Skip to content

Commit 8acf739

Browse files
committed
Simplify reporters log checks
1 parent 85166f4 commit 8acf739

File tree

8 files changed

+121
-88
lines changed

8 files changed

+121
-88
lines changed

azure-pipelines.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ variables:
77
CI_BUILD_URL: "https://toxdev.visualstudio.com/tox/_build/results?buildId=$(Build.BuildId)"
88
GIT_BRANCH: $(Build.SourceBranch)
99
GIT_COMMIT_SHA: $(Build.SourceVersion)
10+
PYTEST_ADDOPTS: "-vv -ra --showlocals"
1011

1112
trigger:
1213
batch: true

changelog/1026.feature.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,3 @@ install it). The hard link is removed at the end of the run (what it points thou
55
inside ``distdir``). This ensures that a tox session operates on the same package it built, even
66
if a parallel tox run builds another version. Note ``distdir`` will contain only the last built
77
package in such cases. - by :user:`gaborbernat`
8-
9-

doc/config.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,16 @@ Global settings are defined under the ``tox`` section as:
6060
Indicates where the packaging root file exists (historically the ``setup.py`` for ``setuptools``).
6161
This will be the working directory when performing the packaging.
6262

63-
6463
.. conf:: distdir ^ PATH ^ {toxworkdir}/dist
6564

6665
Directory where the packaged source distribution should be put. Note this is cleaned at the start of
6766
every packaging invocation.
6867

68+
.. conf:: sdistsrc ^ PATH ^ {toxworkdir}/dist
69+
70+
Do not build the package, but instead use teh latest package available under this path.
71+
You can override it via the command line flag ``--installpkg``.
72+
6973
.. conf:: distshare ^ PATH ^ {homedir}/.tox/distshare
7074

7175
Folder where the packaged source distribution will be moved, this is not cleaned between packaging

src/tox/package.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
def tox_package(session, venv):
2121
"""Build an sdist at first call return that for all calls"""
2222
if not hasattr(session, "package"):
23-
session.package = get_package(session)
23+
session.package, session.dist = get_package(session)
2424
return session.package
2525

2626

@@ -41,7 +41,8 @@ def get_package(session):
4141
report.verbosity0("lock file {} present, will block until released".format(lock_file))
4242
lock.acquire()
4343
package = acquire_package(config, report, session)
44-
return create_session_view(package, config.temp_dir, report)
44+
session_package = create_session_view(package, config.temp_dir, report)
45+
return session_package, package
4546
finally:
4647
lock.release(force=True)
4748

