test_actions.py 11.7 KB
Newer Older
F
frostming 已提交
1 2
from collections import namedtuple

F
linting  
Frost Ming 已提交
3
import pytest
F
Frost Ming 已提交
4 5
from distlib.wheel import Wheel
from pdm.cli import actions
F
frostming 已提交
6
from pdm.exceptions import PdmUsageError
F
Frost Ming 已提交
7
from pdm.models.requirements import parse_requirement
F
Frost Ming 已提交
8
from pdm.project import Project
F
frostming 已提交
9 10

Requirement = namedtuple("Requirement", "key")
F
Frost Ming 已提交
11
Candidate = namedtuple("Candidate", "req,name,version")
F
frostming 已提交
12 13 14 15


def make_candidate(name, version):
    req = Requirement(name)
F
Frost Ming 已提交
16
    return Candidate(req=req, name=name, version=version)
F
frostming 已提交
17 18


F
Frost Ming 已提交
19 20 21 22
def test_sync_only_different(project, repository, working_set, capsys):
    working_set.add_candidate(make_candidate("foo", "0.1.0"))
    working_set.add_candidate(make_candidate("chardet", "3.0.1"))
    working_set.add_candidate(make_candidate("idna", "2.7"))
F
Frost Ming 已提交
23
    actions.do_add(project, packages=["requests"])
F
frostming 已提交
24
    out, _ = capsys.readouterr()
F
frostming 已提交
25
    assert "4 packages added" in out
F
frostming 已提交
26
    assert "1 package updated" in out
F
Frost Ming 已提交
27 28 29
    assert "foo" in working_set
    assert "test-project" in working_set
    assert working_set["chardet"].version == "3.0.4"
F
frostming 已提交
30 31


F
Frost Ming 已提交
32 33 34
def test_sync_no_lockfile(project):
    project.add_dependencies({"requests": parse_requirement("requests")})
    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
35
        actions.do_sync(project)
F
Frost Ming 已提交
36 37


F
Frost Ming 已提交
38 39 40 41 42 43 44
def test_sync_clean_packages(project, repository, working_set):
    for candidate in [
        make_candidate("foo", "0.1.0"),
        make_candidate("chardet", "3.0.1"),
        make_candidate("idna", "2.7"),
    ]:
        working_set.add_candidate(candidate)
F
Frost Ming 已提交
45 46
    actions.do_add(project, packages=["requests"], sync=False)
    actions.do_sync(project, clean=True)
F
Frost Ming 已提交
47
    assert "foo" not in working_set
F
frostming 已提交
48 49


F
Frost Ming 已提交
50 51 52 53 54 55 56
def test_sync_dry_run(project, repository, working_set):
    for candidate in [
        make_candidate("foo", "0.1.0"),
        make_candidate("chardet", "3.0.1"),
        make_candidate("idna", "2.7"),
    ]:
        working_set.add_candidate(candidate)
F
Frost Ming 已提交
57 58
    actions.do_add(project, packages=["requests"], sync=False)
    actions.do_sync(project, clean=True, dry_run=True)
F
Frost Ming 已提交
59 60 61
    assert "foo" in working_set
    assert "requests" not in working_set
    assert working_set["chardet"].version == "3.0.1"
F
frostming 已提交
62 63


F
Frost Ming 已提交
64
def test_add_package(project, repository, working_set, is_dev):
F
Frost Ming 已提交
65
    actions.do_add(project, is_dev, packages=["requests"])
F
frostming 已提交
66 67
    section = "dev-dependencies" if is_dev else "dependencies"

F
frostming 已提交
68
    assert project.tool_settings[section]["requests"] == "<3.0.0,>=2.19.1"
F
frostming 已提交
69 70 71
    locked_candidates = project.get_locked_candidates("dev" if is_dev else "default")
    assert locked_candidates["idna"].version == "2.7"
    for package in ("requests", "idna", "chardet", "urllib3", "certifi"):
F
Frost Ming 已提交
72
        assert package in working_set
F
frostming 已提交
73 74


F
Frost Ming 已提交
75
def test_add_package_to_custom_package(project, repository, working_set):
F
Frost Ming 已提交
76
    actions.do_add(project, section="test", packages=["requests"])
