Skip to content

Commit bea6f66

Browse files
authored
Merge pull request #475 from hugovk/rm-3.4
Drop support for EOL Python 3.4
2 parents 6fd5b56 + 3a47004 commit bea6f66

12 files changed

+30
-29
lines changed

.appveyor.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
environment:
22
matrix:
33
- TOXENV: "py27-pytestlatest"
4-
- TOXENV: "py34-pytestlatest"
54
- TOXENV: "py35-pytestlatest"
65
- TOXENV: "py36-pytestlatest"
76
- TOXENV: "py37-pytestlatest"

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
repos:
22
- repo: https://github.com/ambv/black
3-
rev: 18.6b4
3+
rev: 19.10b0
44
hooks:
55
- id: black
66
args: [--safe, --quiet]
77
language_version: python3.7
88
- repo: https://github.com/pre-commit/pre-commit-hooks
9-
rev: v1.3.0
9+
rev: v2.4.0
1010
hooks:
1111
- id: trailing-whitespace
1212
- id: end-of-file-fixer

.travis.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ jobs:
3636
env: TOXENV=py27-pytestlatest
3737

3838
- stage: test
39-
python: "3.4"
40-
env: TOXENV=py34-pytestlatest
41-
- python: "3.5"
39+
python: "3.5"
4240
env: TOXENV=py35-pytestlatest
4341
- python: "3.6"
4442
env: TOXENV=py36-pytestlatest

changelog/475.removal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Drop support for EOL Python 3.4.

