From 27f67a58a44811e723a0cb689cbc1b287b9c5391 Mon Sep 17 00:00:00 2001 From: Michal Szczesny Date: Fri, 8 Sep 2023 12:27:47 +0100 Subject: [PATCH] Replace imp with importlib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This project uses the imp module which has been deprecated since Python 3.4 and set for removal in 3.12: • Raised PendingDeprecationWarning since 3.4 (2014) • Raised DeprecationWarning since 3.5 (2015) • Updated DeprecationWarning to say removal in 3.12 since 3.10 (2021) • Removal planned for 3.12 (2023) This change removes the dependency on imp in favour of importlib. Co-authored-by: @jbkkd Inspired by: @mgorny https://github.com/jazzband/django-configurations/issues/358 --- configurations/importer.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/configurations/importer.py b/configurations/importer.py index e3573f4..499eab6 100644 --- a/configurations/importer.py +++ b/configurations/importer.py @@ -1,4 +1,5 @@ -import imp +import importlib.util +from importlib.machinery import PathFinder import logging import os import sys @@ -126,25 +127,30 @@ def stylize(text): self.name)) self.logger.debug(stylize(message)) - def find_module(self, fullname, path=None): + def find_spec(self, fullname, path=None, target=None): if fullname is not None and fullname == self.module: - module = fullname.rsplit('.', 1)[-1] - return ConfigurationLoader(self.name, - imp.find_module(module, path)) + spec = PathFinder.find_spec(fullname, path) + if spec is not None: + return importlib.machinery.ModuleSpec(spec.name, + ConfigurationLoader(self.name, spec), + origin=spec.origin) return None class ConfigurationLoader: - def __init__(self, name, location): + def __init__(self, name, spec): self.name = name - self.location = location + self.spec = spec def load_module(self, fullname): if fullname in sys.modules: mod = sys.modules[fullname] # pragma: no cover else: - mod = imp.load_module(fullname, *self.location) + mod = importlib.util.module_from_spec(self.spec) + sys.modules[fullname] = mod + self.spec.loader.exec_module(mod) + cls_path = '{0}.{1}'.format(mod.__name__, self.name) try: