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 <tchva...@suse.com>
+
+- 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"
+
+
+@pytest.fixture(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"}
 
 
+@pytest.mark.parametrize("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}
 


Reply via email to