From 2cac0286642417e89a8e36031046e65777afd3fd Mon Sep 17 00:00:00 2001 From: Peter Ebden Date: Wed, 13 Mar 2024 18:00:35 +0000 Subject: [PATCH] Implement find_spec (#129) * Quiet down warnings about find_spec * version --- tools/ChangeLog | 4 ++++ tools/VERSION | 2 +- tools/please_pex/pex/pex_main.py | 20 ++++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/tools/ChangeLog b/tools/ChangeLog index ba1042e..580696d 100644 --- a/tools/ChangeLog +++ b/tools/ChangeLog @@ -1,3 +1,7 @@ +Version 1.2.1 +------------- + * Quieten warnings from ModuleDirImport / SoImport in newer Python versions + Version 1.2.0 ------------- * Upgrade importlib-metadata to 6.8.0 (#122) - note that this increases the diff --git a/tools/VERSION b/tools/VERSION index 26aaba0..6085e94 100644 --- a/tools/VERSION +++ b/tools/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 diff --git a/tools/please_pex/pex/pex_main.py b/tools/please_pex/pex/pex_main.py index 0885c32..009d280 100644 --- a/tools/please_pex/pex/pex_main.py +++ b/tools/please_pex/pex/pex_main.py @@ -1,6 +1,8 @@ """Zipfile entry point which supports auto-extracting itself based on zip-safety.""" from importlib import import_module +from importlib.abc import MetaPathFinder +from importlib.util import spec_from_loader from zipfile import ZipFile, ZipInfo, is_zipfile import os import runpy @@ -109,7 +111,7 @@ def _extract_member(self, member, targetpath, pwd): os.chmod(targetpath, attr) return targetpath -class SoImport(object): +class SoImport(MetaPathFinder): """So import. Much binary. Such dynamic. Wow.""" def __init__(self): @@ -136,6 +138,13 @@ def __init__(self): if self.modules: self.zf = zf + def find_spec(self, name, path, target=None): + """Implements abc.MetaPathFinder.""" + loader = self.find_module(name, path) + if loader is None: + return None + return spec_from_loader(name, loader) + def find_module(self, fullname, path=None): """Attempt to locate module. Returns self if found, None if not.""" if fullname in self.modules: @@ -167,7 +176,7 @@ def splitext(self, path): return None, None -class ModuleDirImport(object): +class ModuleDirImport(MetaPathFinder): """Handles imports to a directory equivalently to them being at the top level. This means that if one writes `import third_party.python.six`, it's imported like `import six`, @@ -178,6 +187,13 @@ class ModuleDirImport(object): def __init__(self, module_dir=MODULE_DIR): self.prefix = module_dir.replace('/', '.') + '.' + def find_spec(self, name, path, target=None): + """Implements abc.MetaPathFinder.""" + loader = self.find_module(name, path) + if loader is None: + return None + return spec_from_loader(name, loader) + def find_module(self, fullname, path=None): """Attempt to locate module. Returns self if found, None if not.""" if fullname.startswith(self.prefix):