Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/importlib_metadata/_compat.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:d30785e31577 | 1:56ad4e20f292 |
---|---|
1 from __future__ import absolute_import, unicode_literals | |
2 | |
3 import io | |
4 import abc | |
5 import sys | |
6 import email | |
7 | |
8 | |
9 if sys.version_info > (3,): # pragma: nocover | |
10 import builtins | |
11 from configparser import ConfigParser | |
12 import contextlib | |
13 FileNotFoundError = builtins.FileNotFoundError | |
14 IsADirectoryError = builtins.IsADirectoryError | |
15 NotADirectoryError = builtins.NotADirectoryError | |
16 PermissionError = builtins.PermissionError | |
17 map = builtins.map | |
18 from itertools import filterfalse | |
19 else: # pragma: nocover | |
20 from backports.configparser import ConfigParser | |
21 from itertools import imap as map # type: ignore | |
22 from itertools import ifilterfalse as filterfalse | |
23 import contextlib2 as contextlib | |
24 FileNotFoundError = IOError, OSError | |
25 IsADirectoryError = IOError, OSError | |
26 NotADirectoryError = IOError, OSError | |
27 PermissionError = IOError, OSError | |
28 | |
29 str = type('') | |
30 | |
31 suppress = contextlib.suppress | |
32 | |
33 if sys.version_info > (3, 5): # pragma: nocover | |
34 import pathlib | |
35 else: # pragma: nocover | |
36 import pathlib2 as pathlib | |
37 | |
38 try: | |
39 ModuleNotFoundError = builtins.FileNotFoundError | |
40 except (NameError, AttributeError): # pragma: nocover | |
41 ModuleNotFoundError = ImportError # type: ignore | |
42 | |
43 | |
44 if sys.version_info >= (3,): # pragma: nocover | |
45 from importlib.abc import MetaPathFinder | |
46 else: # pragma: nocover | |
47 class MetaPathFinder(object): | |
48 __metaclass__ = abc.ABCMeta | |
49 | |
50 | |
51 __metaclass__ = type | |
52 __all__ = [ | |
53 'install', 'NullFinder', 'MetaPathFinder', 'ModuleNotFoundError', | |
54 'pathlib', 'ConfigParser', 'map', 'suppress', 'FileNotFoundError', | |
55 'NotADirectoryError', 'email_message_from_string', | |
56 ] | |
57 | |
58 | |
59 def install(cls): | |
60 """ | |
61 Class decorator for installation on sys.meta_path. | |
62 | |
63 Adds the backport DistributionFinder to sys.meta_path and | |
64 attempts to disable the finder functionality of the stdlib | |
65 DistributionFinder. | |
66 """ | |
67 sys.meta_path.append(cls()) | |
68 disable_stdlib_finder() | |
69 return cls | |
70 | |
71 | |
72 def disable_stdlib_finder(): | |
73 """ | |
74 Give the backport primacy for discovering path-based distributions | |
75 by monkey-patching the stdlib O_O. | |
76 | |
77 See #91 for more background for rationale on this sketchy | |
78 behavior. | |
79 """ | |
80 def matches(finder): | |
81 return ( | |
82 getattr(finder, '__module__', None) == '_frozen_importlib_external' | |
83 and hasattr(finder, 'find_distributions') | |
84 ) | |
85 for finder in filter(matches, sys.meta_path): # pragma: nocover | |
86 del finder.find_distributions | |
87 | |
88 | |
89 class NullFinder: | |
90 """ | |
91 A "Finder" (aka "MetaClassFinder") that never finds any modules, | |
92 but may find distributions. | |
93 """ | |
94 @staticmethod | |
95 def find_spec(*args, **kwargs): | |
96 return None | |
97 | |
98 # In Python 2, the import system requires finders | |
99 # to have a find_module() method, but this usage | |
100 # is deprecated in Python 3 in favor of find_spec(). | |
101 # For the purposes of this finder (i.e. being present | |
102 # on sys.meta_path but having no other import | |
103 # system functionality), the two methods are identical. | |
104 find_module = find_spec | |
105 | |
106 | |
107 def py2_message_from_string(text): # nocoverpy3 | |
108 # Work around https://bugs.python.org/issue25545 where | |
109 # email.message_from_string cannot handle Unicode on Python 2. | |
110 io_buffer = io.StringIO(text) | |
111 return email.message_from_file(io_buffer) | |
112 | |
113 | |
114 email_message_from_string = ( | |
115 py2_message_from_string | |
116 if sys.version_info < (3,) else | |
117 email.message_from_string | |
118 ) | |
119 | |
120 | |
121 class PyPy_repr: | |
122 """ | |
123 Override repr for EntryPoint objects on PyPy to avoid __iter__ access. | |
124 Ref #97, #102. | |
125 """ | |
126 affected = hasattr(sys, 'pypy_version_info') | |
127 | |
128 def __compat_repr__(self): # pragma: nocover | |
129 def make_param(name): | |
130 value = getattr(self, name) | |
131 return '{name}={value!r}'.format(**locals()) | |
132 params = ', '.join(map(make_param, self._fields)) | |
133 return 'EntryPoint({params})'.format(**locals()) | |
134 | |
135 if affected: # pragma: nocover | |
136 __repr__ = __compat_repr__ | |
137 del affected | |
138 | |
139 | |
140 # from itertools recipes | |
141 def unique_everseen(iterable): # pragma: nocover | |
142 "List unique elements, preserving order. Remember all elements ever seen." | |
143 seen = set() | |
144 seen_add = seen.add | |
145 | |
146 for element in filterfalse(seen.__contains__, iterable): | |
147 seen_add(element) | |
148 yield element | |
149 | |
150 | |
151 unique_ordered = ( | |
152 unique_everseen if sys.version_info < (3, 7) else dict.fromkeys) |