F
frostming 已提交
77

F
frostming 已提交
78
    assert "requests" in project.tool_settings["test-dependencies"]
F
frostming 已提交
79 80 81
    locked_candidates = project.get_locked_candidates("test")
    assert locked_candidates["idna"].version == "2.7"
    for package in ("requests", "idna", "chardet", "urllib3", "certifi"):
F
Frost Ming 已提交
82
        assert package in working_set
F
frostming 已提交
83 84


F
Frost Ming 已提交
85
def test_add_editable_package(project, repository, working_set, is_dev, vcs):
F
Frost Ming 已提交
86
    actions.do_add(
F
frostming 已提交
87 88 89
        project,
        is_dev,
        editables=["git+https://github.com/test-root/demo.git#egg=demo"],
F
frostming 已提交
90 91
    )
    section = "dev-dependencies" if is_dev else "dependencies"
F
frostming 已提交
92
    assert "demo" in project.tool_settings[section]
F
frostming 已提交
93 94
    locked_candidates = project.get_locked_candidates("dev" if is_dev else "default")
    assert locked_candidates["idna"].version == "2.7"
F
Frost Ming 已提交
95
    assert "idna" in working_set
F
frostming 已提交
96 97


F
Frost Ming 已提交
98
def test_add_no_install(project, repository, working_set):
F
Frost Ming 已提交
99
    actions.do_add(project, sync=False, packages=["requests"])
F
frostming 已提交
100
    for package in ("requests", "idna", "chardet", "urllib3", "certifi"):
F
Frost Ming 已提交
101
        assert package not in working_set
F
frostming 已提交
102 103 104


def test_add_package_save_exact(project, repository):
F
Frost Ming 已提交
105
    actions.do_add(project, sync=False, save="exact", packages=["requests"])
F
frostming 已提交
106
    assert project.tool_settings["dependencies"]["requests"] == "==2.19.1"
F
frostming 已提交
107 108 109


def test_add_package_save_wildcard(project, repository):
F
Frost Ming 已提交
110
    actions.do_add(project, sync=False, save="wildcard", packages=["requests"])
F
frostming 已提交
111
    assert project.tool_settings["dependencies"]["requests"] == "*"
F
frostming 已提交
112 113 114


def test_add_package_update_reuse(project, repository):
F
Frost Ming 已提交
115
    actions.do_add(project, sync=False, save="wildcard", packages=["requests", "pytz"])
F
frostming 已提交
116 117 118 119 120 121 122 123 124

    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.19.1"
    assert locked_candidates["chardet"].version == "3.0.4"
    assert locked_candidates["pytz"].version == "2019.3"

    repository.add_candidate("pytz", "2019.6")
    repository.add_candidate("chardet", "3.0.5")
    repository.add_candidate("requests", "2.20.0")
F
frostming 已提交
125 126 127 128 129 130 131 132 133 134
    repository.add_dependencies(
        "requests",
        "2.20.0",
        [
            "certifi>=2017.4.17",
            "chardet<3.1.0,>=3.0.2",
            "idna<2.8,>=2.5",
            "urllib3<1.24,>=1.21.1",
        ],
    )
F
Frost Ming 已提交
135
    actions.do_add(
F
frostming 已提交
136
        project, sync=False, save="wildcard", packages=["requests"], strategy="reuse"
F
frostming 已提交
137 138 139 140 141 142 143 144
    )
    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.20.0"
    assert locked_candidates["chardet"].version == "3.0.4"
    assert locked_candidates["pytz"].version == "2019.3"


def test_add_package_update_eager(project, repository):
F
Frost Ming 已提交
145
    actions.do_add(project, sync=False, save="wildcard", packages=["requests", "pytz"])
F
frostming 已提交
146 147 148 149 150 151 152 153 154

    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.19.1"
    assert locked_candidates["chardet"].version == "3.0.4"
    assert locked_candidates["pytz"].version == "2019.3"

    repository.add_candidate("pytz", "2019.6")
    repository.add_candidate("chardet", "3.0.5")
    repository.add_candidate("requests", "2.20.0")
