You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
import os import sys import platform
from typing import Union
__all__ = ['install', 'NullFinder', 'Protocol']
try: from typing import Protocol except ImportError: # pragma: no cover # Python 3.7 compatibility from typing_extensions import Protocol # type: ignore
def install(cls): """
Class decorator for installation on sys.meta_path.
Adds the backport DistributionFinder to sys.meta_path and attempts to disable the finder functionality of the stdlib DistributionFinder. """
sys.meta_path.append(cls()) disable_stdlib_finder() return cls
def disable_stdlib_finder(): """
Give the backport primacy for discovering path-based distributions by monkey-patching the stdlib O_O.
See #91 for more background for rationale on this sketchy behavior. """
def matches(finder): return getattr( finder, '__module__', None ) == '_frozen_importlib_external' and hasattr(finder, 'find_distributions')
for finder in filter(matches, sys.meta_path): # pragma: nocover del finder.find_distributions
class NullFinder: """
A "Finder" (aka "MetaClassFinder") that never finds any modules, but may find distributions. """
@staticmethod def find_spec(*args, **kwargs): return None
def pypy_partial(val): """
Adjust for variable stacklevel on partial under PyPy.
Workaround for #327. """
is_pypy = platform.python_implementation() == 'PyPy' return val + is_pypy
if sys.version_info >= (3, 9): StrPath = Union[str, os.PathLike[str]] else: # PathLike is only subscriptable at runtime in 3.9+ StrPath = Union[str, "os.PathLike[str]"] # pragma: no cover
|