1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
"""Tests for distutils.core."""
import io
import distutils.core
import os
import sys
import pytest
from distutils.dist import Distribution
# setup script that uses __file__
setup_using___file__ = """\
__file__
from distutils.core import setup
setup()
"""
setup_prints_cwd = """\
import os
print(os.getcwd())
from distutils.core import setup
setup()
"""
setup_does_nothing = """\
from distutils.core import setup
setup()
"""
setup_defines_subclass = """\
from distutils.core import setup
from distutils.command.install import install as _install
class install(_install):
sub_commands = _install.sub_commands + ['cmd']
setup(cmdclass={'install': install})
"""
setup_within_if_main = """\
from distutils.core import setup
def main():
return setup(name="setup_within_if_main")
if __name__ == "__main__":
main()
"""
@pytest.fixture(autouse=True)
def save_stdout(monkeypatch):
monkeypatch.setattr(sys, 'stdout', sys.stdout)
@pytest.fixture
def temp_file(tmp_path):
return tmp_path / 'file'
@pytest.mark.usefixtures('save_env')
@pytest.mark.usefixtures('save_argv')
class TestCore:
def test_run_setup_provides_file(self, temp_file):
# Make sure the script can use __file__; if that's missing, the test
# setup.py script will raise NameError.
temp_file.write_text(setup_using___file__)
distutils.core.run_setup(temp_file)
def test_run_setup_preserves_sys_argv(self, temp_file):
# Make sure run_setup does not clobber sys.argv
argv_copy = sys.argv.copy()
temp_file.write_text(setup_does_nothing)
distutils.core.run_setup(temp_file)
assert sys.argv == argv_copy
def test_run_setup_defines_subclass(self, temp_file):
# Make sure the script can use __file__; if that's missing, the test
# setup.py script will raise NameError.
temp_file.write_text(setup_defines_subclass)
dist = distutils.core.run_setup(temp_file)
install = dist.get_command_obj('install')
assert 'cmd' in install.sub_commands
def test_run_setup_uses_current_dir(self, tmp_path):
"""
Test that the setup script is run with the current directory
as its own current directory.
"""
sys.stdout = io.StringIO()
cwd = os.getcwd()
# Create a directory and write the setup.py file there:
setup_py = tmp_path / 'setup.py'
setup_py.write_text(setup_prints_cwd)
distutils.core.run_setup(setup_py)
output = sys.stdout.getvalue()
if output.endswith("\n"):
output = output[:-1]
assert cwd == output
def test_run_setup_within_if_main(self, temp_file):
temp_file.write_text(setup_within_if_main)
dist = distutils.core.run_setup(temp_file, stop_after="config")
assert isinstance(dist, Distribution)
assert dist.get_name() == "setup_within_if_main"
def test_run_commands(self, temp_file):
sys.argv = ['setup.py', 'build']
temp_file.write_text(setup_within_if_main)
dist = distutils.core.run_setup(temp_file, stop_after="commandline")
assert 'build' not in dist.have_run
distutils.core.run_commands(dist)
assert 'build' in dist.have_run
def test_debug_mode(self, capsys, monkeypatch):
# this covers the code called when DEBUG is set
sys.argv = ['setup.py', '--name']
distutils.core.setup(name='bar')
capsys.readouterr().out == 'bar\n'
monkeypatch.setattr(distutils.core, 'DEBUG', True)
distutils.core.setup(name='bar')
wanted = "options (after parsing config files):\n"
assert capsys.readouterr().out.startswith(wanted)
|