Mercurial > piecrust2
annotate piecrust/routing.py @ 791:504d6817352d
routing: Don't mistakenly raise errors about incorrect variadic parameters.
Off by one error! Yay.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 05 Sep 2016 22:30:05 -0700 |
parents | 4cbe057a8b6a |
children | 58ebf50235a5 |
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 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
6 from werkzeug.utils import cached_property |
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 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
12 route_re = re.compile(r'%((?P<qual>[\w\d]+):)?(?P<var>\+)?(?P<name>\w+)%') |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
13 route_esc_re = re.compile(r'\\%((?P<qual>[\w\d]+)\\:)?(?P<var>\\\+)?(?P<name>\w+)\\%') |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
14 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
|
15 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
555
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
17 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
|
18 pass |
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
19 |
daf8df5ade7d
serve: Refactor the server to make pieces usable by the debugging middleware.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
20 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
21 class InvalidRouteError(Exception): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
22 pass |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
23 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
24 |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
25 def create_route_metadata(page): |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
26 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
|
27 route_metadata.update(page.getRouteMetadata()) |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
28 return route_metadata |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
29 |
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
30 |
147
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
31 class IRouteMetadataProvider(object): |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
32 def getRouteMetadata(self): |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
33 raise NotImplementedError() |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
34 |
ab6e7e0e9d44
Pass date information to routing when building URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
35 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
36 ROUTE_TYPE_SOURCE = 0 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
37 ROUTE_TYPE_GENERATOR = 1 |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
38 |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
39 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 class Route(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 """ 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
|
42 Each route defines the "shape" of an URL and how it maps to |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
43 sources and generators. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 """ |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 def __init__(self, app, cfg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 self.app = app |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
47 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
48 self.source_name = cfg.get('source') |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
49 self.generator_name = cfg.get('generator') |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
50 if not self.source_name and not self.generator_name: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
51 raise InvalidRouteError( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
52 "Both `source` and `generator` are specified.") |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
53 |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
54 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
|
55 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
|
56 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
|
57 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
|
58 '__cache/pagination_suffix_format') |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
59 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
|
60 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 uri = cfg['url'] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 self.uri_pattern = uri.lstrip('/') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 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
|
64 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
65 # 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
|
66 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
|
67 re.escape(self.uri_pattern)) + '$' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 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
|
69 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
70 # 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
|
71 # 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
|
72 # 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
|
73 # 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
|
74 # 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
|
75 # (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
|
76 # right now) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
77 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
|
78 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
|
79 .replace('//', '/') |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
80 .rstrip('/')) |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 else: |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
86 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
|
87 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
88 # Determine the parameters for the route function. |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
89 self.func_name = self._validateFuncName(cfg.get('func')) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
90 self.func_parameters = [] |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
91 self.func_has_variadic_parameter = False |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
92 self.param_types = {} |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
93 variadic_param_idx = -1 |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
94 for m in route_re.finditer(self.uri_pattern): |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
95 name = m.group('name') |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
96 self.func_parameters.append(name) |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
97 |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
98 qual = m.group('qual') |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
99 if not qual: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
100 qual = self._getBackwardCompatibleParamType(name) |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
101 if qual: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
102 self.param_types[name] = qual |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
103 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
104 if m.group('var'): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
105 self.func_has_variadic_parameter = True |
791
504d6817352d
routing: Don't mistakenly raise errors about incorrect variadic parameters.
Ludovic Chabant <ludovic@chabant.com>
parents:
790
diff
changeset
|
106 variadic_param_idx = len(self.func_parameters) - 1 |
329
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
107 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
108 if (variadic_param_idx >= 0 and |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
109 variadic_param_idx != len(self.func_parameters) - 1): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
110 raise Exception( |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
111 "Only the last route URL parameter can be variadic. " |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
112 "Got: %s" % self.uri_pattern) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 @property |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
115 def route_type(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
116 if self.source_name: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
117 return ROUTE_TYPE_SOURCE |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
118 elif self.generator_name: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
119 return ROUTE_TYPE_GENERATOR |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
120 else: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
121 raise InvalidRouteError() |
483
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
122 |
64e1cd71b30b
serve: Try to serve taxonomy pages after all normal pages have failed.
Ludovic Chabant <ludovic@chabant.com>
parents:
482
diff
changeset
|
123 @property |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
124 def is_source_route(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
125 return self.route_type == ROUTE_TYPE_SOURCE |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
126 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
127 @property |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
128 def is_generator_route(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
129 return self.route_type == ROUTE_TYPE_GENERATOR |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
130 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
131 @cached_property |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 def source(self): |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
133 if not self.is_source_route: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
134 return InvalidRouteError("This is not a source route.") |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 for src in self.app.sources: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 if src.name == self.source_name: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 return src |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
138 raise Exception("Can't find source '%s' for route '%s'." % ( |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 self.source_name, self.uri)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
141 @cached_property |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
142 def generator(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
143 if not self.is_generator_route: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
144 return InvalidRouteError("This is not a generator route.") |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
145 for gen in self.app.generators: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
146 if gen.name == self.generator_name: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
147 return gen |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
148 raise Exception("Can't find generator '%s' for route '%s'." % ( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
661
diff
changeset
|
149 self.generator_name, self.uri)) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
151 def matchesMetadata(self, route_metadata): |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
152 return set(self.func_parameters).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
|
153 |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
154 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
|
155 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
|
156 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
|
157 uri = uri[len(self.uri_root):] |
422052d2e978
internal: Try handling URLs in a consistent way.
Ludovic Chabant <ludovic@chabant.com>
parents:
262
diff
changeset
|
158 |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
159 if not self.pretty_urls: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
160 uri = ugly_url_cleaner.sub('', uri) |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
161 elif self.trailing_slash: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
162 uri = uri.rstrip('/') |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
163 |
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 = None |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 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
|
173 return None |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
174 |
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
175 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
|
176 # 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
|
177 # 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
|
178 # 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
|
179 # 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
|
180 matched_keys = set(route_metadata.keys()) |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
181 missing_keys = set(self.func_parameters) - matched_keys |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
182 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
|
183 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
|
184 |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
185 for k in route_metadata: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
186 route_metadata[k] = self._coerceRouteParameter( |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
187 k, route_metadata[k]) |
448
a17774094db8
serve: Fix bug with creating routing metadata from the URL.
Ludovic Chabant <ludovic@chabant.com>
parents:
438
diff
changeset
|
188 |
380
f33712c4cfab
routing: Fix bugs with matching URLs with correct route but missing metadata.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
189 return route_metadata |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
396
diff
changeset
|
191 def getUri(self, route_metadata, *, sub_num=1): |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
192 route_metadata = dict(route_metadata) |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
193 for k in route_metadata: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
194 route_metadata[k] = self._coerceRouteParameter( |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
195 k, route_metadata[k]) |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
196 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
344
diff
changeset
|
197 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
|
198 suffix = None |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
199 if sub_num > 1: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
200 # 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
|
201 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
|
202 |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
203 if self.pretty_urls: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
204 # Output will be: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
205 # - `subdir/name` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
206 # - `subdir/name/2` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
207 # - `subdir/name.ext` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
208 # - `subdir/name.ext/2` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
209 if suffix: |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
210 if uri == '': |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
211 uri = suffix.lstrip('/') |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
212 else: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
213 uri = uri.rstrip('/') + suffix |
337
49408002798e
internal: Fix stupid routing bug.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
214 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
|
215 uri = uri.rstrip('/') + '/' |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
216 else: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
217 # Output will be: |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
218 # - `subdir/name.html` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
219 # - `subdir/name/2.html` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
220 # - `subdir/name.ext` |
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
221 # - `subdir/name/2.ext` |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
222 if uri == '': |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
223 if suffix: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
224 uri = suffix.lstrip('/') + '.html' |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
225 else: |
262
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
226 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
|
227 if not ext: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
228 ext = '.html' |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
229 if suffix: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
230 uri = base_uri + suffix + ext |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
231 else: |
61145dcd56e0
routing: Better generate URLs according to the site configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
256
diff
changeset
|
232 uri = base_uri + ext |
256
da5e6e00fb41
bake/serve: Make previewed and baked URLs consistent.
Ludovic Chabant <ludovic@chabant.com>
parents:
235
diff
changeset
|
233 |
568
6b6c5442c790
bug: Correctly handle root URLs with special characters.
Ludovic Chabant <ludovic@chabant.com>
parents:
561
diff
changeset
|
234 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
|
235 |
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
236 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
|
237 uri += '?!debug' |
dc0988d937b3
serve: Fix bug where `?!debug` doesn't get appending correctly.
Ludovic Chabant <ludovic@chabant.com>
parents:
380
diff
changeset
|
238 |
235
55087da9a72e
bake: Don't include the site root when building output paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
225
diff
changeset
|
239 return uri |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
241 def execTemplateFunc(self, *args): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
242 fixed_param_count = len(self.func_parameters) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
243 if self.func_has_variadic_parameter: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
244 fixed_param_count -= 1 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
245 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
246 if len(args) < fixed_param_count: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
247 raise Exception( |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
248 "Route function '%s' expected %d arguments, " |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
249 "got %d: %s" % |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
250 (self.func_name, fixed_param_count, len(args), args)) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
251 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
252 if self.func_has_variadic_parameter: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
253 coerced_args = list(args[:fixed_param_count]) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
254 if len(args) > fixed_param_count: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
255 var_arg = tuple(args[fixed_param_count:]) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
256 coerced_args.append(var_arg) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
257 else: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
258 coerced_args = args |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
259 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
260 metadata = {} |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
261 for arg_name, arg_val in zip(self.func_parameters, coerced_args): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
262 metadata[arg_name] = self._coerceRouteParameter( |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
263 arg_name, arg_val) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
264 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
265 if self.is_generator_route: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
266 self.generator.onRouteFunctionUsed(self, metadata) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
267 |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
268 return self.getUri(metadata) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
269 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 def _uriFormatRepl(self, m): |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
271 qual = m.group('qual') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 name = m.group('name') |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
273 |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
274 # Backwards compatibility... this will print a warning later. |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
275 if qual is None: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
276 if name == 'year': |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
277 qual = 'int4' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
278 elif name in ['month', 'day']: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
279 qual = 'int2' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
280 |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
281 if qual == 'int4': |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
282 return '%%(%s)04d' % name |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
283 elif qual == 'int2': |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
284 return '%%(%s)02d' % name |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
285 elif qual and qual != 'path': |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
286 raise Exception("Unknown route parameter type: %s" % qual) |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
287 return '%%(%s)s' % name |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 def _uriPatternRepl(self, m): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 name = m.group('name') |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
291 qual = m.group('qual') |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
292 |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
293 # Backwards compatibility... this will print a warning later. |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
294 if qual is None: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
295 if name == 'year': |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
296 qual = 'int4' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
297 elif name in ['month', 'day']: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
298 qual = 'int2' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
299 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
300 if qual == 'path' or m.group('var'): |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
301 return r'(?P<%s>[^\?]*)' % name |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
302 elif qual == 'int4': |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
303 return r'(?P<%s>\d{4})' % name |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
304 elif qual == 'int2': |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
305 return r'(?P<%s>\d{2})' % name |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
306 elif qual and qual != 'path': |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
307 raise Exception("Unknown route parameter type: %s" % qual) |
173
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
308 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
|
309 |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 if qualifier == 'path': |
0a86a7a6b284
routes: Actually match metadata when finding routes, fix problems with paths.
Ludovic Chabant <ludovic@chabant.com>
parents:
154
diff
changeset
|
314 return '' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 return r'(?P<%s>[^/\?]+)' % name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
317 def _coerceRouteParameter(self, name, val): |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
318 param_type = self.param_types.get(name) |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
319 if param_type is None: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
320 return val |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
321 if param_type in ['int', 'int2', 'int4']: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
322 try: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
323 return int(val) |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
324 except ValueError: |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
325 raise Exception( |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
326 "Expected route parameter '%s' to be of type " |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
327 "'%s', but was: %s" % |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
328 (name, param_type, val)) |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
329 if param_type == 'path': |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
330 return val |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
331 raise Exception("Unknown route parameter type: %s" % param_type) |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
332 |
790
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
333 def _getBackwardCompatibleParamType(self, name): |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
334 # Print a warning only if we're not in a worker process. |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
335 print_warning = not self.app.config.has('baker/worker_id') |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
336 |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
337 if name in ['year']: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
338 if print_warning: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
339 logger.warning( |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
340 "Route parameter '%%%s%%' has no type qualifier. " |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
341 "You probably meant '%%int4:%s%%' so we'll use that." % |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
342 (name, name)) |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
343 return 'int4' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
344 if name in ['month', 'day']: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
345 if print_warning: |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
346 logger.warning( |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
347 "Route parameter '%%%s%%' has no type qualifier. " |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
348 "You probably meant '%%int2:%s%%' so we'll use that." % |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
349 (name, name)) |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
350 return 'int2' |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
351 return None |
4cbe057a8b6a
routing: Add some backwards compatibility support for parameter types.
Ludovic Chabant <ludovic@chabant.com>
parents:
787
diff
changeset
|
352 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
353 def _validateFuncName(self, name): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
354 if not name: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
355 return None |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
356 i = name.find('(') |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
357 if i >= 0: |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
358 name = name[:i] |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
359 logger.warning( |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
360 "Route function names shouldn't contain the list of arguments " |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
361 "anymore -- just specify '%s'." % name) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
362 return name |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 class CompositeRouteFunction(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 def __init__(self): |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
367 self._routes = [] |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 self._arg_names = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 def addFunc(self, route): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 if self._arg_names is None: |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
372 self._arg_names = list(route.func_parameters) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
374 if route.func_parameters != self._arg_names: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 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
|
376 "with route function with arguments '%s'." % |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
377 (route.func_parameters, self._arg_names)) |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
378 self._routes.append(route) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
379 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 def __call__(self, *args, **kwargs): |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
381 if len(self._routes) == 1 or len(args) == len(self._arg_names): |
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
382 return self._routes[0].execTemplateFunc(*args, **kwargs) |
3
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 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
|
385 f_args = args[:-1] |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
386 for r in self._routes: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 if r.source_name == args[-1]: |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
734
diff
changeset
|
388 return r.execTemplateFunc(*f_args, **kwargs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 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
|
390 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 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
|
392 "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
|
393 |