diff --git a/pelican/__init__.py b/pelican/__init__.py index 735002a2..ce2fe6b1 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -1,32 +1,37 @@ import argparse +from collections.abc import Iterable import logging import multiprocessing import os +from pkgutil import extend_path import pprint import sys import time import traceback -from collections.abc import Iterable -# Combines all paths to `pelican` package accessible from `sys.path` -# Makes it possible to install `pelican` and namespace plugins into different -# locations in the file system (e.g. pip with `-e` or `--user`) -from pkgutil import extend_path -__path__ = extend_path(__path__, __name__) from rich.console import Console +# Combines all paths to `pelican` package accessible from `sys.path` +# Makes it possible to install `pelican` and namespace plugins into different +# locations in the file system (e.g. pip with `-e` or `--user`) +__path__ = extend_path(__path__, __name__) + # pelican.log has to be the first pelican module to be loaded # because logging.setLoggerClass has to be called before logging.getLogger -from pelican.log import init as init_logging -from pelican.generators import (ArticlesGenerator, # noqa: I100 - PagesGenerator, SourceFileGenerator, - StaticGenerator, TemplatePagesGenerator) +from pelican.log import init as init_logging # isort:skip +from pelican.generators import ( # noqa: I100 + ArticlesGenerator, + PagesGenerator, + SourceFileGenerator, + StaticGenerator, + TemplatePagesGenerator, +) from pelican.plugins import signals from pelican.plugins._utils import get_plugin_name, load_plugins from pelican.readers import Readers from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer from pelican.settings import coerce_overrides, read_settings -from pelican.utils import (FileSystemWatcher, clean_output_dir, maybe_pluralize) +from pelican.utils import FileSystemWatcher, clean_output_dir, maybe_pluralize from pelican.writers import Writer try: diff --git a/pelican/__main__.py b/pelican/__main__.py index 69a5b95d..bf384305 100644 --- a/pelican/__main__.py +++ b/pelican/__main__.py @@ -4,6 +4,5 @@ python -m pelican module entry point to run via python -m from . import main - if __name__ == '__main__': main() diff --git a/pelican/contents.py b/pelican/contents.py index 1740df88..738a7a80 100644 --- a/pelican/contents.py +++ b/pelican/contents.py @@ -1,22 +1,29 @@ import copy import datetime +from html import unescape import locale import logging import os import re -from html import unescape from urllib.parse import unquote, urljoin, urlparse, urlunparse import pytz from pelican.plugins import signals from pelican.settings import DEFAULT_CONFIG -from pelican.utils import (deprecated_attribute, memoized, path_to_url, - posixize_path, sanitised_join, set_date_tzinfo, - slugify, truncate_html_words) # Import these so that they're avalaible when you import from pelican.contents. -from pelican.urlwrappers import (Author, Category, Tag, URLWrapper) # NOQA +from pelican.urlwrappers import Author, Category, Tag, URLWrapper # NOQA +from pelican.utils import ( + deprecated_attribute, + memoized, + path_to_url, + posixize_path, + sanitised_join, + set_date_tzinfo, + slugify, + truncate_html_words, +) logger = logging.getLogger(__name__) diff --git a/pelican/generators.py b/pelican/generators.py index e18531be..5ab4c42a 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -1,23 +1,34 @@ import calendar +from collections import defaultdict import errno import fnmatch -import logging -import os -from collections import defaultdict from functools import partial from itertools import chain, groupby +import logging from operator import attrgetter +import os -from jinja2 import (BaseLoader, ChoiceLoader, Environment, FileSystemLoader, - PrefixLoader, TemplateNotFound) +from jinja2 import ( + BaseLoader, + ChoiceLoader, + Environment, + FileSystemLoader, + PrefixLoader, + TemplateNotFound, +) from pelican.cache import FileStampDataCacher from pelican.contents import Article, Page, Static from pelican.plugins import signals from pelican.readers import Readers -from pelican.utils import (DateFormatter, copy, mkdir_p, order_content, - posixize_path, process_translations) - +from pelican.utils import ( + DateFormatter, + copy, + mkdir_p, + order_content, + posixize_path, + process_translations, +) logger = logging.getLogger(__name__) diff --git a/pelican/log.py b/pelican/log.py index 325ac3ea..1d6ed87b 100644 --- a/pelican/log.py +++ b/pelican/log.py @@ -1,8 +1,8 @@ +from collections import defaultdict +from collections.abc import Mapping import logging import os import sys -from collections import defaultdict -from collections.abc import Mapping __all__ = [ 'init' diff --git a/pelican/paginator.py b/pelican/paginator.py index 7e738fe3..bdfc76e9 100644 --- a/pelican/paginator.py +++ b/pelican/paginator.py @@ -1,8 +1,8 @@ +from collections import namedtuple import functools import logging -import os -from collections import namedtuple from math import ceil +import os logger = logging.getLogger(__name__) PaginationRule = namedtuple( diff --git a/pelican/plugins/_utils.py b/pelican/plugins/_utils.py index 87877b08..c3197df2 100644 --- a/pelican/plugins/_utils.py +++ b/pelican/plugins/_utils.py @@ -6,7 +6,6 @@ import logging import pkgutil import sys - logger = logging.getLogger(__name__) diff --git a/pelican/readers.py b/pelican/readers.py index 15d09908..6b25fcde 100644 --- a/pelican/readers.py +++ b/pelican/readers.py @@ -1,11 +1,11 @@ -import datetime -import logging -import os -import re from collections import OrderedDict +import datetime from html import escape from html.parser import HTMLParser from io import StringIO +import logging +import os +import re import docutils import docutils.core @@ -580,8 +580,8 @@ class Readers(FileStampDataCacher): # eventually filter the content with typogrify if asked so if self.settings['TYPOGRIFY']: - from typogrify.filters import typogrify import smartypants + from typogrify.filters import typogrify typogrify_dashes = self.settings['TYPOGRIFY_DASHES'] if typogrify_dashes == 'oldschool': diff --git a/pelican/rstdirectives.py b/pelican/rstdirectives.py index 500c8578..17ddfcf1 100644 --- a/pelican/rstdirectives.py +++ b/pelican/rstdirectives.py @@ -2,7 +2,6 @@ import re from docutils import nodes, utils from docutils.parsers.rst import Directive, directives, roles - from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import TextLexer, get_lexer_by_name diff --git a/pelican/server.py b/pelican/server.py index 6ebce876..07b16e8e 100644 --- a/pelican/server.py +++ b/pelican/server.py @@ -1,11 +1,11 @@ import argparse +from http import server import logging import os import posixpath import ssl import sys import urllib -from http import server try: from magic import from_file as magic_from_file @@ -13,6 +13,7 @@ except ImportError: magic_from_file = None from pelican.log import init as init_logging + logger = logging.getLogger(__name__) diff --git a/pelican/settings.py b/pelican/settings.py index ea3ee8eb..e4c49e2d 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -5,8 +5,8 @@ import json import locale import logging import os -import re from os.path import isabs +import re from pelican.log import LimitFilter diff --git a/pelican/tests/support.py b/pelican/tests/support.py index 55ddf625..23344303 100644 --- a/pelican/tests/support.py +++ b/pelican/tests/support.py @@ -1,16 +1,16 @@ -import locale -import logging -import os -import re -import subprocess -import sys -import unittest from contextlib import contextmanager from functools import wraps from io import StringIO +import locale +import logging from logging.handlers import BufferingHandler +import os +import re from shutil import rmtree +import subprocess +import sys from tempfile import mkdtemp +import unittest from pelican.contents import Article from pelican.readers import default_metadata diff --git a/pelican/tests/test_cache.py b/pelican/tests/test_cache.py index 564f1d31..2bc28568 100644 --- a/pelican/tests/test_cache.py +++ b/pelican/tests/test_cache.py @@ -6,7 +6,6 @@ from unittest.mock import MagicMock from pelican.generators import ArticlesGenerator, PagesGenerator from pelican.tests.support import get_context, get_settings, unittest - CUR_DIR = os.path.dirname(__file__) CONTENT_DIR = os.path.join(CUR_DIR, 'content') diff --git a/pelican/tests/test_contents.py b/pelican/tests/test_contents.py index 32012d4f..c9da7a7f 100644 --- a/pelican/tests/test_contents.py +++ b/pelican/tests/test_contents.py @@ -10,10 +10,8 @@ from jinja2.utils import generate_lorem_ipsum from pelican.contents import Article, Author, Category, Page, Static from pelican.plugins.signals import content_object_init from pelican.settings import DEFAULT_CONFIG -from pelican.tests.support import (LoggedTestCase, get_context, get_settings, - unittest) -from pelican.utils import (path_to_url, posixize_path, truncate_html_words) - +from pelican.tests.support import LoggedTestCase, get_context, get_settings, unittest +from pelican.utils import path_to_url, posixize_path, truncate_html_words # generate one paragraph, enclosed with

