diff --git a/pelican/contents.py b/pelican/contents.py index 2bb2e3a0..2e29d84e 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -215,7 +215,7 @@ class Content: if not klass: klass = self.__class__.__name__ fq_key = ('{}_{}'.format(klass, key)).upper() - return self.settings[fq_key].format(**self.url_format) + return str(self.settings[fq_key]).format(**self.url_format) def get_url_setting(self, key): if hasattr(self, 'override_' + key): diff --git a/pelican/generators.py b/pelican/generators.py index 424e9c22..d92e8ff8 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -349,12 +349,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['CATEGORY_FEED_ATOM'].format(slug=cat.slug), + str(self.settings['CATEGORY_FEED_ATOM']).format(slug=cat.slug), self.settings.get( 'CATEGORY_FEED_ATOM_URL', - str(self.settings['CATEGORY_FEED_ATOM'])).format( + str(self.settings['CATEGORY_FEED_ATOM']).format( slug=cat.slug - ), + )), feed_title=cat.name ) @@ -362,12 +362,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['CATEGORY_FEED_RSS'].format(slug=cat.slug), + str(self.settings['CATEGORY_FEED_RSS']).format(slug=cat.slug), self.settings.get( 'CATEGORY_FEED_RSS_URL', - str(self.settings['CATEGORY_FEED_RSS'])).format( + str(self.settings['CATEGORY_FEED_RSS']).format( slug=cat.slug - ), + )), feed_title=cat.name, feed_type='rss' ) @@ -377,12 +377,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['AUTHOR_FEED_ATOM'].format(slug=auth.slug), + str(self.settings['AUTHOR_FEED_ATOM']).format(slug=auth.slug), self.settings.get( 'AUTHOR_FEED_ATOM_URL', - str(self.settings['AUTHOR_FEED_ATOM'])).format( + str(self.settings['AUTHOR_FEED_ATOM']).format( slug=auth.slug - ), + )), feed_title=auth.name ) @@ -390,12 +390,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['AUTHOR_FEED_RSS'].format(slug=auth.slug), + str(self.settings['AUTHOR_FEED_RSS']).format(slug=auth.slug), self.settings.get( 'AUTHOR_FEED_RSS_URL', - str(self.settings['AUTHOR_FEED_RSS'])).format( + str(self.settings['AUTHOR_FEED_RSS']).format( slug=auth.slug - ), + )), feed_title=auth.name, feed_type='rss' ) @@ -407,12 +407,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['TAG_FEED_ATOM'].format(slug=tag.slug), + str(self.settings['TAG_FEED_ATOM']).format(slug=tag.slug), self.settings.get( 'TAG_FEED_ATOM_URL', - str(self.settings['TAG_FEED_ATOM'])).format( + str(self.settings['TAG_FEED_ATOM']).format( slug=tag.slug - ), + )), feed_title=tag.name ) @@ -420,12 +420,12 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( arts, self.context, - self.settings['TAG_FEED_RSS'].format(slug=tag.slug), + str(self.settings['TAG_FEED_RSS']).format(slug=tag.slug), self.settings.get( 'TAG_FEED_RSS_URL', - str(self.settings['TAG_FEED_RSS'])).format( + str(self.settings['TAG_FEED_RSS']).format( slug=tag.slug - ), + )), feed_title=tag.name, feed_type='rss' ) @@ -443,27 +443,31 @@ class ArticlesGenerator(CachingGenerator): writer.write_feed( items, self.context, - self.settings['TRANSLATION_FEED_ATOM'] - .format(lang=lang), + str( + self.settings['TRANSLATION_FEED_ATOM'] + ).format(lang=lang), self.settings.get( 'TRANSLATION_FEED_ATOM_URL', str( - self.settings['TRANSLATION_FEED_ATOM']) + self.settings['TRANSLATION_FEED_ATOM'] ).format(lang=lang), ) + ) if self.settings.get('TRANSLATION_FEED_RSS'): writer.write_feed( items, self.context, - self.settings['TRANSLATION_FEED_RSS'] - .format(lang=lang), + str( + self.settings['TRANSLATION_FEED_RSS'] + ).format(lang=lang), self.settings.get( 'TRANSLATION_FEED_RSS_URL', - str(self.settings['TRANSLATION_FEED_RSS'])).format( + str(self.settings['TRANSLATION_FEED_RSS']).format( lang=lang ), feed_type='rss' ) + ) def generate_articles(self, write): """Generate the articles.""" diff --git a/pelican/settings.py b/pelican/settings.py index 7b333de8..ddb6748d 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -406,7 +406,7 @@ def handle_deprecated_settings(settings): for key in ['TRANSLATION_FEED_ATOM', 'TRANSLATION_FEED_RSS' ]: - if settings.get(key) and '%s' in settings[key]: + if settings.get(key) and not isinstance(settings[key], Path) and '%s' in settings[key]: logger.warning('%%s usage in %s is deprecated, use {lang} ' 'instead.', key) try: @@ -423,7 +423,7 @@ def handle_deprecated_settings(settings): 'TAG_FEED_ATOM', 'TAG_FEED_RSS', ]: - if settings.get(key) and '%s' in settings[key]: + if settings.get(key) and not isinstance(settings[key], Path) and '%s' in settings[key]: logger.warning('%%s usage in %s is deprecated, use {slug} ' 'instead.', key) try: diff --git a/pelican/urlwrappers.py b/pelican/urlwrappers.py index efe09fbc..e00b914c 100644 --- a/pelican/urlwrappers.py +++ b/pelican/urlwrappers.py @@ -1,6 +1,7 @@ import functools import logging import os +import pathlib from pelican.utils import slugify @@ -110,6 +111,8 @@ class URLWrapper: """ setting = "{}_{}".format(self.__class__.__name__.upper(), key) value = self.settings[setting] + if isinstance(value, pathlib.Path): + value = str(value) if not isinstance(value, str): logger.warning('%s is set to %s', setting, value) return value diff --git a/pelican/utils.py b/pelican/utils.py index e82117d3..a3ece8ce 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -3,6 +3,7 @@ import fnmatch import locale import logging import os +import pathlib import re import shutil import sys @@ -921,17 +922,28 @@ def split_all(path): >>> split_all(os.path.join('a', 'b', 'c')) ['a', 'b', 'c'] """ - components = [] - path = path.lstrip('/') - while path: - head, tail = os.path.split(path) - if tail: - components.insert(0, tail) - elif head == path: - components.insert(0, head) - break - path = head - return components + if isinstance(path, str): + components = [] + path = path.lstrip('/') + while path: + head, tail = os.path.split(path) + if tail: + components.insert(0, tail) + elif head == path: + components.insert(0, head) + break + path = head + return components + elif isinstance(path, pathlib.Path): + return path.parts + elif path is None: + return None + else: + raise TypeError( + '"path" was {}, must be string, None, or pathlib.Path'.format( + type(path) + ) + ) def is_selected_for_writing(settings, path): diff --git a/pelican/writers.py b/pelican/writers.py index 9b27a748..379af1f4 100644 --- a/pelican/writers.py +++ b/pelican/writers.py @@ -29,7 +29,7 @@ class Writer: self.urljoiner = posix_join else: self.urljoiner = lambda base, url: urljoin( - base if base.endswith('/') else base + '/', url) + base if base.endswith('/') else base + '/', str(url)) def _create_new_feed(self, feed_type, feed_title, context): feed_class = Rss201rev2Feed if feed_type == 'rss' else Atom1Feed