[pygobject/pygobject-3-42] Implement DynamicImporter.find_spec()



commit f4350ea8c1a752791517b8093778ede51b11b26c
Author: Miro HronĨok <miro hroncok cz>
Date:   Tue May 18 12:31:51 2021 +0200

    Implement DynamicImporter.find_spec()
    
    On Python 3.10, the code raised an ImportWarning:
    
        ImportWarning: DynamicImporter.find_spec() not found; falling back to find_module()
    
    See https://docs.python.org/3.10/whatsnew/3.10.html#deprecated
    
    > Starting in this release, there will be a concerted effort to begin cleaning
    > up old import semantics that were kept for Python 2.7 compatibility.
    > Specifically, find_loader()/find_module() (superseded by find_spec()),
    > load_module() (superseded by exec_module()), module_repr()
    > (which the import system takes care of for you),
    > the __package__ attribute (superseded by __spec__.parent),
    > the __loader__ attribute (superseded by __spec__.loader),
    > and the __cached__ attribute (superseded by __spec__.cached)
    > will slowly be removed (as well as other classes and methods in importlib).
    > ImportWarning and/or DeprecationWarning will be raised as appropriate to help
    > identify code which needs updating during this transition.
    
    Fixes https://gitlab.gnome.org/GNOME/pygobject/-/issues/473

 gi/importer.py | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
---
diff --git a/gi/importer.py b/gi/importer.py
index 32967974..63788776 100644
--- a/gi/importer.py
+++ b/gi/importer.py
@@ -107,15 +107,20 @@ class DynamicImporter(object):
     def __init__(self, path):
         self.path = path
 
-    def find_module(self, fullname, path=None):
+    def _find_module_check(self, fullname):
         if not fullname.startswith(self.path):
-            return
+            return False
 
         path, namespace = fullname.rsplit('.', 1)
-        if path != self.path:
-            return
+        return path == self.path
+
+    def find_spec(self, fullname, path=None, target=None):
+        if self._find_module_check(fullname):
+            return importlib.util.spec_from_loader(fullname, self)
 
-        return self
+    def find_module(self, fullname, path=None):
+        if self._find_module_check(fullname):
+            return self
 
     def load_module(self, fullname):
         if fullname in sys.modules:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]