From b095e0de47a684bf7a7a3a7ec49c5457fabf6903 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 9 Aug 2019 21:35:03 +0200 Subject: [PATCH 1/7] Improve docs of pytest.importorskip --- doc/en/reference.rst | 2 ++ doc/en/skipping.rst | 9 ++++----- src/_pytest/outcomes.py | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/doc/en/reference.rst b/doc/en/reference.rst index 7e47ffce072..991050c2326 100644 --- a/doc/en/reference.rst +++ b/doc/en/reference.rst @@ -27,6 +27,8 @@ pytest.skip .. autofunction:: _pytest.outcomes.skip(msg, [allow_module_level=False]) +.. _`pytest.importorskip ref`: + pytest.importorskip ~~~~~~~~~~~~~~~~~~~ diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index eb00a6dfb12..57f565472e5 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -179,16 +179,15 @@ information. Skipping on a missing import dependency ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can use the following helper at module level -or within a test or test setup function: +You can skip tests on a missing import by using :ref:`pytest.importorskip ref` +at module level or within a test or test setup function. .. code-block:: python docutils = pytest.importorskip("docutils") -If ``docutils`` cannot be imported here, this will lead to a -skip outcome of the test. You can also skip based on the -version number of a library: +If ``docutils`` cannot be imported here, this will lead to a skip outcome of +the test. You can also skip based on the version number of a library: .. code-block:: python diff --git a/src/_pytest/outcomes.py b/src/_pytest/outcomes.py index 55c30803f59..a3b6d405430 100644 --- a/src/_pytest/outcomes.py +++ b/src/_pytest/outcomes.py @@ -143,14 +143,21 @@ def xfail(reason=""): def importorskip(modname, minversion=None, reason=None): - """Imports and returns the requested module ``modname``, or skip the current test - if the module cannot be imported. + """Imports and returns the requested module ``modname``, or skip the + current test if the module cannot be imported. :param str modname: the name of the module to import - :param str minversion: if given, the imported module ``__version__`` attribute must be - at least this minimal version, otherwise the test is still skipped. - :param str reason: if given, this reason is shown as the message when the module - cannot be imported. + :param str minversion: if given, the imported module ``__version__`` + attribute must be at least this minimal version, otherwise the test is + still skipped. + :param str reason: if given, this reason is shown as the message when the + module cannot be imported. + :returns: The imported module. This should be assigned to its canonical + name. + + Example:: + + docutils = pytest.importorskip("docutils") """ import warnings From e0ce8b79d5bb6d1114201ce5d85fd6f02948e325 Mon Sep 17 00:00:00 2001 From: martbln Date: Sat, 10 Aug 2019 00:55:39 +0300 Subject: [PATCH 2/7] pytester: add docstrings for Testdir.copy_example --- changelog/5669.doc.rst | 1 + src/_pytest/pytester.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 changelog/5669.doc.rst diff --git a/changelog/5669.doc.rst b/changelog/5669.doc.rst new file mode 100644 index 00000000000..0ec9626ae50 --- /dev/null +++ b/changelog/5669.doc.rst @@ -0,0 +1 @@ +Add docstring for ``Testdir.copy_example``. diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 2068761faf9..eef87615253 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -630,6 +630,12 @@ def mkpydir(self, name): return p def copy_example(self, name=None): + """Copy file from project's directory into the testdir. + + :param str name: The name of the file for copy. + :return: self.tmpdir + + """ import warnings from _pytest.warning_types import PYTESTER_COPY_EXAMPLE From ee936b27a8bda9e46af327ce093c209463b488ab Mon Sep 17 00:00:00 2001 From: Ilya Stepin Date: Sat, 10 Aug 2019 09:12:04 +0300 Subject: [PATCH 3/7] pytester: fix docstrings Co-Authored-By: Bruno Oliveira --- src/_pytest/pytester.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index eef87615253..29c200ce6dc 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -633,7 +633,7 @@ def copy_example(self, name=None): """Copy file from project's directory into the testdir. :param str name: The name of the file for copy. - :return: self.tmpdir + :return: path to the copied directory (inside ``self.tmpdir``). """ import warnings From 0767f080a4dfe4fdcfbab4e66bfdccff4ecad52e Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Sat, 10 Aug 2019 12:38:13 -0700 Subject: [PATCH 4/7] =?UTF-8?q?Update=20URL:=20python/black=20=E2=86=92=20?= =?UTF-8?q?psf/black?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pre-commit-config.yaml | 2 +- CONTRIBUTING.rst | 2 +- README.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c9940674d2a..13cdb855170 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ exclude: doc/en/example/py2py3/test_py2.py repos: -- repo: https://github.com/python/black +- repo: https://github.com/psf/black rev: 19.3b0 hooks: - id: black diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 5ef418e0b5c..8e59191abd4 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -167,7 +167,7 @@ Short version #. Enable and install `pre-commit `_ to ensure style-guides and code checks are followed. #. Target ``master`` for bugfixes and doc changes. #. Target ``features`` for new features or functionality changes. -#. Follow **PEP-8** for naming and `black `_ for formatting. +#. Follow **PEP-8** for naming and `black `_ for formatting. #. Tests are run using ``tox``:: tox -e linting,py37 diff --git a/README.rst b/README.rst index 301e4953884..4bf9cce2f48 100644 --- a/README.rst +++ b/README.rst @@ -26,7 +26,7 @@ :target: https://dev.azure.com/pytest-dev/pytest .. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/python/black + :target: https://github.com/psf/black .. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg :target: https://www.codetriage.com/pytest-dev/pytest From 0db9dade653d9fbaf830cefaf305c25193837b15 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Sat, 10 Aug 2019 23:30:49 +0200 Subject: [PATCH 5/7] test_non_ascii_paste_text: mock call to urlopen Likely to fix flaky coverage due to requests failing sometimes. Ref: https://codecov.io/gh/pytest-dev/pytest/compare/f7e81dab9aa8d57498511e1b5655b53cbfbed0d0...83a1f4bd668fe337d42f909cc2ef2d8d986e9748/changes --- testing/test_pastebin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testing/test_pastebin.py b/testing/test_pastebin.py index fd443ed40da..9afa1e23f31 100644 --- a/testing/test_pastebin.py +++ b/testing/test_pastebin.py @@ -55,7 +55,7 @@ def test_skip(): ] ) - def test_non_ascii_paste_text(self, testdir): + def test_non_ascii_paste_text(self, testdir, pastebinlist): """Make sure that text which contains non-ascii characters is pasted correctly. See #1219. """ @@ -74,6 +74,7 @@ def test(): "*Sending information to Paste Service*", ] ) + assert len(pastebinlist) == 1 class TestPaste: From 3eb4973065c17d0e6904b5e622875a590af0bd0b Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 12 Aug 2019 00:09:53 -0600 Subject: [PATCH 6/7] remove %s formatting from docs --- doc/en/capture.rst | 2 +- doc/en/example/assertion/failure_demo.py | 2 +- doc/en/example/markers.rst | 4 ++-- doc/en/example/multipython.py | 2 +- doc/en/example/nonpython/conftest.py | 4 ++-- doc/en/example/reportingdemo.rst | 2 +- doc/en/example/simple.rst | 4 ++-- doc/en/fixture.rst | 14 +++++++------- doc/en/getting-started.rst | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/doc/en/capture.rst b/doc/en/capture.rst index 356da26785e..55714c25b4b 100644 --- a/doc/en/capture.rst +++ b/doc/en/capture.rst @@ -57,7 +57,7 @@ is that you can use print statements for debugging: def setup_function(function): - print("setting up %s" % function) + print("setting up", function) def test_func1(): diff --git a/doc/en/example/assertion/failure_demo.py b/doc/en/example/assertion/failure_demo.py index 129362cd7ff..26454e48d76 100644 --- a/doc/en/example/assertion/failure_demo.py +++ b/doc/en/example/assertion/failure_demo.py @@ -177,7 +177,7 @@ def test_tupleerror(self): def test_reinterpret_fails_with_print_for_the_fun_of_it(self): items = [1, 2, 3] - print("items is %r" % items) + print("items is {!r}".format(items)) a, b = items.pop() def test_some_error(self): diff --git a/doc/en/example/markers.rst b/doc/en/example/markers.rst index a1fe658740b..909f23a2e13 100644 --- a/doc/en/example/markers.rst +++ b/doc/en/example/markers.rst @@ -384,7 +384,7 @@ specifies via named environments: envnames = [mark.args[0] for mark in item.iter_markers(name="env")] if envnames: if item.config.getoption("-E") not in envnames: - pytest.skip("test requires env in %r" % envnames) + pytest.skip("test requires env in {!r}".format(envnames)) A test file using this local plugin: @@ -578,7 +578,7 @@ for your particular platform, you could use the following plugin: supported_platforms = ALL.intersection(mark.name for mark in item.iter_markers()) plat = sys.platform if supported_platforms and plat not in supported_platforms: - pytest.skip("cannot run on platform %s" % (plat)) + pytest.skip("cannot run on platform {}".format(plat)) then tests will be skipped if they were specified for a different platform. Let's do a little test file to show how this looks like: diff --git a/doc/en/example/multipython.py b/doc/en/example/multipython.py index 3dc1d9b29d1..9db6879edae 100644 --- a/doc/en/example/multipython.py +++ b/doc/en/example/multipython.py @@ -69,4 +69,4 @@ def load_and_is_true(self, expression): @pytest.mark.parametrize("obj", [42, {}, {1: 3}]) def test_basic_objects(python1, python2, obj): python1.dumps(obj) - python2.load_and_is_true("obj == %s" % obj) + python2.load_and_is_true("obj == {}".format(obj)) diff --git a/doc/en/example/nonpython/conftest.py b/doc/en/example/nonpython/conftest.py index c94620e97ba..93d8285bfa7 100644 --- a/doc/en/example/nonpython/conftest.py +++ b/doc/en/example/nonpython/conftest.py @@ -33,13 +33,13 @@ def repr_failure(self, excinfo): return "\n".join( [ "usecase execution failed", - " spec failed: %r: %r" % excinfo.value.args[1:3], + " spec failed: {1!r}: {2!r}".format(*excinfo.value.args), " no further details known at this point.", ] ) def reportinfo(self): - return self.fspath, 0, "usecase: %s" % self.name + return self.fspath, 0, "usecase: {}".format(self.name) class YamlException(Exception): diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index ae8928c51b6..05d06ecb6be 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -434,7 +434,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: def test_reinterpret_fails_with_print_for_the_fun_of_it(self): items = [1, 2, 3] - print("items is %r" % items) + print("items is {!r}".format(items)) > a, b = items.pop() E TypeError: 'int' object is not iterable diff --git a/doc/en/example/simple.rst b/doc/en/example/simple.rst index dbfba0fa09d..b4baa2b9b83 100644 --- a/doc/en/example/simple.rst +++ b/doc/en/example/simple.rst @@ -478,7 +478,7 @@ an ``incremental`` marker which is to be used on classes: if "incremental" in item.keywords: previousfailed = getattr(item.parent, "_previousfailed", None) if previousfailed is not None: - pytest.xfail("previous test failed (%s)" % previousfailed.name) + pytest.xfail("previous test failed ({})".format(previousfailed.name)) These two hook implementations work together to abort incremental-marked tests in a class. Here is a test module example: @@ -684,7 +684,7 @@ case we just write some information out to a ``failures`` file: with open("failures", mode) as f: # let's also access a fixture for the fun of it if "tmpdir" in item.fixturenames: - extra = " (%s)" % item.funcargs["tmpdir"] + extra = " ({})".format(item.funcargs["tmpdir"]) else: extra = "" diff --git a/doc/en/fixture.rst b/doc/en/fixture.rst index ea5e2dc86e8..b494ec0fe1d 100644 --- a/doc/en/fixture.rst +++ b/doc/en/fixture.rst @@ -629,7 +629,7 @@ through the special :py:class:`request ` object: def smtp_connection(request): smtp_connection = smtplib.SMTP(request.param, 587, timeout=5) yield smtp_connection - print("finalizing %s" % smtp_connection) + print("finalizing {}".format(smtp_connection)) smtp_connection.close() The main change is the declaration of ``params`` with @@ -902,25 +902,25 @@ to show the setup/teardown flow: @pytest.fixture(scope="module", params=["mod1", "mod2"]) def modarg(request): param = request.param - print(" SETUP modarg %s" % param) + print(" SETUP modarg", param) yield param - print(" TEARDOWN modarg %s" % param) + print(" TEARDOWN modarg", param) @pytest.fixture(scope="function", params=[1, 2]) def otherarg(request): param = request.param - print(" SETUP otherarg %s" % param) + print(" SETUP otherarg", param) yield param - print(" TEARDOWN otherarg %s" % param) + print(" TEARDOWN otherarg", param) def test_0(otherarg): - print(" RUN test0 with otherarg %s" % otherarg) + print(" RUN test0 with otherarg", otherarg) def test_1(modarg): - print(" RUN test1 with modarg %s" % modarg) + print(" RUN test1 with modarg", modarg) def test_2(otherarg, modarg): diff --git a/doc/en/getting-started.rst b/doc/en/getting-started.rst index 149bd33f163..f1c28769f0b 100644 --- a/doc/en/getting-started.rst +++ b/doc/en/getting-started.rst @@ -28,7 +28,7 @@ Install ``pytest`` .. code-block:: bash $ pytest --version - This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py + This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.x/site-packages/pytest.py .. _`simpletest`: From 998da2c5862ef6e94a81b79bc30da96a81fca619 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Wed, 14 Aug 2019 20:32:07 -0300 Subject: [PATCH 7/7] Apply suggestions from code review Co-Authored-By: Daniel Hahler --- doc/en/skipping.rst | 4 ++-- src/_pytest/outcomes.py | 2 +- src/_pytest/pytester.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index 57f565472e5..b92dc98973a 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -179,8 +179,8 @@ information. Skipping on a missing import dependency ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can skip tests on a missing import by using :ref:`pytest.importorskip ref` -at module level or within a test or test setup function. +You can skip tests on a missing import by using :ref:`pytest.importorskip` +at module level, within a test, or test setup function. .. code-block:: python diff --git a/src/_pytest/outcomes.py b/src/_pytest/outcomes.py index 5e5a04208c3..41fc1a186ab 100644 --- a/src/_pytest/outcomes.py +++ b/src/_pytest/outcomes.py @@ -161,7 +161,7 @@ def importorskip( if the module cannot be imported. :param str modname: the name of the module to import - :param str minversion: if given, the imported module ``__version__`` + :param str minversion: if given, the imported module's ``__version__`` attribute must be at least this minimal version, otherwise the test is still skipped. :param str reason: if given, this reason is shown as the message when the diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index d9ceb0e7867..94058f70cba 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -632,7 +632,7 @@ def mkpydir(self, name): def copy_example(self, name=None): """Copy file from project's directory into the testdir. - :param str name: The name of the file for copy. + :param str name: The name of the file to copy. :return: path to the copied directory (inside ``self.tmpdir``). """