comparison env/lib/python3.9/site-packages/setuptools/command/sdist.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 from distutils import log
2 import distutils.command.sdist as orig
3 import os
4 import sys
5 import io
6 import contextlib
7
8 from setuptools.extern import ordered_set
9
10 from .py36compat import sdist_add_defaults
11
12 import pkg_resources
13
14 _default_revctrl = list
15
16
17 def walk_revctrl(dirname=''):
18 """Find all files under revision control"""
19 for ep in pkg_resources.iter_entry_points('setuptools.file_finders'):
20 for item in ep.load()(dirname):
21 yield item
22
23
24 class sdist(sdist_add_defaults, orig.sdist):
25 """Smart sdist that finds anything supported by revision control"""
26
27 user_options = [
28 ('formats=', None,
29 "formats for source distribution (comma-separated list)"),
30 ('keep-temp', 'k',
31 "keep the distribution tree around after creating " +
32 "archive file(s)"),
33 ('dist-dir=', 'd',
34 "directory to put the source distribution archive(s) in "
35 "[default: dist]"),
36 ]
37
38 negative_opt = {}
39
40 README_EXTENSIONS = ['', '.rst', '.txt', '.md']
41 READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS)
42
43 def run(self):
44 self.run_command('egg_info')
45 ei_cmd = self.get_finalized_command('egg_info')
46 self.filelist = ei_cmd.filelist
47 self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt'))
48 self.check_readme()
49
50 # Run sub commands
51 for cmd_name in self.get_sub_commands():
52 self.run_command(cmd_name)
53
54 self.make_distribution()
55
56 dist_files = getattr(self.distribution, 'dist_files', [])
57 for file in self.archive_files:
58 data = ('sdist', '', file)
59 if data not in dist_files:
60 dist_files.append(data)
61
62 def initialize_options(self):
63 orig.sdist.initialize_options(self)
64
65 self._default_to_gztar()
66
67 def _default_to_gztar(self):
68 # only needed on Python prior to 3.6.
69 if sys.version_info >= (3, 6, 0, 'beta', 1):
70 return
71 self.formats = ['gztar']
72
73 def make_distribution(self):
74 """
75 Workaround for #516
76 """
77 with self._remove_os_link():
78 orig.sdist.make_distribution(self)
79
80 @staticmethod
81 @contextlib.contextmanager
82 def _remove_os_link():
83 """
84 In a context, remove and restore os.link if it exists
85 """
86
87 class NoValue:
88 pass
89
90 orig_val = getattr(os, 'link', NoValue)
91 try:
92 del os.link
93 except Exception:
94 pass
95 try:
96 yield
97 finally:
98 if orig_val is not NoValue:
99 setattr(os, 'link', orig_val)
100
101 def _add_defaults_optional(self):
102 super()._add_defaults_optional()
103 if os.path.isfile('pyproject.toml'):
104 self.filelist.append('pyproject.toml')
105
106 def _add_defaults_python(self):
107 """getting python files"""
108 if self.distribution.has_pure_modules():
109 build_py = self.get_finalized_command('build_py')
110 self.filelist.extend(build_py.get_source_files())
111 self._add_data_files(self._safe_data_files(build_py))
112
113 def _safe_data_files(self, build_py):
114 """
115 Extracting data_files from build_py is known to cause
116 infinite recursion errors when `include_package_data`
117 is enabled, so suppress it in that case.
118 """
119 if self.distribution.include_package_data:
120 return ()
121 return build_py.data_files
122
123 def _add_data_files(self, data_files):
124 """
125 Add data files as found in build_py.data_files.
126 """
127 self.filelist.extend(
128 os.path.join(src_dir, name)
129 for _, src_dir, _, filenames in data_files
130 for name in filenames
131 )
132
133 def _add_defaults_data_files(self):
134 try:
135 super()._add_defaults_data_files()
136 except TypeError:
137 log.warn("data_files contains unexpected objects")
138
139 def check_readme(self):
140 for f in self.READMES:
141 if os.path.exists(f):
142 return
143 else:
144 self.warn(
145 "standard file not found: should have one of " +
146 ', '.join(self.READMES)
147 )
148
149 def make_release_tree(self, base_dir, files):
150 orig.sdist.make_release_tree(self, base_dir, files)
151
152 # Save any egg_info command line options used to create this sdist
153 dest = os.path.join(base_dir, 'setup.cfg')
154 if hasattr(os, 'link') and os.path.exists(dest):
155 # unlink and re-copy, since it might be hard-linked, and
156 # we don't want to change the source version
157 os.unlink(dest)
158 self.copy_file('setup.cfg', dest)
159
160 self.get_finalized_command('egg_info').save_version_info(dest)
161
162 def _manifest_is_not_generated(self):
163 # check for special comment used in 2.7.1 and higher
164 if not os.path.isfile(self.manifest):
165 return False
166
167 with io.open(self.manifest, 'rb') as fp:
168 first_line = fp.readline()
169 return (first_line !=
170 '# file GENERATED by distutils, do NOT edit\n'.encode())
171
172 def read_manifest(self):
173 """Read the manifest file (named by 'self.manifest') and use it to
174 fill in 'self.filelist', the list of files to include in the source
175 distribution.
176 """
177 log.info("reading manifest file '%s'", self.manifest)
178 manifest = open(self.manifest, 'rb')
179 for line in manifest:
180 # The manifest must contain UTF-8. See #303.
181 try:
182 line = line.decode('UTF-8')
183 except UnicodeDecodeError:
184 log.warn("%r not UTF-8 decodable -- skipping" % line)
185 continue
186 # ignore comments and blank lines
187 line = line.strip()
188 if line.startswith('#') or not line:
189 continue
190 self.filelist.append(line)
191 manifest.close()
192
193 def check_license(self):
194 """Checks if license_file' or 'license_files' is configured and adds any
195 valid paths to 'self.filelist'.
196 """
197
198 files = ordered_set.OrderedSet()
199
200 opts = self.distribution.get_option_dict('metadata')
201
202 # ignore the source of the value
203 _, license_file = opts.get('license_file', (None, None))
204
205 if license_file is None:
206 log.debug("'license_file' option was not specified")
207 else:
208 files.add(license_file)
209
210 try:
211 files.update(self.distribution.metadata.license_files)
212 except TypeError:
213 log.warn("warning: 'license_files' option is malformed")
214
215 for f in files:
216 if not os.path.exists(f):
217 log.warn(
218 "warning: Failed to find the configured license file '%s'",
219 f)
220 files.remove(f)
221
222 self.filelist.extend(files)