hyb
2025-10-24 43c4449e6c9231446895ad26d169825ca7a65c9a
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
"""Tests for distutils.core."""
 
import distutils.core
import io
import os
import sys
from distutils.dist import Distribution
 
import pytest
 
# 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__, encoding='utf-8')
        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, encoding='utf-8')
        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, encoding='utf-8')
        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, encoding='utf-8')
        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, encoding='utf-8')
        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, encoding='utf-8')
        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')
        assert 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)