Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
setuptools
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jérome Perrin
setuptools
Commits
bb71fd1b
Commit
bb71fd1b
authored
Nov 09, 2017
by
Jason R. Coombs
Committed by
GitHub
Nov 09, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1150 from benoit-pierre/support_setup_requires_in_setup.cfg
support `setup_requires` in setup.cfg
parents
4f43bd2a
42f5ec91
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
124 additions
and
29 deletions
+124
-29
CHANGES.rst
CHANGES.rst
+5
-0
setuptools/__init__.py
setuptools/__init__.py
+21
-1
setuptools/dist.py
setuptools/dist.py
+19
-21
setuptools/tests/test_dist.py
setuptools/tests/test_dist.py
+1
-0
setuptools/tests/test_easy_install.py
setuptools/tests/test_easy_install.py
+78
-7
No files found.
CHANGES.rst
View file @
bb71fd1b
v36
.7.0
-------
*
#
1054
:
Support
``
setup_requires
``
in
``
setup
.
cfg
``
files
.
v36
.6.1
-------
...
...
setuptools/__init__.py
View file @
bb71fd1b
...
...
@@ -109,7 +109,27 @@ class PEP420PackageFinder(PackageFinder):
find_packages
=
PackageFinder
.
find
setup
=
distutils
.
core
.
setup
def
_install_setup_requires
(
attrs
):
# Note: do not use `setuptools.Distribution` directly, as
# our PEP 517 backend patch `distutils.core.Distribution`.
dist
=
distutils
.
core
.
Distribution
(
dict
(
(
k
,
v
)
for
k
,
v
in
attrs
.
items
()
if
k
in
(
'dependency_links'
,
'setup_requires'
)
))
# Honor setup.cfg's options.
dist
.
parse_config_files
(
ignore_option_errors
=
True
)
if
dist
.
setup_requires
:
dist
.
fetch_build_eggs
(
dist
.
setup_requires
)
def
setup
(
**
attrs
):
# Make sure we have any requirements needed to interpret 'attrs'.
_install_setup_requires
(
attrs
)
return
distutils
.
core
.
setup
(
**
attrs
)
setup
.
__doc__
=
distutils
.
core
.
setup
.
__doc__
_Command
=
monkey
.
get_unpatched
(
distutils
.
core
.
Command
)
...
...
setuptools/dist.py
View file @
bb71fd1b
...
...
@@ -316,23 +316,19 @@ class Distribution(Distribution_parse_config_files, _Distribution):
have_package_data = hasattr(self, "package_data")
if not have_package_data:
self.package_data = {}
_attrs_dict
= attrs or {}
if '
features
' in
_attrs_dict or '
require_features
' in _attrs_dict
:
attrs
= attrs or {}
if '
features
' in
attrs or '
require_features
' in attrs
:
Feature.warn_deprecated()
self.require_features = []
self.features = {}
self.dist_files = []
self.src_root = attrs
and attrs
.pop("src_root", None)
self.src_root = attrs.pop("src_root", None)
self.patch_missing_pkg_info(attrs)
self.long_description_content_type =
_attrs_dict
.get(
self.long_description_content_type =
attrs
.get(
'
long_description_content_type
'
)
# Make sure we have any eggs needed to interpret '
attrs
'
if attrs is not None:
self.dependency_links = attrs.pop('
dependency_links
', [])
assert_string_list(self, '
dependency_links
', self.dependency_links)
if attrs and '
setup_requires
' in attrs:
self.fetch_build_eggs(attrs['
setup_requires
'])
self.dependency_links = attrs.pop('
dependency_links
', [])
self.setup_requires = attrs.pop('
setup_requires
', [])
for ep in pkg_resources.iter_entry_points('
distutils
.
setup_keywords
'):
vars(self).setdefault(ep.name, None)
_Distribution.__init__(self, attrs)
...
...
@@ -427,14 +423,15 @@ class Distribution(Distribution_parse_config_files, _Distribution):
req.marker = None
return req
def parse_config_files(self, filenames=None):
def parse_config_files(self, filenames=None
, ignore_option_errors=False
):
"""Parses configuration files from various levels
and loads configuration.
"""
_Distribution.parse_config_files(self, filenames=filenames)
parse_configuration(self, self.command_options)
parse_configuration(self, self.command_options,
ignore_option_errors=ignore_option_errors)
self._finalize_requires()
def parse_command_line(self):
...
...
@@ -497,19 +494,20 @@ class Distribution(Distribution_parse_config_files, _Distribution):
"""Fetch an egg needed for building"""
from setuptools.command.easy_install import easy_install
dist = self.__class__({'
script_args
': ['
easy_install
']})
dist.parse_config_files()
opts = dist.get_option_dict('
easy_install
')
keep = (
'
find_links
', '
site_dirs
', '
index_url
', '
optimize
',
'
site_dirs
', '
allow_hosts
'
)
for key in list(opts):
if key not in keep:
del opts[key] # don'
t
use
any
other
settings
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
]
.
split
()
+
links
links
=
opts
[
'find_links'
][
1
]
+
links
opts
[
'find_links'
]
=
(
'setup'
,
links
)
install_dir
=
self
.
get_egg_cache_dir
()
cmd
=
easy_install
(
...
...
setuptools/tests/test_dist.py
View file @
bb71fd1b
...
...
@@ -39,6 +39,7 @@ def test_dist_fetch_build_egg(tmpdir):
'''
.
split
()
with
tmpdir
.
as_cwd
():
dist
=
Distribution
()
dist
.
parse_config_files
()
resolved_dists
=
[
dist
.
fetch_build_egg
(
r
)
for
r
in
reqs
...
...
setuptools/tests/test_easy_install.py
View file @
bb71fd1b
...
...
@@ -381,7 +381,15 @@ class TestSetupRequires:
"""
))])
yield
dist_path
def
test_setup_requires_overrides_version_conflict
(
self
):
use_setup_cfg
=
(
(),
(
'dependency_links'
,),
(
'setup_requires'
,),
(
'dependency_links'
,
'setup_requires'
),
)
@
pytest
.
mark
.
parametrize
(
'use_setup_cfg'
,
use_setup_cfg
)
def
test_setup_requires_overrides_version_conflict
(
self
,
use_setup_cfg
):
"""
Regression test for distribution issue 323:
https://bitbucket.org/tarek/distribute/issues/323
...
...
@@ -397,7 +405,7 @@ class TestSetupRequires:
with
contexts
.
save_pkg_resources_state
():
with
contexts
.
tempdir
()
as
temp_dir
:
test_pkg
=
create_setup_requires_package
(
temp_dir
)
test_pkg
=
create_setup_requires_package
(
temp_dir
,
use_setup_cfg
=
use_setup_cfg
)
test_setup_py
=
os
.
path
.
join
(
test_pkg
,
'setup.py'
)
with
contexts
.
quiet
()
as
(
stdout
,
stderr
):
# Don't even need to install the package, just
...
...
@@ -406,9 +414,10 @@ class TestSetupRequires:
lines
=
stdout
.
readlines
()
assert
len
(
lines
)
>
0
assert
lines
[
-
1
].
strip
()
,
'test_pkg'
assert
lines
[
-
1
].
strip
()
==
'test_pkg'
def
test_setup_requires_override_nspkg
(
self
):
@
pytest
.
mark
.
parametrize
(
'use_setup_cfg'
,
use_setup_cfg
)
def
test_setup_requires_override_nspkg
(
self
,
use_setup_cfg
):
"""
Like ``test_setup_requires_overrides_version_conflict`` but where the
``setup_requires`` package is part of a namespace package that has
...
...
@@ -446,7 +455,8 @@ class TestSetupRequires:
"""
)
test_pkg
=
create_setup_requires_package
(
temp_dir
,
'foo.bar'
,
'0.2'
,
make_nspkg_sdist
,
template
)
temp_dir
,
'foo.bar'
,
'0.2'
,
make_nspkg_sdist
,
template
,
use_setup_cfg
=
use_setup_cfg
)
test_setup_py
=
os
.
path
.
join
(
test_pkg
,
'setup.py'
)
...
...
@@ -464,6 +474,38 @@ class TestSetupRequires:
assert
len
(
lines
)
>
0
assert
lines
[
-
1
].
strip
()
==
'test_pkg'
@
pytest
.
mark
.
parametrize
(
'use_setup_cfg'
,
use_setup_cfg
)
def
test_setup_requires_with_attr_version
(
self
,
use_setup_cfg
):
def
make_dependency_sdist
(
dist_path
,
distname
,
version
):
make_sdist
(
dist_path
,
[
(
'setup.py'
,
DALS
(
"""
import setuptools
setuptools.setup(
name={name!r},
version={version!r},
py_modules=[{name!r}],
)
"""
.
format
(
name
=
distname
,
version
=
version
))),
(
distname
+
'.py'
,
DALS
(
"""
version = 42
"""
))])
with
contexts
.
save_pkg_resources_state
():
with
contexts
.
tempdir
()
as
temp_dir
:
test_pkg
=
create_setup_requires_package
(
temp_dir
,
setup_attrs
=
dict
(
version
=
'attr: foobar.version'
),
make_package
=
make_dependency_sdist
,
use_setup_cfg
=
use_setup_cfg
+
(
'version'
,),
)
test_setup_py
=
os
.
path
.
join
(
test_pkg
,
'setup.py'
)
with
contexts
.
quiet
()
as
(
stdout
,
stderr
):
run_setup
(
test_setup_py
,
[
'--version'
])
lines
=
stdout
.
readlines
()
assert
len
(
lines
)
>
0
assert
lines
[
-
1
].
strip
()
==
'42'
def
make_trivial_sdist
(
dist_path
,
distname
,
version
):
"""
...
...
@@ -532,7 +574,8 @@ def make_sdist(dist_path, files):
def
create_setup_requires_package
(
path
,
distname
=
'foobar'
,
version
=
'0.1'
,
make_package
=
make_trivial_sdist
,
setup_py_template
=
None
):
setup_py_template
=
None
,
setup_attrs
=
{},
use_setup_cfg
=
()):
"""Creates a source tree under path for a trivial test package that has a
single requirement in setup_requires--a tarball for that requirement is
also created and added to the dependency_links argument.
...
...
@@ -547,11 +590,39 @@ def create_setup_requires_package(path, distname='foobar', version='0.1',
'setup_requires'
:
[
'%s==%s'
%
(
distname
,
version
)],
'dependency_links'
:
[
os
.
path
.
abspath
(
path
)]
}
test_setup_attrs
.
update
(
setup_attrs
)
test_pkg
=
os
.
path
.
join
(
path
,
'test_pkg'
)
test_setup_py
=
os
.
path
.
join
(
test_pkg
,
'setup.py'
)
os
.
mkdir
(
test_pkg
)
if
use_setup_cfg
:
test_setup_cfg
=
os
.
path
.
join
(
test_pkg
,
'setup.cfg'
)
options
=
[]
metadata
=
[]
for
name
in
use_setup_cfg
:
value
=
test_setup_attrs
.
pop
(
name
)
if
name
in
'name version'
.
split
():
section
=
metadata
else
:
section
=
options
if
isinstance
(
value
,
(
tuple
,
list
)):
value
=
';'
.
join
(
value
)
section
.
append
(
'%s: %s'
%
(
name
,
value
))
with
open
(
test_setup_cfg
,
'w'
)
as
f
:
f
.
write
(
DALS
(
"""
[metadata]
{metadata}
[options]
{options}
"""
).
format
(
options
=
'
\
n
'
.
join
(
options
),
metadata
=
'
\
n
'
.
join
(
metadata
),
))
test_setup_py
=
os
.
path
.
join
(
test_pkg
,
'setup.py'
)
if
setup_py_template
is
None
:
setup_py_template
=
DALS
(
"""
\
import setuptools
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment