Hello community, here is the log from the commit of package python-pytest4 for openSUSE:Factory checked in at 2020-01-16 18:15:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pytest4 (Old) and /work/SRC/openSUSE:Factory/.python-pytest4.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest4" Thu Jan 16 18:15:33 2020 rev:11 rq:764287 version:4.6.9 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pytest4/python-pytest4.changes 2019-11-04 17:05:32.464205660 +0100 +++ /work/SRC/openSUSE:Factory/.python-pytest4.new.26092/python-pytest4.changes 2020-01-16 18:15:42.036786780 +0100 @@ -1,0 +2,12 @@ +Tue Jan 14 12:33:25 UTC 2020 - Tomáš Chvátal <[email protected]> + +- Fix typo importlib_metadata -> importlib-metadata + +------------------------------------------------------------------- +Mon Jan 6 13:19:54 UTC 2020 - Tomáš Chvátal <[email protected]> + +- Update to 4.6.9: + * various minor bugfixes for 4.x series to keep it working with + latest python modules + +------------------------------------------------------------------- Old: ---- pytest-4.6.6.tar.gz New: ---- pytest-4.6.9.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pytest4.spec ++++++ --- /var/tmp/diff_new_pack.m29vIk/_old 2020-01-16 18:15:43.800787777 +0100 +++ /var/tmp/diff_new_pack.m29vIk/_new 2020-01-16 18:15:43.800787777 +0100 @@ -1,7 +1,7 @@ # # spec file for package python # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -26,7 +26,7 @@ %bcond_with test %endif Name: python-pytest4%{psuffix} -Version: 4.6.6 +Version: 4.6.9 Release: 0 Summary: Python testing tool with autodiscovery and detailed asserts License: MIT @@ -55,7 +55,7 @@ BuildArch: noarch %if %{with test} BuildRequires: %{python_module hypothesis} -BuildRequires: %{python_module importlib_metadata >= 0.12} +BuildRequires: %{python_module importlib-metadata >= 0.12} BuildRequires: %{python_module pygments-pytest} BuildRequires: %{python_module pytest4 >= %{version}} BuildRequires: %{python_module setuptools_scm} ++++++ pytest-4.6.6.tar.gz -> pytest-4.6.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/.pre-commit-config.yaml new/pytest-4.6.9/.pre-commit-config.yaml --- old/pytest-4.6.6/.pre-commit-config.yaml 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/.pre-commit-config.yaml 2020-01-04 21:35:12.000000000 +0100 @@ -1,7 +1,7 @@ exclude: doc/en/example/py2py3/test_py2.py repos: -- repo: https://github.com/python/black - rev: 19.3b0 +- repo: https://github.com/psf/black + rev: 19.10b0 hooks: - id: black args: [--safe, --quiet] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/AUTHORS new/pytest-4.6.9/AUTHORS --- old/pytest-4.6.6/AUTHORS 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/AUTHORS 2020-01-04 21:35:12.000000000 +0100 @@ -58,6 +58,7 @@ Christian Tismer Christopher Gilling Christopher Dignam +Claudio Madotto CrazyMerlyn Cyrus Maden Damian Skrzypczak diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/CHANGELOG.rst new/pytest-4.6.9/CHANGELOG.rst --- old/pytest-4.6.6/CHANGELOG.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/CHANGELOG.rst 2020-01-04 21:35:12.000000000 +0100 @@ -18,6 +18,52 @@ .. towncrier release notes start +pytest 4.6.9 (2020-01-04) +========================= + +Bug Fixes +--------- + +- `#6301 <https://github.com/pytest-dev/pytest/issues/6301>`_: Fix assertion rewriting for egg-based distributions and ``editable`` installs (``pip install --editable``). + + +pytest 4.6.8 (2019-12-19) +========================= + +Features +-------- + +- `#5471 <https://github.com/pytest-dev/pytest/issues/5471>`_: JUnit XML now includes a timestamp and hostname in the testsuite tag. + + + +Bug Fixes +--------- + +- `#5430 <https://github.com/pytest-dev/pytest/issues/5430>`_: junitxml: Logs for failed test are now passed to junit report in case the test fails during call phase. + + + +Trivial/Internal Changes +------------------------ + +- `#6345 <https://github.com/pytest-dev/pytest/issues/6345>`_: Pin ``colorama`` to ``0.4.1`` only for Python 3.4 so newer Python versions can still receive colorama updates. + + +pytest 4.6.7 (2019-12-05) +========================= + +Bug Fixes +--------- + +- `#5477 <https://github.com/pytest-dev/pytest/issues/5477>`_: The XML file produced by ``--junitxml`` now correctly contain a ``<testsuites>`` root element. + + +- `#6044 <https://github.com/pytest-dev/pytest/issues/6044>`_: Properly ignore ``FileNotFoundError`` (``OSError.errno == NOENT`` in Python 2) exceptions when trying to remove old temporary directories, + for instance when multiple processes try to remove the same directory (common with ``pytest-xdist`` + for example). + + pytest 4.6.6 (2019-10-11) ========================= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/LICENSE new/pytest-4.6.9/LICENSE --- old/pytest-4.6.6/LICENSE 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/LICENSE 2020-01-04 21:35:12.000000000 +0100 @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2004-2019 Holger Krekel and others +Copyright (c) 2004-2020 Holger Krekel and others Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/PKG-INFO new/pytest-4.6.9/PKG-INFO --- old/pytest-4.6.6/PKG-INFO 2019-10-13 16:54:20.000000000 +0200 +++ new/pytest-4.6.9/PKG-INFO 2020-01-04 21:35:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pytest -Version: 4.6.6 +Version: 4.6.9 Summary: pytest: simple powerful testing with Python Home-page: https://docs.pytest.org/en/latest/ Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others @@ -140,7 +140,7 @@ License ------- - Copyright Holger Krekel and others, 2004-2019. + Copyright Holger Krekel and others, 2004-2020. Distributed under the terms of the `MIT`_ license, pytest is free and open source software. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/README.rst new/pytest-4.6.9/README.rst --- old/pytest-4.6.6/README.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/README.rst 2020-01-04 21:35:12.000000000 +0100 @@ -131,7 +131,7 @@ License ------- -Copyright Holger Krekel and others, 2004-2019. +Copyright Holger Krekel and others, 2004-2020. Distributed under the terms of the `MIT`_ license, pytest is free and open source software. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/azure-pipelines.yml new/pytest-4.6.9/azure-pipelines.yml --- old/pytest-4.6.6/azure-pipelines.yml 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/azure-pipelines.yml 2020-01-04 21:35:12.000000000 +0100 @@ -48,12 +48,6 @@ # pypy3: # python.version: 'pypy3' # tox.env: 'pypy3' - py34-xdist: - python.version: '3.4' - tox.env: 'py34-xdist' - # Coverage for: - # - _pytest.compat._bytes_to_ascii - PYTEST_COVERAGE: '1' py35-xdist: python.version: '3.5' tox.env: 'py35-xdist' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/codecov.yml new/pytest-4.6.9/codecov.yml --- old/pytest-4.6.6/codecov.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/pytest-4.6.9/codecov.yml 2020-01-04 21:35:12.000000000 +0100 @@ -0,0 +1,7 @@ +coverage: + status: + project: true + patch: true + changes: true + +comment: off diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/announce/index.rst new/pytest-4.6.9/doc/en/announce/index.rst --- old/pytest-4.6.6/doc/en/announce/index.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/announce/index.rst 2020-01-04 21:35:12.000000000 +0100 @@ -6,6 +6,9 @@ :maxdepth: 2 + release-4.6.9 + release-4.6.8 + release-4.6.7 release-4.6.6 release-4.6.5 release-4.6.4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/announce/release-4.6.7.rst new/pytest-4.6.9/doc/en/announce/release-4.6.7.rst --- old/pytest-4.6.6/doc/en/announce/release-4.6.7.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/pytest-4.6.9/doc/en/announce/release-4.6.7.rst 2020-01-04 21:35:12.000000000 +0100 @@ -0,0 +1,19 @@ +pytest-4.6.7 +======================================= + +pytest 4.6.7 has just been released to PyPI. + +This is a bug-fix release, being a drop-in replacement. To upgrade:: + + pip install --upgrade pytest + +The full changelog is available at https://docs.pytest.org/en/latest/changelog.html. + +Thanks to all who contributed to this release, among them: + +* Bruno Oliveira +* Daniel Hahler + + +Happy testing, +The pytest Development Team diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/announce/release-4.6.8.rst new/pytest-4.6.9/doc/en/announce/release-4.6.8.rst --- old/pytest-4.6.6/doc/en/announce/release-4.6.8.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/pytest-4.6.9/doc/en/announce/release-4.6.8.rst 2020-01-04 21:35:12.000000000 +0100 @@ -0,0 +1,20 @@ +pytest-4.6.8 +======================================= + +pytest 4.6.8 has just been released to PyPI. + +This is a bug-fix release, being a drop-in replacement. To upgrade:: + + pip install --upgrade pytest + +The full changelog is available at https://docs.pytest.org/en/latest/changelog.html. + +Thanks to all who contributed to this release, among them: + +* Anthony Sottile +* Bruno Oliveira +* Ryan Mast + + +Happy testing, +The pytest Development Team diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/announce/release-4.6.9.rst new/pytest-4.6.9/doc/en/announce/release-4.6.9.rst --- old/pytest-4.6.6/doc/en/announce/release-4.6.9.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/pytest-4.6.9/doc/en/announce/release-4.6.9.rst 2020-01-04 21:35:12.000000000 +0100 @@ -0,0 +1,21 @@ +pytest-4.6.9 +======================================= + +pytest 4.6.9 has just been released to PyPI. + +This is a bug-fix release, being a drop-in replacement. To upgrade:: + + pip install --upgrade pytest + +The full changelog is available at https://docs.pytest.org/en/latest/changelog.html. + +Thanks to all who contributed to this release, among them: + +* Anthony Sottile +* Bruno Oliveira +* Felix Yan +* Hugo + + +Happy testing, +The pytest Development Team diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/conf.py new/pytest-4.6.9/doc/en/conf.py --- old/pytest-4.6.6/doc/en/conf.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/conf.py 2020-01-04 21:35:12.000000000 +0100 @@ -65,7 +65,7 @@ # General information about the project. project = u"pytest" year = datetime.datetime.utcnow().year -copyright = u"2015–2019 , holger krekel and pytest-dev team" +copyright = u"2015–2020, holger krekel and pytest-dev team" # The language for content autogenerated by Sphinx. Refer to documentation @@ -275,7 +275,7 @@ epub_title = u"pytest" epub_author = u"holger krekel at merlinux eu" epub_publisher = u"holger krekel at merlinux eu" -epub_copyright = u"2013, holger krekel et alii" +epub_copyright = u"2013-2020, holger krekel et alii" # The language of the text. It defaults to the language option # or en if the language is not set. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/example/parametrize.rst new/pytest-4.6.9/doc/en/example/parametrize.rst --- old/pytest-4.6.6/doc/en/example/parametrize.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/example/parametrize.rst 2020-01-04 21:35:12.000000000 +0100 @@ -434,11 +434,10 @@ .. code-block:: pytest . $ pytest -rs -q multipython.py - ...ssssssssssssssssssssssss [100%] + ......sss......ssssssssssss [100%] ========================= short test summary info ========================== - SKIPPED [12] $REGENDOC_TMPDIR/CWD/multipython.py:31: 'python3.4' not found - SKIPPED [12] $REGENDOC_TMPDIR/CWD/multipython.py:31: 'python3.5' not found - 3 passed, 24 skipped in 0.12 seconds + SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:31: 'python3.5' not found + 12 passed, 15 skipped in 0.12 seconds Indirect parametrization of optional implementations/imports -------------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/example/reportingdemo.rst new/pytest-4.6.9/doc/en/example/reportingdemo.rst --- old/pytest-4.6.6/doc/en/example/reportingdemo.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/example/reportingdemo.rst 2020-01-04 21:35:12.000000000 +0100 @@ -436,7 +436,7 @@ items = [1, 2, 3] print("items is %r" % items) > a, b = items.pop() - E TypeError: cannot unpack non-iterable int object + E TypeError: 'int' object is not iterable failure_demo.py:182: TypeError --------------------------- Captured stdout call --------------------------- @@ -515,7 +515,7 @@ def test_z2_type_error(self): items = 3 > a, b = items - E TypeError: cannot unpack non-iterable int object + E TypeError: 'int' object is not iterable failure_demo.py:222: TypeError ______________________ TestMoreErrors.test_startswith ______________________ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/getting-started.rst new/pytest-4.6.9/doc/en/getting-started.rst --- old/pytest-4.6.6/doc/en/getting-started.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/getting-started.rst 2020-01-04 21:35:12.000000000 +0100 @@ -28,7 +28,7 @@ .. code-block:: bash $ pytest --version - This is pytest version 4.x.y, imported from $PYTHON_PREFIX/lib/python3.7/site-packages/pytest.py + This is pytest version 4.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py .. _`simpletest`: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/index.rst new/pytest-4.6.9/doc/en/index.rst --- old/pytest-4.6.6/doc/en/index.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/index.rst 2020-01-04 21:35:12.000000000 +0100 @@ -87,7 +87,7 @@ License ------- -Copyright Holger Krekel and others, 2004-2017. +Copyright Holger Krekel and others, 2004-2020. Distributed under the terms of the `MIT`_ license, pytest is free and open source software. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/doc/en/license.rst new/pytest-4.6.9/doc/en/license.rst --- old/pytest-4.6.6/doc/en/license.rst 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/doc/en/license.rst 2020-01-04 21:35:12.000000000 +0100 @@ -9,7 +9,7 @@ The MIT License (MIT) - Copyright (c) 2004-2017 Holger Krekel and others + Copyright (c) 2004-2020 Holger Krekel and others Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/setup.py new/pytest-4.6.9/setup.py --- old/pytest-4.6.6/setup.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/setup.py 2020-01-04 21:35:12.000000000 +0100 @@ -13,7 +13,8 @@ "atomicwrites>=1.0", 'funcsigs>=1.0;python_version<"3.0"', 'pathlib2>=2.2.0;python_version<"3.6"', - 'colorama;sys_platform=="win32"', + 'colorama<=0.4.1;sys_platform=="win32" and python_version=="3.4"', + 'colorama;sys_platform=="win32" and python_version!="3.4"', "pluggy>=0.12,<1.0", 'importlib-metadata>=0.12;python_version<"3.8"', "wcwidth", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/_version.py new/pytest-4.6.9/src/_pytest/_version.py --- old/pytest-4.6.6/src/_pytest/_version.py 2019-10-13 16:54:20.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/_version.py 2020-01-04 21:35:29.000000000 +0100 @@ -1,4 +1,4 @@ # coding: utf-8 # file generated by setuptools_scm # don't change, don't track in version control -version = '4.6.6' +version = '4.6.9' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/config/__init__.py new/pytest-4.6.9/src/_pytest/config/__init__.py --- old/pytest-4.6.6/src/_pytest/config/__init__.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/config/__init__.py 2020-01-04 21:35:12.000000000 +0100 @@ -116,13 +116,13 @@ # Plugins that cannot be disabled via "-p no:X" currently. -essential_plugins = ( # fmt: off +essential_plugins = ( "mark", "main", "runner", "fixtures", "helpconfig", # Provides -p. -) # fmt: on +) default_plugins = essential_plugins + ( "python", @@ -622,16 +622,68 @@ def _iter_rewritable_modules(package_files): + """ + Given an iterable of file names in a source distribution, return the "names" that should + be marked for assertion rewrite (for example the package "pytest_mock/__init__.py" should + be added as "pytest_mock" in the assertion rewrite mechanism. + + This function has to deal with dist-info based distributions and egg based distributions + (which are still very much in use for "editable" installs). + + Here are the file names as seen in a dist-info based distribution: + + pytest_mock/__init__.py + pytest_mock/_version.py + pytest_mock/plugin.py + pytest_mock.egg-info/PKG-INFO + + Here are the file names as seen in an egg based distribution: + + src/pytest_mock/__init__.py + src/pytest_mock/_version.py + src/pytest_mock/plugin.py + src/pytest_mock.egg-info/PKG-INFO + LICENSE + setup.py + + We have to take in account those two distribution flavors in order to determine which + names should be considered for assertion rewriting. + + More information: + https://github.com/pytest-dev/pytest-mock/issues/167 + """ + package_files = list(package_files) + seen_some = False for fn in package_files: is_simple_module = "/" not in fn and fn.endswith(".py") is_package = fn.count("/") == 1 and fn.endswith("__init__.py") if is_simple_module: module_name, _ = os.path.splitext(fn) - yield module_name + # we ignore "setup.py" at the root of the distribution + if module_name != "setup": + seen_some = True + yield module_name elif is_package: package_name = os.path.dirname(fn) + seen_some = True yield package_name + if not seen_some: + # at this point we did not find any packages or modules suitable for assertion + # rewriting, so we try again by stripping the first path component (to account for + # "src" based source trees for example) + # this approach lets us have the common case continue to be fast, as egg-distributions + # are rarer + new_package_files = [] + for fn in package_files: + parts = fn.split("/") + new_fn = "/".join(parts[1:]) + if new_fn: + new_package_files.append(new_fn) + if new_package_files: + for _module in _iter_rewritable_modules(new_package_files): + yield _module + class Config(object): """ access to configuration values, pluginmanager and plugin hooks. """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/junitxml.py new/pytest-4.6.9/src/_pytest/junitxml.py --- old/pytest-4.6.6/src/_pytest/junitxml.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/junitxml.py 2020-01-04 21:35:12.000000000 +0100 @@ -15,9 +15,11 @@ import functools import os +import platform import re import sys import time +from datetime import datetime import py import six @@ -595,6 +597,8 @@ if report.when == "call": reporter.append_failure(report) self.open_reports.append(report) + if not self.log_passing_tests: + reporter.write_captured_output(report) else: reporter.append_error(report) elif report.skipped: @@ -667,18 +671,19 @@ ) logfile.write('<?xml version="1.0" encoding="utf-8"?>') - logfile.write( - Junit.testsuite( - self._get_global_properties_node(), - [x.to_xml() for x in self.node_reporters_ordered], - name=self.suite_name, - errors=self.stats["error"], - failures=self.stats["failure"], - skipped=self.stats["skipped"], - tests=numtests, - time="%.3f" % suite_time_delta, - ).unicode(indent=0) + suite_node = Junit.testsuite( + self._get_global_properties_node(), + [x.to_xml() for x in self.node_reporters_ordered], + name=self.suite_name, + errors=self.stats["error"], + failures=self.stats["failure"], + skipped=self.stats["skipped"], + tests=numtests, + time="%.3f" % suite_time_delta, + timestamp=datetime.fromtimestamp(self.suite_start_time).isoformat(), + hostname=platform.node(), ) + logfile.write(Junit.testsuites([suite_node]).unicode(indent=0)) logfile.close() def pytest_terminal_summary(self, terminalreporter): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/pathlib.py new/pytest-4.6.9/src/_pytest/pathlib.py --- old/pytest-4.6.6/src/_pytest/pathlib.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/pathlib.py 2020-01-04 21:35:12.000000000 +0100 @@ -48,24 +48,38 @@ def on_rm_rf_error(func, path, exc, **kwargs): - """Handles known read-only errors during rmtree.""" + """Handles known read-only errors during rmtree. + + The returned value is used only by our own tests. + """ start_path = kwargs["start_path"] - excvalue = exc[1] + exctype, excvalue = exc[:2] + + # another process removed the file in the middle of the "rm_rf" (xdist for example) + # more context: https://github.com/pytest-dev/pytest/issues/5974#issuecomment-543799018 + if isinstance(excvalue, OSError) and excvalue.errno == errno.ENOENT: + return False if not isinstance(excvalue, OSError) or excvalue.errno not in ( errno.EACCES, errno.EPERM, ): warnings.warn( - PytestWarning("(rm_rf) error removing {}: {}".format(path, excvalue)) + PytestWarning( + "(rm_rf) error removing {}\n{}: {}".format(path, exctype, excvalue) + ) ) - return + return False if func not in (os.rmdir, os.remove, os.unlink): warnings.warn( - PytestWarning("(rm_rf) error removing {}: {}".format(path, excvalue)) + PytestWarning( + "(rm_rf) unknown function {} when removing {}:\n{}: {}".format( + path, func, exctype, excvalue + ) + ) ) - return + return False # Chmod + retry. import stat @@ -86,6 +100,7 @@ chmod_rw(str(path)) func(path) + return True def rm_rf(path): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/python_api.py new/pytest-4.6.9/src/_pytest/python_api.py --- old/pytest-4.6.6/src/_pytest/python_api.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/python_api.py 2020-01-04 21:35:12.000000000 +0100 @@ -694,7 +694,7 @@ return RaisesContext(expected_exception, message, match_expr) elif isinstance(args[0], str): warnings.warn(deprecated.RAISES_EXEC, stacklevel=2) - code, = args + (code,) = args assert isinstance(code, str) frame = sys._getframe(1) loc = frame.f_locals.copy() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/_pytest/recwarn.py new/pytest-4.6.9/src/_pytest/recwarn.py --- old/pytest-4.6.6/src/_pytest/recwarn.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/src/_pytest/recwarn.py 2020-01-04 21:35:12.000000000 +0100 @@ -95,7 +95,7 @@ return WarningsChecker(expected_warning, match_expr=match_expr) elif isinstance(args[0], str): warnings.warn(WARNS_EXEC, stacklevel=2) - code, = args + (code,) = args assert isinstance(code, str) frame = sys._getframe(1) loc = frame.f_locals.copy() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/pytest.egg-info/PKG-INFO new/pytest-4.6.9/src/pytest.egg-info/PKG-INFO --- old/pytest-4.6.6/src/pytest.egg-info/PKG-INFO 2019-10-13 16:54:20.000000000 +0200 +++ new/pytest-4.6.9/src/pytest.egg-info/PKG-INFO 2020-01-04 21:35:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pytest -Version: 4.6.6 +Version: 4.6.9 Summary: pytest: simple powerful testing with Python Home-page: https://docs.pytest.org/en/latest/ Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others @@ -140,7 +140,7 @@ License ------- - Copyright Holger Krekel and others, 2004-2019. + Copyright Holger Krekel and others, 2004-2020. Distributed under the terms of the `MIT`_ license, pytest is free and open source software. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/pytest.egg-info/SOURCES.txt new/pytest-4.6.9/src/pytest.egg-info/SOURCES.txt --- old/pytest-4.6.6/src/pytest.egg-info/SOURCES.txt 2019-10-13 16:54:20.000000000 +0200 +++ new/pytest-4.6.9/src/pytest.egg-info/SOURCES.txt 2020-01-04 21:35:29.000000000 +0100 @@ -12,6 +12,7 @@ README.rst TIDELIFT.rst azure-pipelines.yml +codecov.yml pyproject.toml setup.cfg setup.py @@ -200,6 +201,9 @@ doc/en/announce/release-4.6.4.rst doc/en/announce/release-4.6.5.rst doc/en/announce/release-4.6.6.rst +doc/en/announce/release-4.6.7.rst +doc/en/announce/release-4.6.8.rst +doc/en/announce/release-4.6.9.rst doc/en/announce/sprint2016.rst doc/en/example/attic.rst doc/en/example/conftest.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/src/pytest.egg-info/requires.txt new/pytest-4.6.9/src/pytest.egg-info/requires.txt --- old/pytest-4.6.6/src/pytest.egg-info/requires.txt 2019-10-13 16:54:20.000000000 +0200 +++ new/pytest-4.6.9/src/pytest.egg-info/requires.txt 2020-01-04 21:35:29.000000000 +0100 @@ -21,9 +21,12 @@ [:python_version > "2.7"] more-itertools>=4.0.0 -[:sys_platform == "win32"] +[:sys_platform == "win32" and python_version != "3.4"] colorama +[:sys_platform == "win32" and python_version == "3.4"] +colorama<=0.4.1 + [testing] argcomplete hypothesis>=3.56 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/deprecated_test.py new/pytest-4.6.9/testing/deprecated_test.py --- old/pytest-4.6.6/testing/deprecated_test.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/deprecated_test.py 2020-01-04 21:35:12.000000000 +0100 @@ -152,7 +152,7 @@ def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_top_level_conftest( - testdir + testdir, ): from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST @@ -181,7 +181,7 @@ def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_false_positives( - testdir + testdir, ): from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/python/fixtures.py new/pytest-4.6.9/testing/python/fixtures.py --- old/pytest-4.6.6/testing/python/fixtures.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/python/fixtures.py 2020-01-04 21:35:12.000000000 +0100 @@ -464,7 +464,7 @@ assert repr(req).find(req.function.__name__) != -1 def test_request_attributes_method(self, testdir): - item, = testdir.getitems( + (item,) = testdir.getitems( """ import pytest class TestB(object): @@ -492,7 +492,7 @@ pass """ ) - item1, = testdir.genitems([modcol]) + (item1,) = testdir.genitems([modcol]) assert item1.name == "test_method" arg2fixturedefs = fixtures.FixtureRequest(item1)._arg2fixturedefs assert len(arg2fixturedefs) == 1 @@ -756,7 +756,7 @@ def test_request_getmodulepath(self, testdir): modcol = testdir.getmodulecol("def test_somefunc(): pass") - item, = testdir.genitems([modcol]) + (item,) = testdir.genitems([modcol]) req = fixtures.FixtureRequest(item) assert req.fspath == modcol.fspath diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_collection.py new/pytest-4.6.9/testing/test_collection.py --- old/pytest-4.6.6/testing/test_collection.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_collection.py 2020-01-04 21:35:12.000000000 +0100 @@ -494,7 +494,7 @@ p = testdir.makepyfile("def test_func(): pass") id = "::".join([p.basename, "test_func"]) items, hookrec = testdir.inline_genitems(id) - item, = items + (item,) = items assert item.name == "test_func" newid = item.nodeid assert newid == id @@ -613,9 +613,9 @@ testdir.makepyfile("def test_func(): pass") items, hookrec = testdir.inline_genitems() assert len(items) == 1 - item, = items + (item,) = items items2, hookrec = testdir.inline_genitems(item.nodeid) - item2, = items2 + (item2,) = items2 assert item2.name == item.name assert item2.fspath == item.fspath @@ -630,7 +630,7 @@ arg = p.basename + "::TestClass::test_method" items, hookrec = testdir.inline_genitems(arg) assert len(items) == 1 - item, = items + (item,) = items assert item.nodeid.endswith("TestClass::test_method") # ensure we are reporting the collection of the single test item (#2464) assert [x.name for x in self.get_reported_items(hookrec)] == ["test_method"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_config.py new/pytest-4.6.9/testing/test_config.py --- old/pytest-4.6.6/testing/test_config.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_config.py 2020-01-04 21:35:12.000000000 +0100 @@ -431,15 +431,21 @@ @pytest.mark.parametrize( "names, expected", [ + # dist-info based distributions root are files as will be put in PYTHONPATH (["bar.py"], ["bar"]), - (["foo", "bar.py"], []), - (["foo", "bar.pyc"], []), - (["foo", "__init__.py"], ["foo"]), - (["foo", "bar", "__init__.py"], []), + (["foo/bar.py"], ["bar"]), + (["foo/bar.pyc"], []), + (["foo/__init__.py"], ["foo"]), + (["bar/__init__.py", "xz.py"], ["bar", "xz"]), + (["setup.py"], []), + # egg based distributions root contain the files from the dist root + (["src/bar/__init__.py"], ["bar"]), + (["src/bar/__init__.py", "setup.py"], ["bar"]), + (["source/python/bar/__init__.py", "setup.py"], ["bar"]), ], ) def test_iter_rewritable_modules(self, names, expected): - assert list(_iter_rewritable_modules(["/".join(names)])) == expected + assert list(_iter_rewritable_modules(names)) == expected class TestConfigFromdictargs(object): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_junitxml.py new/pytest-4.6.9/testing/test_junitxml.py --- old/pytest-4.6.6/testing/test_junitxml.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_junitxml.py 2020-01-04 21:35:12.000000000 +0100 @@ -4,7 +4,9 @@ from __future__ import print_function import os +import platform import sys +from datetime import datetime from xml.dom import minidom import py @@ -47,6 +49,16 @@ def _by_tag(self, tag): return self.__node.getElementsByTagName(tag) + @property + def children(self): + return [type(self)(x) for x in self.__node.childNodes] + + @property + def get_unique_child(self): + children = self.children + assert len(children) == 1 + return children[0] + def find_nth_by_tag(self, tag, n): items = self._by_tag(tag) try: @@ -81,7 +93,7 @@ return self.__node.tagName @property - def next_siebling(self): + def next_sibling(self): return type(self)(self.__node.nextSibling) @@ -135,6 +147,30 @@ node = dom.find_first_by_tag("testsuite") node.assert_attr(name="pytest", errors=1, failures=2, skipped=1, tests=5) + def test_hostname_in_xml(self, testdir): + testdir.makepyfile( + """ + def test_pass(): + pass + """ + ) + result, dom = runandparse(testdir) + node = dom.find_first_by_tag("testsuite") + node.assert_attr(hostname=platform.node()) + + def test_timestamp_in_xml(self, testdir): + testdir.makepyfile( + """ + def test_pass(): + pass + """ + ) + start_time = datetime.now() + result, dom = runandparse(testdir) + node = dom.find_first_by_tag("testsuite") + timestamp = datetime.strptime(node["timestamp"], "%Y-%m-%dT%H:%M:%S.%f") + assert start_time <= timestamp < datetime.now() + def test_timing_function(self, testdir): testdir.makepyfile( """ @@ -390,11 +426,11 @@ fnode = tnode.find_first_by_tag("failure") fnode.assert_attr(message="ValueError: 42") assert "ValueError" in fnode.toxml() - systemout = fnode.next_siebling + systemout = fnode.next_sibling assert systemout.tag == "system-out" assert "hello-stdout" in systemout.toxml() assert "info msg" not in systemout.toxml() - systemerr = systemout.next_siebling + systemerr = systemout.next_sibling assert systemerr.tag == "system-err" assert "hello-stderr" in systemerr.toxml() assert "info msg" not in systemerr.toxml() @@ -1101,6 +1137,20 @@ assert failed == ["test_x[22]"] +def test_root_testsuites_tag(testdir): + testdir.makepyfile( + """ + def test_x(): + pass + """ + ) + _, dom = runandparse(testdir) + root = dom.get_unique_child + assert root.tag == "testsuites" + suite_node = root.get_unique_child + assert suite_node.tag == "testsuite" + + def test_runs_twice(testdir): f = testdir.makepyfile( """ @@ -1359,3 +1409,39 @@ node = dom.find_first_by_tag("testcase") assert len(node.find_by_tag("system-err")) == 0 assert len(node.find_by_tag("system-out")) == 0 + + [email protected]("junit_logging", ["no", "system-out", "system-err"]) +def test_logging_passing_tests_disabled_logs_output_for_failing_test_issue5430( + testdir, junit_logging +): + testdir.makeini( + """ + [pytest] + junit_log_passing_tests=False + """ + ) + testdir.makepyfile( + """ + import pytest + import logging + import sys + + def test_func(): + logging.warning('hello') + assert 0 + """ + ) + result, dom = runandparse(testdir, "-o", "junit_logging=%s" % junit_logging) + assert result.ret == 1 + node = dom.find_first_by_tag("testcase") + if junit_logging == "system-out": + assert len(node.find_by_tag("system-err")) == 0 + assert len(node.find_by_tag("system-out")) == 1 + elif junit_logging == "system-err": + assert len(node.find_by_tag("system-err")) == 1 + assert len(node.find_by_tag("system-out")) == 0 + else: + assert junit_logging == "no" + assert len(node.find_by_tag("system-err")) == 0 + assert len(node.find_by_tag("system-out")) == 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_mark.py new/pytest-4.6.9/testing/test_mark.py --- old/pytest-4.6.6/testing/test_mark.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_mark.py 2020-01-04 21:35:12.000000000 +0100 @@ -1008,7 +1008,7 @@ def test_pytest_param_id_requires_string(): with pytest.raises(TypeError) as excinfo: pytest.param(id=True) - msg, = excinfo.value.args + (msg,) = excinfo.value.args if six.PY2: assert msg == "Expected id to be a string, got <type 'bool'>: True" else: @@ -1025,7 +1025,7 @@ # typo, should be marks= pytest.param(1, 2, mark=pytest.mark.xfail()) assert warninfo[0].filename == __file__ - msg, = warninfo[0].message.args + (msg,) = warninfo[0].message.args assert msg == ( "pytest.param() got unexpected keyword arguments: ['mark'].\n" "This will be an error in future versions." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_recwarn.py new/pytest-4.6.9/testing/test_recwarn.py --- old/pytest-4.6.6/testing/test_recwarn.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_recwarn.py 2020-01-04 21:35:12.000000000 +0100 @@ -225,7 +225,7 @@ assert len(warninfo) == 3 for w in warninfo: assert w.filename == __file__ - msg, = w.message.args + (msg,) = w.message.args assert msg.startswith("warns(..., 'code(as_a_string)') is deprecated") def test_function(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_skipping.py new/pytest-4.6.9/testing/test_skipping.py --- old/pytest-4.6.6/testing/test_skipping.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_skipping.py 2020-01-04 21:35:12.000000000 +0100 @@ -136,7 +136,7 @@ ) def test_skipif_class(self, testdir): - item, = testdir.getitems( + (item,) = testdir.getitems( """ import pytest class TestClass(object): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_tmpdir.py new/pytest-4.6.9/testing/test_tmpdir.py --- old/pytest-4.6.6/testing/test_tmpdir.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_tmpdir.py 2020-01-04 21:35:12.000000000 +0100 @@ -273,7 +273,7 @@ registry = [] register_cleanup_lock_removal(lock, register=registry.append) - cleanup_func, = registry + (cleanup_func,) = registry assert lock.is_file() @@ -398,9 +398,14 @@ on_rm_rf_error(os.unlink, str(fn), exc_info, start_path=tmp_path) assert fn.is_file() + # we ignore FileNotFoundError + file_not_found = OSError() + file_not_found.errno = errno.ENOENT + exc_info = (None, file_not_found, None) + assert not on_rm_rf_error(None, str(fn), exc_info, start_path=tmp_path) + permission_error = OSError() permission_error.errno = errno.EACCES - # unknown function with pytest.warns(pytest.PytestWarning): exc_info = (None, permission_error, None) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pytest-4.6.6/testing/test_unittest.py new/pytest-4.6.9/testing/test_unittest.py --- old/pytest-4.6.6/testing/test_unittest.py 2019-10-13 16:54:01.000000000 +0200 +++ new/pytest-4.6.9/testing/test_unittest.py 2020-01-04 21:35:12.000000000 +0100 @@ -388,7 +388,7 @@ def test_testcase_totally_incompatible_exception_info(testdir): - item, = testdir.getitems( + (item,) = testdir.getitems( """ from unittest import TestCase class MyTestCase(TestCase):
