Abhilash Raj pushed to branch master at GNU Mailman / Mailman Core
Commits:
f0aae233 by Abhilash Raj at 2020-04-10T05:52:00+00:00
Wrap importlib.resources.path for divergent behaviors.
Create a new utility function which makes it easy to patch Mailman to work with
standard library importlib.resources by patching the divergent behavior with a
utility function.
- - - - -
31867019 by Abhilash Raj at 2020-04-10T05:52:00+00:00
Merge branch 'importlib-resources' into 'master'
Wrap importlib.resources.path for divergent behaviors.
See merge request mailman/mailman!615
- - - - -
4 changed files:
- src/mailman/utilities/filesystem.py
- src/mailman/utilities/i18n.py
- src/mailman/utilities/tests/test_modules.py
- src/mailman/utilities/tests/test_templates.py
Changes:
=====================================
src/mailman/utilities/filesystem.py
=====================================
@@ -86,6 +86,7 @@ def safe_remove(path):
os.remove(path)
+@public
def first_inexistent_directory(path):
"""Splits iteratively a path until it gives the first non-existent
directory in the tree.
@@ -108,3 +109,31 @@ def first_inexistent_directory(path):
"The path %s exists but is not a directory.",
directory)
directory, rhs = os.path.split(directory)
+
+
+@public
+def path(package, module, *args, **kw):
+ """Wrap around importlib.resources.path.
+
+ importlib_resources.path (PyPI package we use for compatibility in Python <
+ 3.7) has now diverged in behavior from importlib.resources.path (in Python
+ >= 3.7), especially in terms of supporting directories. Even though we can
+ just jump to the new version of the library, many distributions packaging
+ Mailman do not package importlib_resources at all and instead patch the
+ source code to simply replace importlib_resources with importlib.resources.
+
+ This utility method is meant to keep that patching ability without any
+ complicated patches to make Mailman work with standard library
+ importlib.resources. This is only supposed to be used where the divergent
+ behavior causes problems for us.
+ """
+ # Note to packaging teams: This function will handle both standard library
+ # and 3rd party importlib_resources package. Please do not patch it.
+ try:
+ from importlib.resources import path
+ return path(package, module, *args, **kw)
+ except ImportError: # pragma: nocover
+ from importlib_resources import files # pragma: nocover
+ if module: # pragma: nocover
+ package = '{}.{}'.format(package, module) # pragma: nocover
+ return files(package, *args, **kw) # pragma: nocover
=====================================
src/mailman/utilities/i18n.py
=====================================
@@ -21,11 +21,11 @@ import os
import sys
from contextlib import ExitStack
-from importlib_resources import files
from itertools import product
from mailman.config import config
from mailman.core.constants import system_preferences
from mailman.interfaces.errors import MailmanError
+from mailman.utilities.filesystem import path
from public import public
@@ -114,7 +114,7 @@ def search(resources, template_file, mlist=None,
language=None):
languages.append(language)
languages.reverse()
# The non-language qualified $template_dir paths in search order.
- templates_dir = str(resources.enter_context(files('mailman.templates')))
+ templates_dir = str(resources.enter_context(path('mailman', 'templates')))
paths = [templates_dir, os.path.join(config.TEMPLATE_DIR, 'site')]
if mlist is not None:
# Don't forget these are in REVERSE search order!
=====================================
src/mailman/utilities/tests/test_modules.py
=====================================
@@ -22,11 +22,11 @@ import sys
import unittest
from contextlib import ExitStack, contextmanager
-from importlib_resources import files
from mailman.interfaces.rules import IRule
from mailman.interfaces.styles import IStyle
from mailman.testing.helpers import configuration
from mailman.testing.layers import ConfigLayer
+from mailman.utilities.filesystem import path
from mailman.utilities.modules import (
find_components, find_pluggable_components, hacked_sys_modules)
from pathlib import Path
@@ -162,7 +162,7 @@ class AbstractStyle:
def test_find_pluggable_components_by_plugin_name(self):
with ExitStack() as resources:
testing_path = resources.enter_context(
- files('mailman.plugins.testing'))
+ path('mailman.plugins.testing', ''))
resources.enter_context(hack_syspath(0, str(testing_path)))
resources.enter_context(configuration('plugin.example', **{
'class': 'example.hooks.ExamplePlugin',
@@ -174,7 +174,7 @@ class AbstractStyle:
def test_find_pluggable_components_by_component_package(self):
with ExitStack() as resources:
testing_path = resources.enter_context(
- files('mailman.plugins.testing'))
+ path('mailman.plugins.testing', ''))
resources.enter_context(hack_syspath(0, str(testing_path)))
resources.enter_context(configuration('plugin.example', **{
'class': 'example.hooks.ExamplePlugin',
=====================================
src/mailman/utilities/tests/test_templates.py
=====================================
@@ -23,11 +23,11 @@ import tempfile
import unittest
from contextlib import ExitStack
-from importlib_resources import files as resource_path
from mailman.app.lifecycle import create_list
from mailman.config import config
from mailman.interfaces.languages import ILanguageManager
from mailman.testing.layers import ConfigLayer
+from mailman.utilities.filesystem import path as resource_path
from mailman.utilities.i18n import TemplateNotFoundError, find, search
from zope.component import getUtility
@@ -64,7 +64,7 @@ class TestSearchOrder(unittest.TestCase):
# /m/ as the root.
with ExitStack() as resources:
in_tree = str(resources.enter_context(
- resource_path('mailman.templates')).parent)
+ resource_path('mailman', 'templates')).parent)
raw_search_order = search(
resources, template_file, mailing_list, language)
for path in raw_search_order:
View it on GitLab:
https://gitlab.com/mailman/mailman/-/compare/a565d3e3bc6f68e7ec87082e8edff0e7490823d3...318670193143f268394dbe834ec6a87de04f8ec5
--
View it on GitLab:
https://gitlab.com/mailman/mailman/-/compare/a565d3e3bc6f68e7ec87082e8edff0e7490823d3...318670193143f268394dbe834ec6a87de04f8ec5
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org