Hello community,
here is the log from the commit of package python-pytest-xdist for
openSUSE:Factory checked in at 2020-05-04 18:32:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-xdist (Old)
and /work/SRC/openSUSE:Factory/.python-pytest-xdist.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest-xdist"
Mon May 4 18:32:35 2020 rev:13 rq:799798 version:1.32.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytest-xdist/python-pytest-xdist.changes
2020-01-16 18:13:33.496714070 +0100
+++
/work/SRC/openSUSE:Factory/.python-pytest-xdist.new.2738/python-pytest-xdist.changes
2020-05-04 18:32:49.812112105 +0200
@@ -1,0 +2,6 @@
+Sun May 3 07:41:14 UTC 2020 - Tomáš Chvátal <[email protected]>
+
+- 1.32.0:
+ * #524: Add testrun_uid fixture. This is a shared value that uniquely
identifies a test run among all workers. This also adds a
PYTEST_XDIST_TESTRUNUID environment variable that is accessible within a test
as well as a command line option --testrunuid to manually set the value from
outside.
+
+-------------------------------------------------------------------
Old:
----
pytest-xdist-1.31.0.tar.gz
New:
----
pytest-xdist-1.32.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pytest-xdist.spec ++++++
--- /var/tmp/diff_new_pack.R0QLON/_old 2020-05-04 18:32:51.116114748 +0200
+++ /var/tmp/diff_new_pack.R0QLON/_new 2020-05-04 18:32:51.120114756 +0200
@@ -18,11 +18,10 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-pytest-xdist
-Version: 1.31.0
+Version: 1.32.0
Release: 0
Summary: Distributed testing and loop-on-failing for py.test
License: MIT
-Group: Development/Languages/Python
URL: https://github.com/pytest-dev/pytest-xdist
Source0:
https://files.pythonhosted.org/packages/source/p/pytest-xdist/pytest-xdist-%{version}.tar.gz
BuildRequires: %{python_module execnet >= 1.1}
@@ -76,7 +75,7 @@
%python_expand %fdupes -s %{buildroot}%{$python_sitelib}
%check
-%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib}
py.test-%{$python_bin_suffix} -v
+%pytest
%files %{python_files}
%doc CHANGELOG.rst ISSUES.txt README.rst
++++++ pytest-xdist-1.31.0.tar.gz -> pytest-xdist-1.32.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/.appveyor.yml
new/pytest-xdist-1.32.0/.appveyor.yml
--- old/pytest-xdist-1.31.0/.appveyor.yml 2019-12-20 02:42:42.000000000
+0100
+++ new/pytest-xdist-1.32.0/.appveyor.yml 2020-05-03 01:48:42.000000000
+0200
@@ -1,13 +1,11 @@
environment:
matrix:
- TOXENV: "py27-pytestlatest"
- - TOXENV: "py34-pytestlatest"
- TOXENV: "py35-pytestlatest"
- TOXENV: "py36-pytestlatest"
- TOXENV: "py37-pytestlatest"
- TOXENV: "py38-pytestlatest"
- TOXENV: "py38-pytestmaster"
- - TOXENV: "py38-pytestfeatures"
install:
- C:\Python38\python -m pip install -U pip setuptools virtualenv
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/.pre-commit-config.yaml
new/pytest-xdist-1.32.0/.pre-commit-config.yaml
--- old/pytest-xdist-1.31.0/.pre-commit-config.yaml 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/.pre-commit-config.yaml 2020-05-03
01:48:42.000000000 +0200
@@ -1,12 +1,12 @@
repos:
- repo: https://github.com/ambv/black
- rev: 18.6b4
+ rev: 19.10b0
hooks:
- id: black
args: [--safe, --quiet]
language_version: python3.7
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v1.3.0
+ rev: v2.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/.travis.yml
new/pytest-xdist-1.32.0/.travis.yml
--- old/pytest-xdist-1.31.0/.travis.yml 2019-12-20 02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/.travis.yml 2020-05-03 01:48:42.000000000 +0200
@@ -36,9 +36,7 @@
env: TOXENV=py27-pytestlatest
- stage: test
- python: "3.4"
- env: TOXENV=py34-pytestlatest
- - python: "3.5"
+ python: "3.5"
env: TOXENV=py35-pytestlatest
- python: "3.6"
env: TOXENV=py36-pytestlatest
@@ -46,8 +44,6 @@
env: TOXENV=py37-pytestlatest
- python: "3.8"
env: TOXENV=py38-pytestmaster
- - python: "3.8"
- env: TOXENV=py38-pytestfeatures
- stage: deploy
python: '3.8'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/CHANGELOG.rst
new/pytest-xdist-1.32.0/CHANGELOG.rst
--- old/pytest-xdist-1.31.0/CHANGELOG.rst 2019-12-20 02:42:42.000000000
+0100
+++ new/pytest-xdist-1.32.0/CHANGELOG.rst 2020-05-03 01:48:42.000000000
+0200
@@ -1,3 +1,19 @@
+pytest-xdist 1.32.0 (2020-05-03)
+================================
+
+Deprecations and Removals
+-------------------------
+
+- `#475 <https://github.com/pytest-dev/pytest-xdist/issues/475>`_: Drop
support for EOL Python 3.4.
+
+
+Features
+--------
+
+- `#524 <https://github.com/pytest-dev/pytest-xdist/issues/524>`_: Add
`testrun_uid` fixture. This is a shared value that uniquely identifies a test
run among all workers.
+ This also adds a `PYTEST_XDIST_TESTRUNUID` environment variable that is
accessible within a test as well as a command line option `--testrunuid` to
manually set the value from outside.
+
+
pytest-xdist 1.31.0 (2019-12-19)
================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/PKG-INFO
new/pytest-xdist-1.32.0/PKG-INFO
--- old/pytest-xdist-1.31.0/PKG-INFO 2019-12-20 02:42:57.247453700 +0100
+++ new/pytest-xdist-1.32.0/PKG-INFO 2020-05-03 01:48:57.491744500 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pytest-xdist
-Version: 1.31.0
+Version: 1.32.0
Summary: pytest xdist plugin for distributed testing and loop-on-failing modes
Home-page: https://github.com/pytest-dev/pytest-xdist
Author: holger krekel and contributors
@@ -284,8 +284,43 @@
The information about the worker_id in a test is stored in the
``TestReport`` as
well, under the ``worker_id`` attribute.
- Acessing ``sys.argv`` from the master node in workers
- -----------------------------------------------------
+
+ Uniquely identifying the current test run
+ -----------------------------------------
+
+ *New in version 1.32.*
+
+ If you need to globally distinguish one test run from others in your
+ workers, you can use the ``testrun_uid`` fixture. For instance, let's
say you
+ wanted to create a separate database for each test run:
+
+ .. code-block:: python
+
+ import pytest
+ from posix_ipc import Semaphore, O_CREAT
+
+ @pytest.fixture(scope="session", autouse=True)
+ def create_unique_database(testrun_uid):
+ """ create a unique database for this particular test run """
+ database_url = f"psql://myapp-{testrun_uid}"
+
+ with Semaphore(f"/{testrun_uid}-lock", flags=O_CREAT,
initial_value=1):
+ if not database_exists(database_url):
+ create_database(database_url)
+
+ @pytest.fixture()
+ def db(testrun_uid):
+ """ retrieve unique database """
+ database_url = f"psql://myapp-{testrun_uid}"
+ return database_get_instance(database_url)
+
+
+ Additionally, during a test run, the following environment variable is
defined:
+
+ * ``PYTEST_XDIST_TESTRUNUID``: the unique id of the test run.
+
+ Accessing ``sys.argv`` from the master node in workers
+ ------------------------------------------------------
To access the ``sys.argv`` passed to the command-line of the master
node, use
``request.config.workerinput["mainargv"]``.
@@ -352,10 +387,9 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/README.rst
new/pytest-xdist-1.32.0/README.rst
--- old/pytest-xdist-1.31.0/README.rst 2019-12-20 02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/README.rst 2020-05-03 01:48:42.000000000 +0200
@@ -276,8 +276,43 @@
The information about the worker_id in a test is stored in the ``TestReport``
as
well, under the ``worker_id`` attribute.
-Acessing ``sys.argv`` from the master node in workers
------------------------------------------------------
+
+Uniquely identifying the current test run
+-----------------------------------------
+
+*New in version 1.32.*
+
+If you need to globally distinguish one test run from others in your
+workers, you can use the ``testrun_uid`` fixture. For instance, let's say you
+wanted to create a separate database for each test run:
+
+.. code-block:: python
+
+ import pytest
+ from posix_ipc import Semaphore, O_CREAT
+
+ @pytest.fixture(scope="session", autouse=True)
+ def create_unique_database(testrun_uid):
+ """ create a unique database for this particular test run """
+ database_url = f"psql://myapp-{testrun_uid}"
+
+ with Semaphore(f"/{testrun_uid}-lock", flags=O_CREAT, initial_value=1):
+ if not database_exists(database_url):
+ create_database(database_url)
+
+ @pytest.fixture()
+ def db(testrun_uid):
+ """ retrieve unique database """
+ database_url = f"psql://myapp-{testrun_uid}"
+ return database_get_instance(database_url)
+
+
+Additionally, during a test run, the following environment variable is defined:
+
+* ``PYTEST_XDIST_TESTRUNUID``: the unique id of the test run.
+
+Accessing ``sys.argv`` from the master node in workers
+------------------------------------------------------
To access the ``sys.argv`` passed to the command-line of the master node, use
``request.config.workerinput["mainargv"]``.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/setup.py
new/pytest-xdist-1.32.0/setup.py
--- old/pytest-xdist-1.31.0/setup.py 2019-12-20 02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/setup.py 2020-05-03 01:48:42.000000000 +0200
@@ -24,7 +24,7 @@
"pytest11": ["xdist = xdist.plugin", "xdist.looponfail =
xdist.looponfail"]
},
zip_safe=False,
- python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
+ python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
install_requires=install_requires,
setup_requires=["setuptools_scm"],
classifiers=[
@@ -42,7 +42,6 @@
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/pytest-xdist-1.31.0/src/pytest_xdist.egg-info/PKG-INFO
new/pytest-xdist-1.32.0/src/pytest_xdist.egg-info/PKG-INFO
--- old/pytest-xdist-1.31.0/src/pytest_xdist.egg-info/PKG-INFO 2019-12-20
02:42:57.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/pytest_xdist.egg-info/PKG-INFO 2020-05-03
01:48:57.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pytest-xdist
-Version: 1.31.0
+Version: 1.32.0
Summary: pytest xdist plugin for distributed testing and loop-on-failing modes
Home-page: https://github.com/pytest-dev/pytest-xdist
Author: holger krekel and contributors
@@ -284,8 +284,43 @@
The information about the worker_id in a test is stored in the
``TestReport`` as
well, under the ``worker_id`` attribute.
- Acessing ``sys.argv`` from the master node in workers
- -----------------------------------------------------
+
+ Uniquely identifying the current test run
+ -----------------------------------------
+
+ *New in version 1.32.*
+
+ If you need to globally distinguish one test run from others in your
+ workers, you can use the ``testrun_uid`` fixture. For instance, let's
say you
+ wanted to create a separate database for each test run:
+
+ .. code-block:: python
+
+ import pytest
+ from posix_ipc import Semaphore, O_CREAT
+
+ @pytest.fixture(scope="session", autouse=True)
+ def create_unique_database(testrun_uid):
+ """ create a unique database for this particular test run """
+ database_url = f"psql://myapp-{testrun_uid}"
+
+ with Semaphore(f"/{testrun_uid}-lock", flags=O_CREAT,
initial_value=1):
+ if not database_exists(database_url):
+ create_database(database_url)
+
+ @pytest.fixture()
+ def db(testrun_uid):
+ """ retrieve unique database """
+ database_url = f"psql://myapp-{testrun_uid}"
+ return database_get_instance(database_url)
+
+
+ Additionally, during a test run, the following environment variable is
defined:
+
+ * ``PYTEST_XDIST_TESTRUNUID``: the unique id of the test run.
+
+ Accessing ``sys.argv`` from the master node in workers
+ ------------------------------------------------------
To access the ``sys.argv`` passed to the command-line of the master
node, use
``request.config.workerinput["mainargv"]``.
@@ -352,10 +387,9 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/_version.py
new/pytest-xdist-1.32.0/src/xdist/_version.py
--- old/pytest-xdist-1.31.0/src/xdist/_version.py 2019-12-20
02:42:57.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/xdist/_version.py 2020-05-03
01:48:57.000000000 +0200
@@ -1,4 +1,4 @@
# coding: utf-8
# file generated by setuptools_scm
# don't change, don't track in version control
-version = '1.31.0'
+version = '1.32.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/dsession.py
new/pytest-xdist-1.32.0/src/xdist/dsession.py
--- old/pytest-xdist-1.31.0/src/xdist/dsession.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/xdist/dsession.py 2020-05-03
01:48:42.000000000 +0200
@@ -169,7 +169,7 @@
"""
self.config.hook.pytest_testnodedown(node=node, error=None)
if node.workeroutput["exitstatus"] == 2: # keyboard-interrupt
- self.shouldstop = "%s received keyboard-interrupt" % (node,)
+ self.shouldstop = "{} received keyboard-interrupt".format(node)
self.worker_errordown(node, "keyboard-interrupt")
return
if node in self.sched.nodes:
@@ -321,7 +321,7 @@
# XXX count no of failures and retry N times
runner = self.config.pluginmanager.getplugin("runner")
fspath = nodeid.split("::")[0]
- msg = "worker %r crashed while running %r" % (worker.gateway.id,
nodeid)
+ msg = "worker {!r} crashed while running
{!r}".format(worker.gateway.id, nodeid)
rep = runner.TestReport(
nodeid, (fspath, None, fspath), (), "failed", msg, "???"
)
@@ -351,7 +351,9 @@
def getstatus(self):
if self.config.option.verbose >= 0:
- parts = ["%s %s" % (spec.id, self._status[spec.id]) for spec in
self._specs]
+ parts = [
+ "{} {}".format(spec.id, self._status[spec.id]) for spec in
self._specs
+ ]
return " / ".join(parts)
else:
return "bringing up nodes..."
@@ -386,14 +388,16 @@
def pytest_testnodeready(self, node):
if self.config.option.verbose > 0:
d = node.workerinfo
- infoline = "[%s] Python %s" % (d["id"], d["version"].replace("\n",
" -- "))
+ infoline = "[{}] Python {}".format(
+ d["id"], d["version"].replace("\n", " -- ")
+ )
self.rewrite(infoline, newline=True)
self.setstatus(node.gateway.spec, "ok")
def pytest_testnodedown(self, node, error):
if not error:
return
- self.write_line("[%s] node down: %s" % (node.gateway.id, error))
+ self.write_line("[{}] node down: {}".format(node.gateway.id, error))
def get_default_max_worker_restart(config):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/looponfail.py
new/pytest-xdist-1.32.0/src/xdist/looponfail.py
--- old/pytest-xdist-1.31.0/src/xdist/looponfail.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/xdist/looponfail.py 2020-05-03
01:48:42.000000000 +0200
@@ -136,7 +136,7 @@
tr.line(report, red=True)
tr.sep("#", "waiting for changes", bold=True)
for rootdir in rootdirs:
- tr.line("### Watching: %s" % (rootdir,), bold=True)
+ tr.line("### Watching: {}".format(rootdir), bold=True)
def init_worker_session(channel, args, option_dict):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/plugin.py
new/pytest-xdist-1.32.0/src/xdist/plugin.py
--- old/pytest-xdist-1.31.0/src/xdist/plugin.py 2019-12-20 02:42:42.000000000
+0100
+++ new/pytest-xdist-1.32.0/src/xdist/plugin.py 2020-05-03 01:48:42.000000000
+0200
@@ -1,4 +1,5 @@
import os
+import uuid
import py
import pytest
@@ -122,12 +123,22 @@
metavar="GLOB",
help="add expression for ignores when rsyncing to remote tx nodes.",
)
-
group.addoption(
"--boxed",
action="store_true",
help="backward compatibility alias for pytest-forked --forked",
)
+ group.addoption(
+ "--testrunuid",
+ action="store",
+ help=(
+ "provide an identifier shared amongst all workers as the value of "
+ "the 'testrun_uid' fixture,\n\n,"
+ "if not provided, 'testrun_uid' is filled with a new unique string
"
+ "on every test run."
+ ),
+ )
+
parser.addini(
"rsyncdirs",
"list of (relative) paths to be rsynced for remote distributed
testing.",
@@ -214,3 +225,12 @@
return request.config.workerinput["workerid"]
else:
return "master"
+
+
[email protected](scope="session")
+def testrun_uid(request):
+ """Return the unique id of the current test."""
+ if hasattr(request.config, "workerinput"):
+ return request.config.workerinput["testrunuid"]
+ else:
+ return uuid.uuid4().hex
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/remote.py
new/pytest-xdist-1.32.0/src/xdist/remote.py
--- old/pytest-xdist-1.31.0/src/xdist/remote.py 2019-12-20 02:42:42.000000000
+0100
+++ new/pytest-xdist-1.32.0/src/xdist/remote.py 2020-05-03 01:48:42.000000000
+0200
@@ -22,6 +22,7 @@
def __init__(self, config, channel):
self.config = config
self.workerid = config.workerinput.get("workerid", "?")
+ self.testrunuid = config.workerinput["testrunuid"]
self.log = py.log.Producer("worker-%s" % self.workerid)
if not config.option.debug:
py.log.setconsumer(self.log._keywords, None)
@@ -112,6 +113,7 @@
)
data["item_index"] = self.item_index
data["worker_id"] = self.workerid
+ data["testrun_uid"] = self.testrunuid
assert self.session.items[self.item_index].nodeid == report.nodeid
self.sendevent("testreport", data=data)
@@ -238,6 +240,7 @@
importpath + os.pathsep + os.environ.get("PYTHONPATH", "")
)
+ os.environ["PYTEST_XDIST_TESTRUNUID"] = workerinput["testrunuid"]
os.environ["PYTEST_XDIST_WORKER"] = workerinput["workerid"]
os.environ["PYTEST_XDIST_WORKER_COUNT"] = str(workerinput["workercount"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/scheduler/loadscope.py
new/pytest-xdist-1.32.0/src/xdist/scheduler/loadscope.py
--- old/pytest-xdist-1.31.0/src/xdist/scheduler/loadscope.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/xdist/scheduler/loadscope.py 2020-05-03
01:48:42.000000000 +0200
@@ -358,12 +358,12 @@
extra_nodes = len(self.nodes) - len(self.workqueue)
if extra_nodes > 0:
- self.log("Shuting down {0} nodes".format(extra_nodes))
+ self.log("Shuting down {} nodes".format(extra_nodes))
for _ in range(extra_nodes):
unused_node, assigned = self.assigned_work.popitem(last=True)
- self.log("Shuting down unused node {0}".format(unused_node))
+ self.log("Shuting down unused node {}".format(unused_node))
unused_node.shutdown()
# Assign initial workload
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/src/xdist/workermanage.py
new/pytest-xdist-1.32.0/src/xdist/workermanage.py
--- old/pytest-xdist-1.31.0/src/xdist/workermanage.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/src/xdist/workermanage.py 2020-05-03
01:48:42.000000000 +0200
@@ -3,6 +3,7 @@
import os
import re
import sys
+import uuid
import py
import pytest
@@ -35,6 +36,9 @@
def __init__(self, config, specs=None, defaultchdir="pyexecnetcache"):
self.config = config
self.trace = self.config.trace.get("nodemanager")
+ self.testrunuid = self.config.getoption("testrunuid")
+ if self.testrunuid is None:
+ self.testrunuid = uuid.uuid4().hex
self.group = execnet.Group()
if specs is None:
specs = self._getxspecs()
@@ -101,7 +105,7 @@
for root in candidates:
root = py.path.local(root).realpath()
if not root.check():
- raise pytest.UsageError("rsyncdir doesn't exist: %r" % (root,))
+ raise pytest.UsageError("rsyncdir doesn't exist:
{!r}".format(root))
if root not in roots:
roots.append(root)
return roots
@@ -179,7 +183,7 @@
if self._verbose:
path = os.path.basename(self._sourcedir) + "/" + modified_rel_path
remotepath = gateway.spec.chdir
- print("%s:%s <= %s" % (gateway.spec, remotepath, path))
+ print("{}:{} <= {}".format(gateway.spec, remotepath, path))
def make_reltoroot(roots, args):
@@ -198,7 +202,7 @@
parts[0] = root.basename + "/" + x
break
else:
- raise ValueError("arg %s not relative to an rsync root" % (arg,))
+ raise ValueError("arg {} not relative to an rsync
root".format(arg))
result.append(splitcode.join(parts))
return result
@@ -222,6 +226,7 @@
"workercount": len(nodemanager.specs),
"slaveid": gateway.id,
"slavecount": len(nodemanager.specs),
+ "testrunuid": nodemanager.testrunuid,
"mainargv": sys.argv,
}
# TODO: deprecated name, backward compatibility only. Remove it in
future
@@ -233,7 +238,7 @@
py.log.setconsumer(self.log._keywords, None)
def __repr__(self):
- return "<%s %s>" % (self.__class__.__name__, self.gateway.id)
+ return "<{} {}>".format(self.__class__.__name__, self.gateway.id)
@property
def shutting_down(self):
@@ -293,11 +298,11 @@
def sendcommand(self, name, **kwargs):
""" send a named parametrized command to the other side. """
- self.log("sending command %s(**%s)" % (name, kwargs))
+ self.log("sending command {}(**{})".format(name, kwargs))
self.channel.send((name, kwargs))
def notify_inproc(self, eventname, **kwargs):
- self.log("queuing %s(**%s)" % (eventname, kwargs))
+ self.log("queuing {}(**{})".format(eventname, kwargs))
self.putevent((eventname, kwargs))
def process_from_remote(self, eventcall): # noqa too complex
@@ -319,7 +324,7 @@
return
eventname, kwargs = eventcall
if eventname in ("collectionstart",):
- self.log("ignoring %s(%s)" % (eventname, kwargs))
+ self.log("ignoring {}({})".format(eventname, kwargs))
elif eventname == "workerready":
self.notify_inproc(eventname, node=self, **kwargs)
elif eventname == "workerfinished":
@@ -359,7 +364,7 @@
item=kwargs["item"],
)
else:
- raise ValueError("unknown event: %s" % (eventname,))
+ raise ValueError("unknown event: {}".format(eventname))
except KeyboardInterrupt:
# should not land in receiver-thread
raise
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/testing/acceptance_test.py
new/pytest-xdist-1.32.0/testing/acceptance_test.py
--- old/pytest-xdist-1.31.0/testing/acceptance_test.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/testing/acceptance_test.py 2020-05-03
01:48:42.000000000 +0200
@@ -115,6 +115,9 @@
assert result.ret == 2
result.stdout.fnmatch_lines(["*Interrupted: stopping*1*", "*1
failed*"])
+ @pytest.mark.xfail(
+ reason="#527: Python 3.8 failure in pytest where testdir.tmpdir
returns an unexpected value"
+ )
def test_basetemp_in_subprocesses(self, testdir):
p1 = testdir.makepyfile(
"""
@@ -186,6 +189,7 @@
)
assert result.ret == 1
+ @pytest.mark.xfail(reason="#527: Ignore Python 3.8 failure for the time
being")
def test_distribution_rsyncdirs_example(self, testdir, monkeypatch):
# use a custom plugin that has a custom command-line option to ensure
# this is propagated to workers (see #491)
@@ -1066,6 +1070,29 @@
assert worker_ids == {"gw0", "gw1"}
[email protected]("n", [0, 2])
+def test_testrun_uid_fixture(testdir, n):
+ import glob
+
+ f = testdir.makepyfile(
+ """
+ import pytest
+ @pytest.mark.parametrize("run_num", range(2))
+ def test_testrun_uid1(testrun_uid, run_num):
+ with open("testrun_uid%s.txt" % run_num, "w") as f:
+ f.write(testrun_uid)
+ """
+ )
+ result = testdir.runpytest(f, "-n%d" % n)
+ result.stdout.fnmatch_lines("* 2 passed in *")
+ testrun_uids = set()
+ for fname in glob.glob(str(testdir.tmpdir.join("*.txt"))):
+ with open(fname) as f:
+ testrun_uids.add(f.read().strip())
+ assert len(testrun_uids) == 1
+ assert len(testrun_uids.pop()) == 32
+
+
@pytest.mark.parametrize("tb", ["auto", "long", "short", "no", "line",
"native"])
def test_error_report_styles(testdir, tb):
testdir.makepyfile(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/testing/test_newhooks.py
new/pytest-xdist-1.32.0/testing/test_newhooks.py
--- old/pytest-xdist-1.31.0/testing/test_newhooks.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/testing/test_newhooks.py 2020-05-03
01:48:42.000000000 +0200
@@ -15,7 +15,7 @@
def test_runtest_logreport(self, testdir):
"""Test that log reports from pytest_runtest_logreport when running
- with xdist contain "node", "nodeid" and "worker_id" attributes. (#8)
+ with xdist contain "node", "nodeid", "worker_id", and "testrun_uid"
attributes. (#8)
"""
testdir.makeconftest(
"""
@@ -23,20 +23,24 @@
if hasattr(report, 'node'):
if report.when == "call":
workerid = report.node.workerinput['workerid']
+ testrunuid = report.node.workerinput['testrunuid']
if workerid != report.worker_id:
print("HOOK: Worker id mismatch: %s %s"
% (workerid, report.worker_id))
+ elif testrunuid != report.testrun_uid:
+ print("HOOK: Testrun uid mismatch: %s %s"
+ % (testrunuid, report.testrun_uid))
else:
- print("HOOK: %s %s"
- % (report.nodeid, report.worker_id))
+ print("HOOK: %s %s %s"
+ % (report.nodeid, report.worker_id,
report.testrun_uid))
"""
)
res = testdir.runpytest("-n1", "-s")
res.stdout.fnmatch_lines(
[
- "*HOOK: test_runtest_logreport.py::test_a gw0*",
- "*HOOK: test_runtest_logreport.py::test_b gw0*",
- "*HOOK: test_runtest_logreport.py::test_c gw0*",
+ "*HOOK: test_runtest_logreport.py::test_a gw0 *",
+ "*HOOK: test_runtest_logreport.py::test_b gw0 *",
+ "*HOOK: test_runtest_logreport.py::test_c gw0 *",
"*3 passed*",
]
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/testing/test_plugin.py
new/pytest-xdist-1.32.0/testing/test_plugin.py
--- old/pytest-xdist-1.31.0/testing/test_plugin.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/testing/test_plugin.py 2020-05-03
01:48:42.000000000 +0200
@@ -95,6 +95,18 @@
assert not config.pluginmanager.hasplugin("dsession")
+def test_testrunuid_provided(testdir):
+ config = testdir.parseconfigure("--testrunuid", "test123", "--tx=popen")
+ nm = NodeManager(config)
+ assert nm.testrunuid == "test123"
+
+
+def test_testrunuid_generated(testdir):
+ config = testdir.parseconfigure("--tx=popen")
+ nm = NodeManager(config)
+ assert len(nm.testrunuid) == 32
+
+
class TestDistOptions:
def test_getxspecs(self, testdir):
config = testdir.parseconfigure("--tx=popen", "--tx", "ssh=xyz")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/testing/test_remote.py
new/pytest-xdist-1.32.0/testing/test_remote.py
--- old/pytest-xdist-1.31.0/testing/test_remote.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/testing/test_remote.py 2020-05-03
01:48:42.000000000 +0200
@@ -2,6 +2,7 @@
import pprint
import pytest
import sys
+import uuid
from xdist.workermanage import WorkerController
import execnet
@@ -25,7 +26,7 @@
self.name, self.kwargs = eventcall
def __str__(self):
- return "<EventCall %s(**%s)>" % (self.name, self.kwargs)
+ return "<EventCall {}(**{})>".format(self.name, self.kwargs)
class WorkerSetup:
@@ -44,6 +45,7 @@
putevent = self.use_callback and self.events.put or None
class DummyMananger:
+ testrunuid = uuid.uuid4().hex
specs = [0, 1]
self.slp = WorkerController(DummyMananger, self.gateway, config,
putevent)
@@ -59,7 +61,7 @@
ev = EventCall(data)
if name is None or ev.name == name:
return ev
- print("skipping %s" % (ev,))
+ print("skipping {}".format(ev))
def sendcommand(self, name, **kwargs):
self.slp.sendcommand(name, **kwargs)
@@ -220,6 +222,7 @@
"""
import os
def test():
+ assert len(os.environ['PYTEST_XDIST_TESTRUNUID']) == 32
assert os.environ['PYTEST_XDIST_WORKER'] in ('gw0', 'gw1')
assert os.environ['PYTEST_XDIST_WORKER_COUNT'] == '2'
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/testing/test_slavemanage.py
new/pytest-xdist-1.32.0/testing/test_slavemanage.py
--- old/pytest-xdist-1.31.0/testing/test_slavemanage.py 2019-12-20
02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/testing/test_slavemanage.py 2020-05-03
01:48:42.000000000 +0200
@@ -168,7 +168,7 @@
# assert nodemanager.config.topdir == source == config.topdir
nodemanager.makegateways()
nodemanager.rsync_roots()
- p, = nodemanager.gwmanager.multi_exec(
+ (p,) = nodemanager.gwmanager.multi_exec(
"import os ; channel.send(os.getcwd())"
).receive_each()
p = py.path.local(p)
@@ -269,5 +269,5 @@
reprec = testdir.inline_run(
"-d", "--rsyncdir=%s" % testdir.tmpdir, "--tx", specssh,
testdir.tmpdir
)
- rep, = reprec.getreports("pytest_runtest_logreport")
+ (rep,) = reprec.getreports("pytest_runtest_logreport")
assert rep.passed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest-xdist-1.31.0/tox.ini
new/pytest-xdist-1.32.0/tox.ini
--- old/pytest-xdist-1.31.0/tox.ini 2019-12-20 02:42:42.000000000 +0100
+++ new/pytest-xdist-1.32.0/tox.ini 2020-05-03 01:48:42.000000000 +0200
@@ -1,8 +1,8 @@
[tox]
envlist=
linting
- py{27,34,35,36,37,38}-pytestlatest
- py38-pytest{master,features}
+ py{27,35,36,37,38}-pytestlatest
+ py38-pytestmaster
[testenv]
passenv = USER USERNAME
@@ -10,7 +10,6 @@
deps =
pytestlatest: pytest
pytestmaster: git+https://github.com/pytest-dev/pytest.git@master
- pytestfeatures: git+https://github.com/pytest-dev/pytest.git@features
commands=
pytest {posargs}