annotate piecrust/sources/posts.py @ 841:f0930178fd01

internal: Make `posts` sources cache their list of pages.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 15 Feb 2017 22:17:54 -0800
parents 58ebf50235a5
children 4850f8c21b6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import os
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import os.path
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import re
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import logging
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import datetime
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
6 from piecrust import osutil
792
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
7 from piecrust.routing import RouteParameter
242
f130365568ff internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents: 109
diff changeset
8 from piecrust.sources.base import (
f130365568ff internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents: 109
diff changeset
9 PageSource, InvalidFileSystemEndpointError, PageFactory,
f130365568ff internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents: 109
diff changeset
10 MODE_CREATING, MODE_PARSING)
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
11 from piecrust.sources.interfaces import (
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
12 IPreparingSource, IInteractiveSource, InteractiveField)
242
f130365568ff internal: Code reorganization to put less stuff in `sources.base`.
Ludovic Chabant <ludovic@chabant.com>
parents: 109
diff changeset
13 from piecrust.sources.mixins import SimplePaginationSourceMixin
577
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
14 from piecrust.uriutil import multi_replace
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
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 logger = logging.getLogger(__name__)
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
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
20 class PostsSource(PageSource, IPreparingSource, IInteractiveSource,
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
21 SimplePaginationSourceMixin):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 PATH_FORMAT = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 def __init__(self, app, name, config):
841
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
25 PageSource.__init__(self, app, name, config)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 self.fs_endpoint = config.get('fs_endpoint', name)
36
485682a6de50 New site layout support.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
27 self.fs_endpoint_path = os.path.join(self.root_dir, self.fs_endpoint)
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
28 self.supported_extensions = list(app.config.get('site/auto_formats').keys())
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
29 self.default_auto_format = app.config.get('site/default_auto_format')
841
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
30 self._source_it_cache = None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 @property
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def path_format(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 return self.__class__.PATH_FORMAT
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 def resolveRef(self, ref_path):
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
37 path = os.path.normpath(os.path.join(self.fs_endpoint_path, ref_path))
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
38 metadata = self._parseMetadataFromPath(ref_path)
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
39 return path, metadata
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40
792
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
41 def getSupportedRouteParameters(self):
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
42 return [
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
43 RouteParameter('slug', RouteParameter.TYPE_STRING),
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
44 RouteParameter('day', RouteParameter.TYPE_INT2),
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
45 RouteParameter('month', RouteParameter.TYPE_INT2),
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
46 RouteParameter('year', RouteParameter.TYPE_INT4)]
58ebf50235a5 routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents: 577
diff changeset
47
577
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
48 def buildPageFactory(self, path):
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
49 if not path.startswith(self.fs_endpoint_path):
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
50 raise Exception("Page path '%s' isn't inside '%s'." % (
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
51 path, self.fs_endpoint_path))
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
52 rel_path = path[len(self.fs_endpoint_path):].lstrip('\\/')
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
53 pat = self.PATH_FORMAT % {
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
54 'year': 'YEAR',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
55 'month': 'MONTH',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
56 'day': 'DAY',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
57 'slug': 'SLUG',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
58 'ext': 'EXT'}
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
59 pat = re.escape(pat)
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
60 pat = multi_replace(pat, {
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
61 'YEAR': '(\d{4})',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
62 'MONTH': '(\d{2})',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
63 'DAY': '(\d{2})',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
64 'SLUG': '(.*)',
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
65 'EXT': '(.*)'})
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
66 m = re.match(pat, rel_path)
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
67 if m is None:
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
68 raise Exception("'%s' isn't a proper %s page path." % (
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
69 rel_path, self.SOURCE_NAME))
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
70 return self._makeFactory(
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
71 rel_path,
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
72 m.group(4),
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
73 int(m.group(1)),
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
74 int(m.group(2)),
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
75 int(m.group(3)))
ff404adfcf45 sources: Add method to get a page factory from a path.
Ludovic Chabant <ludovic@chabant.com>
parents: 576
diff changeset
76
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
77 def findPageFactory(self, metadata, mode):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 year = metadata.get('year')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 month = metadata.get('month')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 day = metadata.get('day')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 slug = metadata.get('slug')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82
281
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
83 try:
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
84 if year is not None:
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
85 year = int(year)
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
86 if month is not None:
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
87 month = int(month)
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
88 if day is not None:
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
89 day = int(day)
0641fe5c3ef9 serve: Don't crash when a post URL doesn't match our expectations.
Ludovic Chabant <ludovic@chabant.com>
parents: 244
diff changeset
90 except ValueError:
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
91 return None
54
a46354306738 Use properly formatted date components for the blog sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 36
diff changeset
92
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 ext = metadata.get('ext')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 if ext is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 if len(self.supported_extensions) == 1:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 ext = self.supported_extensions[0]
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
97 elif mode == MODE_CREATING and self.default_auto_format:
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
98 ext = self.default_auto_format
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 replacements = {
244
ba857c693c72 sources: Fix a bug where the `posts` source wasn't correctly parsing URLs.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
101 'year': '%04d' % year if year is not None else None,
ba857c693c72 sources: Fix a bug where the `posts` source wasn't correctly parsing URLs.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
102 'month': '%02d' % month if month is not None else None,
ba857c693c72 sources: Fix a bug where the `posts` source wasn't correctly parsing URLs.
Ludovic Chabant <ludovic@chabant.com>
parents: 242
diff changeset
103 'day': '%02d' % day if day is not None else None,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 'slug': slug,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 'ext': ext
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 }
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 needs_recapture = False
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 if year is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 needs_recapture = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 replacements['year'] = '????'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 if month is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 needs_recapture = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 replacements['month'] = '??'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 if day is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 needs_recapture = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 replacements['day'] = '??'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 if slug is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 needs_recapture = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 replacements['slug'] = '*'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 if ext is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 needs_recapture = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 replacements['ext'] = '*'
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
123 path = os.path.normpath(os.path.join(
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
124 self.fs_endpoint_path, self.path_format % replacements))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 if needs_recapture:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 if mode == MODE_CREATING:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 raise ValueError("Not enough information to find a post path.")
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
129 possible_paths = osutil.glob(path)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 if len(possible_paths) != 1:
516
73bd408caebc internal: Return `None` instead of raising an exception when finding pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 363
diff changeset
131 return None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 path = possible_paths[0]
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
133 elif mode == MODE_PARSING and not os.path.isfile(path):
516
73bd408caebc internal: Return `None` instead of raising an exception when finding pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 363
diff changeset
134 return None
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
136 rel_path = os.path.relpath(path, self.fs_endpoint_path)
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
137 rel_path = rel_path.replace('\\', '/')
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
138 fac_metadata = self._parseMetadataFromPath(rel_path)
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
139 return PageFactory(self, rel_path, fac_metadata)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140
841
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
141 def getSourceIterator(self):
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
142 if self._source_it_cache is None:
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
143 it = SimplePaginationSourceMixin.getSourceIterator(self)
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
144 self._source_it_cache = list(it)
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
145 return self._source_it_cache
f0930178fd01 internal: Make `posts` sources cache their list of pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 792
diff changeset
146
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 def setupPrepareParser(self, parser, app):
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
148 parser.add_argument(
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
149 '-d', '--date', help="The date of the post, "
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 "in `year/month/day` format (defaults to today).")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151 parser.add_argument('slug', help="The URL slug for the new post.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 def buildMetadata(self, args):
80
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
154 dt = datetime.date.today()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 if args.date:
80
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
156 if args.date == 'today':
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
157 pass # Keep the default we had.
80
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
158 elif args.date == 'tomorrow':
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
159 dt += datetime.timedelta(days=1)
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
160 elif args.date.startswith('+'):
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
161 try:
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
162 dt += datetime.timedelta(days=int(args.date.lstrip('+')))
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
163 except ValueError:
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
164 raise Exception("Date offsets must be numbers.")
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
165 else:
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
166 try:
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
167 year, month, day = [int(s) for s in args.date.split('/')]
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
168 except ValueError:
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
169 raise Exception("Dates must be of the form: "
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
170 "YEAR/MONTH/DAY.")
80
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
171 dt = datetime.date(year, month, day)
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
172
838a9dd0e23c Better date creation for blog post scaffolding.
Ludovic Chabant <ludovic@chabant.com>
parents: 54
diff changeset
173 year, month, day = dt.year, dt.month, dt.day
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174 return {'year': year, 'month': month, 'day': day, 'slug': args.slug}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175
576
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
176 def getInteractiveFields(self):
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
177 dt = datetime.date.today()
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
178 return [
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
179 InteractiveField('year', InteractiveField.TYPE_INT, dt.year),
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
180 InteractiveField('month', InteractiveField.TYPE_INT, dt.month),
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
181 InteractiveField('day', InteractiveField.TYPE_INT, dt.day),
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
182 InteractiveField('slug', InteractiveField.TYPE_STRING, 'new-post')]
0c74a6c4533d sources: Add code to support "interactive" metadata acquisition.
Ludovic Chabant <ludovic@chabant.com>
parents: 520
diff changeset
183
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 def _checkFsEndpointPath(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 if not os.path.isdir(self.fs_endpoint_path):
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
186 if self.ignore_missing_dir:
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
187 return False
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 raise InvalidFileSystemEndpointError(self.name, self.fs_endpoint_path)
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
189 return True
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190
363
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
191 def _parseMetadataFromPath(self, path):
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
192 regex_repl = {
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
193 'year': '(?P<year>\d{4})',
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
194 'month': '(?P<month>\d{2})',
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
195 'day': '(?P<day>\d{2})',
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
196 'slug': '(?P<slug>.*)',
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
197 'ext': '(?P<ext>.*)'
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
198 }
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
199 path_format_re = re.sub(r'([\-\.])', r'\\\1', self.path_format)
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
200 pattern = path_format_re % regex_repl + '$'
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
201 m = re.search(pattern, path.replace('\\', '/'))
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
202 if not m:
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
203 raise Exception("Expected to be able to match path with path "
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
204 "format: %s" % path)
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
205
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
206 year = int(m.group('year'))
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
207 month = int(m.group('month'))
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
208 day = int(m.group('day'))
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
209 timestamp = datetime.date(year, month, day)
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
210 metadata = {
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
211 'year': year,
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
212 'month': month,
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
213 'day': day,
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
214 'slug': m.group('slug'),
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
215 'date': timestamp
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
216 }
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
217 return metadata
dd25bd3ce1f9 serve: Refactoring and fixes to be able to serve taxonomy pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 281
diff changeset
218
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 def _makeFactory(self, path, slug, year, month, day):
11
617191dec18e Fixes for Windows, make `findPagePath` return a ref path.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
220 path = path.replace('\\', '/')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 timestamp = datetime.date(year, month, day)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 metadata = {
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 'slug': slug,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 'year': year,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 'month': month,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 'day': day,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 'date': timestamp}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 return PageFactory(self, path, metadata)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 class FlatPostsSource(PostsSource):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 SOURCE_NAME = 'posts/flat'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 PATH_FORMAT = '%(year)s-%(month)s-%(day)s_%(slug)s.%(ext)s'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 def __init__(self, app, name, config):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 super(FlatPostsSource, self).__init__(app, name, config)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 def buildPageFactories(self):
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
239 if not self._checkFsEndpointPath():
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
240 return
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 logger.debug("Scanning for posts (flat) in: %s" % self.fs_endpoint_path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})_(.*)\.(\w+)$')
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
243 _, __, filenames = next(osutil.walk(self.fs_endpoint_path))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 for f in filenames:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 match = pattern.match(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 if match is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247 name, ext = os.path.splitext(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 logger.warning("'%s' is not formatted as 'YYYY-MM-DD_slug-title.%s' "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 "and will be ignored. Is that a typo?" % (f, ext))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 continue
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 yield self._makeFactory(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 f,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 match.group(4),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 int(match.group(1)),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 int(match.group(2)),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 int(match.group(3)))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 class ShallowPostsSource(PostsSource):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 SOURCE_NAME = 'posts/shallow'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 PATH_FORMAT = '%(year)s/%(month)s-%(day)s_%(slug)s.%(ext)s'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 def __init__(self, app, name, config):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 super(ShallowPostsSource, self).__init__(app, name, config)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 def buildPageFactories(self):
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
267 if not self._checkFsEndpointPath():
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
268 return
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 logger.debug("Scanning for posts (shallow) in: %s" % self.fs_endpoint_path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270 year_pattern = re.compile(r'(\d{4})$')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 file_pattern = re.compile(r'(\d{2})-(\d{2})_(.*)\.(\w+)$')
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
272 _, year_dirs, __ = next(osutil.walk(self.fs_endpoint_path))
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
273 year_dirs = [d for d in year_dirs if year_pattern.match(d)]
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 for yd in year_dirs:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 if year_pattern.match(yd) is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 logger.warning("'%s' is not formatted as 'YYYY' and will be ignored. "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 "Is that a typo?")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 continue
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 year = int(yd)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 year_dir = os.path.join(self.fs_endpoint_path, yd)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
282 _, __, filenames = next(osutil.walk(year_dir))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 for f in filenames:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 match = file_pattern.match(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 if match is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 name, ext = os.path.splitext(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 logger.warning("'%s' is not formatted as 'MM-DD_slug-title.%s' "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 "and will be ignored. Is that a typo?" % (f, ext))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 continue
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 yield self._makeFactory(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 os.path.join(yd, f),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 match.group(3),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 year,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 int(match.group(1)),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 int(match.group(2)))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296
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 class HierarchyPostsSource(PostsSource):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 SOURCE_NAME = 'posts/hierarchy'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 PATH_FORMAT = '%(year)s/%(month)s/%(day)s_%(slug)s.%(ext)s'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 def __init__(self, app, name, config):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 super(HierarchyPostsSource, self).__init__(app, name, config)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305 def buildPageFactories(self):
84
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
306 if not self._checkFsEndpointPath():
b3ce11b2cf36 Don't complain about missing `pages` or `posts` directories by default.
Ludovic Chabant <ludovic@chabant.com>
parents: 80
diff changeset
307 return
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 logger.debug("Scanning for posts (hierarchy) in: %s" % self.fs_endpoint_path)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 year_pattern = re.compile(r'(\d{4})$')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 month_pattern = re.compile(r'(\d{2})$')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 file_pattern = re.compile(r'(\d{2})_(.*)\.(\w+)$')
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
312 _, year_dirs, __ = next(osutil.walk(self.fs_endpoint_path))
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
313 year_dirs = [d for d in year_dirs if year_pattern.match(d)]
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 for yd in year_dirs:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 year = int(yd)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 year_dir = os.path.join(self.fs_endpoint_path, yd)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
318 _, month_dirs, __ = next(osutil.walk(year_dir))
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
319 month_dirs = [d for d in month_dirs if month_pattern.match(d)]
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 for md in month_dirs:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 month = int(md)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 month_dir = os.path.join(year_dir, md)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323
520
bab91fcef741 bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents: 516
diff changeset
324 _, __, filenames = next(osutil.walk(month_dir))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 for f in filenames:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 match = file_pattern.match(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 if match is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 name, ext = os.path.splitext(f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 logger.warning("'%s' is not formatted as 'DD_slug-title.%s' "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 "and will be ignored. Is that a typo?" % (f, ext))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 continue
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 rel_name = os.path.join(yd, md, f)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 yield self._makeFactory(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 rel_name,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 match.group(2),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 year,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 month,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 int(match.group(1)))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339