Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/setuptools/command/sdist.py
7757 views
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 six, 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 __read_template_hack(self):
102
# This grody hack closes the template file (MANIFEST.in) if an
103
# exception occurs during read_template.
104
# Doing so prevents an error when easy_install attempts to delete the
105
# file.
106
try:
107
orig.sdist.read_template(self)
108
except Exception:
109
_, _, tb = sys.exc_info()
110
tb.tb_next.tb_frame.f_locals['template'].close()
111
raise
112
113
# Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle
114
# has been fixed, so only override the method if we're using an earlier
115
# Python.
116
has_leaky_handle = (
117
sys.version_info < (2, 7, 2)
118
or (3, 0) <= sys.version_info < (3, 1, 4)
119
or (3, 2) <= sys.version_info < (3, 2, 1)
120
)
121
if has_leaky_handle:
122
read_template = __read_template_hack
123
124
def _add_defaults_optional(self):
125
if six.PY2:
126
sdist_add_defaults._add_defaults_optional(self)
127
else:
128
super()._add_defaults_optional()
129
if os.path.isfile('pyproject.toml'):
130
self.filelist.append('pyproject.toml')
131
132
def _add_defaults_python(self):
133
"""getting python files"""
134
if self.distribution.has_pure_modules():
135
build_py = self.get_finalized_command('build_py')
136
self.filelist.extend(build_py.get_source_files())
137
self._add_data_files(self._safe_data_files(build_py))
138
139
def _safe_data_files(self, build_py):
140
"""
141
Extracting data_files from build_py is known to cause
142
infinite recursion errors when `include_package_data`
143
is enabled, so suppress it in that case.
144
"""
145
if self.distribution.include_package_data:
146
return ()
147
return build_py.data_files
148
149
def _add_data_files(self, data_files):
150
"""
151
Add data files as found in build_py.data_files.
152
"""
153
self.filelist.extend(
154
os.path.join(src_dir, name)
155
for _, src_dir, _, filenames in data_files
156
for name in filenames
157
)
158
159
def _add_defaults_data_files(self):
160
try:
161
if six.PY2:
162
sdist_add_defaults._add_defaults_data_files(self)
163
else:
164
super()._add_defaults_data_files()
165
except TypeError:
166
log.warn("data_files contains unexpected objects")
167
168
def check_readme(self):
169
for f in self.READMES:
170
if os.path.exists(f):
171
return
172
else:
173
self.warn(
174
"standard file not found: should have one of " +
175
', '.join(self.READMES)
176
)
177
178
def make_release_tree(self, base_dir, files):
179
orig.sdist.make_release_tree(self, base_dir, files)
180
181
# Save any egg_info command line options used to create this sdist
182
dest = os.path.join(base_dir, 'setup.cfg')
183
if hasattr(os, 'link') and os.path.exists(dest):
184
# unlink and re-copy, since it might be hard-linked, and
185
# we don't want to change the source version
186
os.unlink(dest)
187
self.copy_file('setup.cfg', dest)
188
189
self.get_finalized_command('egg_info').save_version_info(dest)
190
191
def _manifest_is_not_generated(self):
192
# check for special comment used in 2.7.1 and higher
193
if not os.path.isfile(self.manifest):
194
return False
195
196
with io.open(self.manifest, 'rb') as fp:
197
first_line = fp.readline()
198
return (first_line !=
199
'# file GENERATED by distutils, do NOT edit\n'.encode())
200
201
def read_manifest(self):
202
"""Read the manifest file (named by 'self.manifest') and use it to
203
fill in 'self.filelist', the list of files to include in the source
204
distribution.
205
"""
206
log.info("reading manifest file '%s'", self.manifest)
207
manifest = open(self.manifest, 'rb')
208
for line in manifest:
209
# The manifest must contain UTF-8. See #303.
210
if not six.PY2:
211
try:
212
line = line.decode('UTF-8')
213
except UnicodeDecodeError:
214
log.warn("%r not UTF-8 decodable -- skipping" % line)
215
continue
216
# ignore comments and blank lines
217
line = line.strip()
218
if line.startswith('#') or not line:
219
continue
220
self.filelist.append(line)
221
manifest.close()
222
223
def check_license(self):
224
"""Checks if license_file' or 'license_files' is configured and adds any
225
valid paths to 'self.filelist'.
226
"""
227
228
files = ordered_set.OrderedSet()
229
230
opts = self.distribution.get_option_dict('metadata')
231
232
# ignore the source of the value
233
_, license_file = opts.get('license_file', (None, None))
234
235
if license_file is None:
236
log.debug("'license_file' option was not specified")
237
else:
238
files.add(license_file)
239
240
try:
241
files.update(self.distribution.metadata.license_files)
242
except TypeError:
243
log.warn("warning: 'license_files' option is malformed")
244
245
for f in files:
246
if not os.path.exists(f):
247
log.warn(
248
"warning: Failed to find the configured license file '%s'",
249
f)
250
files.remove(f)
251
252
self.filelist.extend(files)
253
254