Mercurial > piecrust2
comparison piecrust/sources/base.py @ 186:e61fbae61402
sources: Pass any current mode to `_populateMetadata` when finding pages.
Page sources like the `prose` source may need to open an existing page's
file to read stuff from it. This won't work if the metadata is populated as
part of finding a path to create a page (like when running `chef prepare`).
We pass the mode to `_populateMetadata` so the underlying class now knows
the current context in which it is called.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 04 Jan 2015 15:48:29 -0800 |
parents | d5991525801d |
children | 0b2d8f6df4ce |
comparison
equal
deleted
inserted
replaced
185:139179dc7abd | 186:e61fbae61402 |
---|---|
307 def getPageFactories(self): | 307 def getPageFactories(self): |
308 for p in self.inner_source: | 308 for p in self.inner_source: |
309 yield CachedPageFactory(p) | 309 yield CachedPageFactory(p) |
310 | 310 |
311 | 311 |
312 class SimplePageSource(PageSource, IListableSource): | 312 class SimplePageSource(PageSource, IListableSource, IPreparingSource, |
313 SimplePaginationSourceMixin): | |
313 def __init__(self, app, name, config): | 314 def __init__(self, app, name, config): |
314 super(SimplePageSource, self).__init__(app, name, config) | 315 super(SimplePageSource, self).__init__(app, name, config) |
315 self.fs_endpoint = config.get('fs_endpoint', name) | 316 self.fs_endpoint = config.get('fs_endpoint', name) |
316 self.fs_endpoint_path = os.path.join(self.root_dir, self.fs_endpoint) | 317 self.fs_endpoint_path = os.path.join(self.root_dir, self.fs_endpoint) |
317 self.supported_extensions = list(app.config.get('site/auto_formats').keys()) | 318 self.supported_extensions = list(app.config.get('site/auto_formats').keys()) |
351 if mode == MODE_CREATING: | 352 if mode == MODE_CREATING: |
352 if ext == '': | 353 if ext == '': |
353 path = '%s.%s' % (path, self.default_auto_format) | 354 path = '%s.%s' % (path, self.default_auto_format) |
354 rel_path = os.path.relpath(path, self.fs_endpoint_path) | 355 rel_path = os.path.relpath(path, self.fs_endpoint_path) |
355 rel_path = rel_path.replace('\\', '/') | 356 rel_path = rel_path.replace('\\', '/') |
356 self._populateMetadata(rel_path, metadata) | 357 self._populateMetadata(rel_path, metadata, mode) |
357 return rel_path, metadata | 358 return rel_path, metadata |
358 | 359 |
359 if ext == '': | 360 if ext == '': |
360 paths_to_check = [ | 361 paths_to_check = [ |
361 '%s.%s' % (path, e) | 362 '%s.%s' % (path, e) |
364 paths_to_check = [path] | 365 paths_to_check = [path] |
365 for path in paths_to_check: | 366 for path in paths_to_check: |
366 if os.path.isfile(path): | 367 if os.path.isfile(path): |
367 rel_path = os.path.relpath(path, self.fs_endpoint_path) | 368 rel_path = os.path.relpath(path, self.fs_endpoint_path) |
368 rel_path = rel_path.replace('\\', '/') | 369 rel_path = rel_path.replace('\\', '/') |
369 self._populateMetadata(rel_path, metadata) | 370 self._populateMetadata(rel_path, metadata, mode) |
370 return rel_path, metadata | 371 return rel_path, metadata |
371 | 372 |
372 return None, None | 373 return None, None |
373 | 374 |
374 def listPath(self, rel_path): | 375 def listPath(self, rel_path): |
401 def getBasename(self, rel_path): | 402 def getBasename(self, rel_path): |
402 filename = os.path.basename(rel_path) | 403 filename = os.path.basename(rel_path) |
403 name, _ = os.path.splitext(filename) | 404 name, _ = os.path.splitext(filename) |
404 return name | 405 return name |
405 | 406 |
407 def setupPrepareParser(self, parser, app): | |
408 parser.add_argument('uri', help='The URI for the new page.') | |
409 | |
410 def buildMetadata(self, args): | |
411 return {'path': args.uri} | |
412 | |
406 def _makeSlug(self, rel_path): | 413 def _makeSlug(self, rel_path): |
407 slug, ext = os.path.splitext(rel_path) | 414 slug, ext = os.path.splitext(rel_path) |
408 slug = slug.replace('\\', '/') | 415 slug = slug.replace('\\', '/') |
409 if ext.lstrip('.') not in self.supported_extensions: | 416 if ext.lstrip('.') not in self.supported_extensions: |
410 slug += ext | 417 slug += ext |
420 def _filterPageFilename(self, f): | 427 def _filterPageFilename(self, f): |
421 return (f[0] != '.' and # .DS_store and other crap | 428 return (f[0] != '.' and # .DS_store and other crap |
422 f[-1] != '~' and # Vim temp files and what-not | 429 f[-1] != '~' and # Vim temp files and what-not |
423 f not in ['Thumbs.db']) # Windows bullshit | 430 f not in ['Thumbs.db']) # Windows bullshit |
424 | 431 |
425 def _populateMetadata(self, rel_path, metadata): | 432 def _populateMetadata(self, rel_path, metadata, mode=None): |
426 pass | 433 pass |
427 | 434 |
428 | 435 |
429 class DefaultPageSource(SimplePageSource, | 436 class DefaultPageSource(SimplePageSource): |
430 IPreparingSource, IListableSource, | |
431 SimplePaginationSourceMixin): | |
432 SOURCE_NAME = 'default' | 437 SOURCE_NAME = 'default' |
433 | 438 |
434 def __init__(self, app, name, config): | 439 def __init__(self, app, name, config): |
435 super(DefaultPageSource, self).__init__(app, name, config) | 440 super(DefaultPageSource, self).__init__(app, name, config) |
436 | |
437 def setupPrepareParser(self, parser, app): | |
438 parser.add_argument('uri', help='The URI for the new page.') | |
439 | |
440 def buildMetadata(self, args): | |
441 return {'path': args.uri} | |
442 | 441 |
443 | 442 |
444 class SourceFactoryIterator(object): | 443 class SourceFactoryIterator(object): |
445 def __init__(self, source): | 444 def __init__(self, source): |
446 self.source = source | 445 self.source = source |