12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from __future__ import absolute_import
- import io
- import abc
- import sys
- import email
- if sys.version_info > (3,): # pragma: nocover
- import builtins
- from configparser import ConfigParser
- from contextlib import suppress
- FileNotFoundError = builtins.FileNotFoundError
- IsADirectoryError = builtins.IsADirectoryError
- NotADirectoryError = builtins.NotADirectoryError
- PermissionError = builtins.PermissionError
- map = builtins.map
- else: # pragma: nocover
- from backports.configparser import ConfigParser
- from itertools import imap as map # type: ignore
- from contextlib2 import suppress # noqa
- FileNotFoundError = IOError, OSError
- IsADirectoryError = IOError, OSError
- NotADirectoryError = IOError, OSError
- PermissionError = IOError, OSError
- if sys.version_info > (3, 5): # pragma: nocover
- import pathlib
- else: # pragma: nocover
- import pathlib2 as pathlib
- try:
- ModuleNotFoundError = builtins.FileNotFoundError
- except (NameError, AttributeError): # pragma: nocover
- ModuleNotFoundError = ImportError # type: ignore
- if sys.version_info >= (3,): # pragma: nocover
- from importlib.abc import MetaPathFinder
- else: # pragma: nocover
- class MetaPathFinder(object):
- __metaclass__ = abc.ABCMeta
- __metaclass__ = type
- __all__ = [
- 'install', 'NullFinder', 'MetaPathFinder', 'ModuleNotFoundError',
- 'pathlib', 'ConfigParser', 'map', 'suppress', 'FileNotFoundError',
- 'NotADirectoryError', 'email_message_from_string',
- ]
- def install(cls):
- """Class decorator for installation on sys.meta_path."""
- sys.meta_path.append(cls())
- return cls
- class NullFinder:
- """
- A "Finder" (aka "MetaClassFinder") that never finds any modules,
- but may find distributions.
- """
- @staticmethod
- def find_spec(*args, **kwargs):
- return None
- # In Python 2, the import system requires finders
- # to have a find_module() method, but this usage
- # is deprecated in Python 3 in favor of find_spec().
- # For the purposes of this finder (i.e. being present
- # on sys.meta_path but having no other import
- # system functionality), the two methods are identical.
- find_module = find_spec
- def py2_message_from_string(text): # nocoverpy3
- # Work around https://bugs.python.org/issue25545 where
- # email.message_from_string cannot handle Unicode on Python 2.
- io_buffer = io.StringIO(text)
- return email.message_from_file(io_buffer)
- email_message_from_string = (
- py2_message_from_string
- if sys.version_info < (3,) else
- email.message_from_string
- )
- # https://bitbucket.org/pypy/pypy/issues/3021/ioopen-directory-leaks-a-file-descriptor
- PYPY_OPEN_BUG = getattr(sys, 'pypy_version_info', (9, 9, 9))[:3] <= (7, 1, 1)
|