update shared deps
This commit is contained in:
parent
6806bebb7c
commit
642ba49f68
275 changed files with 31987 additions and 19235 deletions
|
|
@ -8,6 +8,8 @@ import distutils.filelist
|
|||
from distutils.util import convert_path
|
||||
from fnmatch import fnmatchcase
|
||||
|
||||
from ._deprecation_warning import SetuptoolsDeprecationWarning
|
||||
|
||||
from setuptools.extern.six import PY3
|
||||
from setuptools.extern.six.moves import filter, map
|
||||
|
||||
|
|
@ -22,6 +24,7 @@ __metaclass__ = type
|
|||
|
||||
__all__ = [
|
||||
'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require',
|
||||
'SetuptoolsDeprecationWarning',
|
||||
'find_packages'
|
||||
]
|
||||
|
||||
|
|
@ -188,4 +191,5 @@ def findall(dir=os.curdir):
|
|||
return list(files)
|
||||
|
||||
|
||||
# Apply monkey patches
|
||||
monkey.patch_all()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
class SetuptoolsDeprecationWarning(Warning):
|
||||
"""
|
||||
Base class for warning deprecations in ``setuptools``
|
||||
|
||||
This class is not derived from ``DeprecationWarning``, and as such is
|
||||
visible by default.
|
||||
"""
|
||||
|
|
@ -40,8 +40,11 @@ import subprocess
|
|||
import shlex
|
||||
import io
|
||||
|
||||
|
||||
from sysconfig import get_config_vars, get_path
|
||||
|
||||
from setuptools import SetuptoolsDeprecationWarning
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import configparser, map
|
||||
|
||||
|
|
@ -2132,7 +2135,7 @@ class ScriptWriter:
|
|||
@classmethod
|
||||
def get_script_args(cls, dist, executable=None, wininst=False):
|
||||
# for backward compatibility
|
||||
warnings.warn("Use get_args", DeprecationWarning)
|
||||
warnings.warn("Use get_args", EasyInstallDeprecationWarning)
|
||||
writer = (WindowsScriptWriter if wininst else ScriptWriter).best()
|
||||
header = cls.get_script_header("", executable, wininst)
|
||||
return writer.get_args(dist, header)
|
||||
|
|
@ -2140,7 +2143,7 @@ class ScriptWriter:
|
|||
@classmethod
|
||||
def get_script_header(cls, script_text, executable=None, wininst=False):
|
||||
# for backward compatibility
|
||||
warnings.warn("Use get_header", DeprecationWarning, stacklevel=2)
|
||||
warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2)
|
||||
if wininst:
|
||||
executable = "python.exe"
|
||||
return cls.get_header(script_text, executable)
|
||||
|
|
@ -2175,7 +2178,7 @@ class ScriptWriter:
|
|||
@classmethod
|
||||
def get_writer(cls, force_windows):
|
||||
# for backward compatibility
|
||||
warnings.warn("Use best", DeprecationWarning)
|
||||
warnings.warn("Use best", EasyInstallDeprecationWarning)
|
||||
return WindowsScriptWriter.best() if force_windows else cls.best()
|
||||
|
||||
@classmethod
|
||||
|
|
@ -2207,7 +2210,7 @@ class WindowsScriptWriter(ScriptWriter):
|
|||
@classmethod
|
||||
def get_writer(cls):
|
||||
# for backward compatibility
|
||||
warnings.warn("Use best", DeprecationWarning)
|
||||
warnings.warn("Use best", EasyInstallDeprecationWarning)
|
||||
return cls.best()
|
||||
|
||||
@classmethod
|
||||
|
|
@ -2388,3 +2391,7 @@ def _patch_usage():
|
|||
yield
|
||||
finally:
|
||||
distutils.core.gen_usage = saved
|
||||
|
||||
class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning):
|
||||
"""Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning."""
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import setuptools.unicode_utils as unicode_utils
|
|||
from setuptools.glob import glob
|
||||
|
||||
from setuptools.extern import packaging
|
||||
|
||||
from setuptools import SetuptoolsDeprecationWarning
|
||||
|
||||
def translate_pattern(glob):
|
||||
"""
|
||||
|
|
@ -575,6 +575,12 @@ class manifest_maker(sdist):
|
|||
self.filelist.extend(rcfiles)
|
||||
elif os.path.exists(self.manifest):
|
||||
self.read_manifest()
|
||||
|
||||
if os.path.exists("setup.py"):
|
||||
# setup.py should be included by default, even if it's not
|
||||
# the script called to create the sdist
|
||||
self.filelist.append("setup.py")
|
||||
|
||||
ei_cmd = self.get_finalized_command('egg_info')
|
||||
self.filelist.graft(ei_cmd.egg_info)
|
||||
|
||||
|
|
@ -696,7 +702,7 @@ def get_pkg_info_revision():
|
|||
Get a -r### off of PKG-INFO Version in case this is an sdist of
|
||||
a subversion revision.
|
||||
"""
|
||||
warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning)
|
||||
warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning)
|
||||
if os.path.exists('PKG-INFO'):
|
||||
with io.open('PKG-INFO') as f:
|
||||
for line in f:
|
||||
|
|
@ -704,3 +710,7 @@ def get_pkg_info_revision():
|
|||
if match:
|
||||
return int(match.group(1))
|
||||
return 0
|
||||
|
||||
|
||||
class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning):
|
||||
"""Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning."""
|
||||
|
|
|
|||
|
|
@ -1,14 +1,26 @@
|
|||
import io
|
||||
import os
|
||||
import hashlib
|
||||
import getpass
|
||||
import platform
|
||||
|
||||
from base64 import standard_b64encode
|
||||
|
||||
from distutils import log
|
||||
from distutils.command import upload as orig
|
||||
from distutils.spawn import spawn
|
||||
|
||||
from distutils.errors import DistutilsError
|
||||
|
||||
from setuptools.extern.six.moves.urllib.request import urlopen, Request
|
||||
from setuptools.extern.six.moves.urllib.error import HTTPError
|
||||
from setuptools.extern.six.moves.urllib.parse import urlparse
|
||||
|
||||
class upload(orig.upload):
|
||||
"""
|
||||
Override default upload behavior to obtain password
|
||||
in a variety of different ways.
|
||||
"""
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
orig.upload.run(self)
|
||||
|
|
@ -33,6 +45,137 @@ class upload(orig.upload):
|
|||
self._prompt_for_password()
|
||||
)
|
||||
|
||||
def upload_file(self, command, pyversion, filename):
|
||||
# Makes sure the repository URL is compliant
|
||||
schema, netloc, url, params, query, fragments = \
|
||||
urlparse(self.repository)
|
||||
if params or query or fragments:
|
||||
raise AssertionError("Incompatible url %s" % self.repository)
|
||||
|
||||
if schema not in ('http', 'https'):
|
||||
raise AssertionError("unsupported schema " + schema)
|
||||
|
||||
# Sign if requested
|
||||
if self.sign:
|
||||
gpg_args = ["gpg", "--detach-sign", "-a", filename]
|
||||
if self.identity:
|
||||
gpg_args[2:2] = ["--local-user", self.identity]
|
||||
spawn(gpg_args,
|
||||
dry_run=self.dry_run)
|
||||
|
||||
# Fill in the data - send all the meta-data in case we need to
|
||||
# register a new release
|
||||
with open(filename, 'rb') as f:
|
||||
content = f.read()
|
||||
|
||||
meta = self.distribution.metadata
|
||||
|
||||
data = {
|
||||
# action
|
||||
':action': 'file_upload',
|
||||
'protocol_version': '1',
|
||||
|
||||
# identify release
|
||||
'name': meta.get_name(),
|
||||
'version': meta.get_version(),
|
||||
|
||||
# file content
|
||||
'content': (os.path.basename(filename),content),
|
||||
'filetype': command,
|
||||
'pyversion': pyversion,
|
||||
'md5_digest': hashlib.md5(content).hexdigest(),
|
||||
|
||||
# additional meta-data
|
||||
'metadata_version': str(meta.get_metadata_version()),
|
||||
'summary': meta.get_description(),
|
||||
'home_page': meta.get_url(),
|
||||
'author': meta.get_contact(),
|
||||
'author_email': meta.get_contact_email(),
|
||||
'license': meta.get_licence(),
|
||||
'description': meta.get_long_description(),
|
||||
'keywords': meta.get_keywords(),
|
||||
'platform': meta.get_platforms(),
|
||||
'classifiers': meta.get_classifiers(),
|
||||
'download_url': meta.get_download_url(),
|
||||
# PEP 314
|
||||
'provides': meta.get_provides(),
|
||||
'requires': meta.get_requires(),
|
||||
'obsoletes': meta.get_obsoletes(),
|
||||
}
|
||||
|
||||
data['comment'] = ''
|
||||
|
||||
if self.sign:
|
||||
data['gpg_signature'] = (os.path.basename(filename) + ".asc",
|
||||
open(filename+".asc", "rb").read())
|
||||
|
||||
# set up the authentication
|
||||
user_pass = (self.username + ":" + self.password).encode('ascii')
|
||||
# The exact encoding of the authentication string is debated.
|
||||
# Anyway PyPI only accepts ascii for both username or password.
|
||||
auth = "Basic " + standard_b64encode(user_pass).decode('ascii')
|
||||
|
||||
# Build up the MIME payload for the POST data
|
||||
boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
|
||||
sep_boundary = b'\r\n--' + boundary.encode('ascii')
|
||||
end_boundary = sep_boundary + b'--\r\n'
|
||||
body = io.BytesIO()
|
||||
for key, value in data.items():
|
||||
title = '\r\nContent-Disposition: form-data; name="%s"' % key
|
||||
# handle multiple entries for the same name
|
||||
if not isinstance(value, list):
|
||||
value = [value]
|
||||
for value in value:
|
||||
if type(value) is tuple:
|
||||
title += '; filename="%s"' % value[0]
|
||||
value = value[1]
|
||||
else:
|
||||
value = str(value).encode('utf-8')
|
||||
body.write(sep_boundary)
|
||||
body.write(title.encode('utf-8'))
|
||||
body.write(b"\r\n\r\n")
|
||||
body.write(value)
|
||||
body.write(end_boundary)
|
||||
body = body.getvalue()
|
||||
|
||||
msg = "Submitting %s to %s" % (filename, self.repository)
|
||||
self.announce(msg, log.INFO)
|
||||
|
||||
# build the Request
|
||||
headers = {
|
||||
'Content-type': 'multipart/form-data; boundary=%s' % boundary,
|
||||
'Content-length': str(len(body)),
|
||||
'Authorization': auth,
|
||||
}
|
||||
|
||||
request = Request(self.repository, data=body,
|
||||
headers=headers)
|
||||
# send the data
|
||||
try:
|
||||
result = urlopen(request)
|
||||
status = result.getcode()
|
||||
reason = result.msg
|
||||
except HTTPError as e:
|
||||
status = e.code
|
||||
reason = e.msg
|
||||
except OSError as e:
|
||||
self.announce(str(e), log.ERROR)
|
||||
raise
|
||||
|
||||
if status == 200:
|
||||
self.announce('Server response (%s): %s' % (status, reason),
|
||||
log.INFO)
|
||||
if self.show_response:
|
||||
text = getattr(self, '_read_pypi_response',
|
||||
lambda x: None)(result)
|
||||
if text is not None:
|
||||
msg = '\n'.join(('-' * 75, text, '-' * 75))
|
||||
self.announce(msg, log.INFO)
|
||||
else:
|
||||
msg = 'Upload failed (%s): %s' % (status, reason)
|
||||
self.announce(msg, log.ERROR)
|
||||
raise DistutilsError(msg)
|
||||
|
||||
def _load_password_from_keyring(self):
|
||||
"""
|
||||
Attempt to load password from keyring. Suppress Exceptions.
|
||||
|
|
|
|||
|
|
@ -2,8 +2,12 @@ from __future__ import absolute_import, unicode_literals
|
|||
import io
|
||||
import os
|
||||
import sys
|
||||
|
||||
import warnings
|
||||
import functools
|
||||
from collections import defaultdict
|
||||
from functools import partial
|
||||
from functools import wraps
|
||||
from importlib import import_module
|
||||
|
||||
from distutils.errors import DistutilsOptionError, DistutilsFileError
|
||||
|
|
@ -61,6 +65,18 @@ def read_configuration(
|
|||
return configuration_to_dict(handlers)
|
||||
|
||||
|
||||
def _get_option(target_obj, key):
|
||||
"""
|
||||
Given a target object and option key, get that option from
|
||||
the target object, either through a get_{key} method or
|
||||
from an attribute directly.
|
||||
"""
|
||||
getter_name = 'get_{key}'.format(**locals())
|
||||
by_attribute = functools.partial(getattr, target_obj, key)
|
||||
getter = getattr(target_obj, getter_name, by_attribute)
|
||||
return getter()
|
||||
|
||||
|
||||
def configuration_to_dict(handlers):
|
||||
"""Returns configuration data gathered by given handlers as a dict.
|
||||
|
||||
|
|
@ -72,20 +88,9 @@ def configuration_to_dict(handlers):
|
|||
config_dict = defaultdict(dict)
|
||||
|
||||
for handler in handlers:
|
||||
|
||||
obj_alias = handler.section_prefix
|
||||
target_obj = handler.target_obj
|
||||
|
||||
for option in handler.set_options:
|
||||
getter = getattr(target_obj, 'get_%s' % option, None)
|
||||
|
||||
if getter is None:
|
||||
value = getattr(target_obj, option)
|
||||
|
||||
else:
|
||||
value = getter()
|
||||
|
||||
config_dict[obj_alias][option] = value
|
||||
value = _get_option(handler.target_obj, option)
|
||||
config_dict[handler.section_prefix][option] = value
|
||||
|
||||
return config_dict
|
||||
|
||||
|
|
@ -110,7 +115,8 @@ def parse_configuration(
|
|||
options.parse()
|
||||
|
||||
meta = ConfigMetadataHandler(
|
||||
distribution.metadata, command_options, ignore_option_errors, distribution.package_dir)
|
||||
distribution.metadata, command_options, ignore_option_errors,
|
||||
distribution.package_dir)
|
||||
meta.parse()
|
||||
|
||||
return meta, options
|
||||
|
|
@ -399,6 +405,20 @@ class ConfigHandler:
|
|||
|
||||
section_parser_method(section_options)
|
||||
|
||||
def _deprecated_config_handler(self, func, msg, warning_class):
|
||||
""" this function will wrap around parameters that are deprecated
|
||||
|
||||
:param msg: deprecation message
|
||||
:param warning_class: class of warning exception to be raised
|
||||
:param func: function to be wrapped around
|
||||
"""
|
||||
@wraps(func)
|
||||
def config_handler(*args, **kwargs):
|
||||
warnings.warn(msg, warning_class)
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return config_handler
|
||||
|
||||
|
||||
class ConfigMetadataHandler(ConfigHandler):
|
||||
|
||||
|
|
@ -434,7 +454,10 @@ class ConfigMetadataHandler(ConfigHandler):
|
|||
'platforms': parse_list,
|
||||
'keywords': parse_list,
|
||||
'provides': parse_list,
|
||||
'requires': parse_list,
|
||||
'requires': self._deprecated_config_handler(parse_list,
|
||||
"The requires parameter is deprecated, please use " +
|
||||
"install_requires for runtime dependencies.",
|
||||
DeprecationWarning),
|
||||
'obsoletes': parse_list,
|
||||
'classifiers': self._get_parser_compound(parse_file, parse_list),
|
||||
'license': parse_file,
|
||||
|
|
@ -458,9 +481,12 @@ class ConfigMetadataHandler(ConfigHandler):
|
|||
# Be strict about versions loaded from file because it's easy to
|
||||
# accidentally include newlines and other unintended content
|
||||
if isinstance(parse(version), LegacyVersion):
|
||||
raise DistutilsOptionError('Version loaded from %s does not comply with PEP 440: %s' % (
|
||||
value, version
|
||||
))
|
||||
tmpl = (
|
||||
'Version loaded from {value} does not '
|
||||
'comply with PEP 440: {version}'
|
||||
)
|
||||
raise DistutilsOptionError(tmpl.format(**locals()))
|
||||
|
||||
return version
|
||||
|
||||
version = self._parse_attr(value, self.package_dir)
|
||||
|
|
@ -518,12 +544,13 @@ class ConfigOptionsHandler(ConfigHandler):
|
|||
find_directives = ['find:', 'find_namespace:']
|
||||
trimmed_value = value.strip()
|
||||
|
||||
if not trimmed_value in find_directives:
|
||||
if trimmed_value not in find_directives:
|
||||
return self._parse_list(value)
|
||||
|
||||
findns = trimmed_value == find_directives[1]
|
||||
if findns and not PY3:
|
||||
raise DistutilsOptionError('find_namespace: directive is unsupported on Python < 3.3')
|
||||
raise DistutilsOptionError(
|
||||
'find_namespace: directive is unsupported on Python < 3.3')
|
||||
|
||||
# Read function arguments from a dedicated section.
|
||||
find_kwargs = self.parse_section_packages__find(
|
||||
|
|
|
|||
|
|
@ -10,7 +10,11 @@ import distutils.core
|
|||
import distutils.cmd
|
||||
import distutils.dist
|
||||
import itertools
|
||||
|
||||
|
||||
from collections import defaultdict
|
||||
from email import message_from_file
|
||||
|
||||
from distutils.errors import (
|
||||
DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
|
||||
)
|
||||
|
|
@ -21,6 +25,8 @@ from setuptools.extern import six
|
|||
from setuptools.extern import packaging
|
||||
from setuptools.extern.six.moves import map, filter, filterfalse
|
||||
|
||||
from . import SetuptoolsDeprecationWarning
|
||||
|
||||
from setuptools.depends import Require
|
||||
from setuptools import windows_support
|
||||
from setuptools.monkey import get_unpatched
|
||||
|
|
@ -33,39 +39,107 @@ __import__('setuptools.extern.packaging.version')
|
|||
|
||||
|
||||
def _get_unpatched(cls):
|
||||
warnings.warn("Do not call this function", DeprecationWarning)
|
||||
warnings.warn("Do not call this function", DistDeprecationWarning)
|
||||
return get_unpatched(cls)
|
||||
|
||||
|
||||
def get_metadata_version(dist_md):
|
||||
if dist_md.long_description_content_type or dist_md.provides_extras:
|
||||
return StrictVersion('2.1')
|
||||
elif (dist_md.maintainer is not None or
|
||||
dist_md.maintainer_email is not None or
|
||||
getattr(dist_md, 'python_requires', None) is not None):
|
||||
return StrictVersion('1.2')
|
||||
elif (dist_md.provides or dist_md.requires or dist_md.obsoletes or
|
||||
dist_md.classifiers or dist_md.download_url):
|
||||
return StrictVersion('1.1')
|
||||
def get_metadata_version(self):
|
||||
mv = getattr(self, 'metadata_version', None)
|
||||
|
||||
return StrictVersion('1.0')
|
||||
if mv is None:
|
||||
if self.long_description_content_type or self.provides_extras:
|
||||
mv = StrictVersion('2.1')
|
||||
elif (self.maintainer is not None or
|
||||
self.maintainer_email is not None or
|
||||
getattr(self, 'python_requires', None) is not None):
|
||||
mv = StrictVersion('1.2')
|
||||
elif (self.provides or self.requires or self.obsoletes or
|
||||
self.classifiers or self.download_url):
|
||||
mv = StrictVersion('1.1')
|
||||
else:
|
||||
mv = StrictVersion('1.0')
|
||||
|
||||
self.metadata_version = mv
|
||||
|
||||
return mv
|
||||
|
||||
|
||||
def read_pkg_file(self, file):
|
||||
"""Reads the metadata values from a file object."""
|
||||
msg = message_from_file(file)
|
||||
|
||||
def _read_field(name):
|
||||
value = msg[name]
|
||||
if value == 'UNKNOWN':
|
||||
return None
|
||||
return value
|
||||
|
||||
def _read_list(name):
|
||||
values = msg.get_all(name, None)
|
||||
if values == []:
|
||||
return None
|
||||
return values
|
||||
|
||||
self.metadata_version = StrictVersion(msg['metadata-version'])
|
||||
self.name = _read_field('name')
|
||||
self.version = _read_field('version')
|
||||
self.description = _read_field('summary')
|
||||
# we are filling author only.
|
||||
self.author = _read_field('author')
|
||||
self.maintainer = None
|
||||
self.author_email = _read_field('author-email')
|
||||
self.maintainer_email = None
|
||||
self.url = _read_field('home-page')
|
||||
self.license = _read_field('license')
|
||||
|
||||
if 'download-url' in msg:
|
||||
self.download_url = _read_field('download-url')
|
||||
else:
|
||||
self.download_url = None
|
||||
|
||||
self.long_description = _read_field('description')
|
||||
self.description = _read_field('summary')
|
||||
|
||||
if 'keywords' in msg:
|
||||
self.keywords = _read_field('keywords').split(',')
|
||||
|
||||
self.platforms = _read_list('platform')
|
||||
self.classifiers = _read_list('classifier')
|
||||
|
||||
# PEP 314 - these fields only exist in 1.1
|
||||
if self.metadata_version == StrictVersion('1.1'):
|
||||
self.requires = _read_list('requires')
|
||||
self.provides = _read_list('provides')
|
||||
self.obsoletes = _read_list('obsoletes')
|
||||
else:
|
||||
self.requires = None
|
||||
self.provides = None
|
||||
self.obsoletes = None
|
||||
|
||||
|
||||
# Based on Python 3.5 version
|
||||
def write_pkg_file(self, file):
|
||||
"""Write the PKG-INFO format data to a file object.
|
||||
"""
|
||||
version = get_metadata_version(self)
|
||||
version = self.get_metadata_version()
|
||||
|
||||
file.write('Metadata-Version: %s\n' % version)
|
||||
file.write('Name: %s\n' % self.get_name())
|
||||
file.write('Version: %s\n' % self.get_version())
|
||||
file.write('Summary: %s\n' % self.get_description())
|
||||
file.write('Home-page: %s\n' % self.get_url())
|
||||
if six.PY2:
|
||||
def write_field(key, value):
|
||||
file.write("%s: %s\n" % (key, self._encode_field(value)))
|
||||
else:
|
||||
def write_field(key, value):
|
||||
file.write("%s: %s\n" % (key, value))
|
||||
|
||||
|
||||
write_field('Metadata-Version', str(version))
|
||||
write_field('Name', self.get_name())
|
||||
write_field('Version', self.get_version())
|
||||
write_field('Summary', self.get_description())
|
||||
write_field('Home-page', self.get_url())
|
||||
|
||||
if version < StrictVersion('1.2'):
|
||||
file.write('Author: %s\n' % self.get_contact())
|
||||
file.write('Author-email: %s\n' % self.get_contact_email())
|
||||
write_field('Author', self.get_contact())
|
||||
write_field('Author-email', self.get_contact_email())
|
||||
else:
|
||||
optional_fields = (
|
||||
('Author', 'author'),
|
||||
|
|
@ -76,28 +150,26 @@ def write_pkg_file(self, file):
|
|||
|
||||
for field, attr in optional_fields:
|
||||
attr_val = getattr(self, attr)
|
||||
if six.PY2:
|
||||
attr_val = self._encode_field(attr_val)
|
||||
|
||||
if attr_val is not None:
|
||||
file.write('%s: %s\n' % (field, attr_val))
|
||||
write_field(field, attr_val)
|
||||
|
||||
file.write('License: %s\n' % self.get_license())
|
||||
write_field('License', self.get_license())
|
||||
if self.download_url:
|
||||
file.write('Download-URL: %s\n' % self.download_url)
|
||||
write_field('Download-URL', self.download_url)
|
||||
for project_url in self.project_urls.items():
|
||||
file.write('Project-URL: %s, %s\n' % project_url)
|
||||
write_field('Project-URL', '%s, %s' % project_url)
|
||||
|
||||
long_desc = rfc822_escape(self.get_long_description())
|
||||
file.write('Description: %s\n' % long_desc)
|
||||
write_field('Description', long_desc)
|
||||
|
||||
keywords = ','.join(self.get_keywords())
|
||||
if keywords:
|
||||
file.write('Keywords: %s\n' % keywords)
|
||||
write_field('Keywords', keywords)
|
||||
|
||||
if version >= StrictVersion('1.2'):
|
||||
for platform in self.get_platforms():
|
||||
file.write('Platform: %s\n' % platform)
|
||||
write_field('Platform', platform)
|
||||
else:
|
||||
self._write_list(file, 'Platform', self.get_platforms())
|
||||
|
||||
|
|
@ -110,17 +182,17 @@ def write_pkg_file(self, file):
|
|||
|
||||
# Setuptools specific for PEP 345
|
||||
if hasattr(self, 'python_requires'):
|
||||
file.write('Requires-Python: %s\n' % self.python_requires)
|
||||
write_field('Requires-Python', self.python_requires)
|
||||
|
||||
# PEP 566
|
||||
if self.long_description_content_type:
|
||||
file.write(
|
||||
'Description-Content-Type: %s\n' %
|
||||
write_field(
|
||||
'Description-Content-Type',
|
||||
self.long_description_content_type
|
||||
)
|
||||
if self.provides_extras:
|
||||
for extra in sorted(self.provides_extras):
|
||||
file.write('Provides-Extra: %s\n' % extra)
|
||||
write_field('Provides-Extra', extra)
|
||||
|
||||
|
||||
sequence = tuple, list
|
||||
|
|
@ -980,7 +1052,7 @@ class Feature:
|
|||
"Features are deprecated and will be removed in a future "
|
||||
"version. See https://github.com/pypa/setuptools/issues/65."
|
||||
)
|
||||
warnings.warn(msg, DeprecationWarning, stacklevel=3)
|
||||
warnings.warn(msg, DistDeprecationWarning, stacklevel=3)
|
||||
|
||||
def __init__(
|
||||
self, description, standard=False, available=True,
|
||||
|
|
@ -1069,3 +1141,7 @@ class Feature:
|
|||
" doesn't contain any packages or modules under %s"
|
||||
% (self.description, item, item)
|
||||
)
|
||||
|
||||
|
||||
class DistDeprecationWarning(SetuptoolsDeprecationWarning):
|
||||
"""Class for warning about deprecations in dist in setuptools. Not ignored by default, unlike DeprecationWarning."""
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ def patch_all():
|
|||
warehouse = 'https://upload.pypi.org/legacy/'
|
||||
distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse
|
||||
|
||||
_patch_distribution_metadata_write_pkg_file()
|
||||
_patch_distribution_metadata()
|
||||
|
||||
# Install Distribution throughout the distutils
|
||||
for module in distutils.dist, distutils.core, distutils.cmd:
|
||||
|
|
@ -101,11 +101,11 @@ def patch_all():
|
|||
patch_for_msvc_specialized_compiler()
|
||||
|
||||
|
||||
def _patch_distribution_metadata_write_pkg_file():
|
||||
"""Patch write_pkg_file to also write Requires-Python/Requires-External"""
|
||||
distutils.dist.DistributionMetadata.write_pkg_file = (
|
||||
setuptools.dist.write_pkg_file
|
||||
)
|
||||
def _patch_distribution_metadata():
|
||||
"""Patch write_pkg_file and read_pkg_file for higher metadata standards"""
|
||||
for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'):
|
||||
new_val = getattr(setuptools.dist, attr)
|
||||
setattr(distutils.dist.DistributionMetadata, attr, new_val)
|
||||
|
||||
|
||||
def patch_func(replacement, target_mod, func_name):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue