Eliminado venv y www del repositorio, agrege un requirements igual
This commit is contained in:
@@ -19,19 +19,18 @@ import itertools
|
||||
from collections import defaultdict
|
||||
from email import message_from_file
|
||||
|
||||
from distutils.errors import (
|
||||
DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
|
||||
)
|
||||
from distutils.errors import DistutilsOptionError, DistutilsSetupError
|
||||
from distutils.util import rfc822_escape
|
||||
from distutils.version import StrictVersion
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern import packaging
|
||||
from setuptools.extern import ordered_set
|
||||
from setuptools.extern.six.moves import map, filter, filterfalse
|
||||
|
||||
from . import SetuptoolsDeprecationWarning
|
||||
|
||||
from setuptools.depends import Require
|
||||
import setuptools
|
||||
from setuptools import windows_support
|
||||
from setuptools.monkey import get_unpatched
|
||||
from setuptools.config import parse_configuration
|
||||
@@ -161,7 +160,7 @@ def write_pkg_file(self, file):
|
||||
if self.download_url:
|
||||
write_field('Download-URL', self.download_url)
|
||||
for project_url in self.project_urls.items():
|
||||
write_field('Project-URL', '%s, %s' % project_url)
|
||||
write_field('Project-URL', '%s, %s' % project_url)
|
||||
|
||||
long_desc = rfc822_escape(self.get_long_description())
|
||||
write_field('Description', long_desc)
|
||||
@@ -205,11 +204,11 @@ def check_importable(dist, attr, value):
|
||||
try:
|
||||
ep = pkg_resources.EntryPoint.parse('x=' + value)
|
||||
assert not ep.extras
|
||||
except (TypeError, ValueError, AttributeError, AssertionError):
|
||||
except (TypeError, ValueError, AttributeError, AssertionError) as e:
|
||||
raise DistutilsSetupError(
|
||||
"%r must be importable 'module:attrs' string (got %r)"
|
||||
% (attr, value)
|
||||
)
|
||||
) from e
|
||||
|
||||
|
||||
def assert_string_list(dist, attr, value):
|
||||
@@ -220,10 +219,10 @@ def assert_string_list(dist, attr, value):
|
||||
assert isinstance(value, (list, tuple))
|
||||
# verify that elements of value are strings
|
||||
assert ''.join(value) != value
|
||||
except (TypeError, ValueError, AttributeError, AssertionError):
|
||||
except (TypeError, ValueError, AttributeError, AssertionError) as e:
|
||||
raise DistutilsSetupError(
|
||||
"%r must be a list of strings (got %r)" % (attr, value)
|
||||
)
|
||||
) from e
|
||||
|
||||
|
||||
def check_nsp(dist, attr, value):
|
||||
@@ -248,12 +247,12 @@ def check_extras(dist, attr, value):
|
||||
"""Verify that extras_require mapping is valid"""
|
||||
try:
|
||||
list(itertools.starmap(_check_extra, value.items()))
|
||||
except (TypeError, ValueError, AttributeError):
|
||||
except (TypeError, ValueError, AttributeError) as e:
|
||||
raise DistutilsSetupError(
|
||||
"'extras_require' must be a dictionary whose values are "
|
||||
"strings or lists of strings containing valid project/version "
|
||||
"requirement specifiers."
|
||||
)
|
||||
) from e
|
||||
|
||||
|
||||
def _check_extra(extra, reqs):
|
||||
@@ -281,7 +280,9 @@ def check_requirements(dist, attr, value):
|
||||
"{attr!r} must be a string or list of strings "
|
||||
"containing valid project/version requirement specifiers; {error}"
|
||||
)
|
||||
raise DistutilsSetupError(tmpl.format(attr=attr, error=error))
|
||||
raise DistutilsSetupError(
|
||||
tmpl.format(attr=attr, error=error)
|
||||
) from error
|
||||
|
||||
|
||||
def check_specifier(dist, attr, value):
|
||||
@@ -293,7 +294,9 @@ def check_specifier(dist, attr, value):
|
||||
"{attr!r} must be a string "
|
||||
"containing valid version specifiers; {error}"
|
||||
)
|
||||
raise DistutilsSetupError(tmpl.format(attr=attr, error=error))
|
||||
raise DistutilsSetupError(
|
||||
tmpl.format(attr=attr, error=error)
|
||||
) from error
|
||||
|
||||
|
||||
def check_entry_points(dist, attr, value):
|
||||
@@ -301,7 +304,7 @@ def check_entry_points(dist, attr, value):
|
||||
try:
|
||||
pkg_resources.EntryPoint.parse_map(value)
|
||||
except ValueError as e:
|
||||
raise DistutilsSetupError(e)
|
||||
raise DistutilsSetupError(e) from e
|
||||
|
||||
|
||||
def check_test_suite(dist, attr, value):
|
||||
@@ -337,7 +340,7 @@ _Distribution = get_unpatched(distutils.core.Distribution)
|
||||
|
||||
|
||||
class Distribution(_Distribution):
|
||||
"""Distribution with support for features, tests, and package data
|
||||
"""Distribution with support for tests and package data
|
||||
|
||||
This is an enhanced version of 'distutils.dist.Distribution' that
|
||||
effectively adds the following new optional keyword arguments to 'setup()':
|
||||
@@ -364,21 +367,6 @@ class Distribution(_Distribution):
|
||||
EasyInstall and requests one of your extras, the corresponding
|
||||
additional requirements will be installed if needed.
|
||||
|
||||
'features' **deprecated** -- a dictionary mapping option names to
|
||||
'setuptools.Feature'
|
||||
objects. Features are a portion of the distribution that can be
|
||||
included or excluded based on user options, inter-feature dependencies,
|
||||
and availability on the current system. Excluded features are omitted
|
||||
from all setup commands, including source and binary distributions, so
|
||||
you can create multiple distributions from the same source tree.
|
||||
Feature names should be valid Python identifiers, except that they may
|
||||
contain the '-' (minus) sign. Features can be included or excluded
|
||||
via the command line options '--with-X' and '--without-X', where 'X' is
|
||||
the name of the feature. Whether a feature is included by default, and
|
||||
whether you are allowed to control this from the command line, is
|
||||
determined by the Feature object. See the 'Feature' class for more
|
||||
information.
|
||||
|
||||
'test_suite' -- the name of a test suite to run for the 'test' command.
|
||||
If the user runs 'python setup.py test', the package will be installed,
|
||||
and the named test suite will be run. The format is the same as
|
||||
@@ -400,14 +388,14 @@ class Distribution(_Distribution):
|
||||
for manipulating the distribution's contents. For example, the 'include()'
|
||||
and 'exclude()' methods can be thought of as in-place add and subtract
|
||||
commands that add or remove packages, modules, extensions, and so on from
|
||||
the distribution. They are used by the feature subsystem to configure the
|
||||
distribution for the included and excluded features.
|
||||
the distribution.
|
||||
"""
|
||||
|
||||
_DISTUTILS_UNSUPPORTED_METADATA = {
|
||||
'long_description_content_type': None,
|
||||
'project_urls': dict,
|
||||
'provides_extras': set,
|
||||
'provides_extras': ordered_set.OrderedSet,
|
||||
'license_files': ordered_set.OrderedSet,
|
||||
}
|
||||
|
||||
_patched_dist = None
|
||||
@@ -430,10 +418,6 @@ class Distribution(_Distribution):
|
||||
if not have_package_data:
|
||||
self.package_data = {}
|
||||
attrs = attrs or {}
|
||||
if 'features' in attrs or 'require_features' in attrs:
|
||||
Feature.warn_deprecated()
|
||||
self.require_features = []
|
||||
self.features = {}
|
||||
self.dist_files = []
|
||||
# Filter-out setuptools' specific options.
|
||||
self.src_root = attrs.pop("src_root", None)
|
||||
@@ -459,30 +443,40 @@ class Distribution(_Distribution):
|
||||
value = default() if default else None
|
||||
setattr(self.metadata, option, value)
|
||||
|
||||
if isinstance(self.metadata.version, numbers.Number):
|
||||
# Some people apparently take "version number" too literally :)
|
||||
self.metadata.version = str(self.metadata.version)
|
||||
self.metadata.version = self._normalize_version(
|
||||
self._validate_version(self.metadata.version))
|
||||
self._finalize_requires()
|
||||
|
||||
if self.metadata.version is not None:
|
||||
@staticmethod
|
||||
def _normalize_version(version):
|
||||
if isinstance(version, setuptools.sic) or version is None:
|
||||
return version
|
||||
|
||||
normalized = str(packaging.version.Version(version))
|
||||
if version != normalized:
|
||||
tmpl = "Normalizing '{version}' to '{normalized}'"
|
||||
warnings.warn(tmpl.format(**locals()))
|
||||
return normalized
|
||||
return version
|
||||
|
||||
@staticmethod
|
||||
def _validate_version(version):
|
||||
if isinstance(version, numbers.Number):
|
||||
# Some people apparently take "version number" too literally :)
|
||||
version = str(version)
|
||||
|
||||
if version is not None:
|
||||
try:
|
||||
ver = packaging.version.Version(self.metadata.version)
|
||||
normalized_version = str(ver)
|
||||
if self.metadata.version != normalized_version:
|
||||
warnings.warn(
|
||||
"Normalizing '%s' to '%s'" % (
|
||||
self.metadata.version,
|
||||
normalized_version,
|
||||
)
|
||||
)
|
||||
self.metadata.version = normalized_version
|
||||
packaging.version.Version(version)
|
||||
except (packaging.version.InvalidVersion, TypeError):
|
||||
warnings.warn(
|
||||
"The version specified (%r) is an invalid version, this "
|
||||
"may not work as expected with newer versions of "
|
||||
"setuptools, pip, and PyPI. Please see PEP 440 for more "
|
||||
"details." % self.metadata.version
|
||||
"details." % version
|
||||
)
|
||||
self._finalize_requires()
|
||||
return setuptools.sic(version)
|
||||
return version
|
||||
|
||||
def _finalize_requires(self):
|
||||
"""
|
||||
@@ -569,7 +563,7 @@ class Distribution(_Distribution):
|
||||
from setuptools.extern.six.moves.configparser import ConfigParser
|
||||
|
||||
# Ignore install directory options if we have a venv
|
||||
if six.PY3 and sys.prefix != sys.base_prefix:
|
||||
if not six.PY2 and sys.prefix != sys.base_prefix:
|
||||
ignore_options = [
|
||||
'install-base', 'install-platbase', 'install-lib',
|
||||
'install-platlib', 'install-purelib', 'install-headers',
|
||||
@@ -591,7 +585,7 @@ class Distribution(_Distribution):
|
||||
with io.open(filename, encoding='utf-8') as reader:
|
||||
if DEBUG:
|
||||
self.announce(" reading {filename}".format(**locals()))
|
||||
(parser.read_file if six.PY3 else parser.readfp)(reader)
|
||||
(parser.readfp if six.PY2 else parser.read_file)(reader)
|
||||
for section in parser.sections():
|
||||
options = parser.options(section)
|
||||
opt_dict = self.get_option_dict(section)
|
||||
@@ -619,8 +613,8 @@ class Distribution(_Distribution):
|
||||
setattr(self, opt, strtobool(val))
|
||||
else:
|
||||
setattr(self, opt, val)
|
||||
except ValueError as msg:
|
||||
raise DistutilsOptionError(msg)
|
||||
except ValueError as e:
|
||||
raise DistutilsOptionError(e) from e
|
||||
|
||||
@staticmethod
|
||||
def _try_str(val):
|
||||
@@ -634,7 +628,7 @@ class Distribution(_Distribution):
|
||||
|
||||
Ref #1653
|
||||
"""
|
||||
if six.PY3:
|
||||
if not six.PY2:
|
||||
return val
|
||||
try:
|
||||
return val.encode()
|
||||
@@ -686,8 +680,8 @@ class Distribution(_Distribution):
|
||||
raise DistutilsOptionError(
|
||||
"error in %s: command '%s' has no such option '%s'"
|
||||
% (source, command_name, option))
|
||||
except ValueError as msg:
|
||||
raise DistutilsOptionError(msg)
|
||||
except ValueError as e:
|
||||
raise DistutilsOptionError(e) from e
|
||||
|
||||
def parse_config_files(self, filenames=None, ignore_option_errors=False):
|
||||
"""Parses configuration files from various levels
|
||||
@@ -700,17 +694,6 @@ class Distribution(_Distribution):
|
||||
ignore_option_errors=ignore_option_errors)
|
||||
self._finalize_requires()
|
||||
|
||||
def parse_command_line(self):
|
||||
"""Process features after parsing command line options"""
|
||||
result = _Distribution.parse_command_line(self)
|
||||
if self.features:
|
||||
self._finalize_features()
|
||||
return result
|
||||
|
||||
def _feature_attrname(self, name):
|
||||
"""Convert feature name to corresponding option attribute name"""
|
||||
return 'with_' + name.replace('-', '_')
|
||||
|
||||
def fetch_build_eggs(self, requires):
|
||||
"""Resolve pre-setup requirements"""
|
||||
resolved_dists = pkg_resources.working_set.resolve(
|
||||
@@ -723,15 +706,28 @@ class Distribution(_Distribution):
|
||||
return resolved_dists
|
||||
|
||||
def finalize_options(self):
|
||||
_Distribution.finalize_options(self)
|
||||
if self.features:
|
||||
self._set_global_opts_from_features()
|
||||
"""
|
||||
Allow plugins to apply arbitrary operations to the
|
||||
distribution. Each hook may optionally define a 'order'
|
||||
to influence the order of execution. Smaller numbers
|
||||
go first and the default is 0.
|
||||
"""
|
||||
group = 'setuptools.finalize_distribution_options'
|
||||
|
||||
def by_order(hook):
|
||||
return getattr(hook, 'order', 0)
|
||||
eps = map(lambda e: e.load(), pkg_resources.iter_entry_points(group))
|
||||
for ep in sorted(eps, key=by_order):
|
||||
ep(self)
|
||||
|
||||
def _finalize_setup_keywords(self):
|
||||
for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
|
||||
value = getattr(self, ep.name, None)
|
||||
if value is not None:
|
||||
ep.require(installer=self.fetch_build_egg)
|
||||
ep.load()(self, ep.name, value)
|
||||
|
||||
def _finalize_2to3_doctests(self):
|
||||
if getattr(self, 'convert_2to3_doctests', None):
|
||||
# XXX may convert to set here when we can rely on set being builtin
|
||||
self.convert_2to3_doctests = [
|
||||
@@ -758,76 +754,8 @@ class Distribution(_Distribution):
|
||||
|
||||
def fetch_build_egg(self, req):
|
||||
"""Fetch an egg needed for building"""
|
||||
from setuptools.command.easy_install import easy_install
|
||||
dist = self.__class__({'script_args': ['easy_install']})
|
||||
opts = dist.get_option_dict('easy_install')
|
||||
opts.clear()
|
||||
opts.update(
|
||||
(k, v)
|
||||
for k, v in self.get_option_dict('easy_install').items()
|
||||
if k in (
|
||||
# don't use any other settings
|
||||
'find_links', 'site_dirs', 'index_url',
|
||||
'optimize', 'site_dirs', 'allow_hosts',
|
||||
))
|
||||
if self.dependency_links:
|
||||
links = self.dependency_links[:]
|
||||
if 'find_links' in opts:
|
||||
links = opts['find_links'][1] + links
|
||||
opts['find_links'] = ('setup', links)
|
||||
install_dir = self.get_egg_cache_dir()
|
||||
cmd = easy_install(
|
||||
dist, args=["x"], install_dir=install_dir,
|
||||
exclude_scripts=True,
|
||||
always_copy=False, build_directory=None, editable=False,
|
||||
upgrade=False, multi_version=True, no_report=True, user=False
|
||||
)
|
||||
cmd.ensure_finalized()
|
||||
return cmd.easy_install(req)
|
||||
|
||||
def _set_global_opts_from_features(self):
|
||||
"""Add --with-X/--without-X options based on optional features"""
|
||||
|
||||
go = []
|
||||
no = self.negative_opt.copy()
|
||||
|
||||
for name, feature in self.features.items():
|
||||
self._set_feature(name, None)
|
||||
feature.validate(self)
|
||||
|
||||
if feature.optional:
|
||||
descr = feature.description
|
||||
incdef = ' (default)'
|
||||
excdef = ''
|
||||
if not feature.include_by_default():
|
||||
excdef, incdef = incdef, excdef
|
||||
|
||||
new = (
|
||||
('with-' + name, None, 'include ' + descr + incdef),
|
||||
('without-' + name, None, 'exclude ' + descr + excdef),
|
||||
)
|
||||
go.extend(new)
|
||||
no['without-' + name] = 'with-' + name
|
||||
|
||||
self.global_options = self.feature_options = go + self.global_options
|
||||
self.negative_opt = self.feature_negopt = no
|
||||
|
||||
def _finalize_features(self):
|
||||
"""Add/remove features and resolve dependencies between them"""
|
||||
|
||||
# First, flag all the enabled items (and thus their dependencies)
|
||||
for name, feature in self.features.items():
|
||||
enabled = self.feature_is_included(name)
|
||||
if enabled or (enabled is None and feature.include_by_default()):
|
||||
feature.include_in(self)
|
||||
self._set_feature(name, 1)
|
||||
|
||||
# Then disable the rest, so that off-by-default features don't
|
||||
# get flagged as errors when they're required by an enabled feature
|
||||
for name, feature in self.features.items():
|
||||
if not self.feature_is_included(name):
|
||||
feature.exclude_from(self)
|
||||
self._set_feature(name, 0)
|
||||
from setuptools.installer import fetch_build_egg
|
||||
return fetch_build_egg(self, req)
|
||||
|
||||
def get_command_class(self, command):
|
||||
"""Pluggable version of get_command_class()"""
|
||||
@@ -858,25 +786,6 @@ class Distribution(_Distribution):
|
||||
self.cmdclass[ep.name] = cmdclass
|
||||
return _Distribution.get_command_list(self)
|
||||
|
||||
def _set_feature(self, name, status):
|
||||
"""Set feature's inclusion status"""
|
||||
setattr(self, self._feature_attrname(name), status)
|
||||
|
||||
def feature_is_included(self, name):
|
||||
"""Return 1 if feature is included, 0 if excluded, 'None' if unknown"""
|
||||
return getattr(self, self._feature_attrname(name))
|
||||
|
||||
def include_feature(self, name):
|
||||
"""Request inclusion of feature named 'name'"""
|
||||
|
||||
if self.feature_is_included(name) == 0:
|
||||
descr = self.features[name].description
|
||||
raise DistutilsOptionError(
|
||||
descr + " is required, but was excluded or is not available"
|
||||
)
|
||||
self.features[name].include_in(self)
|
||||
self._set_feature(name, 1)
|
||||
|
||||
def include(self, **attrs):
|
||||
"""Add items to distribution that are named in keyword arguments
|
||||
|
||||
@@ -938,10 +847,10 @@ class Distribution(_Distribution):
|
||||
)
|
||||
try:
|
||||
old = getattr(self, name)
|
||||
except AttributeError:
|
||||
except AttributeError as e:
|
||||
raise DistutilsSetupError(
|
||||
"%s: No such distribution setting" % name
|
||||
)
|
||||
) from e
|
||||
if old is not None and not isinstance(old, sequence):
|
||||
raise DistutilsSetupError(
|
||||
name + ": this setting cannot be changed via include/exclude"
|
||||
@@ -958,10 +867,10 @@ class Distribution(_Distribution):
|
||||
)
|
||||
try:
|
||||
old = getattr(self, name)
|
||||
except AttributeError:
|
||||
except AttributeError as e:
|
||||
raise DistutilsSetupError(
|
||||
"%s: No such distribution setting" % name
|
||||
)
|
||||
) from e
|
||||
if old is None:
|
||||
setattr(self, name, value)
|
||||
elif not isinstance(old, sequence):
|
||||
@@ -1121,160 +1030,6 @@ class Distribution(_Distribution):
|
||||
sys.stdout.detach(), encoding, errors, newline, line_buffering)
|
||||
|
||||
|
||||
class Feature:
|
||||
"""
|
||||
**deprecated** -- The `Feature` facility was never completely implemented
|
||||
or supported, `has reported issues
|
||||
<https://github.com/pypa/setuptools/issues/58>`_ and will be removed in
|
||||
a future version.
|
||||
|
||||
A subset of the distribution that can be excluded if unneeded/wanted
|
||||
|
||||
Features are created using these keyword arguments:
|
||||
|
||||
'description' -- a short, human readable description of the feature, to
|
||||
be used in error messages, and option help messages.
|
||||
|
||||
'standard' -- if true, the feature is included by default if it is
|
||||
available on the current system. Otherwise, the feature is only
|
||||
included if requested via a command line '--with-X' option, or if
|
||||
another included feature requires it. The default setting is 'False'.
|
||||
|
||||
'available' -- if true, the feature is available for installation on the
|
||||
current system. The default setting is 'True'.
|
||||
|
||||
'optional' -- if true, the feature's inclusion can be controlled from the
|
||||
command line, using the '--with-X' or '--without-X' options. If
|
||||
false, the feature's inclusion status is determined automatically,
|
||||
based on 'availabile', 'standard', and whether any other feature
|
||||
requires it. The default setting is 'True'.
|
||||
|
||||
'require_features' -- a string or sequence of strings naming features
|
||||
that should also be included if this feature is included. Defaults to
|
||||
empty list. May also contain 'Require' objects that should be
|
||||
added/removed from the distribution.
|
||||
|
||||
'remove' -- a string or list of strings naming packages to be removed
|
||||
from the distribution if this feature is *not* included. If the
|
||||
feature *is* included, this argument is ignored. This argument exists
|
||||
to support removing features that "crosscut" a distribution, such as
|
||||
defining a 'tests' feature that removes all the 'tests' subpackages
|
||||
provided by other features. The default for this argument is an empty
|
||||
list. (Note: the named package(s) or modules must exist in the base
|
||||
distribution when the 'setup()' function is initially called.)
|
||||
|
||||
other keywords -- any other keyword arguments are saved, and passed to
|
||||
the distribution's 'include()' and 'exclude()' methods when the
|
||||
feature is included or excluded, respectively. So, for example, you
|
||||
could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
|
||||
added or removed from the distribution as appropriate.
|
||||
|
||||
A feature must include at least one 'requires', 'remove', or other
|
||||
keyword argument. Otherwise, it can't affect the distribution in any way.
|
||||
Note also that you can subclass 'Feature' to create your own specialized
|
||||
feature types that modify the distribution in other ways when included or
|
||||
excluded. See the docstrings for the various methods here for more detail.
|
||||
Aside from the methods, the only feature attributes that distributions look
|
||||
at are 'description' and 'optional'.
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def warn_deprecated():
|
||||
msg = (
|
||||
"Features are deprecated and will be removed in a future "
|
||||
"version. See https://github.com/pypa/setuptools/issues/65."
|
||||
)
|
||||
warnings.warn(msg, DistDeprecationWarning, stacklevel=3)
|
||||
|
||||
def __init__(
|
||||
self, description, standard=False, available=True,
|
||||
optional=True, require_features=(), remove=(), **extras):
|
||||
self.warn_deprecated()
|
||||
|
||||
self.description = description
|
||||
self.standard = standard
|
||||
self.available = available
|
||||
self.optional = optional
|
||||
if isinstance(require_features, (str, Require)):
|
||||
require_features = require_features,
|
||||
|
||||
self.require_features = [
|
||||
r for r in require_features if isinstance(r, str)
|
||||
]
|
||||
er = [r for r in require_features if not isinstance(r, str)]
|
||||
if er:
|
||||
extras['require_features'] = er
|
||||
|
||||
if isinstance(remove, str):
|
||||
remove = remove,
|
||||
self.remove = remove
|
||||
self.extras = extras
|
||||
|
||||
if not remove and not require_features and not extras:
|
||||
raise DistutilsSetupError(
|
||||
"Feature %s: must define 'require_features', 'remove', or "
|
||||
"at least one of 'packages', 'py_modules', etc."
|
||||
)
|
||||
|
||||
def include_by_default(self):
|
||||
"""Should this feature be included by default?"""
|
||||
return self.available and self.standard
|
||||
|
||||
def include_in(self, dist):
|
||||
"""Ensure feature and its requirements are included in distribution
|
||||
|
||||
You may override this in a subclass to perform additional operations on
|
||||
the distribution. Note that this method may be called more than once
|
||||
per feature, and so should be idempotent.
|
||||
|
||||
"""
|
||||
|
||||
if not self.available:
|
||||
raise DistutilsPlatformError(
|
||||
self.description + " is required, "
|
||||
"but is not available on this platform"
|
||||
)
|
||||
|
||||
dist.include(**self.extras)
|
||||
|
||||
for f in self.require_features:
|
||||
dist.include_feature(f)
|
||||
|
||||
def exclude_from(self, dist):
|
||||
"""Ensure feature is excluded from distribution
|
||||
|
||||
You may override this in a subclass to perform additional operations on
|
||||
the distribution. This method will be called at most once per
|
||||
feature, and only after all included features have been asked to
|
||||
include themselves.
|
||||
"""
|
||||
|
||||
dist.exclude(**self.extras)
|
||||
|
||||
if self.remove:
|
||||
for item in self.remove:
|
||||
dist.exclude_package(item)
|
||||
|
||||
def validate(self, dist):
|
||||
"""Verify that feature makes sense in context of distribution
|
||||
|
||||
This method is called by the distribution just before it parses its
|
||||
command line. It checks to ensure that the 'remove' attribute, if any,
|
||||
contains only valid package/module names that are present in the base
|
||||
distribution when 'setup()' is called. You may override it in a
|
||||
subclass to perform any other required validation of the feature
|
||||
against a target distribution.
|
||||
"""
|
||||
|
||||
for item in self.remove:
|
||||
if not dist.has_contents_for(item):
|
||||
raise DistutilsSetupError(
|
||||
"%s wants to be able to remove %s, but the distribution"
|
||||
" 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."""
|
||||
|
||||
Reference in New Issue
Block a user