summaryrefslogtreecommitdiff
path: root/setuptools/_distutils/tests/test_core.py
blob: 2c11ff769eebec2e6199a19efa436a3305037bdf (plain)
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)