TEST_CONTENT = str(generate_lorem_ipsum(n=1)) diff --git a/pelican/tests/test_generators.py b/pelican/tests/test_generators.py index 0a4a8fdc..0089ac05 100644 --- a/pelican/tests/test_generators.py +++ b/pelican/tests/test_generators.py @@ -1,18 +1,21 @@ import locale import os -import sys from shutil import copy, rmtree +import sys from tempfile import mkdtemp from unittest.mock import MagicMock -from pelican.generators import (ArticlesGenerator, Generator, PagesGenerator, - PelicanTemplateNotFound, StaticGenerator, - TemplatePagesGenerator) -from pelican.tests.support import (can_symlink, get_context, get_settings, - unittest) +from pelican.generators import ( + ArticlesGenerator, + Generator, + PagesGenerator, + PelicanTemplateNotFound, + StaticGenerator, + TemplatePagesGenerator, +) +from pelican.tests.support import can_symlink, get_context, get_settings, unittest from pelican.writers import Writer - CUR_DIR = os.path.dirname(__file__) CONTENT_DIR = os.path.join(CUR_DIR, 'content') diff --git a/pelican/tests/test_importer.py b/pelican/tests/test_importer.py index 76feb9ce..c26ab981 100644 --- a/pelican/tests/test_importer.py +++ b/pelican/tests/test_importer.py @@ -1,16 +1,20 @@ import locale import os -import re from posixpath import join as posix_join +import re from pelican.settings import DEFAULT_CONFIG -from pelican.tests.support import (mute, skipIfNoExecutable, temporary_folder, - unittest) -from pelican.tools.pelican_import import (blogger2fields, build_header, - build_markdown_header, - decode_wp_content, - download_attachments, fields2pelican, - get_attachments, wp2fields) +from pelican.tests.support import mute, skipIfNoExecutable, temporary_folder, unittest +from pelican.tools.pelican_import import ( + blogger2fields, + build_header, + build_markdown_header, + decode_wp_content, + download_attachments, + fields2pelican, + get_attachments, + wp2fields, +) from pelican.utils import path_to_file_url, slugify CUR_DIR = os.path.abspath(os.path.dirname(__file__)) diff --git a/pelican/tests/test_log.py b/pelican/tests/test_log.py index 3f9d7250..cd32f46e 100644 --- a/pelican/tests/test_log.py +++ b/pelican/tests/test_log.py @@ -1,7 +1,7 @@ -import logging -import unittest from collections import defaultdict from contextlib import contextmanager +import logging +import unittest from pelican import log from pelican.tests.support import LogCountHandler diff --git a/pelican/tests/test_paginator.py b/pelican/tests/test_paginator.py index f8233eb4..152c5c4e 100644 --- a/pelican/tests/test_paginator.py +++ b/pelican/tests/test_paginator.py @@ -7,7 +7,6 @@ from pelican.paginator import Paginator from pelican.settings import DEFAULT_CONFIG from pelican.tests.support import get_settings, unittest - # generate one paragraph, enclosed with