setup.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"pytest11": ["xdist = xdist.plugin", "xdist.looponfail = xdist.looponfail"]
2525
},
2626
zip_safe=False,
27-
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
27+
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
2828
install_requires=install_requires,
2929
setup_requires=["setuptools_scm"],
3030
classifiers=[
@@ -42,7 +42,6 @@
4242
"Programming Language :: Python :: 2",
4343
"Programming Language :: Python :: 2.7",
4444
"Programming Language :: Python :: 3",
45-
"Programming Language :: Python :: 3.4",
4645
"Programming Language :: Python :: 3.5",
4746
"Programming Language :: Python :: 3.6",
4847
"Programming Language :: Python :: 3.7",

src/xdist/dsession.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def worker_workerfinished(self, node):
169169
"""
170170
self.config.hook.pytest_testnodedown(node=node, error=None)
171171
if node.workeroutput["exitstatus"] == 2: # keyboard-interrupt
172-
self.shouldstop = "%s received keyboard-interrupt" % (node,)
172+
self.shouldstop = "{} received keyboard-interrupt".format(node)
173173
self.worker_errordown(node, "keyboard-interrupt")
174174
return
175175
if node in self.sched.nodes:
@@ -321,7 +321,7 @@ def handle_crashitem(self, nodeid, worker):
321321
# XXX count no of failures and retry N times
322322
runner = self.config.pluginmanager.getplugin("runner")
323323
fspath = nodeid.split("::")[0]
324-
msg = "worker %r crashed while running %r" % (worker.gateway.id, nodeid)
324+
msg = "worker {!r} crashed while running {!r}".format(worker.gateway.id, nodeid)
325325
rep = runner.TestReport(
326326
nodeid, (fspath, None, fspath), (), "failed", msg, "???"
327327
)
@@ -351,7 +351,9 @@ def setstatus(self, spec, status, show=True):
351351

352352
def getstatus(self):
353353
if self.config.option.verbose >= 0:
354-
parts = ["%s %s" % (spec.id, self._status[spec.id]) for spec in self._specs]
354+
parts = [
355+
"{} {}".format(spec.id, self._status[spec.id]) for spec in self._specs
356+
]
355357
return " / ".join(parts)
356358
else:
357359
return "bringing up nodes..."
@@ -386,14 +388,16 @@ def pytest_xdist_newgateway(self, gateway):
386388
def pytest_testnodeready(self, node):
387389
if self.config.option.verbose > 0:
388390
d = node.workerinfo
389-
infoline = "[%s] Python %s" % (d["id"], d["version"].replace("\n", " -- "))
391+
infoline = "[{}] Python {}".format(
392+
d["id"], d["version"].replace("\n", " -- ")
393+
)
390394
self.rewrite(infoline, newline=True)
391395
self.setstatus(node.gateway.spec, "ok")
392396

393397
def pytest_testnodedown(self, node, error):
394398
if not error:
395399
return
396-
self.write_line("[%s] node down: %s" % (node.gateway.id, error))
400+
self.write_line("[{}] node down: {}".format(node.gateway.id, error))
397401

398402

399403
def get_default_max_worker_restart(config):

src/xdist/looponfail.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def repr_pytest_looponfailinfo(failreports, rootdirs):
136136
tr.line(report, red=True)
137137
tr.sep("#", "waiting for changes", bold=True)
138138
for rootdir in rootdirs:
139-
tr.line("### Watching: %s" % (rootdir,), bold=True)
139+
tr.line("### Watching: {}".format(rootdir), bold=True)
140140

141141

142142
def init_worker_session(channel, args, option_dict):

src/xdist/scheduler/loadscope.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,12 @@ def schedule(self):
358358
extra_nodes = len(self.nodes) - len(self.workqueue)
359359

360360
if extra_nodes > 0:
361-
self.log("Shuting down {0} nodes".format(extra_nodes))
361+
self.log("Shuting down {} nodes".format(extra_nodes))
362362

363363
for _ in range(extra_nodes):
364364
unused_node, assigned = self.assigned_work.popitem(last=True)
365365

366-
self.log("Shuting down unused node {0}".format(unused_node))
366+
self.log("Shuting down unused node {}".format(unused_node))
367367
unused_node.shutdown()
368368

369369
# Assign initial workload

src/xdist/workermanage.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def _getrsyncdirs(self):
101101
for root in candidates:
102102
root = py.path.local(root).realpath()
103103
if not root.check():
104-
raise pytest.UsageError("rsyncdir doesn't exist: %r" % (root,))
104+
raise pytest.UsageError("rsyncdir doesn't exist: {!r}".format(root))
105105
if root not in roots:
106106
roots.append(root)
107107
return roots
@@ -179,7 +179,7 @@ def _report_send_file(self, gateway, modified_rel_path):
179179
if self._verbose:
180180
path = os.path.basename(self._sourcedir) + "/" + modified_rel_path
181181
remotepath = gateway.spec.chdir
182-
print("%s:%s <= %s" % (gateway.spec, remotepath, path))
182+
print("{}:{} <= {}".format(gateway.spec, remotepath, path))
183183

184184

185185
def make_reltoroot(roots, args):
@@ -198,7 +198,7 @@ def make_reltoroot(roots, args):
198198
parts[0] = root.basename + "/" + x
199199
break
200200
else:
201-
raise ValueError("arg %s not relative to an rsync root" % (arg,))
201+
raise ValueError("arg {} not relative to an rsync root".format(arg))
202202
result.append(splitcode.join(parts))
203203
return result
204204

@@ -233,7 +233,7 @@ def __init__(self, nodemanager, gateway, config, putevent):
233233
py.log.setconsumer(self.log._keywords, None)
234234

235235
def __repr__(self):
236-
return "<%s %s>" % (self.__class__.__name__, self.gateway.id)
236+
return "<{} {}>".format(self.__class__.__name__, self.gateway.id)
237237

238238
@property
239239
def shutting_down(self):
@@ -293,11 +293,11 @@ def shutdown(self):
293293

294294
def sendcommand(self, name, **kwargs):
295295
""" send a named parametrized command to the other side. """
296-
self.log("sending command %s(**%s)" % (name, kwargs))
296+
self.log("sending command {}(**{})".format(name, kwargs))
297297
self.channel.send((name, kwargs))
298298

299299
def notify_inproc(self, eventname, **kwargs):
300-
self.log("queuing %s(**%s)" % (eventname, kwargs))
300+
self.log("queuing {}(**{})".format(eventname, kwargs))
301301
self.putevent((eventname, kwargs))
302302

303303
def process_from_remote(self, eventcall): # noqa too complex
@@ -319,7 +319,7 @@ def process_from_remote(self, eventcall): # noqa too complex
319319
return
320320
eventname, kwargs = eventcall
321321
if eventname in ("collectionstart",):
322-
self.log("ignoring %s(%s)" % (eventname, kwargs))
322+
self.log("ignoring {}({})".format(eventname, kwargs))
323323
elif eventname == "workerready":
324324
self.notify_inproc(eventname, node=self, **kwargs)
325325
elif eventname == "workerfinished":
@@ -359,7 +359,7 @@ def process_from_remote(self, eventcall): # noqa too complex
359359
item=kwargs["item"],
360360
)
361361
else:
362-
raise ValueError("unknown event: %s" % (eventname,))
362+
raise ValueError("unknown event: {}".format(eventname))
363363
except KeyboardInterrupt:
364364
# should not land in receiver-thread
365365
raise

testing/test_remote.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def __init__(self, eventcall):
2525
self.name, self.kwargs = eventcall
2626

2727
def __str__(self):
28-
return "<EventCall %s(**%s)>" % (self.name, self.kwargs)
28+
return "<EventCall {}(**{})>".format(self.name, self.kwargs)
2929

3030

3131
class WorkerSetup:
@@ -59,7 +59,7 @@ def popevent(self, name=None):
5959
ev = EventCall(data)
6060
if name is None or ev.name == name:
6161
return ev
62-
print("skipping %s" % (ev,))
62+
print("skipping {}".format(ev))
6363

6464
def sendcommand(self, name, **kwargs):
6565
self.slp.sendcommand(name, **kwargs)

testing/test_slavemanage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def test_rsync_roots_no_roots(self, testdir, mysetup):
168168
# assert nodemanager.config.topdir == source == config.topdir
169169
nodemanager.makegateways()
170170
nodemanager.rsync_roots()
171-
p, = nodemanager.gwmanager.multi_exec(
171+
(p,) = nodemanager.gwmanager.multi_exec(
172172
"import os ; channel.send(os.getcwd())"
173173
).receive_each()
174174
p = py.path.local(p)
@@ -269,5 +269,5 @@ def test_one():
269269
reprec = testdir.inline_run(
270270
"-d", "--rsyncdir=%s" % testdir.tmpdir, "--tx", specssh, testdir.tmpdir
271271
)
272-
rep, = reprec.getreports("pytest_runtest_logreport")
272+
(rep,) = reprec.getreports("pytest_runtest_logreport")
273273
assert rep.passed

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tox]
22
envlist=
33
linting
4-
py{27,34,35,36,37,38}-pytestlatest
4+
py{27,35,36,37,38}-pytestlatest
55
py38-pytest{master,features}
66

77
[testenv]

0 commit comments

Comments
 (0)