Mercurial > piecrust2
annotate piecrust/routing.py @ 584:9ccc933ac2c7
internal: Refactor the app configuration class.
* Moved to its own module.
* More extensible validation.
* Allow easier setup of defaults so `showconfig` shows more useful stuff.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 01 Jan 2016 23:18:26 -0800 |
parents | 6b6c5442c790 |
children | 2f780b191541 |
rev | line source |
---|---|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
2 import os.path |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
3 import copy |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
5 import urllib.parse |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
6 import unidecode |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 route_re = re.compile(r'%((?P<qual>path):)?(?P<name>\w+)%') |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
13 route_esc_re = re.compile(r'\\%((?P<qual>path)\\:)?(?P<name>\w+)\\%') |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
14 template_func_re = re.compile(r'^(?P<name>\w+)\((?P<first_arg>\w+)' |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
15 r'(?P<other_args>.*)\)\s*$') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 template_func_arg_re = re.compile(r',\s*(?P<arg>\w+)') |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
17 ugly_url_cleaner = re.compile(r'\.html$') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 |
555
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
20 class RouteNotFoundError(Exception): |
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
21 pass |
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
22 |
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
23 |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
24 def create_route_metadata(page): |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
25 route_metadata = copy.deepcopy(page.source_metadata) |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
26 route_metadata.update(page.getRouteMetadata()) |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
27 |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
28 # TODO: fix this hard-coded shit |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
29 for key in ['year', 'month', 'day']: |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
30 if key in route_metadata and isinstance(route_metadata[key], str): |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
31 route_metadata[key] = int(route_metadata[key]) |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
32 |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
33 return route_metadata |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
34 |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
35 |
147
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
36 class IRouteMetadataProvider(object): |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
37 def getRouteMetadata(self): |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
38 raise NotImplementedError() |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
39 |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
40 |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
41 SLUGIFY_ENCODE = 1 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
42 SLUGIFY_TRANSLITERATE = 2 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
43 SLUGIFY_LOWERCASE = 4 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
44 SLUGIFY_DOT_TO_DASH = 8 |
561
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
45 SLUGIFY_SPACE_TO_DASH = 16 |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
46 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
47 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
48 re_first_dot_to_dash = re.compile(r'^\.+') |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
49 re_dot_to_dash = re.compile(r'\.+') |
561
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
50 re_space_to_dash = re.compile(r'\s+') |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
51 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
52 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
53 def _parse_slugify_mode(value): |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
54 mapping = { |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
55 'encode': SLUGIFY_ENCODE, |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
56 'transliterate': SLUGIFY_TRANSLITERATE, |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
57 'lowercase': SLUGIFY_LOWERCASE, |
561
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
58 'dot_to_dash': SLUGIFY_DOT_TO_DASH, |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
59 'space_to_dash': SLUGIFY_SPACE_TO_DASH} |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
60 mode = 0 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
61 for v in value.split(','): |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
62 f = mapping.get(v.strip()) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
63 if f is None: |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
64 if v == 'iconv': |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
65 raise Exception("'iconv' is not supported as a slugify mode " |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
66 "in PieCrust2. Use 'transliterate'.") |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
67 raise Exception("Unknown slugify flag: %s" % v) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
68 mode |= f |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
69 return mode |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
70 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
71 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 class Route(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 """ Information about a route for a PieCrust application. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 Each route defines the "shape" of an URL and how it maps to |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 sources and taxonomies. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 """ |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 def __init__(self, app, cfg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 self.app = app |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
79 |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
80 self.source_name = cfg['source'] |
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
81 self.taxonomy_name = cfg.get('taxonomy') |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
82 self.taxonomy_term_sep = cfg.get('term_separator', '/') |
561
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
83 |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
84 sm = cfg.get('slugify_mode') |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
85 if not sm: |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
86 sm = app.config.get('site/slugify_mode', 'encode') |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
87 self.slugify_mode = _parse_slugify_mode(sm) |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
88 |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
89 self.pretty_urls = app.config.get('site/pretty_urls') |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
90 self.trailing_slash = app.config.get('site/trailing_slash') |
396
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
91 self.show_debug_info = app.config.get('site/show_debug_info') |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
92 self.pagination_suffix_format = app.config.get( |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
93 '__cache/pagination_suffix_format') |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
94 self.uri_root = app.config.get('site/root') |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
95 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 uri = cfg['url'] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 self.uri_pattern = uri.lstrip('/') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 self.uri_format = route_re.sub(self._uriFormatRepl, self.uri_pattern) |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
99 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
100 # Get the straight-forward regex for matching this URI pattern. |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
101 p = route_esc_re.sub(self._uriPatternRepl, |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
102 re.escape(self.uri_pattern)) + '$' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 self.uri_re = re.compile(p) |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
104 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
105 # If the URI pattern has a 'path'-type component, we'll need to match |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
106 # the versions for which that component is empty. So for instance if |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
107 # we have `/foo/%path:bar%`, we may need to match `/foo` (note the |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
108 # lack of a trailing slash). We have to build a special pattern (in |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
109 # this case without that trailing slash) to match those situations. |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
110 # (maybe there's a better way to do it but I can't think of any |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
111 # right now) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
112 uri_pattern_no_path = ( |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
113 route_re.sub(self._uriNoPathRepl, self.uri_pattern) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
114 .replace('//', '/') |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
115 .rstrip('/')) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
116 if uri_pattern_no_path != self.uri_pattern: |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
117 p = route_esc_re.sub(self._uriPatternRepl, |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
118 re.escape(uri_pattern_no_path)) + '$' |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
119 self.uri_re_no_path = re.compile(p) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
120 else: |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
121 self.uri_re_no_path = None |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
122 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
123 self.required_route_metadata = set() |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
124 for m in route_re.finditer(self.uri_pattern): |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
125 self.required_route_metadata.add(m.group('name')) |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
126 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 self.template_func = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 self.template_func_name = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 self.template_func_args = [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 self._createTemplateFunc(cfg.get('func')) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 @property |
483
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
133 def is_taxonomy_route(self): |
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
134 return self.taxonomy_name is not None |
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
135 |
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
136 @property |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 def source(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 for src in self.app.sources: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 if src.name == self.source_name: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 return src |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 raise Exception("Can't find source '%s' for route '%'." % ( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 self.source_name, self.uri)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 def source_realm(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 return self.source.realm |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
148 def matchesMetadata(self, route_metadata): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
149 return self.required_route_metadata.issubset(route_metadata.keys()) |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
150 |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
151 def matchUri(self, uri, strict=False): |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
152 if not uri.startswith(self.uri_root): |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
153 raise Exception("The given URI is not absolute: %s" % uri) |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
154 uri = uri[len(self.uri_root):] |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
155 |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
156 if not self.pretty_urls: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
157 uri = ugly_url_cleaner.sub('', uri) |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
158 elif self.trailing_slash: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
159 uri = uri.rstrip('/') |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
160 |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
161 route_metadata = None |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
162 m = self.uri_re.match(uri) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
163 if m: |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
164 route_metadata = m.groupdict() |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
165 if self.uri_re_no_path: |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
166 m = self.uri_re_no_path.match(uri) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
167 if m: |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
168 route_metadata = m.groupdict() |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
169 if route_metadata is None: |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
170 return None |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
171 |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
172 if not strict: |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
173 # When matching URIs, if the URI is a match but is missing some |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
174 # metadata, fill those up with empty strings. This can happen if, |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
175 # say, a route's pattern is `/foo/%slug%`, and we're matching an |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
176 # URL like `/foo`. |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
177 matched_keys = set(route_metadata.keys()) |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
178 missing_keys = self.required_route_metadata - matched_keys |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
179 for k in missing_keys: |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
180 route_metadata[k] = '' |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
181 |
448
a17774094db8
serve: Fix bug with creating routing metadata from the URL.
Ludovic Chabant <ludovic@chabant.com>
parents:
438
diff
changeset
|
182 # TODO: fix this hard-coded shit |
a17774094db8
serve: Fix bug with creating routing metadata from the URL.
Ludovic Chabant <ludovic@chabant.com>
parents:
438
diff
changeset
|
183 for key in ['year', 'month', 'day']: |
a17774094db8
serve: Fix bug with creating routing metadata from the URL.
Ludovic Chabant <ludovic@chabant.com>
parents:
438
diff
changeset
|
184 if key in route_metadata and isinstance(route_metadata[key], str): |
482
cce911be024d
serve: Fix a crash when matching taxonomy URLs with incorrect URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
448
diff
changeset
|
185 try: |
cce911be024d
serve: Fix a crash when matching taxonomy URLs with incorrect URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
448
diff
changeset
|
186 route_metadata[key] = int(route_metadata[key]) |
cce911be024d
serve: Fix a crash when matching taxonomy URLs with incorrect URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
448
diff
changeset
|
187 except ValueError: |
cce911be024d
serve: Fix a crash when matching taxonomy URLs with incorrect URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
448
diff
changeset
|
188 pass |
448
a17774094db8
serve: Fix bug with creating routing metadata from the URL.
Ludovic Chabant <ludovic@chabant.com>
parents:
438
diff
changeset
|
189 |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
190 return route_metadata |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
192 def getUri(self, route_metadata, *, sub_num=1): |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
193 uri = self.uri_format % route_metadata |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
194 suffix = None |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
195 if sub_num > 1: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
196 # Note that we know the pagination suffix starts with a slash. |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
197 suffix = self.pagination_suffix_format % {'num': sub_num} |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
198 |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
199 if self.pretty_urls: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
200 # Output will be: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
201 # - `subdir/name` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
202 # - `subdir/name/2` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
203 # - `subdir/name.ext` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
204 # - `subdir/name.ext/2` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
205 if suffix: |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
206 if uri == '': |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
207 uri = suffix.lstrip('/') |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
208 else: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
209 uri = uri.rstrip('/') + suffix |
337
49408002798e
internal: Fix stupid routing bug.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
210 if self.trailing_slash and uri != '': |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
211 uri = uri.rstrip('/') + '/' |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
212 else: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
213 # Output will be: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
214 # - `subdir/name.html` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
215 # - `subdir/name/2.html` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
216 # - `subdir/name.ext` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
217 # - `subdir/name/2.ext` |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
218 if uri == '': |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
219 if suffix: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
220 uri = suffix.lstrip('/') + '.html' |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
221 else: |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
222 base_uri, ext = os.path.splitext(uri) |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
223 if not ext: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
224 ext = '.html' |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
225 if suffix: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
226 uri = base_uri + suffix + ext |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
227 else: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
228 uri = base_uri + ext |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
229 |
568
6b6c5442c790
bug: Correctly handle root URLs with special characters.
Ludovic Chabant <ludovic@chabant.com>
parents:
561
diff
changeset
|
230 uri = self.uri_root + urllib.parse.quote(uri) |
396
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
231 |
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
232 if self.show_debug_info: |
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
233 uri += '?!debug' |
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
234 |
235
55087da9a72e
bake: Don't include the site root when building output paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
225
diff
changeset
|
235 return uri |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
237 def getTaxonomyTerms(self, route_metadata): |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
238 if not self.is_taxonomy_route: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
239 raise Exception("This route isn't a taxonomy route.") |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
240 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
241 tax = self.app.getTaxonomy(self.taxonomy_name) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
242 all_values = route_metadata.get(tax.term_name) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
243 if all_values is None: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
244 raise Exception("'%s' values couldn't be found in route metadata" % |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
245 tax.term_name) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
246 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
247 if self.taxonomy_term_sep in all_values: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
248 return tuple(all_values.split(self.taxonomy_term_sep)) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
249 return all_values |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
483
diff
changeset
|
250 |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
251 def slugifyTaxonomyTerm(self, term): |
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
252 if isinstance(term, tuple): |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
253 return self.taxonomy_term_sep.join( |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
254 map(self._slugifyOne, term)) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
255 return self._slugifyOne(term) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
256 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
257 def _slugifyOne(self, term): |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
258 if self.slugify_mode & SLUGIFY_TRANSLITERATE: |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
259 term = unidecode.unidecode(term) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
260 if self.slugify_mode & SLUGIFY_LOWERCASE: |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
261 term = term.lower() |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
262 if self.slugify_mode & SLUGIFY_DOT_TO_DASH: |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
263 term = re_first_dot_to_dash.sub('', term) |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
264 term = re_dot_to_dash.sub('-', term) |
561
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
265 if self.slugify_mode & SLUGIFY_SPACE_TO_DASH: |
624559e72d3b
routes: Add better support for taxonomy slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
555
diff
changeset
|
266 term = re_space_to_dash.sub('-', term) |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
267 return term |
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
268 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
269 def _uriFormatRepl(self, m): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 name = m.group('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 #TODO: fix this hard-coded shit |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 if name == 'year': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 return '%(year)04d' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 if name == 'month': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 return '%(month)02d' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 if name == 'day': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 return '%(day)02d' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 return '%(' + name + ')s' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 def _uriPatternRepl(self, m): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 name = m.group('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 qualifier = m.group('qual') |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
283 if qualifier == 'path' or self.taxonomy_name: |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
284 return r'(?P<%s>[^\?]*)' % name |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
285 return r'(?P<%s>[^/\?]+)' % name |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
286 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
287 def _uriNoPathRepl(self, m): |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
288 name = m.group('name') |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
289 qualifier = m.group('qual') |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
290 if qualifier == 'path': |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
291 return '' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 return r'(?P<%s>[^/\?]+)' % name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 def _createTemplateFunc(self, func_def): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 if func_def is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 return |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 m = template_func_re.match(func_def) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 if m is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 raise Exception("Template function definition for route '%s' " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 "has invalid syntax: %s" % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 (self.uri_pattern, func_def)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 self.template_func_name = m.group('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 self.template_func_args.append(m.group('first_arg')) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 arg_list = m.group('other_args') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 if arg_list: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 self.template_func_args += template_func_arg_re.findall(arg_list) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
310 if self.taxonomy_name: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 # This will be a taxonomy route function... this means we can |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 # have a variable number of parameters, but only one parameter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 # definition, which is the value. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 if len(self.template_func_args) != 1: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 raise Exception("Route '%s' is a taxonomy route and must have " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 "only one argument, which is the term value." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 self.uri_pattern) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 def template_func(*args): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 if len(args) == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 raise Exception( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 "Route function '%s' expected at least one " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 "argument." % func_def) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 # Term combinations can be passed as an array, or as multiple |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 # arguments. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 values = args |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
328 if len(args) == 1 and isinstance(args[0], list): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
329 values = args[0] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
330 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
331 # We need to register this use of a taxonomy term. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
332 if len(values) == 1: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 registered_values = values[0] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
335 registered_values = tuple(values) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 eis = self.app.env.exec_info_stack |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
337
diff
changeset
|
337 cpi = eis.current_page_info.render_ctx.current_pass_info |
344
bf32be298b89
internal: Template functions could potentially be called outside of a render.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
338 if cpi: |
bf32be298b89
internal: Template functions could potentially be called outside of a render.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
339 cpi.used_taxonomy_terms.add( |
bf32be298b89
internal: Template functions could potentially be called outside of a render.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
340 (self.source_name, self.taxonomy_name, |
bf32be298b89
internal: Template functions could potentially be called outside of a render.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
341 registered_values)) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
343 str_values = self.slugifyTaxonomyTerm(registered_values) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 term_name = self.template_func_args[0] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 metadata = {term_name: str_values} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 return self.getUri(metadata) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 # Normal route function. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 def template_func(*args): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
352 if len(args) != len(self.template_func_args): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 raise Exception( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 "Route function '%s' expected %d arguments, " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 "got %d." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
356 (func_def, len(self.template_func_args), |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 len(args))) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 metadata = {} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 for arg_name, arg_val in zip(self.template_func_args, args): |
438
cff70eeb1cc1
bug: Fix routing bug introduced by 21e26ed867b6.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
360 #TODO: fix this hard-coded shit. |
cff70eeb1cc1
bug: Fix routing bug introduced by 21e26ed867b6.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
361 if arg_name in ['year', 'month', 'day']: |
cff70eeb1cc1
bug: Fix routing bug introduced by 21e26ed867b6.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
362 arg_val = int(arg_val) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 metadata[arg_name] = arg_val |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 return self.getUri(metadata) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 self.template_func = template_func |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 class CompositeRouteFunction(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 self._funcs = [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 self._arg_names = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 def addFunc(self, route): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 if self._arg_names is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
376 self._arg_names = sorted(route.template_func_args) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 if sorted(route.template_func_args) != self._arg_names: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
379 raise Exception("Cannot merge route function with arguments '%s' " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 "with route function with arguments '%s'." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 (route.template_func_args, self._arg_names)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 self._funcs.append((route, route.template_func)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 def __call__(self, *args, **kwargs): |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
385 if len(self._funcs) == 1 or len(args) == len(self._arg_names): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 f = self._funcs[0][1] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 return f(*args, **kwargs) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 if len(args) == len(self._arg_names) + 1: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 f_args = args[:-1] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 for r, f in self._funcs: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 if r.source_name == args[-1]: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 return f(f_args, **kwargs) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 raise Exception("No such source: %s" % args[-1]) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 raise Exception("Incorrect number of arguments for route function. " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 "Expected '%s', got '%s'" % (self._arg_names, args)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 |