TEST_CONTENT = str(generate_lorem_ipsum(n=1)) TEST_SUMMARY = generate_lorem_ipsum(n=1, html=False) diff --git a/pelican/tests/test_pelican.py b/pelican/tests/test_pelican.py index cacc65c1..d6bc164c 100644 --- a/pelican/tests/test_pelican.py +++ b/pelican/tests/test_pelican.py @@ -1,17 +1,16 @@ +from collections.abc import Sequence import locale import logging import os +from shutil import rmtree import subprocess import sys -from collections.abc import Sequence -from shutil import rmtree from tempfile import mkdtemp from pelican import Pelican from pelican.generators import StaticGenerator from pelican.settings import read_settings -from pelican.tests.support import (LoggedTestCase, locale_available, - mute, unittest) +from pelican.tests.support import LoggedTestCase, locale_available, mute, unittest CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) SAMPLES_PATH = os.path.abspath(os.path.join( diff --git a/pelican/tests/test_plugins.py b/pelican/tests/test_plugins.py index 348c3e94..230b2016 100644 --- a/pelican/tests/test_plugins.py +++ b/pelican/tests/test_plugins.py @@ -1,9 +1,8 @@ -import os from contextlib import contextmanager +import os +from pelican.plugins._utils import get_namespace_plugins, get_plugin_name, load_plugins import pelican.tests.dummy_plugins.normal_plugin.normal_plugin as normal_plugin -from pelican.plugins._utils import (get_namespace_plugins, get_plugin_name, - load_plugins) from pelican.tests.support import unittest diff --git a/pelican/tests/test_readers.py b/pelican/tests/test_readers.py index ea5f3bdd..ae6752cf 100644 --- a/pelican/tests/test_readers.py +++ b/pelican/tests/test_readers.py @@ -5,7 +5,6 @@ from pelican import readers from pelican.tests.support import get_settings, unittest from pelican.utils import SafeDatetime - CUR_DIR = os.path.dirname(__file__) CONTENT_PATH = os.path.join(CUR_DIR, 'content') diff --git a/pelican/tests/test_server.py b/pelican/tests/test_server.py index 307a3e10..093b0d85 100644 --- a/pelican/tests/test_server.py +++ b/pelican/tests/test_server.py @@ -1,5 +1,5 @@ -import os from io import BytesIO +import os from shutil import rmtree from tempfile import mkdtemp diff --git a/pelican/tests/test_settings.py b/pelican/tests/test_settings.py index 83203ae5..541f9b87 100644 --- a/pelican/tests/test_settings.py +++ b/pelican/tests/test_settings.py @@ -4,11 +4,15 @@ import os from os.path import abspath, dirname, join from sys import platform - -from pelican.settings import (DEFAULT_CONFIG, DEFAULT_THEME, - _printf_s_to_format_field, - coerce_overrides, configure_settings, - handle_deprecated_settings, read_settings) +from pelican.settings import ( + DEFAULT_CONFIG, + DEFAULT_THEME, + _printf_s_to_format_field, + coerce_overrides, + configure_settings, + handle_deprecated_settings, + read_settings, +) from pelican.tests.support import unittest diff --git a/pelican/tests/test_utils.py b/pelican/tests/test_utils.py index 10816199..56515fce 100644 --- a/pelican/tests/test_utils.py +++ b/pelican/tests/test_utils.py @@ -2,9 +2,9 @@ import locale import logging import os import shutil -import time from sys import platform from tempfile import mkdtemp +import time import pytz @@ -12,8 +12,12 @@ from pelican import utils from pelican.generators import TemplatePagesGenerator from pelican.readers import Readers from pelican.settings import read_settings -from pelican.tests.support import (LoggedTestCase, get_article, - locale_available, unittest) +from pelican.tests.support import ( + LoggedTestCase, + get_article, + locale_available, + unittest, +) from pelican.writers import Writer diff --git a/pelican/tools/pelican_import.py b/pelican/tools/pelican_import.py index b74da750..9966b905 100755 --- a/pelican/tools/pelican_import.py +++ b/pelican/tools/pelican_import.py @@ -1,14 +1,14 @@ #!/usr/bin/env python import argparse +from collections import defaultdict +from html import unescape import logging import os import re import subprocess import sys import time -from collections import defaultdict -from html import unescape from urllib.error import URLError from urllib.parse import quote, urlparse, urlsplit, urlunsplit from urllib.request import urlretrieve @@ -18,7 +18,6 @@ from pelican.log import init from pelican.settings import read_settings from pelican.utils import SafeDatetime, slugify - logger = logging.getLogger(__name__) diff --git a/pelican/tools/pelican_quickstart.py b/pelican/tools/pelican_quickstart.py index 41ddea3c..7c1b7bf8 100755 --- a/pelican/tools/pelican_quickstart.py +++ b/pelican/tools/pelican_quickstart.py @@ -5,7 +5,6 @@ import locale import os from jinja2 import Environment, FileSystemLoader - import pytz try: diff --git a/pelican/tools/templates/publishconf.py.jinja2 b/pelican/tools/templates/publishconf.py.jinja2 index bb18966b..426756dd 100755 --- a/pelican/tools/templates/publishconf.py.jinja2 +++ b/pelican/tools/templates/publishconf.py.jinja2 @@ -6,6 +6,7 @@ import os import sys + sys.path.append(os.curdir) from pelicanconf import * diff --git a/pelican/utils.py b/pelican/utils.py index 8c3a886d..485cf7c4 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -1,28 +1,25 @@ +from collections.abc import Hashable +from contextlib import contextmanager import datetime import fnmatch +from functools import partial +from html import entities +from html.parser import HTMLParser +from itertools import groupby import locale import logging +from operator import attrgetter import os import re import shutil import sys import traceback import urllib -from collections.abc import Hashable -from contextlib import contextmanager -from functools import partial -from html import entities -from html.parser import HTMLParser -from itertools import groupby -from operator import attrgetter import dateutil.parser - from markupsafe import Markup - import pytz - logger = logging.getLogger(__name__) @@ -231,6 +228,7 @@ def slugify(value, regex_subs=(), preserve_case=False, use_unicode=False): """ import unicodedata + import unidecode def normalize_unicode(text): diff --git a/pelican/writers.py b/pelican/writers.py index 73ee4b33..bebc958e 100644 --- a/pelican/writers.py +++ b/pelican/writers.py @@ -4,13 +4,17 @@ from posixpath import join as posix_join from urllib.parse import urljoin from feedgenerator import Atom1Feed, Rss201rev2Feed, get_tag_uri - from markupsafe import Markup from pelican.paginator import Paginator from pelican.plugins import signals -from pelican.utils import (get_relative_path, is_selected_for_writing, - path_to_url, sanitised_join, set_date_tzinfo) +from pelican.utils import ( + get_relative_path, + is_selected_for_writing, + path_to_url, + sanitised_join, + set_date_tzinfo, +) logger = logging.getLogger(__name__) diff --git a/pyproject.toml b/pyproject.toml index 99b1d5d4..f2beceb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,5 +85,15 @@ version-header = "=" version-strings = ["setup.py"] build-system = "setuptools" +[tool.isort] +# Maintain compatibility with Black +profile = "black" + +# Sort imports within their section independent of the import type +force_sort_within_sections = true + +# Designate "pelican" as separate import section +known_pelican = "pelican" +sections = "FUTURE,STDLIB,THIRDPARTY,PELICAN,FIRSTPARTY,LOCALFOLDER" [build-system] requires = ["setuptools >= 40.6.0", "wheel"] diff --git a/setup.py b/setup.py index 5ffd0fdf..dea34729 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,6 @@ from os.path import join, relpath from setuptools import find_packages, setup - version = "4.6.0" requires = ['feedgenerator >= 1.9', 'jinja2 >= 2.7', 'pygments',