F
frostming 已提交
155 156 157 158 159 160 161 162 163 164
    repository.add_dependencies(
        "requests",
        "2.20.0",
        [
            "certifi>=2017.4.17",
            "chardet<3.1.0,>=3.0.2",
            "idna<2.8,>=2.5",
            "urllib3<1.24,>=1.21.1",
        ],
    )
F
Frost Ming 已提交
165
    actions.do_add(
F
frostming 已提交
166
        project, sync=False, save="wildcard", packages=["requests"], strategy="eager"
F
frostming 已提交
167 168 169 170 171
    )
    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.20.0"
    assert locked_candidates["chardet"].version == "3.0.5"
    assert locked_candidates["pytz"].version == "2019.3"
F
frostming 已提交
172 173


F
Frost Ming 已提交
174
def test_update_all_packages(project, repository, working_set, capsys):
F
Frost Ming 已提交
175
    actions.do_add(project, packages=["requests", "pytz"])
F
frostming 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188
    repository.add_candidate("pytz", "2019.6")
    repository.add_candidate("chardet", "3.0.5")
    repository.add_candidate("requests", "2.20.0")
    repository.add_dependencies(
        "requests",
        "2.20.0",
        [
            "certifi>=2017.4.17",
            "chardet<3.1.0,>=3.0.2",
            "idna<2.8,>=2.5",
            "urllib3<1.24,>=1.21.1",
        ],
    )
F
Frost Ming 已提交
189
    actions.do_update(project)
F
frostming 已提交
190 191 192 193 194 195 196
    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.20.0"
    assert locked_candidates["chardet"].version == "3.0.5"
    assert locked_candidates["pytz"].version == "2019.6"
    out, _ = capsys.readouterr()
    assert "3 packages updated" in out

F
Frost Ming 已提交
197
    actions.do_sync(project)
F
frostming 已提交
198 199 200 201
    out, _ = capsys.readouterr()
    assert "All packages are synced to date" in out


F
Frost Ming 已提交
202
def test_update_specified_packages(project, repository, working_set):
F
Frost Ming 已提交
203
    actions.do_add(project, sync=False, packages=["requests", "pytz"])
F
frostming 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216
    repository.add_candidate("pytz", "2019.6")
    repository.add_candidate("chardet", "3.0.5")
    repository.add_candidate("requests", "2.20.0")
    repository.add_dependencies(
        "requests",
        "2.20.0",
        [
            "certifi>=2017.4.17",
            "chardet<3.1.0,>=3.0.2",
            "idna<2.8,>=2.5",
            "urllib3<1.24,>=1.21.1",
        ],
    )
F
Frost Ming 已提交
217
    actions.do_update(project, packages=["requests"])
F
frostming 已提交
218 219 220 221 222
    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.20.0"
    assert locked_candidates["chardet"].version == "3.0.4"


F
Frost Ming 已提交
223
def test_update_specified_packages_eager_mode(project, repository, working_set):
F
Frost Ming 已提交
224
    actions.do_add(project, sync=False, packages=["requests", "pytz"])
F
frostming 已提交
225 226 227 228 229 230 231 232 233 234 235 236 237
    repository.add_candidate("pytz", "2019.6")
    repository.add_candidate("chardet", "3.0.5")
    repository.add_candidate("requests", "2.20.0")
    repository.add_dependencies(
        "requests",
        "2.20.0",
        [
            "certifi>=2017.4.17",
            "chardet<3.1.0,>=3.0.2",
            "idna<2.8,>=2.5",
            "urllib3<1.24,>=1.21.1",
        ],
    )
F
Frost Ming 已提交
238
    actions.do_update(project, strategy="eager", packages=["requests"])
F
frostming 已提交
239 240 241 242 243 244
    locked_candidates = project.get_locked_candidates()
    assert locked_candidates["requests"].version == "2.20.0"
    assert locked_candidates["chardet"].version == "3.0.5"
    assert locked_candidates["pytz"].version == "2019.3"


F
Frost Ming 已提交
245
def test_remove_package(project, repository, working_set, is_dev):
F
Frost Ming 已提交
246 247
    actions.do_add(project, dev=is_dev, packages=["requests", "pytz"])
    actions.do_remove(project, dev=is_dev, packages=["pytz"])
