comparison planemo/lib/python3.7/site-packages/importlib_metadata/tests/fixtures.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 unicode_literals
2
3 import os
4 import sys
5 import shutil
6 import tempfile
7 import textwrap
8 import test.support
9
10 from .._compat import pathlib, contextlib
11
12
13 __metaclass__ = type
14
15
16 @contextlib.contextmanager
17 def tempdir():
18 tmpdir = tempfile.mkdtemp()
19 try:
20 yield pathlib.Path(tmpdir)
21 finally:
22 shutil.rmtree(tmpdir)
23
24
25 @contextlib.contextmanager
26 def save_cwd():
27 orig = os.getcwd()
28 try:
29 yield
30 finally:
31 os.chdir(orig)
32
33
34 @contextlib.contextmanager
35 def tempdir_as_cwd():
36 with tempdir() as tmp:
37 with save_cwd():
38 os.chdir(str(tmp))
39 yield tmp
40
41
42 @contextlib.contextmanager
43 def install_finder(finder):
44 sys.meta_path.append(finder)
45 try:
46 yield
47 finally:
48 sys.meta_path.remove(finder)
49
50
51 class Fixtures:
52 def setUp(self):
53 self.fixtures = contextlib.ExitStack()
54 self.addCleanup(self.fixtures.close)
55
56
57 class SiteDir(Fixtures):
58 def setUp(self):
59 super(SiteDir, self).setUp()
60 self.site_dir = self.fixtures.enter_context(tempdir())
61
62
63 class OnSysPath(Fixtures):
64 @staticmethod
65 @contextlib.contextmanager
66 def add_sys_path(dir):
67 sys.path[:0] = [str(dir)]
68 try:
69 yield
70 finally:
71 sys.path.remove(str(dir))
72
73 def setUp(self):
74 super(OnSysPath, self).setUp()
75 self.fixtures.enter_context(self.add_sys_path(self.site_dir))
76
77
78 class DistInfoPkg(OnSysPath, SiteDir):
79 files = {
80 "distinfo_pkg-1.0.0.dist-info": {
81 "METADATA": """
82 Name: distinfo-pkg
83 Author: Steven Ma
84 Version: 1.0.0
85 Requires-Dist: wheel >= 1.0
86 Requires-Dist: pytest; extra == 'test'
87 """,
88 "RECORD": "mod.py,sha256=abc,20\n",
89 "entry_points.txt": """
90 [entries]
91 main = mod:main
92 ns:sub = mod:main
93 """
94 },
95 "mod.py": """
96 def main():
97 print("hello world")
98 """,
99 }
100
101 def setUp(self):
102 super(DistInfoPkg, self).setUp()
103 build_files(DistInfoPkg.files, self.site_dir)
104
105
106 class DistInfoPkgOffPath(SiteDir):
107 def setUp(self):
108 super(DistInfoPkgOffPath, self).setUp()
109 build_files(DistInfoPkg.files, self.site_dir)
110
111
112 class EggInfoPkg(OnSysPath, SiteDir):
113 files = {
114 "egginfo_pkg.egg-info": {
115 "PKG-INFO": """
116 Name: egginfo-pkg
117 Author: Steven Ma
118 License: Unknown
119 Version: 1.0.0
120 Classifier: Intended Audience :: Developers
121 Classifier: Topic :: Software Development :: Libraries
122 """,
123 "SOURCES.txt": """
124 mod.py
125 egginfo_pkg.egg-info/top_level.txt
126 """,
127 "entry_points.txt": """
128 [entries]
129 main = mod:main
130 """,
131 "requires.txt": """
132 wheel >= 1.0; python_version >= "2.7"
133 [test]
134 pytest
135 """,
136 "top_level.txt": "mod\n"
137 },
138 "mod.py": """
139 def main():
140 print("hello world")
141 """,
142 }
143
144 def setUp(self):
145 super(EggInfoPkg, self).setUp()
146 build_files(EggInfoPkg.files, prefix=self.site_dir)
147
148
149 class EggInfoFile(OnSysPath, SiteDir):
150 files = {
151 "egginfo_file.egg-info": """
152 Metadata-Version: 1.0
153 Name: egginfo_file
154 Version: 0.1
155 Summary: An example package
156 Home-page: www.example.com
157 Author: Eric Haffa-Vee
158 Author-email: eric@example.coms
159 License: UNKNOWN
160 Description: UNKNOWN
161 Platform: UNKNOWN
162 """,
163 }
164
165 def setUp(self):
166 super(EggInfoFile, self).setUp()
167 build_files(EggInfoFile.files, prefix=self.site_dir)
168
169
170 class LocalPackage:
171 files = {
172 "setup.py": """
173 import setuptools
174 setuptools.setup(name="local-pkg", version="2.0.1")
175 """,
176 }
177
178 def setUp(self):
179 self.fixtures = contextlib.ExitStack()
180 self.addCleanup(self.fixtures.close)
181 self.fixtures.enter_context(tempdir_as_cwd())
182 build_files(self.files)
183
184
185 def build_files(file_defs, prefix=pathlib.Path()):
186 """Build a set of files/directories, as described by the
187
188 file_defs dictionary. Each key/value pair in the dictionary is
189 interpreted as a filename/contents pair. If the contents value is a
190 dictionary, a directory is created, and the dictionary interpreted
191 as the files within it, recursively.
192
193 For example:
194
195 {"README.txt": "A README file",
196 "foo": {
197 "__init__.py": "",
198 "bar": {
199 "__init__.py": "",
200 },
201 "baz.py": "# Some code",
202 }
203 }
204 """
205 for name, contents in file_defs.items():
206 full_name = prefix / name
207 if isinstance(contents, dict):
208 full_name.mkdir()
209 build_files(contents, prefix=full_name)
210 else:
211 if isinstance(contents, bytes):
212 with full_name.open('wb') as f:
213 f.write(contents)
214 else:
215 with full_name.open('w') as f:
216 f.write(DALS(contents))
217
218
219 class FileBuilder:
220 def unicode_filename(self):
221 return test.support.FS_NONASCII or \
222 self.skip("File system does not support non-ascii.")
223
224
225 def DALS(str):
226 "Dedent and left-strip"
227 return textwrap.dedent(str).lstrip()
228
229
230 class NullFinder:
231 def find_module(self, name):
232 pass