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}