commit: 34626d0465b689a569c0ea41bb529f00d760057f Author: Brian Harring <ferringb <AT> gmail <DOT> com> AuthorDate: Sat Nov 29 16:51:34 2025 +0000 Commit: Brian Harring <ferringb <AT> gmail <DOT> com> CommitDate: Sat Nov 29 18:32:56 2025 +0000 URL: https://gitweb.gentoo.org/proj/pkgcore/snakeoil.git/commit/?id=34626d04
chore: delete demandimport Usage of this was removed in 2020 in 87ca2f5 in pkgcore. Frankly the mechanism there isn't designed for devex or robustness; the original demandload is doing things that made since >5-10y ago and isn't modern is what is in use. Signed-off-by: Brian Harring <ferringb <AT> gmail.com> src/snakeoil/demandimport.py | 129 ------------------------------------------- tests/test_code_quality.py | 3 +- 2 files changed, 1 insertion(+), 131 deletions(-) diff --git a/src/snakeoil/demandimport.py b/src/snakeoil/demandimport.py deleted file mode 100644 index d95f515..0000000 --- a/src/snakeoil/demandimport.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Import modules on demand. - -See https://bugs.python.org/issue17621 for background. -""" - -import contextlib -import importlib.machinery -import os -import sys -from importlib.util import LazyLoader - -# global flag controlling lazy import support -_disabled = False - -# modules that have issues when lazily imported -_skip = frozenset( - [ - "__builtin__", - "__future__", - "builtins", - "grp", - "pwd", - "OpenSSL.SSL", # pyopenssl - ] -) - - -class _LazyLoader(LazyLoader): - """LazyLoader with extended support for disabling and skipping modules.""" - - def exec_module(self, module): - """Make the module load lazily.""" - if _disabled or module.__name__ in _skip: - self.loader.exec_module(module) - else: - super().exec_module(module) - - -# custom loaders using our extended LazyLoader -_extensions_loader = _LazyLoader.factory(importlib.machinery.ExtensionFileLoader) -_bytecode_loader = _LazyLoader.factory(importlib.machinery.SourcelessFileLoader) -_source_loader = _LazyLoader.factory(importlib.machinery.SourceFileLoader) - - -def _filefinder(path): - """Return a custom FileFinder using our lazy loaders.""" - return importlib.machinery.FileFinder( - path, - (_extensions_loader, importlib.machinery.EXTENSION_SUFFIXES), - (_source_loader, importlib.machinery.SOURCE_SUFFIXES), - (_bytecode_loader, importlib.machinery.BYTECODE_SUFFIXES), - ) - - -def enable(): - """Enable lazy loading for all future module imports.""" - if os.environ.get("SNAKEOIL_DEMANDIMPORT", "y").lower() not in ( - "n", - "no", - "0", - "false", - ): - sys.path_hooks.insert(0, _filefinder) - - -def is_enabled(): - """Determine if lazy loading is currently enabled.""" - return _filefinder in sys.path_hooks and not _disabled - - -def disable(): - """Disable lazy loading for all future module imports.""" - try: - while True: - sys.path_hooks.remove(_filefinder) - except ValueError: - pass - - [email protected] -def disabled(): - """Context manager for temporarily disabling lazy imports. - - Example usage: - >>> from importlib.util import _LazyModule - >>> from snakeoil import demandimport - >>> demandimport.enable() - >>> - >>> with demandimport.disabled(): - >>> from module import submodule - >>> assert not isinstance(submodule, _LazyModule) - """ - global _disabled - enabled = is_enabled() - if enabled: - _disabled = True - try: - yield - finally: - if enabled: - _disabled = False - - [email protected] -def enabled(): - """Context manager for temporarily enabling lazy imports. - - Useful as a workaround for avoiding circular import issues. - - Example usage: - >>> from importlib.util import _LazyModule - >>> from snakeoil import demandimport - >>> - >>> with demandimport.enabled(): - >>> from module import submodule - >>> assert isinstance(submodule, _LazyModule) - >>> from module2 import submodule2 - >>> assert not isinstance(submodule2, _LazyModule) - """ - global _disabled - enabled = is_enabled() - if not enabled: - _disabled = False - enable() - try: - yield - finally: - if not enabled: - _disabled = True diff --git a/tests/test_code_quality.py b/tests/test_code_quality.py index 98d3f95..cf34604 100644 --- a/tests/test_code_quality.py +++ b/tests/test_code_quality.py @@ -12,8 +12,7 @@ class TestSlots(code_quality.Slots): "snakeoil.constraints", "snakeoil.contexts", "snakeoil.data_source", # oofta on that class, py2k/py3k transition was brutal on that one. - "snakeoil.demandload", # needs to be rewritten to descriptor protocol in particular. - "snakeoil.demandimport", # may need rewrite, but isn't worth caring. Py3.15 renders this dead. + "snakeoil.demandload", # needs to be rewritten to descriptor protocol in particular "snakeoil.klass.deprecated", "snakeoil.dist", "snakeoil.formatters",