@@ -52,12 +53,19 @@ def create_session_view(package, temp_dir, report):
5253
return a view of the file that it's not prone to deletion and can be removed when the
5354
session ends
5455
"""
56+
if not package:
57+
return package
58+
temp_dir.ensure(dir=True)
59+
60+
# we'll prefix it with a unique number, note adding as suffix can cause conflicts
61+
# with tools that check the files extension (e.g. pip)
5562
exists = [
56-
i.basename[len(package.basename) + 1 :]
57-
for i in temp_dir.listdir(fil="{}.*".format(package.basename))
63+
i.basename[: -len(package.basename) - 1]
64+
for i in temp_dir.listdir(fil="*-{}".format(package.basename))
5865
]
5966
file_id = max(chain((0,), (int(i) for i in exists if six.text_type(i).isnumeric())))
60-
session_package = temp_dir.join("{}.{}".format(package.basename, file_id + 1))
67+
session_package = temp_dir.join("{}-{}".format(file_id + 1, package.basename))
68+
6169
# if we can do hard links do that, otherwise just copy
6270
operation = "links"
6371
if hasattr(os, "link"):
@@ -67,20 +75,17 @@ def create_session_view(package, temp_dir, report):
6775
package.copy(session_package)
6876
common = session_package.common(package)
6977
report.verbosity1(
70-
"cwd {} package {} {} to {}".format(
71-
common, common.bestrelpath(session_package), operation, common.bestrelpath(package)
78+
"package {} {} to {} ({})".format(
79+
common.bestrelpath(session_package), operation, common.bestrelpath(package), common
7280
)
7381
)
7482
return session_package
7583

7684

7785
def acquire_package(config, report, session):
86+
"""acquire a source distribution (either by loading a local file or triggering a build)"""
7887
if not config.option.sdistonly and (config.sdistsrc or config.option.installpkg):
79-
path = config.option.installpkg
80-
if not path:
81-
path = config.sdistsrc
82-
path = session._resolve_package(path)
83-
report.info("using package {!r}, skipping 'sdist' activity ".format(str(path)))
88+
path = get_local_package(config, report, session)
8489
else:
8590
try:
8691
path = build_package(config, report, session)
@@ -99,6 +104,15 @@ def acquire_package(config, report, session):
99104
return path
100105

101106

107+
def get_local_package(config, report, session):
108+
path = config.option.installpkg
109+
if not path:
110+
path = config.sdistsrc
111+
path = session._resolve_package(path)
112+
report.info("using package {!r}, skipping 'sdist' activity ".format(str(path)))
113+
return path
114+
115+
102116
def build_package(config, report, session):
103117
if not config.isolated_build:
104118
return make_sdist_legacy(report, config, session)

src/tox/result.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def __init__(self, reportlog, name, dict):
4545

4646
def set_python_info(self, python_executable):
4747
cmd = [
48-
python_executable,
48+
str(python_executable),
4949
"-c",
5050
"import sys; import json;"
5151
"print(json.dumps({"

src/tox/session.py

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,14 @@ def startsummary(self):
318318
if self.verbosity >= Verbosity.QUIET:
319319
self.tw.sep("_", "summary")
320320

321-
def info(self, msg):
322-
if self.verbosity >= Verbosity.DEBUG:
323-
self.logline(msg)
321+
def logline_if(self, level, msg, key=None, **kwargs):
322+
if self.verbosity >= level:
323+
message = str(msg) if key is None else "{}{}".format(key, msg)
324+
self.logline(message, **kwargs)
324325

325-
def using(self, msg):
326-
if self.verbosity >= Verbosity.INFO:
327-
self.logline("using {}".format(msg), bold=True)
326+
def logline(self, msg, **opts):
327+
self.reported_lines.append(msg)
328+
self.tw.line("{}".format(msg), **opts)
328329

329330
def keyboard_interrupt(self):
330331
self.error("KEYBOARDINTERRUPT")
@@ -339,40 +340,32 @@ def keyvalue(self, name, value):
339340
def line(self, msg, **opts):
340341
self.logline(msg, **opts)
341342

343+
def info(self, msg):
344+
self.logline_if(Verbosity.DEBUG, msg)
345+
346+
def using(self, msg):
347+
self.logline_if(Verbosity.INFO, msg, "using ", bold=True)
348+
342349
def good(self, msg):
343-
if self.verbosity >= Verbosity.QUIET:
344-
self.logline(msg, green=True)
350+
self.logline_if(Verbosity.QUIET, msg, green=True)
345351

346352
def warning(self, msg):
347-
if self.verbosity >= Verbosity.QUIET:
348-
self.logline("WARNING: {}".format(msg), red=True)
353+
self.logline_if(Verbosity.QUIET, msg, "WARNING: ", red=True)
349354

350355
def error(self, msg):
351-
if self.verbosity >= Verbosity.QUIET:
352-
self.logline("ERROR: {}".format(msg), red=True)
356+
self.logline_if(Verbosity.QUIET, msg, "ERROR: ", red=True)
353357

354358
def skip(self, msg):
355-
if self.verbosity >= Verbosity.QUIET:
356-
self.logline("SKIPPED: {}".format(msg), yellow=True)
357-
358-
def logline(self, msg, **opts):
359-
self.reported_lines.append(msg)
360-
self.tw.line("{}".format(msg), **opts)
359+
self.logline_if(Verbosity.QUIET, msg, "SKIPPED: ", yellow=True)
361360

362361
def verbosity0(self, msg, **opts):
363-
if self.verbosity >= Verbosity.DEFAULT:
364-
self.logline("{}".format(msg), **opts)
362+
self.logline_if(Verbosity.DEFAULT, msg, **opts)
365363

366364
def verbosity1(self, msg, **opts):
367-
if self.verbosity >= Verbosity.INFO:
368-
self.logline("{}".format(msg), **opts)
365+
self.logline_if(Verbosity.INFO, msg, **opts)
369366

370367
def verbosity2(self, msg, **opts):
371-
if self.verbosity >= Verbosity.DEBUG:
372-
self.logline("{}".format(msg), **opts)
373-
374-
# def log(self, msg):
375-
# print(msg, file=sys.stderr)
368+
self.logline_if(Verbosity.DEBUG, msg, **opts)
376369

377370

378371
class Session:
@@ -459,7 +452,11 @@ def cleanup(self):
459452
yield
460453
finally:
461454
for tox_env in self.venvlist:
462-
if hasattr(tox_env, "package") and tox_env.package.exists():
455+
if (
456+
hasattr(tox_env, "package")
457+
and isinstance(tox_env.package, py.path.local)
458+
and tox_env.package.exists()
459+
):
463460
self.report.verbosity2("cleanup {}".format(tox_env.package))
464461
tox_env.package.remove()
465462

tests/unit/test_package.py

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import re
23
import traceback
34
from functools import partial
@@ -21,15 +22,15 @@ def test_make_sdist(initproj):
2122
)
2223
config = parseconfig([])
2324
session = Session(config)
24-
sdist = get_package(session)
25+
_, sdist = get_package(session)
2526
assert sdist.check()
2627
assert sdist.ext == ".zip"
2728
assert sdist == config.distdir.join(sdist.basename)
28-
sdist2 = get_package(session)
29+
_, sdist2 = get_package(session)
2930
assert sdist2 == sdist
3031
sdist.write("hello")
3132
assert sdist.stat().size < 10
32-
sdist_new = get_package(Session(config))
33+
_, sdist_new = get_package(Session(config))
3334
assert sdist_new == sdist
3435
assert sdist_new.stat().size > 10
3536

@@ -50,13 +51,18 @@ def test_make_sdist_distshare(tmpdir, initproj):
5051
)
5152
config = parseconfig([])
5253
session = Session(config)
53-
sdist = get_package(session)
54-
assert sdist.check()
55-
assert sdist.ext == ".zip"
56-
assert sdist == config.distdir.join(sdist.basename)
57-
sdist_share = config.distshare.join(sdist.basename)
54+
package, dist = get_package(session)
55+
assert package.check()
56+
assert package.ext == ".zip"
57+
assert package == config.temp_dir.join(package.basename)
58+
59+
assert dist == config.distdir.join(package.basename[len("1-") :])
60+
assert dist.check()
61+
assert os.stat(str(dist)).st_ino == os.stat(str(package)).st_ino
62+
63+
sdist_share = config.distshare.join(package.basename[len("1-") :])
5864
assert sdist_share.check()
59-
assert sdist_share.read("rb") == sdist.read("rb"), (sdist_share, sdist)
65+
assert sdist_share.read("rb") == dist.read("rb"), (sdist_share, package)
6066

6167

6268
def test_sdistonly(initproj, cmd):
@@ -110,12 +116,21 @@ def test_separate_sdist(cmd, initproj, tmpdir):
110116
)
111117
result = cmd("--sdistonly")
112118
assert not result.ret
113-
sdistfiles = distshare.listdir()
114-
assert len(sdistfiles) == 1
115-
sdistfile = sdistfiles[0]
119+
dist_share_files = distshare.listdir()
120+
assert len(dist_share_files) == 1
121+
assert dist_share_files[0].check()
122+
116123
result = cmd("-v", "--notest")
117-
assert not result.ret
118-
assert "python inst: {}".format(sdistfile) in result.out
124+
assert not result.ret, result.out
125+
msg = "python inst: {}".format(result.session.package)
126+
assert msg in result.out, result.out
127+
operation = "copied" if not hasattr(os, "link") else "links"
128+
msg = "package {} {} to {}".format(
129+
os.sep.join(("pkg123", ".tox", ".tmp", "1-pkg123-0.7.zip")),
130+
operation,
131+
os.sep.join(("distshare", "pkg123-0.7.zip")),
132+
)
133+
assert msg in result.out, result.out
119134

120135

121136
def test_sdist_latest(tmpdir, newconfig):
@@ -133,15 +148,15 @@ def test_sdist_latest(tmpdir, newconfig):
133148
p = distshare.ensure("pkg123-1.4.5.zip")
134149
distshare.ensure("pkg123-1.4.5a1.zip")
135150
session = Session(config)
136-
sdist_path = get_package(session)
137-
assert sdist_path == p
151+
_, dist = get_package(session)
152+
assert dist == p
138153

139154

140155
def test_installpkg(tmpdir, newconfig):
141156
p = tmpdir.ensure("pkg123-1.0.zip")
142157
config = newconfig(["--installpkg={}".format(p)], "")
143158
session = Session(config)
144-
sdist_path = get_package(session)
159+
_, sdist_path = get_package(session)
145160
assert sdist_path == p
146161

147162

@@ -347,10 +362,14 @@ def build_package(config, report, session):
347362
for val in invoke_result.values():
348363
if isinstance(val, tuple):
349364
assert False, "{!r}\n{}".format(val[0], val[1])
350-
351-
# output has no error
352-
err = "\n".join((invoke_result["t1"].err, invoke_result["t2"].err)).strip()
353-
out = "\n".join((invoke_result["t1"].out, invoke_result["t2"].out)).strip()
365+
err = "\n".join(
366+
"{}=\n{}".format(k, v.err).strip() for k, v in invoke_result.items() if v.err.strip()
367+
)
368+
out = "\n".join(
369+
"{}=\n{}".format(k, v.out).strip() for k, v in invoke_result.items() if v.out.strip()
370+
)
371+
for val in invoke_result.values():
372+
assert not val.ret, "{}\n{}".format(err, out)
354373
assert not err
355374

356375
# when the lock is hit we notify

0 commit comments

Comments
 (0)