F
frostming 已提交
248 249
    locked_candidates = project.get_locked_candidates()
    assert "pytz" not in locked_candidates
F
Frost Ming 已提交
250
    assert "pytz" not in working_set
F
frostming 已提交
251 252


F
Frost Ming 已提交
253
def test_remove_package_no_sync(project, repository, working_set):
F
Frost Ming 已提交
254 255
    actions.do_add(project, packages=["requests", "pytz"])
    actions.do_remove(project, sync=False, packages=["pytz"])
F
frostming 已提交
256 257
    locked_candidates = project.get_locked_candidates()
    assert "pytz" not in locked_candidates
F
Frost Ming 已提交
258
    assert "pytz" in working_set
F
frostming 已提交
259 260


F
Frost Ming 已提交
261
def test_remove_package_not_exist(project, repository, working_set):
F
Frost Ming 已提交
262
    actions.do_add(project, packages=["requests", "pytz"])
F
frostming 已提交
263
    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
264
        actions.do_remove(project, sync=False, packages=["django"])
F
frostming 已提交
265 266 267 268


def test_add_remove_no_package(project, repository):
    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
269
        actions.do_add(project, packages=())
F
frostming 已提交
270 271

    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
272
        actions.do_remove(project, packages=())
F
frostming 已提交
273 274


F
Frost Ming 已提交
275
def test_update_with_package_and_sections_argument(project, repository, working_set):
F
Frost Ming 已提交
276
    actions.do_add(project, packages=["requests", "pytz"])
F
frostming 已提交
277
    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
278
        actions.do_update(project, sections=("default", "dev"), packages=("requests",))
F
frostming 已提交
279 280

    with pytest.raises(PdmUsageError):
F
Frost Ming 已提交
281
        actions.do_update(project, default=False, packages=("requests",))
F
Frost Ming 已提交
282 283


F
Frost Ming 已提交
284
def test_add_package_with_mismatch_marker(project, repository, working_set, mocker):
F
frostming 已提交
285 286 287 288
    mocker.patch(
        "pdm.models.environment.get_pep508_environment",
        return_value={"platform_system": "Darwin"},
    )
F
Frost Ming 已提交
289
    actions.do_add(project, packages=["requests", "pytz; platform_system!='Darwin'"])
F
Frost Ming 已提交
290
    assert "pytz" not in working_set
F
frostming 已提交
291 292


F
Frost Ming 已提交
293
def test_add_dependency_from_multiple_parents(project, repository, working_set, mocker):
F
frostming 已提交
294 295 296 297
    mocker.patch(
        "pdm.models.environment.get_pep508_environment",
        return_value={"platform_system": "Darwin"},
    )
F
Frost Ming 已提交
298
    actions.do_add(project, packages=["requests", "chardet; platform_system!='Darwin'"])
F
Frost Ming 已提交
299
    assert "chardet" in working_set
F
Frost Ming 已提交
300 301 302


def test_list_packages(capsys):
F
Frost Ming 已提交
303
    actions.do_list(Project())
F
Frost Ming 已提交
304 305 306 307 308 309 310 311
    out, _ = capsys.readouterr()
    assert "pdm" in out
    assert "tomlkit" in out
    assert "halo" in out


def test_lock_dependencies(project, repository):
    project.add_dependencies({"requests": parse_requirement("requests")})
F
Frost Ming 已提交
312
    actions.do_lock(project)
F
Frost Ming 已提交
313 314 315 316
    assert project.lockfile_file.exists()
    locked = project.get_locked_candidates()
    for package in ("requests", "idna", "chardet", "certifi"):
        assert package in locked
F
Frost Ming 已提交
317 318 319 320 321 322 323 324 325


def test_build_distributions(tmp_path):
    project = Project()
    actions.do_build(project, dest=tmp_path.as_posix())
    wheel = Wheel(next(tmp_path.glob("*.whl")).as_posix())
    assert wheel.name == "pdm"
    tarball = next(tmp_path.glob("*.tar.gz"))
    assert tarball.exists()