From d8172318366f8147c1bee07f0f1cabf3d7256d5d Mon Sep 17 00:00:00 2001 From: MinchinWeb Date: Thu, 23 Apr 2020 12:49:44 -0600 Subject: [PATCH 1/3] Allow generators to deal with settings that are `pathlib.Path`s --- pelican/generators.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/pelican/generators.py b/pelican/generators.py index 63e20a0a..424e9c22 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -18,7 +18,6 @@ from pelican.readers import Readers from pelican.utils import (DateFormatter, copy, mkdir_p, order_content, posixize_path, process_translations) - logger = logging.getLogger(__name__) @@ -322,8 +321,9 @@ class ArticlesGenerator(CachingGenerator): all_articles = list(self.articles) for article in self.articles: all_articles.extend(article.translations) - order_content(all_articles, - order_by=self.settings['ARTICLE_ORDER_BY']) + order_content( + all_articles, order_by=self.settings['ARTICLE_ORDER_BY'] + ) if self.settings.get('FEED_ALL_ATOM'): writer.write_feed( @@ -352,7 +352,7 @@ class ArticlesGenerator(CachingGenerator): self.settings['CATEGORY_FEED_ATOM'].format(slug=cat.slug), self.settings.get( 'CATEGORY_FEED_ATOM_URL', - self.settings['CATEGORY_FEED_ATOM']).format( + str(self.settings['CATEGORY_FEED_ATOM'])).format( slug=cat.slug ), feed_title=cat.name @@ -365,7 +365,7 @@ class ArticlesGenerator(CachingGenerator): self.settings['CATEGORY_FEED_RSS'].format(slug=cat.slug), self.settings.get( 'CATEGORY_FEED_RSS_URL', - self.settings['CATEGORY_FEED_RSS']).format( + str(self.settings['CATEGORY_FEED_RSS'])).format( slug=cat.slug ), feed_title=cat.name, @@ -380,8 +380,9 @@ class ArticlesGenerator(CachingGenerator): self.settings['AUTHOR_FEED_ATOM'].format(slug=auth.slug), self.settings.get( 'AUTHOR_FEED_ATOM_URL', - self.settings['AUTHOR_FEED_ATOM'] - ).format(slug=auth.slug), + str(self.settings['AUTHOR_FEED_ATOM'])).format( + slug=auth.slug + ), feed_title=auth.name ) @@ -392,8 +393,9 @@ class ArticlesGenerator(CachingGenerator): self.settings['AUTHOR_FEED_RSS'].format(slug=auth.slug), self.settings.get( 'AUTHOR_FEED_RSS_URL', - self.settings['AUTHOR_FEED_RSS'] - ).format(slug=auth.slug), + str(self.settings['AUTHOR_FEED_RSS'])).format( + slug=auth.slug + ), feed_title=auth.name, feed_type='rss' ) @@ -408,8 +410,9 @@ class ArticlesGenerator(CachingGenerator): self.settings['TAG_FEED_ATOM'].format(slug=tag.slug), self.settings.get( 'TAG_FEED_ATOM_URL', - self.settings['TAG_FEED_ATOM'] - ).format(slug=tag.slug), + str(self.settings['TAG_FEED_ATOM'])).format( + slug=tag.slug + ), feed_title=tag.name ) @@ -420,8 +423,9 @@ class ArticlesGenerator(CachingGenerator): self.settings['TAG_FEED_RSS'].format(slug=tag.slug), self.settings.get( 'TAG_FEED_RSS_URL', - self.settings['TAG_FEED_RSS'] - ).format(slug=tag.slug), + str(self.settings['TAG_FEED_RSS'])).format( + slug=tag.slug + ), feed_title=tag.name, feed_type='rss' ) @@ -443,7 +447,8 @@ class ArticlesGenerator(CachingGenerator): .format(lang=lang), self.settings.get( 'TRANSLATION_FEED_ATOM_URL', - self.settings['TRANSLATION_FEED_ATOM'] + str( + self.settings['TRANSLATION_FEED_ATOM']) ).format(lang=lang), ) if self.settings.get('TRANSLATION_FEED_RSS'): @@ -454,8 +459,9 @@ class ArticlesGenerator(CachingGenerator): .format(lang=lang), self.settings.get( 'TRANSLATION_FEED_RSS_URL', - self.settings['TRANSLATION_FEED_RSS'] - ).format(lang=lang), + str(self.settings['TRANSLATION_FEED_RSS'])).format( + lang=lang + ), feed_type='rss' ) From cfba3d72beef60de10311a75f83ebb259269fed8 Mon Sep 17 00:00:00 2001 From: MinchinWeb Date: Thu, 23 Apr 2020 13:47:10 -0600 Subject: [PATCH 2/3] fix testing failures when settings could be pathlib.Path --- pelican/contents.py | 2 +- pelican/generators.py | 52 +++++++++++++++++++++++------------------- pelican/settings.py | 4 ++-- pelican/urlwrappers.py | 3 +++ pelican/utils.py | 34 ++++++++++++++++++--------- pelican/writers.py | 2 +- 6 files changed, 58 insertions(+), 39 deletions(-) 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 From a13371670970661c7d3f673e9c634df83f7a95bf Mon Sep 17 00:00:00 2001 From: MinchinWeb Date: Thu, 21 May 2020 21:43:06 -0600 Subject: [PATCH 3/3] flake8 fixes --- pelican/generators.py | 3 +-- pelican/settings.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pelican/generators.py b/pelican/generators.py index d92e8ff8..ecc06851 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -462,11 +462,10 @@ class ArticlesGenerator(CachingGenerator): ).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): diff --git a/pelican/settings.py b/pelican/settings.py index ddb6748d..a5e39161 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -6,6 +6,7 @@ import logging import os import re from os.path import isabs +from pathlib import Path from pelican.log import LimitFilter @@ -406,7 +407,10 @@ def handle_deprecated_settings(settings): for key in ['TRANSLATION_FEED_ATOM', 'TRANSLATION_FEED_RSS' ]: - if settings.get(key) and not isinstance(settings[key], Path) 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 +427,10 @@ def handle_deprecated_settings(settings): 'TAG_FEED_ATOM', 'TAG_FEED_RSS', ]: - if settings.get(key) and not isinstance(settings[key], Path) 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: