From issues-reply at bitbucket.org Wed Oct 1 09:09:14 2014 From: issues-reply at bitbucket.org (pytry) Date: Wed, 01 Oct 2014 07:09:14 -0000 Subject: [Pytest-commit] Issue #604: ValueError: unsupported format character in case of % sign in assert message (hpk42/pytest) Message-ID: <20141001070914.1868.81453@app09.ash-private.bitbucket.org> New issue 604: ValueError: unsupported format character in case of % sign in assert message https://bitbucket.org/hpk42/pytest/issue/604/valueerror-unsupported-format-character-in pytry: Hello, I have noticed strange error when running the tests which in assert message use the % sign. Following code is reproducing this behaviour: ``` #!python def test_message_fail(): assert False, "message with %" ``` And as result I've got: ``` #! ValueError: unsupported format character ' E ValueError: unsupported format character ' ' (0xa) at index 14 ``` Versions I'm using: * Python 2.7.6 * pytest-2.6.3 I've noticed that this behaviour is not visible when--assert=reinterp is used. Is it intended behaviour? Maybe I missed something but could not find any info in change log. Thanks in advance for help. From issues-reply at bitbucket.org Wed Oct 1 12:39:19 2014 From: issues-reply at bitbucket.org (Bjorn Pettersen) Date: Wed, 01 Oct 2014 10:39:19 -0000 Subject: [Pytest-commit] Issue #605: tmpdir.join("foo").write(...) doesn't work as expected. (hpk42/pytest) Message-ID: <20141001103919.12600.82184@app10.ash-private.bitbucket.org> New issue 605: tmpdir.join("foo").write(...) doesn't work as expected. https://bitbucket.org/hpk42/pytest/issue/605/tmpdirjoin-foo-write-doesnt-work-as Bjorn Pettersen: All of the following testcase ``` #!python # -*- coding: utf-8 -*- def test_1(tmpdir): tmpdir.join('foo').write(u'?') def test_2(tmpdir): tmpdir.join('foo').write(u'?'.encode('u8')) def test_3(tmpdir): tmpdir.join('foo').write(u'?'.encode('l1')) ``` fails with the following errors: (dev) w:\>py.test test_tmpdir.py ============================= test session starts ============================= platform win32 -- Python 2.7.8 -- py-1.4.25 -- pytest-2.6.3 plugins: cov, xdist collected 3 items test_tmpdir.py FFF ================================== FAILURES =================================== ___________________________________ test_1 ____________________________________ tmpdir = local('c:\\tmp\\pytest-20\\test_10') def test_1(tmpdir): > tmpdir.join('foo').write(u'??') test_tmpdir.py:4: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = local('c:\\tmp\\pytest-20\\test_10\\foo'), data = '?', mode = 'w' ensure = False def write(self, data, mode='w', ensure=False): """ write data into path. If ensure is True create missing parent directories. """ if ensure: self.dirpath().ensure(dir=1) if 'b' in mode: if not py.builtin._isbytes(data): raise ValueError("can only process bytes") else: if not py.builtin._istext(data): if not py.builtin._isbytes(data): data = str(data) else: data = py.builtin._totext(data, sys.getdefaultencoding()) f = self.open(mode) try: > f.write(data) E UnicodeEncodeError: 'ascii' codec can't encode character u'\xe6' in position 0: ordinal not in range(128) dev\lib\site-packages\py\_path\local.py:476: UnicodeEncodeError ___________________________________ test_2 ____________________________________ tmpdir = local('c:\\tmp\\pytest-20\\test_20') def test_2(tmpdir): > tmpdir.join('foo').write(u'??'.encode('u8')) test_tmpdir.py:8: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = local('c:\\tmp\\pytest-20\\test_20\\foo'), data = '\xc3\xa6', mode = 'w' ensure = False def write(self, data, mode='w', ensure=False): """ write data into path. If ensure is True create missing parent directories. """ if ensure: self.dirpath().ensure(dir=1) if 'b' in mode: if not py.builtin._isbytes(data): raise ValueError("can only process bytes") else: if not py.builtin._istext(data): if not py.builtin._isbytes(data): data = str(data) else: > data = py.builtin._totext(data, sys.getdefaultencoding()) E UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) dev\lib\site-packages\py\_path\local.py:473: UnicodeDecodeError ___________________________________ test_3 ____________________________________ tmpdir = local('c:\\tmp\\pytest-20\\test_30') def test_3(tmpdir): > tmpdir.join('foo').write(u'??'.encode('l1')) test_tmpdir.py:12: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = local('c:\\tmp\\pytest-20\\test_30\\foo'), data = '\xe6', mode = 'w' ensure = False def write(self, data, mode='w', ensure=False): """ write data into path. If ensure is True create missing parent directories. """ if ensure: self.dirpath().ensure(dir=1) if 'b' in mode: if not py.builtin._isbytes(data): raise ValueError("can only process bytes") else: if not py.builtin._istext(data): if not py.builtin._isbytes(data): data = str(data) else: > data = py.builtin._totext(data, sys.getdefaultencoding()) E UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128) dev\lib\site-packages\py\_path\local.py:473: UnicodeDecodeError ========================== 3 failed in 0.19 seconds =========================== (dev) w:\> From issues-reply at bitbucket.org Wed Oct 1 14:03:17 2014 From: issues-reply at bitbucket.org (=?utf-8?q?J=C4=99drzej_Nowak?=) Date: Wed, 01 Oct 2014 12:03:17 -0000 Subject: [Pytest-commit] Issue #606: INTERNALERROR when no valid source lines found (hpk42/pytest) Message-ID: <20141001120317.29595.80031@app12.ash-private.bitbucket.org> New issue 606: INTERNALERROR when no valid source lines found https://bitbucket.org/hpk42/pytest/issue/606/internalerror-when-no-valid-source-lines J?drzej Nowak: ``` INTERNALERROR> Traceback (most recent call last): INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session INTERNALERROR> doit(config, session) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main INTERNALERROR> config.hook.pytest_runtestloop(session=session) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 413, in __call__ INTERNALERROR> return self._docall(methods, kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 424, in _docall INTERNALERROR> res = mc.execute() INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 315, in execute INTERNALERROR> res = method(**kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/main.py", line 142, in pytest_runtestloop INTERNALERROR> item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 413, in __call__ INTERNALERROR> return self._docall(methods, kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 424, in _docall INTERNALERROR> res = mc.execute() INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 315, in execute INTERNALERROR> res = method(**kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/runner.py", line 65, in pytest_runtest_protocol INTERNALERROR> runtestprotocol(item, nextitem=nextitem) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/runner.py", line 75, in runtestprotocol INTERNALERROR> reports.append(call_and_report(item, "call", log)) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/runner.py", line 111, in call_and_report INTERNALERROR> report = hook.pytest_runtest_makereport(item=item, call=call) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/main.py", line 167, in call_matching_hooks INTERNALERROR> return hookmethod.pcall(plugins, **kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 417, in pcall INTERNALERROR> return self._docall(methods, kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 424, in _docall INTERNALERROR> res = mc.execute() INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/core.py", line 315, in execute INTERNALERROR> res = method(**kwargs) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/runner.py", line 214, in pytest_runtest_makereport INTERNALERROR> longrepr = item.repr_failure(excinfo) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/python.py", line 600, in repr_failure INTERNALERROR> return self._repr_failure_py(excinfo, style=style) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/python.py", line 593, in _repr_failure_py INTERNALERROR> style=style) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/_pytest/main.py", line 412, in _repr_failure_py INTERNALERROR> style=style, tbfilter=tbfilter) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/py/_code/code.py", line 412, in getrepr INTERNALERROR> return fmt.repr_excinfo(self) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/py/_code/code.py", line 590, in repr_excinfo INTERNALERROR> reprtraceback = self.repr_traceback(excinfo) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/py/_code/code.py", line 582, in repr_traceback INTERNALERROR> reprentry = self.repr_traceback_entry(entry, einfo) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/py/_code/code.py", line 543, in repr_traceback_entry INTERNALERROR> s = self.get_source(source, line_index, excinfo, short=short) INTERNALERROR> File "/tmp/venv/lib/python2.7/site-packages/py/_code/code.py", line 484, in get_source INTERNALERROR> lines.append(self.flow_marker + " " + source.lines[line_index]) INTERNALERROR> IndexError: list index out of range ``` The reason for this is error in macropy generated code. When it crashes inside macro then it propagates wrong line numbers (https://github.com/lihaoyi/macropy#line-numbers). But the same "wrong line numbers" applies to: - saved/changed file after test started - probably other code modifications I would expect one of two things there: - same behavior that is in `--tb native` OR - some kind of message "no source code could be detected". The bad thing about this `INTERNALERROR` is that it makes pytest to fail. From issues-reply at bitbucket.org Fri Oct 3 23:03:55 2014 From: issues-reply at bitbucket.org (Bryce Lampe) Date: Fri, 03 Oct 2014 21:03:55 -0000 Subject: [Pytest-commit] Issue #607: pytest.skip will skip entire files when used as a decorator (hpk42/pytest) Message-ID: <20141003210355.22911.39070@app13.ash-private.bitbucket.org> New issue 607: pytest.skip will skip entire files when used as a decorator https://bitbucket.org/hpk42/pytest/issue/607/pytestskip-will-skip-entire-files-when Bryce Lampe: I've seen several people assume that `@pytest.skip` can be used in place of `@pytest.mark.skipif(True, reason="foo")`. It seems like a reasonable convenience and it *seems* to work. However, this is actually quite dangerous because it has the unexpected side-effect of skipping every test in the file: ``` $ cat test.py import pytest @pytest.skip def test_1(): print 1 def test_2(): print 2 def test_3(): print 3 ``` Expected behavior: ``` $ py.test test.py -v ============================= test session starts ============================== platform darwin -- Python 2.7.8 -- py-1.4.25 -- pytest-2.6.3 -- /Users/blampe/env/bin/python2.7 collected 2 items test.py::test_2 PASSED test.py::test_3 PASSED =========================== 2 passed in 0.01 seconds =========================== ``` Actual behavior: ``` $ py.test test.py -v ============================= test session starts ============================== platform darwin -- Python 2.7.8 -- py-1.4.25 -- pytest-2.6.3 collected 0 items / 1 skipped ========================== 1 skipped in 0.00 seconds ========================== ``` Note that this is reporting the wrong number of skipped tests, so this definitely seems unintentional. From issues-reply at bitbucket.org Sun Oct 5 07:20:21 2014 From: issues-reply at bitbucket.org (Eric Higgins) Date: Sun, 05 Oct 2014 05:20:21 -0000 Subject: [Pytest-commit] Issue #195: Document how to define/override the virtualenv path (hpk42/tox) Message-ID: <20141005052021.11895.26020@app07.ash-private.bitbucket.org> New issue 195: Document how to define/override the virtualenv path https://bitbucket.org/hpk42/tox/issue/195/document-how-to-define-override-the Eric Higgins: Virtualenv [supports custom bootstrap scripts](http://virtualenv.readthedocs.org/en/latest/virtualenv.html#creating-your-own-bootstrap-scripts) which extend the virtualenv library and replaces $ virtualenv ENV with $ ./virtualenv.boostrap.py ENV The documentation for tox does not make it clear how to override the path to `virtualenv`, which would allow these bootstrap scripts to be called instead. Additional reading: - http://mindtrove.info/virtualenv-bootstrapping/ From commits-noreply at bitbucket.org Mon Oct 6 11:14:50 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 09:14:50 -0000 Subject: [Pytest-commit] commit/pytest: 4 new changesets Message-ID: <20141006091450.28843.7205@app09.ash-private.bitbucket.org> 4 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/68b0ceb80d71/ Changeset: 68b0ceb80d71 Branch: dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 User: dgilcrease Date: 2014-10-02 21:27:19+00:00 Summary: change the defaults from a tuple to a list so I can use config.addinivalue_line("norecursedirs", "...") to append new options in my own plugins Affected #: 1 file diff -r 25aa56b376c11b083ccc6d49057b765bc5e4b87a -r 68b0ceb80d71d5f5b06a3462cf97c54723f5c638 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", https://bitbucket.org/hpk42/pytest/commits/2c90d5c60353/ Changeset: 2c90d5c60353 Branch: dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 User: dgilcrease Date: 2014-10-02 21:32:35+00:00 Summary: change the defaults from a tuple to a list so I can use config.addinivalue_line("python_files", "...") to append new options in my own plugins Affected #: 1 file diff -r 68b0ceb80d71d5f5b06a3462cf97c54723f5c638 -r 2c90d5c603535f53cf2a7eb735a145ee89421829 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): https://bitbucket.org/hpk42/pytest/commits/6dc2385e7aa2/ Changeset: 6dc2385e7aa2 Branch: dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 User: dgilcrease Date: 2014-10-02 21:33:48+00:00 Summary: Close branch dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/d29d0e7844e8/ Changeset: d29d0e7844e8 User: dgilcrease Date: 2014-10-02 21:33:48+00:00 Summary: Merged in dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 (pull request #1) change the defaults from a tuple to a list so I can use config.addinivalue_line("norecursedirs", "...") to append new options in my own plugins Affected #: 2 files diff -r 25aa56b376c11b083ccc6d49057b765bc5e4b87a -r d29d0e7844e8413ba704508a1390ec76d944b3d0 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", diff -r 25aa56b376c11b083ccc6d49057b765bc5e4b87a -r d29d0e7844e8413ba704508a1390ec76d944b3d0 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Mon Oct 6 11:33:19 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 09:33:19 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 337 Message-ID: <20141006093317.64913.94520@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/337 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3806:a846b9033a61 Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest (pull request #214) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Mon Oct 6 11:34:06 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 09:34:06 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 336 Message-ID: <20141006092340.82427.668@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/336 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3804:d29d0e7844e8 Author : Dj Gilcrease Branch : default Message: Merged in dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 (pull request #1) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Mon Oct 6 11:39:32 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 09:39:32 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 338 Message-ID: <20141006093932.82427.60946@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/338 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3806:a846b9033a61 Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest (pull request #214) -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Mon Oct 6 11:55:40 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 09:55:40 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141006095540.20763.32098@app08.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/dcc30fc64d62/ Changeset: dcc30fc64d62 Branch: defer-hook-example User: nicoddemus Date: 2014-10-04 17:48:19+00:00 Summary: Adding docs on how to properly add new hooks and using them in 3rd party plugins Affected #: 1 file diff -r 25aa56b376c11b083ccc6d49057b765bc5e4b87a -r dcc30fc64d62a316598c8363a5871eca545a7bf4 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== https://bitbucket.org/hpk42/pytest/commits/9d5d7c0d97ba/ Changeset: 9d5d7c0d97ba User: hpk42 Date: 2014-10-06 09:55:35+00:00 Summary: Merged in nicoddemus/pytest/defer-hook-example (pull request #216) Documentation for new hooks and how to use them Affected #: 1 file diff -r a846b9033a61904fe60fcc64c5dff582cb01d85c -r 9d5d7c0d97ba889a7c369f184122ecdd5ad1f22f doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Mon Oct 6 11:55:40 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 09:55:40 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in nicoddemus/pytest/defer-hook-example (pull request #216) Message-ID: <20141006095540.27972.39472@app05.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/9d5d7c0d97ba/ Changeset: 9d5d7c0d97ba User: hpk42 Date: 2014-10-06 09:55:35+00:00 Summary: Merged in nicoddemus/pytest/defer-hook-example (pull request #216) Documentation for new hooks and how to use them Affected #: 1 file diff -r a846b9033a61904fe60fcc64c5dff582cb01d85c -r 9d5d7c0d97ba889a7c369f184122ecdd5ad1f22f doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Mon Oct 6 12:02:47 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 10:02:47 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: add some changelog entries Message-ID: <20141006100247.17186.8778@app06.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/31668a78f211/ Changeset: 31668a78f211 User: hpk42 Date: 2014-10-06 09:56:56+00:00 Summary: add some changelog entries Affected #: 1 file diff -r 9d5d7c0d97ba889a7c369f184122ecdd5ad1f22f -r 31668a78f211ce8e782c8b838a16185625f1ccb0 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,10 @@ - removed outdated japanese docs from source tree. +- docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. + +- updated plugin index docs. Thanks Bruno Oliveira. + 2.6.3 ----------- Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Mon Oct 6 12:05:44 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 10:05:44 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 339 Message-ID: <20141006100456.82443.26430@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/339 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3808:9d5d7c0d97ba Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest/defer-hook-example (pull request #216) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Mon Oct 6 12:10:47 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 10:10:47 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 340 Message-ID: <20141006101046.64891.63066@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/340 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3809:31668a78f211 Author : holger krekel Branch : default Message: add some changelog entries -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Mon Oct 6 12:12:04 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 10:12:04 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: fix issue557: with "-k" we only allow the old style "-" for negation Message-ID: <20141006101204.19234.93525@app11.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/6d407ed022d7/ Changeset: 6d407ed022d7 Branch: issue557 User: hpk42 Date: 2014-10-06 10:11:48+00:00 Summary: fix issue557: with "-k" we only allow the old style "-" for negation at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. Affected #: 3 files diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r 6d407ed022d75e4addc1084a7bd53d04b146cda3 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,10 @@ - updated plugin index docs. Thanks Bruno Oliveira. +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + 2.6.3 ----------- diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r 6d407ed022d75e4addc1084a7bd53d04b146cda3 _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r 6d407ed022d75e4addc1084a7bd53d04b146cda3 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Mon Oct 6 12:22:26 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 10:22:26 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 341 Message-ID: <20141006102222.52967.47461@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/341 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3722:6d407ed022d7 Author : holger krekel Branch : issue557 Message: fix issue557: with "-k" we only allow the old style "-" for negation -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Mon Oct 6 12:54:10 2014 From: issues-reply at bitbucket.org (=?utf-8?q?Bj=C3=B8rnar_Snoksrud?=) Date: Mon, 06 Oct 2014 10:54:10 -0000 Subject: [Pytest-commit] Issue #608: Failed assertions with any/all and generator expressions raise NameError (hpk42/pytest) Message-ID: <20141006105410.5119.18882@app11.ash-private.bitbucket.org> New issue 608: Failed assertions with any/all and generator expressions raise NameError https://bitbucket.org/hpk42/pytest/issue/608/failed-assertions-with-any-all-and Bj?rnar Snoksrud: Tested with pytest 2.6.1: repro.py: ``` #!python from repro2 import foo def test_case(): foo() ``` repro2.py: ``` #!python def foo(): obj = {} assert all(x in obj for x in '1') ``` Running the test. ``` #!python $ py.test repro.py platform linux2 -- Python 2.7.5 -- py-1.4.23 -- pytest-2.5.2 plugins: xdist collected 1 items repro.py F ============================================= FAILURES _____________________________________________ test_case def test_case(): > foo() repro.py:5: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def foo(): obj = {} > assert all(x in obj for x in '1') E AssertionError: NameError: all( at 0x2ab35a0>) << global name 'obj' is not defined ``` This looks alot like #339, but the kicker is this: if you move the 'foo()' function to the file containing the testcase, it works as expected. From commits-noreply at bitbucket.org Mon Oct 6 13:42:56 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 11:42:56 -0000 Subject: [Pytest-commit] commit/pytest: bubenkoff: Close branch issue557 Message-ID: <20141006114256.27646.23759@app13.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/eb1bd0b415f4/ Changeset: eb1bd0b415f4 Branch: issue557 User: bubenkoff Date: 2014-10-06 11:42:53+00:00 Summary: Close branch issue557 Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Mon Oct 6 13:42:58 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 11:42:58 -0000 Subject: [Pytest-commit] commit/pytest: bubenkoff: Merged in issue557 (pull request #218) Message-ID: <20141006114258.8275.16491@app10.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/fb399a582553/ Changeset: fb399a582553 User: bubenkoff Date: 2014-10-06 11:42:53+00:00 Summary: Merged in issue557 (pull request #218) fix issue557: with "-k" we only allow the old style "-" for negation Affected #: 3 files diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r fb399a582553ac8180e5706ad0e34149da85436e CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,10 @@ - updated plugin index docs. Thanks Bruno Oliveira. +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + 2.6.3 ----------- diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r fb399a582553ac8180e5706ad0e34149da85436e _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 31668a78f211ce8e782c8b838a16185625f1ccb0 -r fb399a582553ac8180e5706ad0e34149da85436e testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Mon Oct 6 13:50:10 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 11:50:10 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 342 Message-ID: <20141006115010.64899.56299@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/342 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3723:eb1bd0b415f4 Author : Anatoly Bubenkov Branch : issue557 Message: Close branch issue557 -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Mon Oct 6 13:56:14 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 11:56:14 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 343 Message-ID: <20141006115609.64915.7063@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/343 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3812:fb399a582553 Author : Anatoly Bubenkov Branch : default Message: Merged in issue557 (pull request #218) -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Mon Oct 6 14:04:23 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 06 Oct 2014 12:04:23 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141006120423.28049.28084@app08.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/a75c837bbb08/ Changeset: a75c837bbb08 Branch: defer-hook-example User: hpk42 Date: 2014-10-06 12:04:12+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/1ad93a3f1ab4/ Changeset: 1ad93a3f1ab4 Branch: better-diff-on-verbose-2 User: hpk42 Date: 2014-10-06 12:04:12+00:00 Summary: close branch Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Mon Oct 6 14:14:36 2014 From: builds at drone.io (Drone.io Build) Date: Mon, 06 Oct 2014 12:14:36 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 344 Message-ID: <20141006121433.82423.63046@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/344 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3710:1ad93a3f1ab4 Author : holger krekel Branch : better-diff-on-verbose-2 Message: close branch -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Mon Oct 6 19:32:14 2014 From: issues-reply at bitbucket.org (Charlie Clark) Date: Mon, 06 Oct 2014 17:32:14 -0000 Subject: [Pytest-commit] Issue #609: Problem with "plugin already registered" on Raspbian (hpk42/pytest) Message-ID: <20141006173214.24485.93087@app13.ash-private.bitbucket.org> New issue 609: Problem with "plugin already registered" on Raspbian https://bitbucket.org/hpk42/pytest/issue/609/problem-with-plugin-already-registered-on Charlie Clark: Hi, I get a weird failure when I run py.test on my project on a RaspberryPi without explicitly passing in the [project](https://bitbucket.org/openpyxl/openpyxl) so `py.test` fails `py.test openpyxl` runs fine I've manually updated pip, setuptools and virtualenv on the box but that doesn't seem to make much difference. But I suspect it's probably something to do with the Python .deb package. I can't reproduce the behaviour on a different Debian system. ``` #!python (openpyxl)openpyxl at Flay ~/openpyxl $ py.test -xrf ============================================================ test session starts ============================================================= platform linux2 -- Python 2.7.3 -- py-1.4.25 -- pytest-2.6.3 collected 0 items / 1 errors =================================================================== ERRORS =================================================================== _____________________________________________________________ ERROR collecting . _____________________________________________________________ local/lib/python2.7/site-packages/py/_path/common.py:331: in visit for x in Visitor(fil, rec, ignore, bf, sort).gen(self): local/lib/python2.7/site-packages/py/_path/common.py:377: in gen for p in self.gen(subdir): local/lib/python2.7/site-packages/py/_path/common.py:367: in gen if p.check(dir=1) and (rec is None or rec(p))]) local/lib/python2.7/site-packages/_pytest/main.py:628: in _recurse ihook.pytest_collect_directory(path=path, parent=self) local/lib/python2.7/site-packages/_pytest/main.py:166: in call_matching_hooks plugins = self.config._getmatchingplugins(self.fspath) local/lib/python2.7/site-packages/_pytest/config.py:688: in _getmatchingplugins plugins += self._conftest.getconftestmodules(fspath) local/lib/python2.7/site-packages/_pytest/config.py:521: in getconftestmodules mod = self.importconftest(conftestpath) local/lib/python2.7/site-packages/_pytest/config.py:554: in importconftest self._onimport(mod) local/lib/python2.7/site-packages/_pytest/config.py:674: in _onimportconftest self.pluginmanager.consider_conftest(conftestmodule) local/lib/python2.7/site-packages/_pytest/core.py:201: in consider_conftest if self.register(conftestmodule, name=conftestmodule.__file__): local/lib/python2.7/site-packages/_pytest/core.py:95: in register name, plugin, self._name2plugin)) E ValueError: Plugin already registered: /home/openpyxl/openpyxl/openpyxl/conftest.pyc= E {'helpconfig': , 'pytestconfig': <_pytest.config.Config object at 0xb683e610>, 'runner': , 'unittest': , 'pastebin': , 'skipping': , 'genscript': , 'session': , 'tmpdir': , 'cap ture': , 'terminalreporter': <_pytest.terminal.TerminalReporter instance at 0x96c738>, 'assertion': , 'mark': , 'terminal': , 'main': , 'nose': , 'python': , 'recwarn': , 'funcmanage': <_pytest.python.FixtureManager instance at 0x977878>, 'monkeypatch': , 'resultlog': , '3062060720': <_pytest.config.PytestPluginManager object at 0xb68356b0>, 'capturemanager': <_pytest.capture.CaptureManager instance at 0x864f08>, 'junitxml': , 'doctest': , 'pdb': , '/home/openpyxl/openpyxl/openpyxl/conftest.pyc': } ========================================================== 1 error in 22.09 seconds ========================================================== ``` From issues-reply at bitbucket.org Mon Oct 6 22:57:11 2014 From: issues-reply at bitbucket.org (virtuald) Date: Mon, 06 Oct 2014 20:57:11 -0000 Subject: [Pytest-commit] Issue #610: Internal error with missing fixture + bad decorator (hpk42/pytest) Message-ID: <20141006205711.9751.66986@app13.ash-private.bitbucket.org> New issue 610: Internal error with missing fixture + bad decorator https://bitbucket.org/hpk42/pytest/issue/610/internal-error-with-missing-fixture-bad virtuald: The [decorator](https://pypi.python.org/pypi/decorator) library doesn't seem to decorate its functions properly -- and when a test function has one of these decorators, and an invalid fixture is specified, an internal error occurs. Using decorator 3.4.0, the following code will generate a py.test internal error: ``` #!python import decorator def bad_decorator(func): def wrapper(func, *args, **kwargs): pass return decorator.decorator(wrapper, func) @bad_decorator def test_something(missing_fixture): pass ``` Arguably decorator should be fixed, but py.test should probably generate a better error message too. The error log is attached. From commits-noreply at bitbucket.org Tue Oct 7 09:06:51 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 07 Oct 2014 07:06:51 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) Message-ID: <20141007070651.20787.28891@app02.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/63ee1c59835a/ Changeset: 63ee1c59835a User: hpk42 Date: 2014-10-07 07:06:47+00:00 Summary: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) Escape % character in the assertion message Affected #: 3 files diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,8 @@ at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. +- fix issue604: Escape % character in the assertion message. + 2.6.3 ----------- diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Tue Oct 7 09:14:52 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 07 Oct 2014 07:14:52 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 345 Message-ID: <20141007071421.82423.99597@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/345 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3818:63ee1c59835a Author : holger krekel Branch : default Message: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Tue Oct 7 09:20:36 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 07 Oct 2014 07:20:36 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 346 Message-ID: <20141007072013.64901.18123@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/346 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3818:63ee1c59835a Author : holger krekel Branch : default Message: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Tue Oct 7 11:19:17 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 07 Oct 2014 09:19:17 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: open up pytest-2.6 branch in case we want to release a 2.6.4 before 2.7.0 happens Message-ID: <20141007091917.31939.62147@app05.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/a460a4db4589/ Changeset: a460a4db4589 Branch: pytest-2.6 User: hpk42 Date: 2014-10-07 09:14:57+00:00 Summary: open up pytest-2.6 branch in case we want to release a 2.6.4 before 2.7.0 happens Affected #: 3 files diff -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 -r a460a4db4589486f62af8716f6960df3edc6d99f CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Unreleased +2.6.4.dev ---------- - Improve assertion failure reporting on iterables, by using ndiff and pprint. diff -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 -r a460a4db4589486f62af8716f6960df3edc6d99f _pytest/__init__.py --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.6.4.dev1' +__version__ = '2.6.4.dev2' diff -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 -r a460a4db4589486f62af8716f6960df3edc6d99f setup.py --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ name='pytest', description='pytest: simple powerful testing with Python', long_description=long_description, - version='2.6.4.dev1', + version='2.6.4.dev2', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Tue Oct 7 11:21:45 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 07 Oct 2014 09:21:45 +0000 Subject: [Pytest-commit] [FAIL] pytest - # 347 Message-ID: <20141007092144.64917.42633@drone.io> Build Failed Build : https://drone.io/bitbucket.org/hpk42/pytest/347 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : Author : Branch : pytest-2.6 Message: -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Tue Oct 7 19:08:23 2014 From: issues-reply at bitbucket.org (Veeti Paananen) Date: Tue, 07 Oct 2014 17:08:23 -0000 Subject: [Pytest-commit] Issue #611: Parametrized test fails with fixture named "request" (hpk42/pytest) Message-ID: <20141007170823.28674.78875@app11.ash-private.bitbucket.org> New issue 611: Parametrized test fails with fixture named "request" https://bitbucket.org/hpk42/pytest/issue/611/parametrized-test-fails-with-fixture-named Veeti Paananen: ``` #!python import pytest @pytest.fixture def request(): return 123 @pytest.mark.parametrize('param', [1, 2, 3]) def test_stuff(request, param): # test stuff assert True ``` Fails with: ``` def get_direct_param_fixture_func(request): > return request.param E AttributeError: 'int' object has no attribute 'param' ``` From commits-noreply at bitbucket.org Tue Oct 7 09:06:51 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 07 Oct 2014 07:06:51 -0000 Subject: [Pytest-commit] commit/pytest: 4 new changesets Message-ID: <20141007070651.28127.8541@app08.ash-private.bitbucket.org> 4 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/099f84c232ac/ Changeset: 099f84c232ac Branch: test_for_issue_604 User: pytry Date: 2014-10-05 12:49:15+00:00 Summary: Added test for ValueError in custom assert message with % sign (issue #604) https://bitbucket.org/hpk42/pytest/issue/604/valueerror-unsupported-format-character-in Affected #: 1 file diff -r 25aa56b376c11b083ccc6d49057b765bc5e4b87a -r 099f84c232ac0bc39816f92a2cb02b5db49d97a1 testing/test_assertmessage.py --- /dev/null +++ b/testing/test_assertmessage.py @@ -0,0 +1,18 @@ + +def test_assert_message_fail(): + ''' + Check if custom message with % sign do not raise ValueError + Later test can be parametrized with other problematic chars + ''' + + MESSAGE = 'Message with %' + + try: + assert False, MESSAGE + except ValueError, ve: + assert False, 'ValueError was raised with the following message: ' \ + + ve.message + except AssertionError, ae: + assert MESSAGE == ae.message, 'Assertion message: ' + ae.message \ + + ' is different than expected: ' + MESSAGE + \ No newline at end of file https://bitbucket.org/hpk42/pytest/commits/f29cb4f22db8/ Changeset: f29cb4f22db8 Branch: test_for_issue_604 User: bubenkoff Date: 2014-10-06 23:01:21+00:00 Summary: Escape % character in the assertion message. closes #604 Affected #: 4 files diff -r 099f84c232ac0bc39816f92a2cb02b5db49d97a1 -r f29cb4f22db8c478da785c0e9973742a00714073 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,9 @@ - removed outdated japanese docs from source tree. +- Escape % character in the assertion message. + + 2.6.3 ----------- diff -r 099f84c232ac0bc39816f92a2cb02b5db49d97a1 -r f29cb4f22db8c478da785c0e9973742a00714073 _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff -r 099f84c232ac0bc39816f92a2cb02b5db49d97a1 -r f29cb4f22db8c478da785c0e9973742a00714073 testing/test_assertmessage.py --- a/testing/test_assertmessage.py +++ /dev/null @@ -1,18 +0,0 @@ - -def test_assert_message_fail(): - ''' - Check if custom message with % sign do not raise ValueError - Later test can be parametrized with other problematic chars - ''' - - MESSAGE = 'Message with %' - - try: - assert False, MESSAGE - except ValueError, ve: - assert False, 'ValueError was raised with the following message: ' \ - + ve.message - except AssertionError, ae: - assert MESSAGE == ae.message, 'Assertion message: ' + ae.message \ - + ' is different than expected: ' + MESSAGE - \ No newline at end of file diff -r 099f84c232ac0bc39816f92a2cb02b5db49d97a1 -r f29cb4f22db8c478da785c0e9973742a00714073 testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False https://bitbucket.org/hpk42/pytest/commits/e43b41716142/ Changeset: e43b41716142 Branch: test_for_issue_604 User: bubenkoff Date: 2014-10-06 23:06:15+00:00 Summary: merge with default Affected #: 9 files diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,8 +5,15 @@ - removed outdated japanese docs from source tree. -- Escape % character in the assertion message. +- docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. +- updated plugin index docs. Thanks Bruno Oliveira. + +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + +- fix issue604: Escape % character in the assertion message. 2.6.3 ----------- diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d doc/en/plugins_index/index.txt --- a/doc/en/plugins_index/index.txt +++ b/doc/en/plugins_index/index.txt @@ -4,7 +4,7 @@ =========================== The table below contains a listing of plugins found in PyPI and -their status when tested using py.test **2.6.2.dev1** and python 2.7 and +their status when tested using py.test **2.6.4.dev1** and python 2.7 and 3.3. A complete listing can also be found at @@ -12,154 +12,160 @@ status against other py.test releases. -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - Name Py27 Py34 Repo Summary -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - `pytest-allure-adaptor-1.4.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports - :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/allure-framework/allure-python - `pytest-bdd-2.3.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BDD for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd - `pytest-beds-0.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps - :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kaste/pytest-beds - `pytest-bench-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Benchmark utility that plugs into pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/concordusapps/pytest-bench - `pytest-blockage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Disable network requests during a test run. - :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/rob-b/pytest-blockage - `pytest-browsermob-proxy-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy - `pytest-bugzilla-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nibrahim/pytest_bugzilla - `pytest-cache-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ - `pytest-capturelog-0.7 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to capture log messages - :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview - `pytest-codecheckers-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) - :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ - `pytest-config-0.0.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/buzzfeed/pytest_config - `pytest-contextfixture-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Define pytest fixtures as context managers. - :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-contextfixture/ - `pytest-couchdbkit-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit - :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit - `pytest-cov-1.8.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing - :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schlamar/pytest-cov - `pytest-cpp-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-cpp - `pytest-dbfixtures-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Databases fixtures plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures - `pytest-dbus-notification-1.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png D-BUS notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification - `pytest-diffeo-0.1.8.dev1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Common py.test support for Diffeo packages - :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/diffeo/pytest-diffeo - `pytest-django-2.6.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.2.dev1 `http://pytest-django.readthedocs.org/ `_ A Django plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.2.dev1 - `pytest-django-haystack-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Cleanup your Haystack indexes between tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/rouge8/pytest-django-haystack - `pytest-django-lite-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dcramer/pytest-django-lite - `pytest-echo-1.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 `http://pypi.python.org/pypi/pytest-echo/ `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes - :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 - `pytest-eradicate-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check for commented out code - :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/spil-johan/pytest-eradicate - `pytest-figleaf-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf - `pytest-fixture-tools-1.0.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 ? Plugin for pytest which provides tools for fixtures - :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 - `pytest-flakes-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check source code with pyflakes - :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/fschulze/pytest-flakes - `pytest-greendots-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 ? Green progress dots - :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 - `pytest-growl-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 ? Growl notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 - `pytest-httpbin-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kevin1024/pytest-httpbin - `pytest-httpretty-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/papaeye/pytest-httpretty - `pytest-incremental-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) - :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental - `pytest-instafail-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to show failures instantly - :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jpvanhal/pytest-instafail - `pytest-ipdb-0.1-prerelease `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. - :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mverteuil/pytest-ipdb - `pytest-jira-0.01 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test JIRA integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/jlaska/pytest_jira - `pytest-knows-0.1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace - :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mapix/ptknows - `pytest-konira-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run Konira DSL tests with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/alfredodeza/pytest-konira - `pytest-localserver-0.3.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. - :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ - `pytest-marker-bugzilla-0.06 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla - `pytest-markfiltration-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration - `pytest-marks-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-marks - `pytest-mock-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nicoddemus/pytest-mock/ - `pytest-monkeyplus-1.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities - :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ - `pytest-mozwebqa-1.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-mozwebqa - `pytest-oerp-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to test OpenERP modules - :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-oerp/ - `pytest-ordering-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to run your tests in a specific order - :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ftobia/pytest-ordering - `pytest-osxnotify-0.1.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OS X notifications for py.test results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dbader/pytest-osxnotify - `pytest-paste-config-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 ? Allow setting the path to a paste config file - :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 - `pytest-pep8-1.0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements - :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ - `pytest-pipeline-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines - :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bow/pytest_pipeline - `pytest-poo-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Visualize your crappy tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-poo - `pytest-pycharm-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jlubcke/pytest-pycharm - `pytest-pydev-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ - `pytest-pythonpath-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bigsassy/pytest-pythonpath - `pytest-qt-1.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest support for PyQt and PySide applications - :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-qt - `pytest-quickcheck-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck - :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ - `pytest-rage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to implement PEP712 - :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-rage/ - `pytest-raisesregexp-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Walkman/pytest_raisesregexp - `pytest-random-0.02 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to randomize tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-random - `pytest-rerunfailures-0.05 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures - :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-rerunfailures - `pytest-runfailed-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png implement a --failed option for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed - `pytest-runner-2.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/jaraco/pytest-runner - `pytest-sftpserver-1.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. - :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/ulope/pytest-sftpserver/ - `pytest-spec-0.2.22 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION - :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/pchomik/pytest-spec - `pytest-splinter-1.0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Splinter subplugin for Pytest BDD plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/paylogic/pytest-splinter - `pytest-stepwise-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run a test suite one failing test at a time. - :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nip3o/pytest-stepwise - `pytest-sugar-0.3.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). - :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Frozenball/pytest-sugar - `pytest-timeout-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ - `pytest-twisted-1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A twisted plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schmir/pytest-twisted - `pytest-xdist-1.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes - :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist - `pytest-xprocess-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ - `pytest-yamlwsgi-0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 ? Run tests against wsgi apps defined in yaml - :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 - `pytest-zap-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OWASP ZAP plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-zap +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + Name Py27 Py34 Home Summary +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + `pytest-allure-adaptor `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports + :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/allure-framework/allure-python + `pytest-bdd `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BDD for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd + `pytest-beds `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps + :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kaste/pytest-beds + `pytest-bench `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Benchmark utility that plugs into pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/concordusapps/pytest-bench + `pytest-blockage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Disable network requests during a test run. + :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/rob-b/pytest-blockage + `pytest-browsermob-proxy `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy + `pytest-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nibrahim/pytest_bugzilla + `pytest-cache `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ + `pytest-capturelog `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to capture log messages + :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview + `pytest-codecheckers `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) + :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ + `pytest-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/buzzfeed/pytest_config + `pytest-contextfixture `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Define pytest fixtures as context managers. + :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-contextfixture/ + `pytest-couchdbkit `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit + :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit + `pytest-cov `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing + :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schlamar/pytest-cov + `pytest-cpp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-cpp + `pytest-dbfixtures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Databases fixtures plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures + `pytest-dbus-notification `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png D-BUS notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification + `pytest-describe `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Describe-style plugin for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ropez/pytest-describe + `pytest-diffeo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Common py.test support for Diffeo packages + :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/diffeo/pytest-diffeo + `pytest-django `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.4.dev1 `link `_ A Django plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.4.dev1 + `pytest-django-haystack `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Cleanup your Haystack indexes between tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/rouge8/pytest-django-haystack + `pytest-django-lite `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dcramer/pytest-django-lite + `pytest-echo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 `link `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes + :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 + `pytest-eradicate `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check for commented out code + :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/spil-johan/pytest-eradicate + `pytest-figleaf `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf + `pytest-fixture-tools `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 ? Plugin for pytest which provides tools for fixtures + :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 + `pytest-flakes `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check source code with pyflakes + :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/fschulze/pytest-flakes + `pytest-flask `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A set of py.test fixtures to test Flask applications. + :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/vitalk/pytest-flask + `pytest-greendots `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 ? Green progress dots + :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 + `pytest-growl `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 ? Growl notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 + `pytest-httpbin `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kevin1024/pytest-httpbin + `pytest-httpretty `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/papaeye/pytest-httpretty + `pytest-incremental `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) + :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental + `pytest-instafail `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to show failures instantly + :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jpvanhal/pytest-instafail + `pytest-ipdb `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. + :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mverteuil/pytest-ipdb + `pytest-jira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test JIRA integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/jlaska/pytest_jira + `pytest-knows `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace + :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mapix/ptknows + `pytest-konira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run Konira DSL tests with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/alfredodeza/pytest-konira + `pytest-localserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. + :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ + `pytest-marker-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla + `pytest-markfiltration `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration + `pytest-marks `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-marks + `pytest-mock `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nicoddemus/pytest-mock/ + `pytest-monkeyplus `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities + :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ + `pytest-mozwebqa `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-mozwebqa + `pytest-oerp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to test OpenERP modules + :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-oerp/ + `pytest-ordering `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to run your tests in a specific order + :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ftobia/pytest-ordering + `pytest-osxnotify `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OS X notifications for py.test results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dbader/pytest-osxnotify + `pytest-paste-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 ? Allow setting the path to a paste config file + :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 + `pytest-pep8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements + :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ + `pytest-pipeline `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines + :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bow/pytest_pipeline + `pytest-poo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Visualize your crappy tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-poo + `pytest-pycharm `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jlubcke/pytest-pycharm + `pytest-pydev `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ + `pytest-pythonpath `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bigsassy/pytest-pythonpath + `pytest-qt `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest support for PyQt and PySide applications + :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-qt + `pytest-quickcheck `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck + :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ + `pytest-rage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to implement PEP712 + :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-rage/ + `pytest-raisesregexp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Walkman/pytest_raisesregexp + `pytest-random `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to randomize tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-random + `pytest-regtest `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 `link `_ py.test plugin for regression tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 + `pytest-rerunfailures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures + :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-rerunfailures + `pytest-runfailed `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png implement a --failed option for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed + `pytest-runner `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png Invoke py.test as distutils command with dependency resolution. + :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/jaraco/pytest-runner + `pytest-sftpserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. + :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/ulope/pytest-sftpserver/ + `pytest-spec `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION + :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pchomik/pytest-spec + `pytest-splinter `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Splinter plugin for pytest testing framework + :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pytest-dev/pytest-splinter + `pytest-stepwise `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run a test suite one failing test at a time. + :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nip3o/pytest-stepwise + `pytest-sugar `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). + :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Frozenball/pytest-sugar + `pytest-timeout `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ + `pytest-twisted `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A twisted plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schmir/pytest-twisted + `pytest-xdist `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes + :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist + `pytest-xprocess `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ + `pytest-yamlwsgi `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 ? Run tests against wsgi apps defined in yaml + :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 + `pytest-zap `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OWASP ZAP plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-zap -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= -*(Updated on 2014-08-26)* +*(Updated on 2014-09-27)* diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d doc/en/plugins_index/plugins_index.py --- a/doc/en/plugins_index/plugins_index.py +++ b/doc/en/plugins_index/plugins_index.py @@ -61,7 +61,7 @@ yield name, str(loose_version) -def obtain_plugins_table(plugins, client): +def obtain_plugins_table(plugins, client, verbose): """ Returns information to populate a table of plugins, their versions, authors, etc. @@ -72,6 +72,7 @@ :param plugins: list of (name, version) :param client: ServerProxy + :param verbose: print plugin name and version as they are fetch """ def get_repo_markup(repo): """ @@ -96,7 +97,7 @@ pad_right = ('%-' + str(len(target_markup)) + 's') return pad_right % image_markup, target_markup else: - return ('`%s <%s>`_' % (target, target)), '' + return ('`link <%s>`_' % target), '' def sanitize_summary(summary): """Make sure summaries don't break our table formatting. @@ -105,13 +106,14 @@ rows = [] ColumnData = namedtuple('ColumnData', 'text link') - headers = ['Name', 'Py27', 'Py34', 'Repo', 'Summary'] + headers = ['Name', 'Py27', 'Py34', 'Home', 'Summary'] pytest_version = pytest.__version__ repositories = obtain_override_repositories() - print('*** pytest-{0} ***'.format(pytest_version)) + print('Generating plugins_index page (pytest-{0})'.format(pytest_version)) plugins = list(plugins) for index, (package_name, version) in enumerate(plugins): - print(package_name, version, '...', end='') + if verbose: + print(package_name, version, '...', end='') release_data = client.release_data(package_name, version) @@ -128,7 +130,7 @@ image_url = url.format(**common_params) image_url += '?py={py}&pytest={pytest}' row = ( - ColumnData(package_name + "-" + version, release_data['package_url']), + ColumnData(package_name, release_data['package_url']), ColumnData(image_url.format(py='py27', pytest=pytest_version), None), ColumnData(image_url.format(py='py34', pytest=pytest_version), @@ -159,7 +161,10 @@ assert len(row) == len(headers) rows.append(row) - print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + if verbose: + print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + + print('Done: %d plugins' % len(plugins)) return headers, rows @@ -235,16 +240,17 @@ print('*(Updated on %s)*' % today, file=f) -def generate_plugins_index(client, filename): +def generate_plugins_index(client, filename, verbose): """ Generates an RST file with a table of the latest pytest plugins found in PyPI. :param client: ServerProxy :param filename: output filename + :param verbose: print name and version of each plugin as they are fetch """ plugins = get_latest_versions(iter_plugins(client)) - headers, rows = obtain_plugins_table(plugins, client) + headers, rows = obtain_plugins_table(plugins, client, verbose) generate_plugins_index_from_table(filename, headers, rows) @@ -262,13 +268,15 @@ help='output filename [default: %default]') parser.add_option('-u', '--url', default=url, help='url of PyPI server to obtain data from [default: %default]') + parser.add_option('-v', '--verbose', default=False, action='store_true', + help='verbose output') (options, _) = parser.parse_args(argv[1:]) client = get_proxy(options.url) - generate_plugins_index(client, options.filename) + generate_plugins_index(client, options.filename, options.verbose) print() - print('%s Updated.' % options.filename) + print('%s updated.' % options.filename) return 0 diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" diff -r f29cb4f22db8c478da785c0e9973742a00714073 -r e43b417161423b59aff384b570f4eb6d7f4d6f4d tox.ini --- a/tox.ini +++ b/tox.ini @@ -89,6 +89,7 @@ PyYAML commands= + {envpython} plugins_index/plugins_index.py make clean make html https://bitbucket.org/hpk42/pytest/commits/63ee1c59835a/ Changeset: 63ee1c59835a User: hpk42 Date: 2014-10-07 07:06:47+00:00 Summary: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) Escape % character in the assertion message Affected #: 3 files diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,8 @@ at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. +- fix issue604: Escape % character in the assertion message. + 2.6.3 ----------- diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff -r fb399a582553ac8180e5706ad0e34149da85436e -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Wed Oct 8 23:32:23 2014 From: issues-reply at bitbucket.org (Alex Gaynor) Date: Wed, 08 Oct 2014 21:32:23 -0000 Subject: [Pytest-commit] Issue #612: Syntax error on assertion reinterpretation (hpk42/pytest) Message-ID: <20141008213223.19280.6089@app06.ash-private.bitbucket.org> New issue 612: Syntax error on assertion reinterpretation https://bitbucket.org/hpk42/pytest/issue/612/syntax-error-on-assertion-reinterpretation Alex Gaynor: The function with the `assert` statement is: ``` def _ec_key_set_public_key_affine_coordinates(self, ctx, x, y): """ This is a port of EC_KEY_set_public_key_affine_coordinates that was added in 1.0.1. Sets the public key point in the EC_KEY context to the affine x and y values. """ bn_x = self._int_to_bn(x) bn_y = self._int_to_bn(y) set_func, get_func, group = ( self._ec_key_determine_group_get_set_funcs(ctx) ) point = self._lib.EC_POINT_new(group) assert point != self._ffi.NULL point = self._ffi.gc(point, self._lib.EC_POINT_free) with self._tmp_bn_ctx() as bn_ctx: check_x = self._lib.BN_CTX_get(bn_ctx) check_y = self._lib.BN_CTX_get(bn_ctx) res = set_func(group, point, bn_x, bn_y, bn_ctx) assert res == 1 res = get_func(group, point, check_x, check_y, bn_ctx) assert res == 1 assert ( self._lib.BN_cmp(bn_x, check_x) == 0 and self._lib.BN_cmp(bn_y, check_y) == 0 ) res = self._lib.EC_KEY_set_public_key(ctx, point) assert res == 1 res = self._lib.EC_KEY_check_key(ctx) assert res == 1 return ctx ``` The specific assertion that's failing is the: ``` assert ( self._lib.BN_cmp(bn_x, check_x) == 0 and self._lib.BN_cmp(bn_y, check_y) == 0 ) ``` The source code that `py.test` is trying to compile is: ``` self._lib.BN_cmp(bn_x, check_x) == 0 and self._lib.BN_cmp(bn_y, check_y) == 0 ) ``` which is clearly a syntax error :-) The exact error message from `py.test` is: ``` __ TestPEMSerialization.test_load_pem_ec_private_key[backend1-ec_private_key_encrypted.pem-123456] __ self = key_file = 'ec_private_key_encrypted.pem', password = '123456' backend = @pytest.mark.parametrize( ("key_file", "password"), [ ("ec_private_key.pem", None), ("ec_private_key_encrypted.pem", b"123456"), ] ) @pytest.mark.elliptic def test_load_pem_ec_private_key(self, key_file, password, backend): _skip_curve_unsupported(backend, ec.SECP256R1()) key = load_vectors_from_file( os.path.join( "asymmetric", "PEM_Serialization", key_file), > lambda pemfile: load_pem_private_key( pemfile.read().encode(), password, backend ) ) tests/hazmat/primitives/test_serialization.py:76: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/utils.py:102: in load_vectors_from_file return loader(vector_file) tests/hazmat/primitives/test_serialization.py:77: in pemfile.read().encode(), password, backend cryptography/hazmat/primitives/serialization.py:59: in load_pem_private_key return parser_type(backend).load_object(pem) cryptography/hazmat/primitives/serialization.py:133: in load_object ).private_key(self._backend) cryptography/hazmat/primitives/asymmetric/ec.py:279: in private_key return backend.load_elliptic_curve_private_numbers(self) cryptography/hazmat/backends/openssl/backend.py:881: in load_elliptic_curve_private_numbers ec_cdata, public.x, public.y) ../../.virtualenvs/cryptography-dev/lib/python2.7/site-packages/_pytest/assertion/reinterpret.py:40: in __init__ self.msg = reinterpret(source, f, should_fail=True) ../../.virtualenvs/cryptography-dev/lib/python2.7/site-packages/_pytest/assertion/newinterpret.py:46: in interpret mod = ast.parse(source) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = 'self._lib.BN_cmp(bn_x, check_x) == 0 and\nself._lib.BN_cmp(bn_y, check_y) == 0\n )' filename = '', mode = 'exec' def parse(source, filename='', mode='exec'): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). """ > return compile(source, filename, mode, PyCF_ONLY_AST) E File "", line 1 E self._lib.BN_cmp(bn_x, check_x) == 0 and E ^ E SyntaxError: invalid syntax /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py:37: SyntaxError ``` I haven't been able to further minimize the failure yet. From issues-reply at bitbucket.org Wed Oct 8 23:58:05 2014 From: issues-reply at bitbucket.org (Tobias Wellnitz) Date: Wed, 08 Oct 2014 21:58:05 -0000 Subject: [Pytest-commit] Issue #613: Pytest can't find locally installed projects (hpk42/pytest) Message-ID: <20141008215805.8000.84739@app04.ash-private.bitbucket.org> New issue 613: Pytest can't find locally installed projects https://bitbucket.org/hpk42/pytest/issue/613/pytest-cant-find-locally-installed Tobias Wellnitz: Hi, when running py.test (OSX 10.9 with virtualenv), py.test can't find third party projects which are installed from a local source (e.g.: pip install -e pyhamtools). However in the python console I can import modules from the project without any problems (within the same virtualenv). **project/test/test_mytest.py:** ``` #!python import pytest import pyhamtools #pytest doesn't find this project from myproject import myfunction class TestDecodeMyData: def test_decoding_data_correctly(self): assert (myfunction("me")) == pyhamtools.get_user("me") ``` **Executing pytest returns:** ``` #!bash ================================================================ test session starts ================================================================ platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 collected 0 items / 1 errors ============================= test session starts ============================= platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 collected 0 items / 1 errors =================================== ERRORS ==================================== ____________ ERROR collecting test/test_decoding_skimmer_spots.py _____________ test/test_decoding_data_correctly.py:2: in > import pyhamtools E ImportError: No module named pyhamtools =========================== 1 error in 0.06 seconds =========================== ``` **Dump of "pip list":** ``` #!bash beautifulsoup4 (4.3.2) pip (1.4.1) py (1.4.25) pyephem (3.7.5.3) pyhamtools (0.5.0, /Users/tobias/projects/pyhamtools) pytest (2.6.3) pytz (2014.7) requests (2.4.1) setuptools (0.9.8) wsgiref (0.1.2) ``` From builds at drone.io Thu Oct 9 15:51:04 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 09 Oct 2014 13:51:04 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 348 Message-ID: <20141009135048.22022.65800@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/348 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3837:0f4f922372c8 Author : holger krekel Branch : default Message: add changelog entry for new hookwrapper mechanism -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Thu Oct 9 17:05:52 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 09 Oct 2014 15:05:52 -0000 Subject: [Pytest-commit] commit/pytest: 5 new changesets Message-ID: <20141009150552.15345.48686@app05.ash-private.bitbucket.org> 5 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/23ce9d676118/ Changeset: 23ce9d676118 User: Holger Peters Date: 2014-10-08 12:31:17+00:00 Summary: Add configuration option for doctest flags Affected #: 2 files diff -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 -r 23ce9d6761185623434a1a58809203e324ff0280 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -6,6 +6,8 @@ from py._code.code import TerminalRepr, ReprFileLocation def pytest_addoption(parser): + parser.addini('doctest_optionflags', 'option flags for doctests', + type="args", default=["ELLIPSIS"]) group = parser.getgroup("collect") group.addoption("--doctest-modules", action="store_true", default=False, @@ -87,6 +89,27 @@ def reportinfo(self): return self.fspath, None, "[doctest] %s" % self.name +def _get_flag_lookup(): + import doctest + return dict(DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) + +def get_optionflags(parent): + import doctest + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + if not optionflags_str: + return doctest.ELLIPSIS + + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + class DoctestTextfile(DoctestItem, pytest.File): def runtest(self): import doctest @@ -101,7 +124,7 @@ fixture_request._fillfixtures() failed, tot = doctest.testfile( str(self.fspath), module_relative=False, - optionflags=doctest.ELLIPSIS, + optionflags=get_optionflags(self), extraglobs=dict(getfixture=fixture_request.getfuncargvalue), raise_on_error=True, verbose=0) @@ -119,7 +142,8 @@ doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) # uses internal doctest module parsing mechanism finder = doctest.DocTestFinder() - runner = doctest.DebugRunner(verbose=0, optionflags=doctest.ELLIPSIS) + optionflags= get_optionflags(self) + runner = doctest.DebugRunner(verbose=0, optionflags=optionflags) for test in finder.find(module, module.__name__, extraglobs=doctest_globals): if test.examples: # skip empty doctests diff -r 63ee1c59835ab6b44c868a410d3d40f9bcebb843 -r 23ce9d6761185623434a1a58809203e324ff0280 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -289,3 +289,37 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=1) + + def test_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(failed=1, passed=0) https://bitbucket.org/hpk42/pytest/commits/f13f826c865f/ Changeset: f13f826c865f User: Holger Peters Date: 2014-10-08 13:48:41+00:00 Summary: Add documentation for doctest flags and remove dead code Affected #: 4 files diff -r 23ce9d6761185623434a1a58809203e324ff0280 -r f13f826c865f5fdea9a8bf632e97a88e86991f69 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ Unreleased ---------- +- add a doctest option for doctest flags + - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. diff -r 23ce9d6761185623434a1a58809203e324ff0280 -r f13f826c865f5fdea9a8bf632e97a88e86991f69 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -102,9 +102,6 @@ import doctest optionflags_str = parent.config.getini("doctest_optionflags") flag_lookup_table = _get_flag_lookup() - if not optionflags_str: - return doctest.ELLIPSIS - flag_acc = 0 for flag in optionflags_str: flag_acc |= flag_lookup_table[flag] diff -r 23ce9d6761185623434a1a58809203e324ff0280 -r f13f826c865f5fdea9a8bf632e97a88e86991f69 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -126,3 +126,8 @@ derived class. See :ref:`change naming conventions` for examples. + +.. confval:: doctest_optionflags + + One or more doctest flag names from the standard ``doctest`` module. + `See how py.test handles doctests `_. diff -r 23ce9d6761185623434a1a58809203e324ff0280 -r f13f826c865f5fdea9a8bf632e97a88e86991f69 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -60,3 +60,12 @@ Also, :ref:`usefixtures` and :ref:`autouse` fixtures are supported when executing text doctest files. + +The standard ``doctest`` module provides some setting flags to configure the +strictness of doctest tests. In py.test You can enable those flags those flags +using the configuration file. To make pytest ignore trailing whitespaces and +ignore lengthy exception stack traces you can just write:: + + # content of pytest.ini + [pytest] + doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL https://bitbucket.org/hpk42/pytest/commits/42fa30934045/ Changeset: 42fa30934045 User: Holger Peters Date: 2014-10-08 13:54:08+00:00 Summary: Add a doctest for module docstrings Affected #: 1 file diff -r f13f826c865f5fdea9a8bf632e97a88e86991f69 -r 42fa30934045df1ef34d4b99fa42369a97fb97f4 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -323,3 +323,29 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=0) + + def test_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(failed=1, passed=0) https://bitbucket.org/hpk42/pytest/commits/6528e73b1e67/ Changeset: 6528e73b1e67 User: Holger Peters Date: 2014-10-09 14:59:42+00:00 Summary: link fix: Use restructured text :doc: link instead of html link Affected #: 1 file diff -r 42fa30934045df1ef34d4b99fa42369a97fb97f4 -r 6528e73b1e67a23ee6d74a9ea66c7eb95035c093 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -130,4 +130,4 @@ .. confval:: doctest_optionflags One or more doctest flag names from the standard ``doctest`` module. - `See how py.test handles doctests `_. + :doc:`See how py.test handles doctests `. https://bitbucket.org/hpk42/pytest/commits/6c340d023e4b/ Changeset: 6c340d023e4b User: hpk42 Date: 2014-10-09 15:05:48+00:00 Summary: Merged in HolgerPeters/pytest (pull request #221) Make doctest flags configurable Affected #: 5 files diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,8 @@ 2.6.4.dev ---------- +- add a doctest option for doctest flags + - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -6,6 +6,8 @@ from py._code.code import TerminalRepr, ReprFileLocation def pytest_addoption(parser): + parser.addini('doctest_optionflags', 'option flags for doctests', + type="args", default=["ELLIPSIS"]) group = parser.getgroup("collect") group.addoption("--doctest-modules", action="store_true", default=False, @@ -87,6 +89,24 @@ def reportinfo(self): return self.fspath, None, "[doctest] %s" % self.name +def _get_flag_lookup(): + import doctest + return dict(DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) + +def get_optionflags(parent): + import doctest + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + class DoctestTextfile(DoctestItem, pytest.File): def runtest(self): import doctest @@ -101,7 +121,7 @@ fixture_request._fillfixtures() failed, tot = doctest.testfile( str(self.fspath), module_relative=False, - optionflags=doctest.ELLIPSIS, + optionflags=get_optionflags(self), extraglobs=dict(getfixture=fixture_request.getfuncargvalue), raise_on_error=True, verbose=0) @@ -119,7 +139,8 @@ doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) # uses internal doctest module parsing mechanism finder = doctest.DocTestFinder() - runner = doctest.DebugRunner(verbose=0, optionflags=doctest.ELLIPSIS) + optionflags= get_optionflags(self) + runner = doctest.DebugRunner(verbose=0, optionflags=optionflags) for test in finder.find(module, module.__name__, extraglobs=doctest_globals): if test.examples: # skip empty doctests diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -126,3 +126,8 @@ derived class. See :ref:`change naming conventions` for examples. + +.. confval:: doctest_optionflags + + One or more doctest flag names from the standard ``doctest`` module. + :doc:`See how py.test handles doctests `. diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -60,3 +60,12 @@ Also, :ref:`usefixtures` and :ref:`autouse` fixtures are supported when executing text doctest files. + +The standard ``doctest`` module provides some setting flags to configure the +strictness of doctest tests. In py.test You can enable those flags those flags +using the configuration file. To make pytest ignore trailing whitespaces and +ignore lengthy exception stack traces you can just write:: + + # content of pytest.ini + [pytest] + doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -289,3 +289,63 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=1) + + def test_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(failed=1, passed=0) + + def test_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(failed=1, passed=0) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Thu Oct 9 17:05:53 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 09 Oct 2014 15:05:53 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in HolgerPeters/pytest (pull request #221) Message-ID: <20141009150553.27890.38474@app06.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/6c340d023e4b/ Changeset: 6c340d023e4b User: hpk42 Date: 2014-10-09 15:05:48+00:00 Summary: Merged in HolgerPeters/pytest (pull request #221) Make doctest flags configurable Affected #: 5 files diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,8 @@ 2.6.4.dev ---------- +- add a doctest option for doctest flags + - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -6,6 +6,8 @@ from py._code.code import TerminalRepr, ReprFileLocation def pytest_addoption(parser): + parser.addini('doctest_optionflags', 'option flags for doctests', + type="args", default=["ELLIPSIS"]) group = parser.getgroup("collect") group.addoption("--doctest-modules", action="store_true", default=False, @@ -87,6 +89,24 @@ def reportinfo(self): return self.fspath, None, "[doctest] %s" % self.name +def _get_flag_lookup(): + import doctest + return dict(DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) + +def get_optionflags(parent): + import doctest + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + class DoctestTextfile(DoctestItem, pytest.File): def runtest(self): import doctest @@ -101,7 +121,7 @@ fixture_request._fillfixtures() failed, tot = doctest.testfile( str(self.fspath), module_relative=False, - optionflags=doctest.ELLIPSIS, + optionflags=get_optionflags(self), extraglobs=dict(getfixture=fixture_request.getfuncargvalue), raise_on_error=True, verbose=0) @@ -119,7 +139,8 @@ doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) # uses internal doctest module parsing mechanism finder = doctest.DocTestFinder() - runner = doctest.DebugRunner(verbose=0, optionflags=doctest.ELLIPSIS) + optionflags= get_optionflags(self) + runner = doctest.DebugRunner(verbose=0, optionflags=optionflags) for test in finder.find(module, module.__name__, extraglobs=doctest_globals): if test.examples: # skip empty doctests diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -126,3 +126,8 @@ derived class. See :ref:`change naming conventions` for examples. + +.. confval:: doctest_optionflags + + One or more doctest flag names from the standard ``doctest`` module. + :doc:`See how py.test handles doctests `. diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -60,3 +60,12 @@ Also, :ref:`usefixtures` and :ref:`autouse` fixtures are supported when executing text doctest files. + +The standard ``doctest`` module provides some setting flags to configure the +strictness of doctest tests. In py.test You can enable those flags those flags +using the configuration file. To make pytest ignore trailing whitespaces and +ignore lengthy exception stack traces you can just write:: + + # content of pytest.ini + [pytest] + doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL diff -r 0f4f922372c86919ea2266bbc0cdb151b645b13d -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -289,3 +289,63 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=1) + + def test_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(failed=1, passed=0) + + def test_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(failed=1, passed=0) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Thu Oct 9 17:07:37 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 09 Oct 2014 15:07:37 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: fix changelog Message-ID: <20141009150737.14437.97121@app08.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/367041e2b6d1/ Changeset: 367041e2b6d1 User: hpk42 Date: 2014-10-09 15:06:39+00:00 Summary: fix changelog Affected #: 1 file diff -r 6c340d023e4b010e71acc2e94c0120dfb5161b24 -r 367041e2b6d147459108c74dc2614fecdc3abafe CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -10,12 +10,11 @@ - use hookwrapper mechanism in builtin pytest plugins. +- add a doctest option for doctest flags, thanks Holger Peters. 2.6.4.dev ---------- -- add a doctest option for doctest flags - - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Thu Oct 9 17:13:39 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 09 Oct 2014 15:13:39 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 349 Message-ID: <20141009151320.99292.67528@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/349 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3842:6c340d023e4b Author : holger krekel Branch : default Message: Merged in HolgerPeters/pytest (pull request #221) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Thu Oct 9 17:23:16 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 09 Oct 2014 15:23:16 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 350 Message-ID: <20141009152302.42878.54419@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/350 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3843:367041e2b6d1 Author : holger krekel Branch : default Message: fix changelog -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Thu Oct 9 22:46:44 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 09 Oct 2014 20:46:44 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: remove unused import Message-ID: <20141009204644.21917.28958@app14.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/b738b91f2dd1/ Changeset: b738b91f2dd1 User: hpk42 Date: 2014-10-09 20:45:33+00:00 Summary: remove unused import Affected #: 2 files diff -r 367041e2b6d147459108c74dc2614fecdc3abafe -r b738b91f2dd19157015e2a7bcf8af404126c0998 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -10,7 +10,7 @@ - use hookwrapper mechanism in builtin pytest plugins. -- add a doctest option for doctest flags, thanks Holger Peters. +- add a doctest ini option for doctest flags, thanks Holger Peters. 2.6.4.dev ---------- diff -r 367041e2b6d147459108c74dc2614fecdc3abafe -r b738b91f2dd19157015e2a7bcf8af404126c0998 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -99,7 +99,6 @@ COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) def get_optionflags(parent): - import doctest optionflags_str = parent.config.getini("doctest_optionflags") flag_lookup_table = _get_flag_lookup() flag_acc = 0 Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Thu Oct 9 22:56:19 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 09 Oct 2014 20:56:19 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 351 Message-ID: <20141009205606.50636.31207@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/351 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3844:b738b91f2dd1 Author : holger krekel Branch : default Message: remove unused import -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Fri Oct 10 07:53:39 2014 From: issues-reply at bitbucket.org (Andy Hayden) Date: Fri, 10 Oct 2014 05:53:39 -0000 Subject: [Pytest-commit] Issue #196: posargs should be able to do substitutions (hpk42/tox) Message-ID: <20141010055339.26240.20509@app03.ash-private.bitbucket.org> New issue 196: posargs should be able to do substitutions https://bitbucket.org/hpk42/tox/issue/196/posargs-should-be-able-to-do-substitutions Andy Hayden: Similar to #150. The [http://tox.readthedocs.org/en/latest/config.html#substitutions-for-positional-arguments-in-commands](spec) suggests that the following should work but it results in a ConfigError: echo {posargs:{env:USER:} passed no posargs} From issues-reply at bitbucket.org Fri Oct 10 18:18:26 2014 From: issues-reply at bitbucket.org (Bruno Oliveira) Date: Fri, 10 Oct 2014 16:18:26 -0000 Subject: [Pytest-commit] Issue #614: --pastebin option is broken: bpaste.net/xmlrpc has been moved (hpk42/pytest) Message-ID: <20141010161826.25829.10799@app05.ash-private.bitbucket.org> New issue 614: --pastebin option is broken: bpaste.net/xmlrpc has been moved https://bitbucket.org/hpk42/pytest/issue/614/pastebin-option-is-broken-bpastenet-xmlrpc Bruno Oliveira: Hi, I'm getting this error when I use the `--pastebin` option: ```python Traceback (most recent call last): File "D:/Shared/dist/12.0-all/pytest-2.6.1/Scripts/py.test-script.py", line 9, in load_entry_point('pytest==2.6.1', 'console_scripts', 'py.test')() File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\config.py", line 41, in main return config.hook.pytest_cmdline_main(config=config) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 413, in __call__ return self._docall(methods, kwargs) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 424, in _docall res = mc.execute() File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 315, in execute res = method(**kwargs) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\main.py", line 116, in pytest_cmdline_main return wrap_session(config, _main) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\main.py", line 111, in wrap_session config.do_unconfigure() File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\config.py", line 623, in do_unconfigure self.hook.pytest_unconfigure(config=self) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 413, in __call__ return self._docall(methods, kwargs) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 424, in _docall res = mc.execute() File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\core.py", line 315, in execute res = method(**kwargs) File "D:\Shared\dist\12.0-all\pytest-2.6.1\lib\site-packages\_pytest\pastebin.py", line 34, in pytest_unconfigure proxyid = getproxy().newPaste("python", sessionlog) File "D:\Shared\dist\12.0-win64\python-2.7.X\lib\xmlrpclib.py", line 1224, in __call__ return self.__send(self.__name, args) File "D:\Shared\dist\12.0-win64\python-2.7.X\lib\xmlrpclib.py", line 1578, in __request verbose=self.__verbose File "D:\Shared\dist\12.0-win64\python-2.7.X\lib\xmlrpclib.py", line 1264, in request return self.single_request(host, handler, request_body, verbose) File "D:\Shared\dist\12.0-win64\python-2.7.X\lib\xmlrpclib.py", line 1312, in single_request response.msg, xmlrpclib.ProtocolError: ``` A quick Google search didn't turn up anything about bpaste.net dropping XMLRPC. I couldn't find anything related to an API either. 1. Does anyone have more information about bpaste.net and its API support? 2. Should we update the built-in plugin to use another paste service, perhaps www.pastebin.com? 3. There's also #142, about moving this support to an external plugin instead. From commits-noreply at bitbucket.org Fri Oct 10 22:43:36 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 10 Oct 2014 20:43:36 -0000 Subject: [Pytest-commit] commit/pytest: nicoddemus: Adding "auto" to help for "--tb" option Message-ID: <20141010204336.22628.92260@app13.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/b661b5912520/ Changeset: b661b5912520 User: nicoddemus Date: 2014-10-10 20:43:33+00:00 Summary: Adding "auto" to help for "--tb" option Affected #: 1 file diff -r b738b91f2dd19157015e2a7bcf8af404126c0998 -r b661b59125202291e8d01272eafd71dc7ea2d8ab _pytest/terminal.py --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -27,7 +27,7 @@ group._addoption('--tb', metavar="style", action="store", dest="tbstyle", default='auto', choices=['auto', 'long', 'short', 'no', 'line', 'native'], - help="traceback print mode (long/short/line/native/no).") + help="traceback print mode (auto/long/short/line/native/no).") group._addoption('--fulltrace', '--full-trace', action="store_true", default=False, help="don't cut any tracebacks (default is to cut).") Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Fri Oct 10 22:50:51 2014 From: builds at drone.io (Drone.io Build) Date: Fri, 10 Oct 2014 20:50:51 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 352 Message-ID: <20141010205040.39534.43874@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/352 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3845:b661b5912520 Author : Bruno Oliveira Branch : default Message: Adding "auto" to help for "--tb" option -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Sun Oct 12 17:21:35 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sun, 12 Oct 2014 15:21:35 -0000 Subject: [Pytest-commit] commit/tox: 4 new changesets Message-ID: <20141012152135.26580.76168@app14.ash-private.bitbucket.org> 4 new commits in tox: https://bitbucket.org/hpk42/tox/commits/f0f92bd50f69/ Changeset: f0f92bd50f69 Branch: alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 User: alex_gaynor Date: 2014-09-26 15:36:48+00:00 Summary: Allow "." in factor names for multi-dimensional tests. Affected #: 1 file diff -r 69a69d68fc4679616daed127e8f5fd66085805c6 -r f0f92bd50f6933d9b1628a0495f90463f5b96a8f tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -305,7 +305,7 @@ factors = set() if section in self._cfg: for _, value in self._cfg[section].items(): - exprs = re.findall(r'^([\w{},-]+)\:\s+', value, re.M) + exprs = re.findall(r'^([\w{}\.,-]+)\:\s+', value, re.M) factors.update(*mapcat(_split_factor_expr, exprs)) return factors https://bitbucket.org/hpk42/tox/commits/3390ebf86a52/ Changeset: 3390ebf86a52 Branch: alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 User: alex_gaynor Date: 2014-09-26 19:32:11+00:00 Summary: Added a test for period in factor Affected #: 1 file diff -r f0f92bd50f6933d9b1628a0495f90463f5b96a8f -r 3390ebf86a52c1ee7fc7641ebed36a93c568b170 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -909,6 +909,14 @@ configs = newconfig([], inisource).envconfigs assert configs["py27"].setenv["X"] == "1" assert "X" not in configs["py26"].setenv + + def test_period_in_factor(self, newconfig): + inisource=""" + [tox] + envlist = py27-{django1.6,django1.7} + """ + configs = newconfig([], inisource).envconfigs + assert list(configs) == ["py27-django1.6", "py27-django-1.7"] class TestGlobalOptions: https://bitbucket.org/hpk42/tox/commits/bd3b538ae259/ Changeset: bd3b538ae259 Branch: alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 User: suor Date: 2014-10-12 15:10:19+00:00 Summary: Recognize period in envnames in factor conditions Affected #: 2 files diff -r 3390ebf86a52c1ee7fc7641ebed36a93c568b170 -r bd3b538ae259bfe60b0a7df0979ee9df2435db6c tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -909,14 +909,21 @@ configs = newconfig([], inisource).envconfigs assert configs["py27"].setenv["X"] == "1" assert "X" not in configs["py26"].setenv - + def test_period_in_factor(self, newconfig): inisource=""" - [tox] - envlist = py27-{django1.6,django1.7} + [tox] + envlist = py27-{django1.6,django1.7} + + [testenv] + deps = + django1.6: Django==1.6 + django1.7: Django==1.7 """ configs = newconfig([], inisource).envconfigs - assert list(configs) == ["py27-django1.6", "py27-django-1.7"] + assert sorted(configs) == ["py27-django1.6", "py27-django1.7"] + assert [d.name for d in configs["py27-django1.6"].deps] \ + == ["Django==1.6"] class TestGlobalOptions: diff -r 3390ebf86a52c1ee7fc7641ebed36a93c568b170 -r bd3b538ae259bfe60b0a7df0979ee9df2435db6c tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -642,7 +642,7 @@ def _apply_factors(self, s): def factor_line(line): - m = re.search(r'^([\w{},-]+)\:\s+(.+)', line) + m = re.search(r'^([\w{}\.,-]+)\:\s+(.+)', line) if not m: return line https://bitbucket.org/hpk42/tox/commits/b50e77c3d2ca/ Changeset: b50e77c3d2ca User: hpk42 Date: 2014-10-12 15:21:32+00:00 Summary: Merged in suor/tox/alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 (pull request #124) Finished "." in factor names pull-request Affected #: 2 files diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r b50e77c3d2ca888b609f540176422d79804fd9ae tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -910,6 +910,21 @@ assert configs["py27"].setenv["X"] == "1" assert "X" not in configs["py26"].setenv + def test_period_in_factor(self, newconfig): + inisource=""" + [tox] + envlist = py27-{django1.6,django1.7} + + [testenv] + deps = + django1.6: Django==1.6 + django1.7: Django==1.7 + """ + configs = newconfig([], inisource).envconfigs + assert sorted(configs) == ["py27-django1.6", "py27-django1.7"] + assert [d.name for d in configs["py27-django1.6"].deps] \ + == ["Django==1.6"] + class TestGlobalOptions: def test_notest(self, newconfig): diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r b50e77c3d2ca888b609f540176422d79804fd9ae tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -305,7 +305,7 @@ factors = set() if section in self._cfg: for _, value in self._cfg[section].items(): - exprs = re.findall(r'^([\w{},-]+)\:\s+', value, re.M) + exprs = re.findall(r'^([\w{}\.,-]+)\:\s+', value, re.M) factors.update(*mapcat(_split_factor_expr, exprs)) return factors @@ -642,7 +642,7 @@ def _apply_factors(self, s): def factor_line(line): - m = re.search(r'^([\w{},-]+)\:\s+(.+)', line) + m = re.search(r'^([\w{}\.,-]+)\:\s+(.+)', line) if not m: return line Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Sun Oct 12 17:21:35 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sun, 12 Oct 2014 15:21:35 -0000 Subject: [Pytest-commit] commit/tox: hpk42: Merged in suor/tox/alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 (pull request #124) Message-ID: <20141012152135.11713.16113@app11.ash-private.bitbucket.org> 1 new commit in tox: https://bitbucket.org/hpk42/tox/commits/b50e77c3d2ca/ Changeset: b50e77c3d2ca User: hpk42 Date: 2014-10-12 15:21:32+00:00 Summary: Merged in suor/tox/alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 (pull request #124) Finished "." in factor names pull-request Affected #: 2 files diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r b50e77c3d2ca888b609f540176422d79804fd9ae tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -910,6 +910,21 @@ assert configs["py27"].setenv["X"] == "1" assert "X" not in configs["py26"].setenv + def test_period_in_factor(self, newconfig): + inisource=""" + [tox] + envlist = py27-{django1.6,django1.7} + + [testenv] + deps = + django1.6: Django==1.6 + django1.7: Django==1.7 + """ + configs = newconfig([], inisource).envconfigs + assert sorted(configs) == ["py27-django1.6", "py27-django1.7"] + assert [d.name for d in configs["py27-django1.6"].deps] \ + == ["Django==1.6"] + class TestGlobalOptions: def test_notest(self, newconfig): diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r b50e77c3d2ca888b609f540176422d79804fd9ae tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -305,7 +305,7 @@ factors = set() if section in self._cfg: for _, value in self._cfg[section].items(): - exprs = re.findall(r'^([\w{},-]+)\:\s+', value, re.M) + exprs = re.findall(r'^([\w{}\.,-]+)\:\s+', value, re.M) factors.update(*mapcat(_split_factor_expr, exprs)) return factors @@ -642,7 +642,7 @@ def _apply_factors(self, s): def factor_line(line): - m = re.search(r'^([\w{},-]+)\:\s+(.+)', line) + m = re.search(r'^([\w{}\.,-]+)\:\s+(.+)', line) if not m: return line Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Sun Oct 12 23:17:42 2014 From: issues-reply at bitbucket.org (Tom V) Date: Sun, 12 Oct 2014 21:17:42 -0000 Subject: [Pytest-commit] Issue #615: ValueError on compound assert with percent (hpk42/pytest) Message-ID: <20141012211742.30495.25987@app10.ash-private.bitbucket.org> New issue 615: ValueError on compound assert with percent https://bitbucket.org/hpk42/pytest/issue/615/valueerror-on-compound-assert-with-percent Tom V: Assertions like `assert 1 % 1 or False` or ``assert True and 1 % 1`` fail with: `ValueError: unsupported format character ')' (0x29) at index 7`. This behaviour is not seen with `py.test --assert=reinterp` or `--assert=plain`. Example: def test_high_odd(): n = 20 high = n > 10 assert high and (n % 2 > 0) def test_simple_percent_error(): assert 1 % 1 and False # no ValueError def test_var_high_odd(): n = 20 high = n > 10 odd = n % 2 > 0 assert high and odd $ py.test percent_error.py === test session starts === platform linux2 -- Python 2.7.6 -- py-1.4.25 -- pytest-2.6.4.dev1 collected 3 items percent_error.py FFF === FAILURES === ___ test_high_odd ___ def test_high_odd(): n = 20 high = n > 10 > assert high and (n % 2 > 0) E ValueError: unsupported format character ')' (0x29) at index 17 percent_error.py:5: ValueError ___ test_simple_percent_error ___ def test_simple_percent_error(): > assert 1 % 1 and False E ValueError: unsupported format character ')' (0x29) at index 7 percent_error.py:8: ValueError ___ test_var_high_odd ___ def test_var_high_odd(): n = 20 high = n > 10 odd = n % 2 > 0 > assert high and odd E assert (True and False) percent_error.py:15: AssertionError === 3 failed in 0.01 seconds === Happy to have a go at writing a failing test in `TestAssertionRewrite`. From commits-noreply at bitbucket.org Tue Oct 14 09:59:55 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 07:59:55 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in tomviner/pytest/some_spelling_fixes (pull request #224) Message-ID: <20141014075955.29560.68129@app11.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/cb1ab2ce0f47/ Changeset: cb1ab2ce0f47 User: hpk42 Date: 2014-10-14 07:59:49+00:00 Summary: Merged in tomviner/pytest/some_spelling_fixes (pull request #224) A few spelling fixes Affected #: 8 files diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -428,7 +428,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. @@ -495,7 +495,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f ISSUES.txt --- a/ISSUES.txt +++ b/ISSUES.txt @@ -49,7 +49,7 @@ the marker-mechanism with respect to a test module but puts it to a directory scale. -When doing larger scoped parametrization it probably becomes neccessary +When doing larger scoped parametrization it probably becomes necessary to allow parametrization to be ignored if the according parameter is not used (currently any parametrized argument that is not present in a function will cause a ValueError). Example: @@ -77,7 +77,7 @@ different values for self.db. This could also work with unittest/nose style tests, i.e. it leverages existing test suites without needing to rewrite them. Together with the previously mentioned setup_test() -maybe the setupfunc could be ommitted? +maybe the setupfunc could be omitted? optimizations --------------------------------------------------------------- @@ -229,7 +229,7 @@ pytest.ensuretemp and pytest.config are probably the last objects containing global state. Often using them is not -neccessary. This is about trying to get rid of them, i.e. +necessary. This is about trying to get rid of them, i.e. deprecating them and checking with PyPy's usages as well as others. @@ -298,7 +298,7 @@ The idea is that you can e.g. import modules in a test and afterwards sys.modules, sys.meta_path etc would be reverted. It can go further -then just importing however, e.g. current working direcroty, file +then just importing however, e.g. current working directory, file descriptors, ... This would probably be done by marking:: @@ -357,7 +357,7 @@ id, call = prepare_check(check) # bubble should only prevent exception propagation after a failure # the whole test should still fail - # there might be need for a loer level api and taking custom markers into account + # there might be need for a lower level api and taking custom markers into account with pytest.section(id, bubble=False): call() diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -455,7 +455,7 @@ for an overview of how this works. The entry point here is .run() which will iterate over all the - statenemts in an ast.Module and for each ast.Assert statement it + statements in an ast.Module and for each ast.Assert statement it finds call .visit() with it. Then .visit_Assert() takes over and is responsible for creating new ast statements to replace the original assert statement: it re-writes the test of an assertion diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/announce/release-2.4.0.txt --- a/doc/en/announce/release-2.4.0.txt +++ b/doc/en/announce/release-2.4.0.txt @@ -34,7 +34,7 @@ influence the environment before conftest files import ``django``. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. + failures/errors occurred or everything passed. The documentation has been updated to accomodate the changes, see `http://pytest.org `_ @@ -95,7 +95,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/announce/release-2.4.2.txt --- a/doc/en/announce/release-2.4.2.txt +++ b/doc/en/announce/release-2.4.2.txt @@ -21,7 +21,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/index.txt --- a/doc/en/index.txt +++ b/doc/en/index.txt @@ -31,7 +31,7 @@ **scales from simple unit to complex functional testing** - :ref:`modular parametrizeable fixtures ` (new in 2.3, - continously improved) + continuously improved) - :ref:`parametrized test functions ` - :ref:`mark` - :ref:`skipping` (improved in 2.4) diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/monkeypatch.txt --- a/doc/en/monkeypatch.txt +++ b/doc/en/monkeypatch.txt @@ -57,7 +57,7 @@ example: setting an attribute on some class ------------------------------------------------------ -If you need to patch out ``os.getcwd()`` to return an artifical +If you need to patch out ``os.getcwd()`` to return an artificial value:: def test_some_interaction(monkeypatch): diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/projects.txt --- a/doc/en/projects.txt +++ b/doc/en/projects.txt @@ -78,6 +78,6 @@ * `Stups department of Heinrich Heine University Duesseldorf `_ * `cellzome `_ * `Open End, Gothenborg `_ -* `Laboraratory of Bioinformatics, Warsaw `_ +* `Laboratory of Bioinformatics, Warsaw `_ * `merlinux, Germany `_ * many more ... (please be so kind to send a note via :ref:`contact`) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 14 10:02:25 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 08:02:25 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in tomviner/pytest (pull request #222) Message-ID: <20141014080225.29560.26895@app11.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/f1fcd44e587b/ Changeset: f1fcd44e587b User: hpk42 Date: 2014-10-14 08:02:21+00:00 Summary: Merged in tomviner/pytest (pull request #222) fix issue552: Add a note to the docs about marking single callables Affected #: 1 file diff -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f -r f1fcd44e587bd193cdc96ae6c08ba509edff581a doc/en/example/markers.txt --- a/doc/en/example/markers.txt +++ b/doc/en/example/markers.txt @@ -280,6 +280,14 @@ tests, whereas the "bar" mark is only applied to the second test. Skip and xfail marks can also be applied in this way, see :ref:`skip/xfail with parametrize`. +.. note:: + + If the data you are parametrizing happen to be single callables, you need to be careful + when marking these items. `pytest.mark.xfail(my_func)` won't work because it's also the + signature of a function being decorated. To resolve this ambiguity, you need to pass a + reason argument: + `pytest.mark.xfail(func_bar, reason="Issue#7")`. + .. _`adding a custom marker from a plugin`: Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 14 10:02:25 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 08:02:25 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141014080225.8255.83036@app12.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/f30eb2fa4343/ Changeset: f30eb2fa4343 User: tomviner Date: 2014-10-12 18:07:03+00:00 Summary: fix issue552: note about marking single callables Affected #: 1 file diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r f30eb2fa4343599397ecd05c90b781a4b570474e doc/en/example/markers.txt --- a/doc/en/example/markers.txt +++ b/doc/en/example/markers.txt @@ -280,6 +280,14 @@ tests, whereas the "bar" mark is only applied to the second test. Skip and xfail marks can also be applied in this way, see :ref:`skip/xfail with parametrize`. +.. note:: + + If the data you are parametrizing happen to be single callables, you need to be careful + when marking these items. `pytest.mark.xfail(my_func)` won't work because it's also the + signature of a function being decorated. To resolve this ambiguity, you need to pass a + reason argument: + `pytest.mark.xfail(func_bar, reason="Issue#7")`. + .. _`adding a custom marker from a plugin`: https://bitbucket.org/hpk42/pytest/commits/f1fcd44e587b/ Changeset: f1fcd44e587b User: hpk42 Date: 2014-10-14 08:02:21+00:00 Summary: Merged in tomviner/pytest (pull request #222) fix issue552: Add a note to the docs about marking single callables Affected #: 1 file diff -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f -r f1fcd44e587bd193cdc96ae6c08ba509edff581a doc/en/example/markers.txt --- a/doc/en/example/markers.txt +++ b/doc/en/example/markers.txt @@ -280,6 +280,14 @@ tests, whereas the "bar" mark is only applied to the second test. Skip and xfail marks can also be applied in this way, see :ref:`skip/xfail with parametrize`. +.. note:: + + If the data you are parametrizing happen to be single callables, you need to be careful + when marking these items. `pytest.mark.xfail(my_func)` won't work because it's also the + signature of a function being decorated. To resolve this ambiguity, you need to pass a + reason argument: + `pytest.mark.xfail(func_bar, reason="Issue#7")`. + .. _`adding a custom marker from a plugin`: Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Tue Oct 14 10:09:36 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 14 Oct 2014 08:09:36 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 353 Message-ID: <20141014080923.16336.20569@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/353 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3893:cb1ab2ce0f47 Author : holger krekel Branch : default Message: Merged in tomviner/pytest/some_spelling_fixes (pull request #224) -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Tue Oct 14 10:10:22 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 08:10:22 -0000 Subject: [Pytest-commit] commit/tox: hpk42: Merged in msabramo/tox/allow_backslash_escape_curly_braces_msabramo_2 (pull request #93) Message-ID: <20141014081022.19022.94528@app01.ash-private.bitbucket.org> 1 new commit in tox: https://bitbucket.org/hpk42/tox/commits/2c1f0d218f7c/ Changeset: 2c1f0d218f7c User: hpk42 Date: 2014-10-14 08:10:18+00:00 Summary: Merged in msabramo/tox/allow_backslash_escape_curly_braces_msabramo_2 (pull request #93) Allow backslashing curly braces to prevent expansion Affected #: 2 files diff -r b50e77c3d2ca888b609f540176422d79804fd9ae -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -706,6 +706,23 @@ assert argv[0] == ["cmd1", "[hello]", "world"] assert argv[1] == ["cmd1", "brave", "new", "world"] + def test_posargs_backslashed_or_quoted(self, tmpdir, newconfig): + inisource = """ + [testenv:py24] + commands = + echo "\{posargs\}" = {posargs} + echo "posargs = " "{posargs}" + """ + conf = newconfig([], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '='] + assert argv[1] == ['echo', 'posargs ='] + + conf = newconfig(['dog', 'cat'], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '=', 'dog', 'cat'] + assert argv[1] == ['echo', 'posargs =', 'dog', 'cat'] + def test_rewrite_posargs(self, tmpdir, newconfig): inisource = """ [testenv:py24] diff -r b50e77c3d2ca888b609f540176422d79804fd9ae -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -484,8 +484,8 @@ self.url = url RE_ITEM_REF = re.compile( - ''' - [{] + r''' + (?[^[:{}]+):)? # optional sub_type for special rules (?P[^{}]*) # substitution key [}] @@ -752,7 +752,7 @@ def word_has_ended(): return ((cur_char in string.whitespace and ps.word and ps.word[-1] not in string.whitespace) or - (cur_char == '{' and ps.depth == 0) or + (cur_char == '{' and ps.depth == 0 and not ps.word.endswith('\\')) or (ps.depth == 0 and ps.word and ps.word[-1] == '}') or (cur_char not in string.whitespace and ps.word and ps.word.strip() == '')) Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 14 10:10:22 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 08:10:22 -0000 Subject: [Pytest-commit] commit/tox: 3 new changesets Message-ID: <20141014081022.6120.85486@app06.ash-private.bitbucket.org> 3 new commits in tox: https://bitbucket.org/hpk42/tox/commits/9d7345ef4b2b/ Changeset: 9d7345ef4b2b Branch: allow_backslash_escape_curly_braces_msabramo_2 User: Marc Abramowitz Date: 2014-04-03 22:45:55+00:00 Summary: Allow backslashing curly braces to prevent expansion e.g.: commands=echo \{posargs\} = {posargs} Affected #: 1 file diff -r 0c390972b576b50dc0e78bd5cbb8e6a164f15f8b -r 9d7345ef4b2be4f12a30a887fcda30c7b268c245 tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -451,8 +451,8 @@ self.url = url RE_ITEM_REF = re.compile( - ''' - [{] + r''' + (?[^[:{}]+):)? # optional sub_type for special rules (?P[^{}]*) # substitution key [}] @@ -686,7 +686,7 @@ def word_has_ended(): return ((cur_char in string.whitespace and ps.word and ps.word[-1] not in string.whitespace) or - (cur_char == '{' and ps.depth == 0) or + (cur_char == '{' and ps.depth == 0 and not ps.word.endswith('\\')) or (ps.depth == 0 and ps.word and ps.word[-1] == '}') or (cur_char not in string.whitespace and ps.word and ps.word.strip() == '')) https://bitbucket.org/hpk42/tox/commits/b1e0902bf31f/ Changeset: b1e0902bf31f Branch: allow_backslash_escape_curly_braces_msabramo_2 User: Marc Abramowitz Date: 2014-05-12 05:44:09+00:00 Summary: Add test_posargs_backslashed_or_quoted Affected #: 1 file diff -r 9d7345ef4b2be4f12a30a887fcda30c7b268c245 -r b1e0902bf31fe4c706e8cf5339858aea65b32c9f tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -663,6 +663,23 @@ assert argv[0] == ["cmd1", "[hello]", "world"] assert argv[1] == ["cmd1", "brave", "new", "world"] + def test_posargs_backslashed_or_quoted(self, tmpdir, newconfig): + inisource = """ + [testenv:py24] + commands = + echo "\{posargs\}" = {posargs} + echo "posargs = " "{posargs}" + """ + conf = newconfig([], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '='] + assert argv[1] == ['echo', 'posargs ='] + + conf = newconfig(['dog', 'cat'], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '=', 'dog', 'cat'] + assert argv[1] == ['echo', 'posargs =', 'dog', 'cat'] + def test_rewrite_posargs(self, tmpdir, newconfig): inisource = """ [testenv:py24] https://bitbucket.org/hpk42/tox/commits/2c1f0d218f7c/ Changeset: 2c1f0d218f7c User: hpk42 Date: 2014-10-14 08:10:18+00:00 Summary: Merged in msabramo/tox/allow_backslash_escape_curly_braces_msabramo_2 (pull request #93) Allow backslashing curly braces to prevent expansion Affected #: 2 files diff -r b50e77c3d2ca888b609f540176422d79804fd9ae -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -706,6 +706,23 @@ assert argv[0] == ["cmd1", "[hello]", "world"] assert argv[1] == ["cmd1", "brave", "new", "world"] + def test_posargs_backslashed_or_quoted(self, tmpdir, newconfig): + inisource = """ + [testenv:py24] + commands = + echo "\{posargs\}" = {posargs} + echo "posargs = " "{posargs}" + """ + conf = newconfig([], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '='] + assert argv[1] == ['echo', 'posargs ='] + + conf = newconfig(['dog', 'cat'], inisource).envconfigs['py24'] + argv = conf.commands + assert argv[0] == ['echo', '\\{posargs\\}', '=', 'dog', 'cat'] + assert argv[1] == ['echo', 'posargs =', 'dog', 'cat'] + def test_rewrite_posargs(self, tmpdir, newconfig): inisource = """ [testenv:py24] diff -r b50e77c3d2ca888b609f540176422d79804fd9ae -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -484,8 +484,8 @@ self.url = url RE_ITEM_REF = re.compile( - ''' - [{] + r''' + (?[^[:{}]+):)? # optional sub_type for special rules (?P[^{}]*) # substitution key [}] @@ -752,7 +752,7 @@ def word_has_ended(): return ((cur_char in string.whitespace and ps.word and ps.word[-1] not in string.whitespace) or - (cur_char == '{' and ps.depth == 0) or + (cur_char == '{' and ps.depth == 0 and not ps.word.endswith('\\')) or (ps.depth == 0 and ps.word and ps.word[-1] == '}') or (cur_char not in string.whitespace and ps.word and ps.word.strip() == '')) Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 14 10:13:14 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 08:13:14 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: add changelog note for tom's PR about parametrized markers. Message-ID: <20141014081314.30902.55316@app07.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/1d2fa202e54c/ Changeset: 1d2fa202e54c User: hpk42 Date: 2014-10-14 08:12:45+00:00 Summary: add changelog note for tom's PR about parametrized markers. Affected #: 1 file diff -r f1fcd44e587bd193cdc96ae6c08ba509edff581a -r 1d2fa202e54cb8e61d5b8eaceffb93da5fe7ed9b CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,10 @@ - add a doctest ini option for doctest flags, thanks Holger Peters. +- add note to docs that if you want to mark a parameter and the + parameter is a callable, you also need to pass in a reason to disambiguate + it from the "decorator" case. Thanks Tom Viner. + 2.6.4.dev ---------- Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Tue Oct 14 10:19:43 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 14 Oct 2014 08:19:43 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 354 Message-ID: <20141014081740.115597.37043@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/354 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3895:f1fcd44e587b Author : holger krekel Branch : default Message: Merged in tomviner/pytest (pull request #222) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Tue Oct 14 10:26:36 2014 From: builds at drone.io (Drone.io Build) Date: Tue, 14 Oct 2014 08:26:36 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 355 Message-ID: <20141014082624.52927.84810@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/355 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3896:1d2fa202e54c Author : holger krekel Branch : default Message: add changelog note for tom's PR about parametrized markers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Tue Oct 14 14:04:57 2014 From: issues-reply at bitbucket.org (DXist) Date: Tue, 14 Oct 2014 12:04:57 -0000 Subject: [Pytest-commit] Issue #197: Project dependencies are not installed when usedevelop=False (hpk42/tox) Message-ID: <20141014120457.27566.54193@app08.ash-private.bitbucket.org> New issue 197: Project dependencies are not installed when usedevelop=False https://bitbucket.org/hpk42/tox/issue/197/project-dependencies-are-not-installed DXist: I run tox without -r option. At he moment I have to manually install project dependencies when they are changed. Steps I do to reproduce this: 0. run tox to initialize test environment 1. activate test environment 2. remove a package my project depends on 3. run tox again and see failed test due to unsatisfied dependency When I set `usedevelop=True` problem disappears. From commits-noreply at bitbucket.org Tue Oct 14 09:59:57 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 14 Oct 2014 07:59:57 -0000 Subject: [Pytest-commit] commit/pytest: 48 new changesets Message-ID: <20141014075957.24573.45441@app09.ash-private.bitbucket.org> 48 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/8640a2bbb187/ Changeset: 8640a2bbb187 User: bubenkoff Date: 2014-09-27 01:29:47+00:00 Summary: Improve assertion failure reporting on iterables, by using ndiff and pprint. Affected #: 3 files diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 8640a2bbb1871cd6fdc570a6364061024182a74b CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Unreleased +---------- + +- Improve assertion failure reporting on iterables, by using ndiff and pprint. + 2.6.3 ----------- @@ -80,7 +85,7 @@ - fix issue with detecting conftest files if the arguments contain "::" node id specifications (copy pasted from "-v" output) -- fix issue544 by only removing "@NUM" at the end of "::" separated parts +- fix issue544 by only removing "@NUM" at the end of "::" separated parts and if the part has an ".py" extension - don't use py.std import helper, rather import things directly. @@ -93,7 +98,7 @@ - fix issue537: Avoid importing old assertion reinterpretation code by default. -- fix issue364: shorten and enhance tracebacks representation by default. +- fix issue364: shorten and enhance tracebacks representation by default. The new "--tb=auto" option (default) will only display long tracebacks for the first and last entry. You can get the old behaviour of printing all entries as long entries with "--tb=long". Also short entries by @@ -119,14 +124,14 @@ - fix issue473: work around mock putting an unbound method into a class dict when double-patching. -- fix issue498: if a fixture finalizer fails, make sure that +- fix issue498: if a fixture finalizer fails, make sure that the fixture is still invalidated. - fix issue453: the result of the pytest_assertrepr_compare hook now gets it's newlines escaped so that format_exception does not blow up. - internal new warning system: pytest will now produce warnings when - it detects oddities in your test collection or execution. + it detects oddities in your test collection or execution. Warnings are ultimately sent to a new pytest_logwarning hook which is currently only implemented by the terminal plugin which displays warnings in the summary line and shows more details when -rw (report on @@ -170,7 +175,7 @@ - fix issue492: avoid leak in test_writeorg. Thanks Marc Abramowitz. -- fix issue493: don't run tests in doc directory with ``python setup.py test`` +- fix issue493: don't run tests in doc directory with ``python setup.py test`` (use tox -e doctesting for that) - fix issue486: better reporting and handling of early conftest loading failures @@ -184,8 +189,8 @@ Groenholm. - support nose-style ``__test__`` attribute on modules, classes and - functions, including unittest-style Classes. If set to False, the - test will not be collected. + functions, including unittest-style Classes. If set to False, the + test will not be collected. - fix issue512: show "" for arguments which might not be set in monkeypatch plugin. Improves output in documentation. @@ -195,11 +200,11 @@ ----------------------------------- - fix issue409 -- better interoperate with cx_freeze by not - trying to import from collections.abc which causes problems + trying to import from collections.abc which causes problems for py27/cx_freeze. Thanks Wolfgang L. for reporting and tracking it down. - fixed docs and code to use "pytest" instead of "py.test" almost everywhere. - Thanks Jurko Gospodnetic for the complete PR. + Thanks Jurko Gospodnetic for the complete PR. - fix issue425: mention at end of "py.test -h" that --markers and --fixtures work according to specified test path (or current dir) @@ -210,7 +215,7 @@ - copy, cleanup and integrate py.io capture from pylib 1.4.20.dev2 (rev 13d9af95547e) - + - address issue416: clarify docs as to conftest.py loading semantics - fix issue429: comparing byte strings with non-ascii chars in assert @@ -230,7 +235,7 @@ - Allow parameterized fixtures to specify the ID of the parameters by adding an ids argument to pytest.fixture() and pytest.yield_fixture(). - Thanks Floris Bruynooghe. + Thanks Floris Bruynooghe. - fix issue404 by always using the binary xml escape in the junitxml plugin. Thanks Ronny Pfannschmidt. diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 8640a2bbb1871cd6fdc570a6364061024182a74b _pytest/assertion/util.py --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -135,18 +135,32 @@ isdict = lambda x: isinstance(x, dict) isset = lambda x: isinstance(x, (set, frozenset)) + def isiterable(obj): + try: + iter(obj) + return not istext(obj) + except TypeError: + return False + verbose = config.getoption('verbose') explanation = None try: if op == '==': if istext(left) and istext(right): explanation = _diff_text(left, right, verbose) - elif issequence(left) and issequence(right): - explanation = _compare_eq_sequence(left, right, verbose) - elif isset(left) and isset(right): - explanation = _compare_eq_set(left, right, verbose) - elif isdict(left) and isdict(right): - explanation = _compare_eq_dict(left, right, verbose) + else: + if issequence(left) and issequence(right): + explanation = _compare_eq_sequence(left, right, verbose) + elif isset(left) and isset(right): + explanation = _compare_eq_set(left, right, verbose) + elif isdict(left) and isdict(right): + explanation = _compare_eq_dict(left, right, verbose) + if isiterable(left) and isiterable(right): + expl = _compare_eq_iterable(left, right, verbose) + if explanation is not None: + explanation.extend(expl) + else: + explanation = expl elif op == 'not in': if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) @@ -203,6 +217,19 @@ return explanation +def _compare_eq_iterable(left, right, verbose=False): + if not verbose: + return [u('Use -v to get the full diff')] + # dynamic import to speedup pytest + import difflib + + left = pprint.pformat(left).splitlines() + right = pprint.pformat(right).splitlines() + explanation = [u('Full diff:')] + explanation.extend(line.strip() for line in difflib.ndiff(left, right)) + return explanation + + def _compare_eq_sequence(left, right, verbose=False): explanation = [] for i in range(min(len(left), len(right))): diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 8640a2bbb1871cd6fdc570a6364061024182a74b testing/test_assertion.py --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- import sys +import textwrap import py, pytest import _pytest.assertion as plugin from _pytest.assertion import reinterpret from _pytest.assertion import util + needsnewassert = pytest.mark.skipif("sys.version_info < (2,6)") +PY3 = sys.version_info >= (3, 0) @pytest.fixture @@ -86,6 +89,48 @@ expl = callequal([0, 1], [0, 2]) assert len(expl) > 1 + @pytest.mark.parametrize( + ['left', 'right', 'expected'], [ + ([0, 1], [0, 2], """ + Full diff: + - [0, 1] + ? ^ + + [0, 2] + ? ^ + """), + ({0: 1}, {0: 2}, """ + Full diff: + - {0: 1} + ? ^ + + {0: 2} + ? ^ + """), + (set([0, 1]), set([0, 2]), """ + Full diff: + - set([0, 1]) + ? ^ + + set([0, 2]) + ? ^ + """ if not PY3 else """ + Full diff: + - {0, 1} + ? ^ + + {0, 2} + ? ^ + """) + ] + ) + def test_iterable_full_diff(self, left, right, expected): + """Test the full diff assertion failure explanation. + + When verbose is False, then just a -v notice to get the diff is rendered, + when verbose is True, then ndiff of the pprint is returned. + """ + expl = callequal(left, right, verbose=False) + assert expl[-1] == 'Use -v to get the full diff' + expl = '\n'.join(callequal(left, right, verbose=True)) + assert expl.endswith(textwrap.dedent(expected).strip()) + def test_list_different_lenghts(self): expl = callequal([0, 1], [0, 1, 2]) assert len(expl) > 1 https://bitbucket.org/hpk42/pytest/commits/2151567afa9a/ Changeset: 2151567afa9a User: flub Date: 2014-09-27 08:09:16+00:00 Summary: Merged in bubenkoff/pytest/better-diff-on-verbose-2 (pull request #213) Improve assertion failure reporting on iterables, by using ndiff and pprint. Affected #: 3 files diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 2151567afa9a4f3f092f4be51357e3ca9e319188 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Unreleased +---------- + +- Improve assertion failure reporting on iterables, by using ndiff and pprint. + 2.6.3 ----------- @@ -80,7 +85,7 @@ - fix issue with detecting conftest files if the arguments contain "::" node id specifications (copy pasted from "-v" output) -- fix issue544 by only removing "@NUM" at the end of "::" separated parts +- fix issue544 by only removing "@NUM" at the end of "::" separated parts and if the part has an ".py" extension - don't use py.std import helper, rather import things directly. @@ -93,7 +98,7 @@ - fix issue537: Avoid importing old assertion reinterpretation code by default. -- fix issue364: shorten and enhance tracebacks representation by default. +- fix issue364: shorten and enhance tracebacks representation by default. The new "--tb=auto" option (default) will only display long tracebacks for the first and last entry. You can get the old behaviour of printing all entries as long entries with "--tb=long". Also short entries by @@ -119,14 +124,14 @@ - fix issue473: work around mock putting an unbound method into a class dict when double-patching. -- fix issue498: if a fixture finalizer fails, make sure that +- fix issue498: if a fixture finalizer fails, make sure that the fixture is still invalidated. - fix issue453: the result of the pytest_assertrepr_compare hook now gets it's newlines escaped so that format_exception does not blow up. - internal new warning system: pytest will now produce warnings when - it detects oddities in your test collection or execution. + it detects oddities in your test collection or execution. Warnings are ultimately sent to a new pytest_logwarning hook which is currently only implemented by the terminal plugin which displays warnings in the summary line and shows more details when -rw (report on @@ -170,7 +175,7 @@ - fix issue492: avoid leak in test_writeorg. Thanks Marc Abramowitz. -- fix issue493: don't run tests in doc directory with ``python setup.py test`` +- fix issue493: don't run tests in doc directory with ``python setup.py test`` (use tox -e doctesting for that) - fix issue486: better reporting and handling of early conftest loading failures @@ -184,8 +189,8 @@ Groenholm. - support nose-style ``__test__`` attribute on modules, classes and - functions, including unittest-style Classes. If set to False, the - test will not be collected. + functions, including unittest-style Classes. If set to False, the + test will not be collected. - fix issue512: show "" for arguments which might not be set in monkeypatch plugin. Improves output in documentation. @@ -195,11 +200,11 @@ ----------------------------------- - fix issue409 -- better interoperate with cx_freeze by not - trying to import from collections.abc which causes problems + trying to import from collections.abc which causes problems for py27/cx_freeze. Thanks Wolfgang L. for reporting and tracking it down. - fixed docs and code to use "pytest" instead of "py.test" almost everywhere. - Thanks Jurko Gospodnetic for the complete PR. + Thanks Jurko Gospodnetic for the complete PR. - fix issue425: mention at end of "py.test -h" that --markers and --fixtures work according to specified test path (or current dir) @@ -210,7 +215,7 @@ - copy, cleanup and integrate py.io capture from pylib 1.4.20.dev2 (rev 13d9af95547e) - + - address issue416: clarify docs as to conftest.py loading semantics - fix issue429: comparing byte strings with non-ascii chars in assert @@ -230,7 +235,7 @@ - Allow parameterized fixtures to specify the ID of the parameters by adding an ids argument to pytest.fixture() and pytest.yield_fixture(). - Thanks Floris Bruynooghe. + Thanks Floris Bruynooghe. - fix issue404 by always using the binary xml escape in the junitxml plugin. Thanks Ronny Pfannschmidt. diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 2151567afa9a4f3f092f4be51357e3ca9e319188 _pytest/assertion/util.py --- a/_pytest/assertion/util.py +++ b/_pytest/assertion/util.py @@ -135,18 +135,32 @@ isdict = lambda x: isinstance(x, dict) isset = lambda x: isinstance(x, (set, frozenset)) + def isiterable(obj): + try: + iter(obj) + return not istext(obj) + except TypeError: + return False + verbose = config.getoption('verbose') explanation = None try: if op == '==': if istext(left) and istext(right): explanation = _diff_text(left, right, verbose) - elif issequence(left) and issequence(right): - explanation = _compare_eq_sequence(left, right, verbose) - elif isset(left) and isset(right): - explanation = _compare_eq_set(left, right, verbose) - elif isdict(left) and isdict(right): - explanation = _compare_eq_dict(left, right, verbose) + else: + if issequence(left) and issequence(right): + explanation = _compare_eq_sequence(left, right, verbose) + elif isset(left) and isset(right): + explanation = _compare_eq_set(left, right, verbose) + elif isdict(left) and isdict(right): + explanation = _compare_eq_dict(left, right, verbose) + if isiterable(left) and isiterable(right): + expl = _compare_eq_iterable(left, right, verbose) + if explanation is not None: + explanation.extend(expl) + else: + explanation = expl elif op == 'not in': if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) @@ -203,6 +217,19 @@ return explanation +def _compare_eq_iterable(left, right, verbose=False): + if not verbose: + return [u('Use -v to get the full diff')] + # dynamic import to speedup pytest + import difflib + + left = pprint.pformat(left).splitlines() + right = pprint.pformat(right).splitlines() + explanation = [u('Full diff:')] + explanation.extend(line.strip() for line in difflib.ndiff(left, right)) + return explanation + + def _compare_eq_sequence(left, right, verbose=False): explanation = [] for i in range(min(len(left), len(right))): diff -r f829d42dd9f7a5deb4a4e497d8ca08c08fdeba9c -r 2151567afa9a4f3f092f4be51357e3ca9e319188 testing/test_assertion.py --- a/testing/test_assertion.py +++ b/testing/test_assertion.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- import sys +import textwrap import py, pytest import _pytest.assertion as plugin from _pytest.assertion import reinterpret from _pytest.assertion import util + needsnewassert = pytest.mark.skipif("sys.version_info < (2,6)") +PY3 = sys.version_info >= (3, 0) @pytest.fixture @@ -86,6 +89,48 @@ expl = callequal([0, 1], [0, 2]) assert len(expl) > 1 + @pytest.mark.parametrize( + ['left', 'right', 'expected'], [ + ([0, 1], [0, 2], """ + Full diff: + - [0, 1] + ? ^ + + [0, 2] + ? ^ + """), + ({0: 1}, {0: 2}, """ + Full diff: + - {0: 1} + ? ^ + + {0: 2} + ? ^ + """), + (set([0, 1]), set([0, 2]), """ + Full diff: + - set([0, 1]) + ? ^ + + set([0, 2]) + ? ^ + """ if not PY3 else """ + Full diff: + - {0, 1} + ? ^ + + {0, 2} + ? ^ + """) + ] + ) + def test_iterable_full_diff(self, left, right, expected): + """Test the full diff assertion failure explanation. + + When verbose is False, then just a -v notice to get the diff is rendered, + when verbose is True, then ndiff of the pprint is returned. + """ + expl = callequal(left, right, verbose=False) + assert expl[-1] == 'Use -v to get the full diff' + expl = '\n'.join(callequal(left, right, verbose=True)) + assert expl.endswith(textwrap.dedent(expected).strip()) + def test_list_different_lenghts(self): expl = callequal([0, 1], [0, 1, 2]) assert len(expl) > 1 https://bitbucket.org/hpk42/pytest/commits/907048348303/ Changeset: 907048348303 User: nicoddemus Date: 2014-09-27 14:59:59+00:00 Summary: Fixed minor typo in plugins.txt Affected #: 1 file diff -r 2151567afa9a4f3f092f4be51357e3ca9e319188 -r 90704834830321ab6a886ceb6e416de1059fbf39 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -29,7 +29,7 @@ # called for running each test in 'a' directory print ("setting up", item) - a/test_in_subdir.py: + a/test_sub.py: def test_sub(): pass https://bitbucket.org/hpk42/pytest/commits/20ee36010a19/ Changeset: 20ee36010a19 User: hpk42 Date: 2014-09-29 10:31:15+00:00 Summary: removed outdated japanese docs from source tree. Affected #: 98 files diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,8 @@ - Improve assertion failure reporting on iterables, by using ndiff and pprint. +- removed outdated japanese docs from source tree. + 2.6.3 ----------- diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/Makefile --- a/doc/ja/Makefile +++ /dev/null @@ -1,159 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest - -regen: - PYTHONDONTWRITEBYTECODE=1 COLUMNS=76 regendoc --update *.txt */*.txt - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -install: html - rsync -avz _build/html/ pytest.org:/www/pytest.org/latest-ja - -installpdf: latexpdf - @scp $(BUILDDIR)/latex/pytest.pdf pytest.org:/www/pytest.org/latest - -installall: clean install installpdf - @echo "done" - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pytest.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pytest.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/pytest" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pytest" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - make -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -texinfo: - mkdir -p $(BUILDDIR)/texinfo - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - mkdir -p $(BUILDDIR)/texinfo - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/_static/sphinxdoc.css --- a/doc/ja/_static/sphinxdoc.css +++ /dev/null @@ -1,343 +0,0 @@ -/* - * sphinxdoc.css_t - * ~~~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- sphinxdoc theme. Originally created by - * Armin Ronacher for Werkzeug. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - - at import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', - 'Verdana', sans-serif; - font-size: 1.1em; - letter-spacing: -0.01em; - line-height: 150%; - text-align: center; - background-color: #BFD1D4; - color: black; - padding: 0; - border: 1px solid #aaa; - - margin: 0px 80px 0px 80px; - min-width: 740px; -} - -div.document { - background-color: white; - text-align: left; - background-image: url(contents.png); - background-repeat: repeat-x; -} - -div.bodywrapper { - margin: 0 290px 0 0; - border-right: 1px solid #ccc; -} - -div.body { - margin: 0; - padding: 0.5em 20px 20px 20px; -} - -div.related { - font-size: 0.8em; -} - -div.related ul { - background-image: url(navigation.png); - height: 2em; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} - -div.related ul li { - margin: 0; - padding: 0; - height: 2em; - float: left; -} - -div.related ul li.right { - float: right; - margin-right: 5px; -} - -div.related ul li a { - margin: 0; - padding: 0 5px 0 5px; - line-height: 1.75em; - color: #EE9816; -} - -div.related ul li a:hover { - color: #3CA8E7; -} - -div.sphinxsidebarwrapper { - padding: 0; -} - -div.sphinxsidebar { - margin: 0; - padding: 0.5em 15px 15px 0; - width: 260px; - float: right; - font-size: 1em; - text-align: left; -} - -div.sphinxsidebar h3, div.sphinxsidebar h4 { - margin: 1em 0 0.5em 0; - font-size: 1em; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border: 1px solid #86989B; - background-color: #AFC1C4; -} - -div.sphinxsidebar h3 a { - color: white; -} - -div.sphinxsidebar ul { - padding-left: 1.5em; - margin-top: 7px; - padding: 0; - line-height: 130%; -} - -div.sphinxsidebar ul ul { - margin-left: 20px; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - width: 55px; -} - -div.footer { - background-color: #E3EFF1; - color: #86989B; - padding: 3px 8px 3px 0; - clear: both; - font-size: 0.8em; - text-align: right; -} - -div.footer a { - color: #86989B; - text-decoration: underline; -} - -/* -- body styles ----------------------------------------------------------- */ - -p { - margin: 0.8em 0 0.5em 0; -} - -a { - color: #CA7900; - text-decoration: none; -} - -a:hover { - color: #2491CF; -} - -div.body a { - text-decoration: underline; -} - -h1 { - margin: 0; - padding: 0.7em 0 0.3em 0; - font-size: 1.5em; - color: #11557C; -} - -h2 { - margin: 1.3em 0 0.2em 0; - font-size: 1.35em; - padding: 0; -} - -h3 { - margin: 1em 0 -0.3em 0; - font-size: 1.2em; -} - -div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { - color: black!important; -} - -h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { - display: none; - margin: 0 0 0 0.3em; - padding: 0 0.2em 0 0.2em; - color: #aaa!important; -} - -h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, -h5:hover a.anchor, h6:hover a.anchor { - display: inline; -} - -h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, -h5 a.anchor:hover, h6 a.anchor:hover { - color: #777; - background-color: #eee; -} - -a.headerlink { - color: #c60f0f!important; - font-size: 1em; - margin-left: 6px; - padding: 0 4px 0 4px; - text-decoration: none!important; -} - -a.headerlink:hover { - background-color: #ccc; - color: white!important; -} - -cite, code, tt { - font-family: 'Consolas', 'Deja Vu Sans Mono', - 'Bitstream Vera Sans Mono', monospace; - font-size: 0.95em; - letter-spacing: 0.01em; -} - -tt { - background-color: #f2f2f2; - border-bottom: 1px solid #ddd; - color: #333; -} - -tt.descname, tt.descclassname, tt.xref { - border: 0; -} - -hr { - border: 1px solid #abc; - margin: 2em; -} - -a tt { - border: 0; - color: #CA7900; -} - -a tt:hover { - color: #2491CF; -} - -pre { - font-family: 'Consolas', 'Deja Vu Sans Mono', - 'Bitstream Vera Sans Mono', monospace; - font-size: 0.95em; - letter-spacing: 0.015em; - line-height: 120%; - padding: 0.5em; - border: 1px solid #ccc; - background-color: #f8f8f8; -} - -pre a { - color: inherit; - text-decoration: underline; -} - -td.linenos pre { - padding: 0.5em 0; -} - -div.quotebar { - background-color: #f8f8f8; - max-width: 250px; - float: right; - padding: 2px 7px; - border: 1px solid #ccc; -} - -div.topic { - background-color: #f8f8f8; -} - -table { - border-collapse: collapse; - margin: 0 -0.5em 0 -0.5em; -} - -table td, table th { - padding: 0.2em 0.5em 0.2em 0.5em; -} - -div.admonition, div.warning { - font-size: 0.9em; - margin: 1em 0 1em 0; - border: 1px solid #86989B; - background-color: #f7f7f7; - padding: 0; -} - -div.admonition p, div.warning p { - margin: 0.5em 1em 0.5em 1em; - padding: 0; -} - -div.admonition pre, div.warning pre { - margin: 0.4em 1em 0.4em 1em; -} - -div.admonition p.admonition-title, -div.warning p.admonition-title { - margin: 0; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border-bottom: 1px solid #86989B; - font-weight: bold; - background-color: #AFC1C4; -} - -div.warning { - border: 1px solid #940000; -} - -div.warning p.admonition-title { - background-color: #CF0000; - border-bottom-color: #940000; -} - -div.admonition ul, div.admonition ol, -div.warning ul, div.warning ol { - margin: 0.1em 0.5em 0.5em 3em; - padding: 0; -} - -div.versioninfo { - margin: 1em 0 0 0; - border: 1px solid #ccc; - background-color: #DDEAF0; - padding: 8px; - line-height: 1.3em; - font-size: 0.9em; -} - -.viewcode-back { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', - 'Verdana', sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/index.txt --- a/doc/ja/announce/index.txt +++ /dev/null @@ -1,24 +0,0 @@ - -.. - Release announcements - =========================================== - -????????? -================== - -.. toctree:: - :maxdepth: 2 - - release-2.2.4 - release-2.2.2 - release-2.2.1 - release-2.2.0 - release-2.1.3 - release-2.1.2 - release-2.1.1 - release-2.1.0 - release-2.0.3 - release-2.0.2 - release-2.0.1 - release-2.0.0 - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.0.0.txt --- a/doc/ja/announce/release-2.0.0.txt +++ /dev/null @@ -1,129 +0,0 @@ -py.test 2.0.0: asserts++, unittest++, reporting++, config++, docs++ -=========================================================================== - -Welcome to pytest-2.0.0, a major new release of "py.test", the rapid -easy Python testing tool. There are many new features and enhancements, -see below for summary and detailed lists. A lot of long-deprecated code -has been removed, resulting in a much smaller and cleaner -implementation. See the new docs with examples here: - - http://pytest.org/2.0.0/index.html - -A note on packaging: pytest used to part of the "py" distribution up -until version py-1.3.4 but this has changed now: pytest-2.0.0 only -contains py.test related code and is expected to be backward-compatible -to existing test code. If you want to install pytest, just type one of:: - - pip install -U pytest - easy_install -U pytest - -Many thanks to all issue reporters and people asking questions or -complaining. Particular thanks to Floris Bruynooghe and Ronny Pfannschmidt -for their great coding contributions and many others for feedback and help. - -best, -holger krekel - - -New Features ------------------------ - -- new invocations through Python interpreter and from Python:: - - python -m pytest # on all pythons >= 2.5 - - or from a python program:: - - import pytest ; pytest.main(arglist, pluginlist) - - see http://pytest.org/2.0.0/usage.html for details. - -- new and better reporting information in assert expressions - if comparing lists, sequences or strings. - - see http://pytest.org/2.0.0/assert.html#newreport - -- new configuration through ini-files (setup.cfg or tox.ini recognized), - for example:: - - [pytest] - norecursedirs = .hg data* # don't ever recurse in such dirs - addopts = -x --pyargs # add these command line options by default - - see http://pytest.org/2.0.0/customize.html - -- improved standard unittest support. In general py.test should now - better be able to run custom unittest.TestCases like twisted trial - or Django based TestCases. Also you can now run the tests of an - installed 'unittest' package with py.test:: - - py.test --pyargs unittest - -- new "-q" option which decreases verbosity and prints a more - nose/unittest-style "dot" output. - -- many many more detailed improvements details - -Fixes ------------------------ - -- fix issue126 - introduce py.test.set_trace() to trace execution via - PDB during the running of tests even if capturing is ongoing. -- fix issue124 - make reporting more resilient against tests opening - files on filedescriptor 1 (stdout). -- fix issue109 - sibling conftest.py files will not be loaded. - (and Directory collectors cannot be customized anymore from a Directory's - conftest.py - this needs to happen at least one level up). -- fix issue88 (finding custom test nodes from command line arg) -- fix issue93 stdout/stderr is captured while importing conftest.py -- fix bug: unittest collected functions now also can have "pytestmark" - applied at class/module level - -Important Notes --------------------- - -* The usual way in pre-2.0 times to use py.test in python code was - to import "py" and then e.g. use "py.test.raises" for the helper. - This remains valid and is not planned to be deprecated. However, - in most examples and internal code you'll find "import pytest" - and "pytest.raises" used as the recommended default way. - -* pytest now first performs collection of the complete test suite - before running any test. This changes for example the semantics of when - pytest_collectstart/pytest_collectreport are called. Some plugins may - need upgrading. - -* The pytest package consists of a 400 LOC core.py and about 20 builtin plugins, - summing up to roughly 5000 LOCs, including docstrings. To be fair, it also - uses generic code from the "pylib", and the new "py" package to help - with filesystem and introspection/code manipulation. - -(Incompatible) Removals ------------------------------ - -- py.test.config is now only available if you are in a test run. - -- the following (mostly already deprecated) functionality was removed: - - - removed support for Module/Class/... collection node definitions - in conftest.py files. They will cause nothing special. - - removed support for calling the pre-1.0 collection API of "run()" and "join" - - removed reading option values from conftest.py files or env variables. - This can now be done much much better and easier through the ini-file - mechanism and the "addopts" entry in particular. - - removed the "disabled" attribute in test classes. Use the skipping - and pytestmark mechanism to skip or xfail a test class. - -- py.test.collect.Directory does not exist anymore and it - is not possible to provide an own "Directory" object. - If you have used this and don't know what to do, get - in contact. We'll figure something out. - - Note that pytest_collect_directory() is still called but - any return value will be ignored. This allows to keep - old code working that performed for example "py.test.skip()" - in collect() to prevent recursion into directory trees - if a certain dependency or command line option is missing. - - -see :ref:`changelog` for more detailed changes. diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.0.1.txt --- a/doc/ja/announce/release-2.0.1.txt +++ /dev/null @@ -1,67 +0,0 @@ -py.test 2.0.1: bug fixes -=========================================================================== - -Welcome to pytest-2.0.1, a maintenance and bug fix release of pytest, -a mature testing tool for Python, supporting CPython 2.4-3.2, Jython -and latest PyPy interpreters. See extensive docs with tested examples here: - - http://pytest.org/ - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -Many thanks to all issue reporters and people asking questions or -complaining. Particular thanks to Floris Bruynooghe and Ronny Pfannschmidt -for their great coding contributions and many others for feedback and help. - -best, -holger krekel - -Changes between 2.0.0 and 2.0.1 ----------------------------------------------- - -- refine and unify initial capturing so that it works nicely - even if the logging module is used on an early-loaded conftest.py - file or plugin. -- fix issue12 - show plugin versions with "--version" and - "--traceconfig" and also document how to add extra information - to reporting test header -- fix issue17 (import-* reporting issue on python3) by - requiring py>1.4.0 (1.4.1 is going to include it) -- fix issue10 (numpy arrays truth checking) by refining - assertion interpretation in py lib -- fix issue15: make nose compatibility tests compatible - with python3 (now that nose-1.0 supports python3) -- remove somewhat surprising "same-conftest" detection because - it ignores conftest.py when they appear in several subdirs. -- improve assertions ("not in"), thanks Floris Bruynooghe -- improve behaviour/warnings when running on top of "python -OO" - (assertions and docstrings are turned off, leading to potential - false positives) -- introduce a pytest_cmdline_processargs(args) hook - to allow dynamic computation of command line arguments. - This fixes a regression because py.test prior to 2.0 - allowed to set command line options from conftest.py - files which so far pytest-2.0 only allowed from ini-files now. -- fix issue7: assert failures in doctest modules. - unexpected failures in doctests will not generally - show nicer, i.e. within the doctest failing context. -- fix issue9: setup/teardown functions for an xfail-marked - test will report as xfail if they fail but report as normally - passing (not xpassing) if they succeed. This only is true - for "direct" setup/teardown invocations because teardown_class/ - teardown_module cannot closely relate to a single test. -- fix issue14: no logging errors at process exit -- refinements to "collecting" output on non-ttys -- refine internal plugin registration and --traceconfig output -- introduce a mechanism to prevent/unregister plugins from the - command line, see http://pytest.org/plugins.html#cmdunregister -- activate resultlog plugin by default -- fix regression wrt yielded tests which due to the - collection-before-running semantics were not - setup as with pytest 1.3.4. Note, however, that - the recommended and much cleaner way to do test - parametrization remains the "pytest_generate_tests" - mechanism, see the docs. diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.0.2.txt --- a/doc/ja/announce/release-2.0.2.txt +++ /dev/null @@ -1,73 +0,0 @@ -py.test 2.0.2: bug fixes, improved xfail/skip expressions, speed ups -=========================================================================== - -Welcome to pytest-2.0.2, a maintenance and bug fix release of pytest, -a mature testing tool for Python, supporting CPython 2.4-3.2, Jython -and latest PyPy interpreters. See the extensive docs with tested examples here: - - http://pytest.org/ - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -Many thanks to all issue reporters and people asking questions -or complaining, particularly Jurko for his insistence, -Laura, Victor and Brianna for helping with improving -and Ronny for his general advise. - -best, -holger krekel - -Changes between 2.0.1 and 2.0.2 ----------------------------------------------- - -- tackle issue32 - speed up test runs of very quick test functions - by reducing the relative overhead - -- fix issue30 - extended xfail/skipif handling and improved reporting. - If you have a syntax error in your skip/xfail - expressions you now get nice error reports. - - Also you can now access module globals from xfail/skipif - expressions so that this for example works now:: - - import pytest - import mymodule - @pytest.mark.skipif("mymodule.__version__[0] == "1") - def test_function(): - pass - - This will not run the test function if the module's version string - does not start with a "1". Note that specifying a string instead - of a boolean expressions allows py.test to report meaningful information - when summarizing a test run as to what conditions lead to skipping - (or xfail-ing) tests. - -- fix issue28 - setup_method and pytest_generate_tests work together - The setup_method fixture method now gets called also for - test function invocations generated from the pytest_generate_tests - hook. - -- fix issue27 - collectonly and keyword-selection (-k) now work together - Also, if you do "py.test --collectonly -q" you now get a flat list - of test ids that you can use to paste to the py.test commandline - in order to execute a particular test. - -- fix issue25 avoid reported problems with --pdb and python3.2/encodings output - -- fix issue23 - tmpdir argument now works on Python3.2 and WindowsXP - Starting with Python3.2 os.symlink may be supported. By requiring - a newer py lib version the py.path.local() implementation acknowledges - this. - -- fixed typos in the docs (thanks Victor Garcia, Brianna Laugher) and particular - thanks to Laura Creighton who also revieved parts of the documentation. - -- fix slighly wrong output of verbose progress reporting for classes - (thanks Amaury) - -- more precise (avoiding of) deprecation warnings for node.Class|Function accesses - -- avoid std unittest assertion helper code in tracebacks (thanks Ronny) diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.0.3.txt --- a/doc/ja/announce/release-2.0.3.txt +++ /dev/null @@ -1,40 +0,0 @@ -py.test 2.0.3: bug fixes and speed ups -=========================================================================== - -Welcome to pytest-2.0.3, a maintenance and bug fix release of pytest, -a mature testing tool for Python, supporting CPython 2.4-3.2, Jython -and latest PyPy interpreters. See the extensive docs with tested examples here: - - http://pytest.org/ - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -There also is a bugfix release 1.6 of pytest-xdist, the plugin -that enables seemless distributed and "looponfail" testing for Python. - -best, -holger krekel - -Changes between 2.0.2 and 2.0.3 ----------------------------------------------- - -- fix issue38: nicer tracebacks on calls to hooks, particularly early - configure/sessionstart ones - -- fix missing skip reason/meta information in junitxml files, reported - via http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html - -- fix issue34: avoid collection failure with "test" prefixed classes - deriving from object. - -- don't require zlib (and other libs) for genscript plugin without - --genscript actually being used. - -- speed up skips (by not doing a full traceback represenation - internally) - -- fix issue37: avoid invalid characters in junitxml's output - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.1.0.txt --- a/doc/ja/announce/release-2.1.0.txt +++ /dev/null @@ -1,47 +0,0 @@ -py.test 2.1.0: perfected assertions and bug fixes -=========================================================================== - -Welcome to the release of pytest-2.1, a mature testing tool for Python, -supporting CPython 2.4-3.2, Jython and latest PyPy interpreters. See -the improved extensive docs (now also as PDF!) with tested examples here: - - http://pytest.org/ - -The single biggest news about this release are **perfected assertions** -courtesy of Benjamin Peterson. You can now safely use ``assert`` -statements in test modules without having to worry about side effects -or python optimization ("-OO") options. This is achieved by rewriting -assert statements in test modules upon import, using a PEP302 hook. -See http://pytest.org/assert.html#advanced-assertion-introspection for -detailed information. The work has been partly sponsored by my company, -merlinux GmbH. - -For further details on bug fixes and smaller enhancements see below. - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -best, -holger krekel / http://merlinux.eu - -Changes between 2.0.3 and 2.1.0 ----------------------------------------------- - -- fix issue53 call nosestyle setup functions with correct ordering -- fix issue58 and issue59: new assertion code fixes -- merge Benjamin's assertionrewrite branch: now assertions - for test modules on python 2.6 and above are done by rewriting - the AST and saving the pyc file before the test module is imported. - see doc/assert.txt for more info. -- fix issue43: improve doctests with better traceback reporting on - unexpected exceptions -- fix issue47: timing output in junitxml for test cases is now correct -- fix issue48: typo in MarkInfo repr leading to exception -- fix issue49: avoid confusing error when initialization partially fails -- fix issue44: env/username expansion for junitxml file path -- show releaselevel information in test runs for pypy -- reworked doc pages for better navigation and PDF generation -- report KeyboardInterrupt even if interrupted during session startup -- fix issue 35 - provide PDF doc version and download link from index page diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.1.1.txt --- a/doc/ja/announce/release-2.1.1.txt +++ /dev/null @@ -1,37 +0,0 @@ -py.test 2.1.1: assertion fixes and improved junitxml output -=========================================================================== - -pytest-2.1.1 is a backward compatible maintenance release of the -popular py.test testing tool. See extensive docs with examples here: - - http://pytest.org/ - -Most bug fixes address remaining issues with the perfected assertions -introduced with 2.1.0 - many thanks to the bug reporters and to Benjamin -Peterson for helping to fix them. Also, junitxml output now produces -system-out/err tags which lead to better displays of tracebacks with Jenkins. - -Also a quick note to package maintainers and others interested: there now -is a "pytest" man page which can be generated with "make man" in doc/. - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -best, -holger krekel / http://merlinux.eu - -Changes between 2.1.0 and 2.1.1 ----------------------------------------------- - -- fix issue64 / pytest.set_trace now works within pytest_generate_tests hooks -- fix issue60 / fix error conditions involving the creation of __pycache__ -- fix issue63 / assertion rewriting on inserts involving strings containing '%' -- fix assertion rewriting on calls with a ** arg -- don't cache rewritten modules if bytecode generation is disabled -- fix assertion rewriting in read-only directories -- fix issue59: provide system-out/err tags for junitxml output -- fix issue61: assertion rewriting on boolean operations with 3 or more operands -- you can now build a man page with "cd doc ; make man" - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.1.2.txt --- a/doc/ja/announce/release-2.1.2.txt +++ /dev/null @@ -1,33 +0,0 @@ -py.test 2.1.2: bug fixes and fixes for jython -=========================================================================== - -pytest-2.1.2 is a minor backward compatible maintenance release of the -popular py.test testing tool. pytest is commonly used for unit, -functional- and integration testing. See extensive docs with examples -here: - - http://pytest.org/ - -Most bug fixes address remaining issues with the perfected assertions -introduced in the 2.1 series - many thanks to the bug reporters and to Benjamin -Peterson for helping to fix them. pytest should also work better with -Jython-2.5.1 (and Jython trunk). - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -best, -holger krekel / http://merlinux.eu - -Changes between 2.1.1 and 2.1.2 ----------------------------------------- - -- fix assertion rewriting on files with windows newlines on some Python versions -- refine test discovery by package/module name (--pyargs), thanks Florian Mayer -- fix issue69 / assertion rewriting fixed on some boolean operations -- fix issue68 / packages now work with assertion rewriting -- fix issue66: use different assertion rewriting caches when the -O option is passed -- don't try assertion rewriting on Jython, use reinterp - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.1.3.txt --- a/doc/ja/announce/release-2.1.3.txt +++ /dev/null @@ -1,32 +0,0 @@ -py.test 2.1.3: just some more fixes -=========================================================================== - -pytest-2.1.3 is a minor backward compatible maintenance release of the -popular py.test testing tool. It is commonly used for unit, functional- -and integration testing. See extensive docs with examples here: - - http://pytest.org/ - -The release contains another fix to the perfected assertions introduced -with the 2.1 series as well as the new possibility to customize reporting -for assertion expressions on a per-directory level. - -If you want to install or upgrade pytest, just type one of:: - - pip install -U pytest # or - easy_install -U pytest - -Thanks to the bug reporters and to Ronny Pfannschmidt, Benjamin Peterson -and Floris Bruynooghe who implemented the fixes. - -best, -holger krekel - -Changes between 2.1.2 and 2.1.3 ----------------------------------------- - -- fix issue79: assertion rewriting failed on some comparisons in boolops, -- correctly handle zero length arguments (a la pytest '') -- fix issue67 / junitxml now contains correct test durations -- fix issue75 / skipping test failure on jython -- fix issue77 / Allow assertrepr_compare hook to apply to a subset of tests diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.2.0.txt --- a/doc/ja/announce/release-2.2.0.txt +++ /dev/null @@ -1,95 +0,0 @@ -py.test 2.2.0: test marking++, parametrization++ and duration profiling -=========================================================================== - -pytest-2.2.0 is a test-suite compatible release of the popular -py.test testing tool. Plugins might need upgrades. It comes -with these improvements: - -* easier and more powerful parametrization of tests: - - - new @pytest.mark.parametrize decorator to run tests with different arguments - - new metafunc.parametrize() API for parametrizing arguments independently - - see examples at http://pytest.org/latest/example/parametrize.html - - NOTE that parametrize() related APIs are still a bit experimental - and might change in future releases. - -* improved handling of test markers and refined marking mechanism: - - - "-m markexpr" option for selecting tests according to their mark - - a new "markers" ini-variable for registering test markers for your project - - the new "--strict" bails out with an error if using unregistered markers. - - see examples at http://pytest.org/latest/example/markers.html - -* duration profiling: new "--duration=N" option showing the N slowest test - execution or setup/teardown calls. This is most useful if you want to - find out where your slowest test code is. - -* also 2.2.0 performs more eager calling of teardown/finalizers functions - resulting in better and more accurate reporting when they fail - -Besides there is the usual set of bug fixes along with a cleanup of -pytest's own test suite allowing it to run on a wider range of environments. - -For general information, see extensive docs with examples here: - - http://pytest.org/ - -If you want to install or upgrade pytest you might just type:: - - pip install -U pytest # or - easy_install -U pytest - -Thanks to Ronny Pfannschmidt, David Burns, Jeff Donner, Daniel Nouri, Alfredo Deza and all who gave feedback or sent bug reports. - -best, -holger krekel - - -notes on incompatibility ------------------------------- - -While test suites should work unchanged you might need to upgrade plugins: - -* You need a new version of the pytest-xdist plugin (1.7) for distributing - test runs. - -* Other plugins might need an upgrade if they implement - the ``pytest_runtest_logreport`` hook which now is called unconditionally - for the setup/teardown fixture phases of a test. You may choose to - ignore setup/teardown failures by inserting "if rep.when != 'call': return" - or something similar. Note that most code probably "just" works because - the hook was already called for failing setup/teardown phases of a test - so a plugin should have been ready to grok such reports already. - - -Changes between 2.1.3 and 2.2.0 ----------------------------------------- - -- fix issue90: introduce eager tearing down of test items so that - teardown function are called earlier. -- add an all-powerful metafunc.parametrize function which allows to - parametrize test function arguments in multiple steps and therefore - from independent plugins and places. -- add a @pytest.mark.parametrize helper which allows to easily - call a test function with different argument values. -- Add examples to the "parametrize" example page, including a quick port - of Test scenarios and the new parametrize function and decorator. -- introduce registration for "pytest.mark.*" helpers via ini-files - or through plugin hooks. Also introduce a "--strict" option which - will treat unregistered markers as errors - allowing to avoid typos and maintain a well described set of markers - for your test suite. See examples at http://pytest.org/latest/mark.html - and its links. -- issue50: introduce "-m marker" option to select tests based on markers - (this is a stricter and more predictable version of "-k" in that "-m" - only matches complete markers and has more obvious rules for and/or - semantics. -- new feature to help optimizing the speed of your tests: - --durations=N option for displaying N slowest test calls - and setup/teardown methods. -- fix issue87: --pastebin now works with python3 -- fix issue89: --pdb with unexpected exceptions in doctest work more sensibly -- fix and cleanup pytest's own test suite to not leak FDs -- fix issue83: link to generated funcarg list -- fix issue74: pyarg module names are now checked against imp.find_module false positives -- fix compatibility with twisted/trial-11.1.0 use cases diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.2.1.txt --- a/doc/ja/announce/release-2.2.1.txt +++ /dev/null @@ -1,41 +0,0 @@ -pytest-2.2.1: bug fixes, perfect teardowns -=========================================================================== - - -pytest-2.2.1 is a minor backward-compatible release of the the py.test -testing tool. It contains bug fixes and little improvements, including -documentation fixes. If you are using the distributed testing -pluginmake sure to upgrade it to pytest-xdist-1.8. - -For general information see here: - - http://pytest.org/ - -To install or upgrade pytest: - - pip install -U pytest # or - easy_install -U pytest - -Special thanks for helping on this release to Ronny Pfannschmidt, Jurko -Gospodnetic and Ralf Schmitt. - -best, -holger krekel - - -Changes between 2.2.0 and 2.2.1 ----------------------------------------- - -- fix issue99 (in pytest and py) internallerrors with resultlog now - produce better output - fixed by normalizing pytest_internalerror - input arguments. -- fix issue97 / traceback issues (in pytest and py) improve traceback output - in conjunction with jinja2 and cython which hack tracebacks -- fix issue93 (in pytest and pytest-xdist) avoid "delayed teardowns": - the final test in a test node will now run its teardown directly - instead of waiting for the end of the session. Thanks Dave Hunt for - the good reporting and feedback. The pytest_runtest_protocol as well - as the pytest_runtest_teardown hooks now have "nextitem" available - which will be None indicating the end of the test run. -- fix collection crash due to unknown-source collected items, thanks - to Ralf Schmitt (fixed by depending on a more recent pylib) diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.2.2.txt --- a/doc/ja/announce/release-2.2.2.txt +++ /dev/null @@ -1,43 +0,0 @@ -pytest-2.2.2: bug fixes -=========================================================================== - -pytest-2.2.2 (updated to 2.2.3 to fix packaging issues) is a minor -backward-compatible release of the versatile py.test testing tool. It -contains bug fixes and a few refinements particularly to reporting with -"--collectonly", see below for betails. - -For general information see here: - - http://pytest.org/ - -To install or upgrade pytest: - - pip install -U pytest # or - easy_install -U pytest - -Special thanks for helping on this release to Ronny Pfannschmidt -and Ralf Schmitt and the contributors of issues. - -best, -holger krekel - - -Changes between 2.2.1 and 2.2.2 ----------------------------------------- - -- fix issue101: wrong args to unittest.TestCase test function now - produce better output -- fix issue102: report more useful errors and hints for when a - test directory was renamed and some pyc/__pycache__ remain -- fix issue106: allow parametrize to be applied multiple times - e.g. from module, class and at function level. -- fix issue107: actually perform session scope finalization -- don't check in parametrize if indirect parameters are funcarg names -- add chdir method to monkeypatch funcarg -- fix crash resulting from calling monkeypatch undo a second time -- fix issue115: make --collectonly robust against early failure - (missing files/directories) -- "-qq --collectonly" now shows only files and the number of tests in them -- "-q --collectonly" now shows test ids -- allow adding of attributes to test reports such that it also works - with distributed testing (no upgrade of pytest-xdist needed) diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/announce/release-2.2.4.txt --- a/doc/ja/announce/release-2.2.4.txt +++ /dev/null @@ -1,39 +0,0 @@ -pytest-2.2.4: bug fixes, better junitxml/unittest/python3 compat -=========================================================================== - -pytest-2.2.4 is a minor backward-compatible release of the versatile -py.test testing tool. It contains bug fixes and a few refinements -to junitxml reporting, better unittest- and python3 compatibility. - -For general information see here: - - http://pytest.org/ - -To install or upgrade pytest: - - pip install -U pytest # or - easy_install -U pytest - -Special thanks for helping on this release to Ronny Pfannschmidt -and Benjamin Peterson and the contributors of issues. - -best, -holger krekel - -Changes between 2.2.3 and 2.2.4 ------------------------------------ - -- fix error message for rewritten assertions involving the % operator -- fix issue 126: correctly match all invalid xml characters for junitxml - binary escape -- fix issue with unittest: now @unittest.expectedFailure markers should - be processed correctly (you can also use @pytest.mark markers) -- document integration with the extended distribute/setuptools test commands -- fix issue 140: propperly get the real functions - of bound classmethods for setup/teardown_class -- fix issue #141: switch from the deceased paste.pocoo.org to bpaste.net -- fix issue #143: call unconfigure/sessionfinish always when - configure/sessionstart where called -- fix issue #144: better mangle test ids to junitxml classnames -- upgrade distribute_setup.py to 0.6.27 - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/apiref.txt --- a/doc/ja/apiref.txt +++ /dev/null @@ -1,29 +0,0 @@ - -.. _apiref: - -py.test ???????????? -================================ - -.. - py.test reference documentation - ================================================ - -.. toctree:: - :maxdepth: 2 - - builtin.txt - customize.txt - assert.txt - funcargs.txt - xunit_setup.txt - capture.txt - monkeypatch.txt - xdist.txt - tmpdir.txt - skipping.txt - mark.txt - recwarn.txt - unittest.txt - nose.txt - doctest.txt - diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/assert.txt --- a/doc/ja/assert.txt +++ /dev/null @@ -1,362 +0,0 @@ - -.. - The writing and reporting of assertions in tests - ================================================== - -??????????????????????? -============================================== - -.. _`assert with the assert statement`: - -``assert`` ?????????? -------------------------------- - -.. - Asserting with the ``assert`` statement - --------------------------------------------------------- - -.. - ``py.test`` allows you to use the standard python ``assert`` for verifying - expectations and values in Python tests. For example, you can write the - following:: - -``py.test`` ????????????????????? Python ??? ``assert`` ?????????????????????????:: - - # test_assert1.py ??? - def f(): - return 3 - - def test_function(): - assert f() == 4 - -.. - to assert that your function returns a certain value. If this assertion fails - you will see the return value of the function call:: - -?????????????????????????????????????????????????????????????:: - - $ py.test test_assert1.py - =========================== test session starts ============================ - platform linux2 -- Python 2.7.1 -- pytest-2.2.4 - collecting ... collected 1 items - - test_assert1.py F - - ================================= FAILURES ================================= - ______________________________ test_function _______________________________ - - def test_function(): - > assert f() == 4 - E assert 3 == 4 - E + where 3 = f() - - test_assert1.py:5: AssertionError - ========================= 1 failed in 0.01 seconds ========================= - -.. - py.test has support for showing the values of the most common subexpressions - including calls, attributes, comparisons, and binary and unary - operators. (See :ref:`tbreportdemo`). This allows you to use the - idiomatic python constructs without boilerplate code while not losing - introspection information. - -py.test ?????????????????????????????????????????????????????? (:ref:`tbreportdemo` ???) ???????????????????????Python ????????????????????????????????????????????? - -.. - However, if you specify a message with the assertion like this:: - -??????????????????????????????:: - - assert a % 2 == 0, "value was odd, should be even" - -.. - then no assertion introspection takes places at all and the message - will be simply shown in the traceback. - -???????????????????????????????????????????????? - -.. - See :ref:`assert-details` for more information on assertion introspection. - -?????????????????????? :ref:`assert-details` ?????????? - -.. - Assertions about expected exceptions - ------------------------------------------ - -??????????????? ------------------------------- - -.. - In order to write assertions about raised exceptions, you can use - ``pytest.raises`` as a context manager like this:: - -?????????????????????????????? ????????? ``pytest.raises`` ?????:: - - import pytest - with pytest.raises(ZeroDivisionError): - 1 / 0 - -.. - and if you need to have access to the actual exception info you may use:: - -???????????????????????????????:: - - with pytest.raises(RuntimeError) as excinfo: - def f(): - f() - f() - - # excinfo.type, excinfo.value, excinfo.traceback ?????????????? - -.. - If you want to write test code that works on Python 2.4 as well, - you may also use two other ways to test for an expected exception:: - -Python 2.4 ?????????????????????????????????????????????2?????:: - - pytest.raises(ExpectedException, func, *args, **kwargs) - pytest.raises(ExpectedException, "func(*args, **kwargs)") - -.. - both of which execute the specified function with args and kwargs and - asserts that the given ``ExpectedException`` is raised. The reporter will - provide you with helpful output in case of failures such as *no - exception* or *wrong exception*. - -??????????? args ? kwargs ???????????????? ``ExpectedException`` ??????????????????????? *no exception* ??? *wrong exception* ?????????????????????????????? - -.. _newreport: - -???????????????? --------------------------------- - -.. - Making use of context-sensitive comparisons - ------------------------------------------------- - -.. versionadded:: 2.0 - -.. - py.test has rich support for providing context-sensitive information - when it encounters comparisons. For example:: - -py.test ?????????????????????????????????????:: - - # test_assert2.py ??? - - def test_set_comparison(): - set1 = set("1308") - set2 = set("8035") - assert set1 == set2 - -.. - if you run this module:: - -?????????????:: - - $ py.test test_assert2.py - =========================== test session starts ============================ - platform linux2 -- Python 2.7.1 -- pytest-2.2.4 - collecting ... collected 1 items - - test_assert2.py F - - ================================= FAILURES ================================= - ___________________________ test_set_comparison ____________________________ - - def test_set_comparison(): - set1 = set("1308") - set2 = set("8035") - > assert set1 == set2 - E assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8']) - E Extra items in the left set: - E '1' - E Extra items in the right set: - E '5' - - test_assert2.py:5: AssertionError - ========================= 1 failed in 0.01 seconds ========================= - -.. - Special comparisons are done for a number of cases: - -??????????????????????: - -.. - * comparing long strings: a context diff is shown - * comparing long sequences: first failing indices - * comparing dicts: different entries - -* ????????: ?????? diff ??? -* ??????????: ????????????? -* ??????????: ??????? - -.. - See the :ref:`reporting demo ` for many more examples. - -?????????????? :ref:`??????? ` ????????? - -.. - Defining your own assertion comparison - ---------------------------------------------- - -??????????? ----------------------- - -.. - It is possible to add your own detailed explanations by implementing - the ``pytest_assertrepr_compare`` hook. - -``pytest_assertrepr_compare`` ?????????????????????????? - -.. autofunction:: _pytest.hookspec.pytest_assertrepr_compare - -.. - As an example consider adding the following hook in a conftest.py which - provides an alternative explanation for ``Foo`` objects:: - -?????conftest.py ?????????????????? ``Foo`` ?????????????????:: - - # conftest.py ??? - from test_foocompare import Foo - def pytest_assertrepr_compare(op, left, right): - if isinstance(left, Foo) and isinstance(right, Foo) and op == "==": - return ['Comparing Foo instances:', - ' vals: %s != %s' % (left.val, right.val)] - -.. - now, given this test module:: - -??????????????????:: - - # test_foocompare.py ??? - class Foo: - def __init__(self, val): - self.val = val - - def test_compare(): - f1 = Foo(1) - f2 = Foo(2) - assert f1 == f2 - -.. - you can run the test module and get the custom output defined in - the conftest file:: - -?????????????????conftest ???????????????????????:: - - $ py.test -q test_foocompare.py - collecting ... collected 1 items - F - ================================= FAILURES ================================= - _______________________________ test_compare _______________________________ - - def test_compare(): - f1 = Foo(1) - f2 = Foo(2) - > assert f1 == f2 - E assert Comparing Foo instances: - E vals: 1 != 2 - - test_foocompare.py:8: AssertionError - 1 failed in 0.01 seconds - -.. _assert-details: -.. _`assert introspection`: - -????????????????? ----------------------------------- - -.. - Advanced assertion introspection - ---------------------------------- - -.. versionadded:: 2.1 - -.. - Reporting details about a failing assertion is achieved either by rewriting - assert statements before they are run or re-evaluating the assert expression and - recording the intermediate values. Which technique is used depends on the - location of the assert, py.test's configuration, and Python version being used - to run py.test. Note that for assert statements with a manually provided - message, i.e. ``assert expr, message``, no assertion introspection takes place - and the manually provided message will be rendered in tracebacks. - -??????????????????????????? assert ???????????? assert ?????????????????????????????????????????? assert ????pytest ????pytest ??????????? Python ???????????? ``assert expr, message`` ????????????????????? assert ?????????????????????????????????????????????????????????? - -.. - By default, if the Python version is greater than or equal to 2.6, py.test - rewrites assert statements in test modules. Rewritten assert statements put - introspection information into the assertion failure message. py.test only - rewrites test modules directly discovered by its test collection process, so - asserts in supporting modules which are not themselves test modules will not be - rewritten. - -????????Python ?????? 2.6 ??????py.test ?????????? assert ???????????????? assert ?????????????????????????????????????py.test ????????????????????????????????????????????????????????????????? assert ???????????? - -.. note:: - - .. - py.test rewrites test modules on import. It does this by using an import hook - to write a new pyc files. Most of the time this works transparently. However, - if you are messing with import yourself, the import hook may interfere. If - this is the case, simply use ``--assert=reinterp`` or - ``--assert=plain``. Additionally, rewriting will fail silently if it cannot - write new pycs, i.e. in a read-only filesystem or a zipfile. - - py.test ???????????????????????????? pyc ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ``--assert=reinterp`` ? ``--assert=plain`` ???????????????? pyc ????????????????????????????????????????????????????? zip ??????????????? - -.. - If an assert statement has not been rewritten or the Python version is less than - 2.6, py.test falls back on assert reinterpretation. In assert reinterpretation, - py.test walks the frame of the function containing the assert statement to - discover sub-expression results of the failing assert statement. You can force - py.test to always use assertion reinterpretation by passing the - ``--assert=reinterp`` option. - -assert ?????????????? Python ????? 2.6 ?????????py.test ??????????????????????????????py.test ??assert ????????????????? assert ?????????????????py.test ?????????????????????? ``--assert=reinterp`` ???????????? - -.. - Assert reinterpretation has a caveat not present with assert rewriting: If - evaluating the assert expression has side effects you may get a warning that the - intermediate values could not be determined safely. A common example of this - issue is an assertion which reads from a file:: - -????????????assert ?????????????????????: ??? assert ??????????????????????????????????????????????????????????????????????????????:: - - assert f.read() != '...' - -.. - If this assertion fails then the re-evaluation will probably succeed! - This is because ``f.read()`` will return an empty string when it is - called the second time during the re-evaluation. However, it is - easy to rewrite the assertion and avoid any trouble:: - -??????????????????????????????????????????2???????????? ``f.read()`` ?????????????????????????????????????????????????????:: - - content = f.read() - assert content != '...' - -.. - All assert introspection can be turned off by passing ``--assert=plain``. - -????????????????????????? ``--assert=plain`` ??????? - -.. - For further information, Benjamin Peterson wrote up `Behind the scenes of py.test's new assertion rewriting `_. - -????????Benjamin Peterson ???????? `Behind the scenes of py.test's new assertion rewriting `_ ?????????? - -.. - Add assert rewriting as an alternate introspection technique. - -.. versionadded:: 2.1 - ????????????????? assert ????????? - -.. - Introduce the ``--assert`` option. Deprecate ``--no-assert`` and - ``--nomagic``. - -.. versionchanged:: 2.1 - ``--assert`` ????????? ``--no-assert`` ? ``--nomagic`` ???? diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 20ee36010a19d7273b3635af9796016622d5a719 doc/ja/builtin.txt --- a/doc/ja/builtin.txt +++ /dev/null @@ -1,152 +0,0 @@ - -.. _`pytest helpers`: - -Pytest ?????????? -=========================== - -.. - Pytest builtin helpers - ================================================ - -.. - builtin pytest.* functions and helping objects - ----------------------------------------------------- - -????? pytest.* ????????????? ----------------------------------------------- - -.. - You can always use an interactive Python prompt and type:: - -Python ??????????????????????????:: - - import pytest - help(pytest) - -.. - to get an overview on the globally available helpers. - -???????????????????????????? - -.. automodule:: pytest - :members: - - -.. _builtinfuncargs: - -????????? ------------------- - -.. - Builtin function arguments - ----------------------------------------------------- - -.. - You can ask for available builtin or project-custom - :ref:`function arguments ` by typing:: - -????????????????????????????????? :ref:`????? ` ???????? - - | $ py.test --fixtures - | ====================== test session starts ======================= - | platform linux2 -- Python 2.7.1 -- pytest-2.2.4 - | collected 0 items - | pytestconfig - | pytest ? config ????????????????????????? - | - | capsys - | sys.stdout/sys.stderr ?????????????? - | ???????????? ``(out, err)`` ??????? - | ``capsys.readouterr()`` ?????????? - | - | capfd - | ??????????? 1 ? 2 ????????????? - | ???????????? ``(out, err)`` ??????? - | ``capsys.readouterr()`` ?????????? - | - | tmpdir - | ?????????????????????????????? - | ??????????????????????????????? - | ??? py.path.local ?????????????? - | - | monkeypatch - | ???????????????os.environ ????? - | ??????????????? ``monkeypatch`` ??????????? - | - | monkeypatch.setattr(obj, name, value, raising=True) - | monkeypatch.delattr(obj, name, raising=True) - | monkeypatch.setitem(mapping, name, value) - | monkeypatch.delitem(obj, name, raising=True) - | monkeypatch.setenv(name, value, prepend=False) - | monkeypatch.delenv(name, value, raising=True) - | monkeypatch.syspath_prepend(path) - | monkeypatch.chdir(path) - | - | ????????????????????????????? - | ``raising`` ????????????????????????? - | KeyError ? AttributeError ??????????????? - | - | recwarn - | ??????????? WarningsRecorder ????????? - | - | * ``pop(category=None)``: category ????????????? - | * ``clear()``: ??????????? - | - | ??????? http://docs.python.org/library/warnings.html ? - | ???????? - | - | ======================== in 0.00 seconds ======================== - -.. - $ py.test --fixtures - =========================== test session starts ============================ - platform linux2 -- Python 2.7.1 -- pytest-2.2.4 - collected 0 items - pytestconfig - the pytest config object with access to command line opts. - capsys - enables capturing of writes to sys.stdout/sys.stderr and makes - captured output available via ``capsys.readouterr()`` method calls - which return a ``(out, err)`` tuple. - - capfd - enables capturing of writes to file descriptors 1 and 2 and makes - captured output available via ``capsys.readouterr()`` method calls - which return a ``(out, err)`` tuple. - - tmpdir - return a temporary directory path object - which is unique to each test function invocation, - created as a sub directory of the base temporary - directory. The returned object is a `py.path.local`_ - path object. - - monkeypatch - The returned ``monkeypatch`` funcarg provides these - helper methods to modify objects, dictionaries or os.environ:: - - monkeypatch.setattr(obj, name, value, raising=True) - monkeypatch.delattr(obj, name, raising=True) - monkeypatch.setitem(mapping, name, value) - monkeypatch.delitem(obj, name, raising=True) - monkeypatch.setenv(name, value, prepend=False) - monkeypatch.delenv(name, value, raising=True) - monkeypatch.syspath_prepend(path) - monkeypatch.chdir(path) - - All modifications will be undone after the requesting - test function has finished. The ``raising`` - parameter determines if a KeyError or AttributeError - will be raised if the set/deletion operation has no target. - - recwarn - Return a WarningsRecorder instance that provides these methods: - - * ``pop(category=None)``: return last warning matching the category. - * ``clear()``: clear list of warnings - - See http://docs.python.org/library/warnings.html for information - on warning categories. - - - ============================= in 0.00 seconds ============================= This diff is so big that we needed to truncate the remainder. https://bitbucket.org/hpk42/pytest/commits/584ecf2b2929/ Changeset: 584ecf2b2929 User: pytry Date: 2014-10-05 12:49:15+00:00 Summary: Added test for ValueError in custom assert message with % sign (issue #604) https://bitbucket.org/hpk42/pytest/issue/604/valueerror-unsupported-format-character-in Affected #: 1 file diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 584ecf2b2929c44362e37530e50dbcf894a11e0a testing/test_assertmessage.py --- /dev/null +++ b/testing/test_assertmessage.py @@ -0,0 +1,18 @@ + +def test_assert_message_fail(): + ''' + Check if custom message with % sign do not raise ValueError + Later test can be parametrized with other problematic chars + ''' + + MESSAGE = 'Message with %' + + try: + assert False, MESSAGE + except ValueError, ve: + assert False, 'ValueError was raised with the following message: ' \ + + ve.message + except AssertionError, ae: + assert MESSAGE == ae.message, 'Assertion message: ' + ae.message \ + + ' is different than expected: ' + MESSAGE + \ No newline at end of file https://bitbucket.org/hpk42/pytest/commits/0b301cade559/ Changeset: 0b301cade559 User: bubenkoff Date: 2014-10-06 23:01:21+00:00 Summary: Escape % character in the assertion message. closes #604 Affected #: 4 files diff -r 584ecf2b2929c44362e37530e50dbcf894a11e0a -r 0b301cade559f0efb5d007742d98039d20d18c4c CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,9 @@ - removed outdated japanese docs from source tree. +- Escape % character in the assertion message. + + 2.6.3 ----------- diff -r 584ecf2b2929c44362e37530e50dbcf894a11e0a -r 0b301cade559f0efb5d007742d98039d20d18c4c _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff -r 584ecf2b2929c44362e37530e50dbcf894a11e0a -r 0b301cade559f0efb5d007742d98039d20d18c4c testing/test_assertmessage.py --- a/testing/test_assertmessage.py +++ /dev/null @@ -1,18 +0,0 @@ - -def test_assert_message_fail(): - ''' - Check if custom message with % sign do not raise ValueError - Later test can be parametrized with other problematic chars - ''' - - MESSAGE = 'Message with %' - - try: - assert False, MESSAGE - except ValueError, ve: - assert False, 'ValueError was raised with the following message: ' \ - + ve.message - except AssertionError, ae: - assert MESSAGE == ae.message, 'Assertion message: ' + ae.message \ - + ' is different than expected: ' + MESSAGE - \ No newline at end of file diff -r 584ecf2b2929c44362e37530e50dbcf894a11e0a -r 0b301cade559f0efb5d007742d98039d20d18c4c testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False https://bitbucket.org/hpk42/pytest/commits/bbf03443f0f8/ Changeset: bbf03443f0f8 User: dgilcrease Date: 2014-10-02 21:27:19+00:00 Summary: change the defaults from a tuple to a list so I can use config.addinivalue_line("norecursedirs", "...") to append new options in my own plugins Affected #: 1 file diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r bbf03443f0f87ce84241cd8e0fc667b42df774a5 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", https://bitbucket.org/hpk42/pytest/commits/35032fac3d90/ Changeset: 35032fac3d90 User: dgilcrease Date: 2014-10-02 21:32:35+00:00 Summary: change the defaults from a tuple to a list so I can use config.addinivalue_line("python_files", "...") to append new options in my own plugins Affected #: 1 file diff -r bbf03443f0f87ce84241cd8e0fc667b42df774a5 -r 35032fac3d909727014aedde6db1242c78049cad _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): https://bitbucket.org/hpk42/pytest/commits/859af0cbaee3/ Changeset: 859af0cbaee3 User: dgilcrease Date: 2014-10-02 21:33:48+00:00 Summary: Close branch dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/9445d4794a4d/ Changeset: 9445d4794a4d User: dgilcrease Date: 2014-10-02 21:33:48+00:00 Summary: Merged in dgilcrease/change-defaults-from-a-tuple-to-a-list-1412285169250 (pull request #1) change the defaults from a tuple to a list so I can use config.addinivalue_line("norecursedirs", "...") to append new options in my own plugins Affected #: 2 files diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 9445d4794a4d41d2900f42cd9ed9214bb217279f _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 9445d4794a4d41d2900f42cd9ed9214bb217279f _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): https://bitbucket.org/hpk42/pytest/commits/79a2d44c6c47/ Changeset: 79a2d44c6c47 User: nicoddemus Date: 2014-09-27 15:28:29+00:00 Summary: added plugins_index page generation to tox Also minor improvements in the page: - Removed version from plugin name - Using "home" instead of "repo", seems more appropriate - Reduced default verbosity Affected #: 3 files diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 79a2d44c6c4757d94b445126c4914c9a77aed95a doc/en/plugins_index/index.txt --- a/doc/en/plugins_index/index.txt +++ b/doc/en/plugins_index/index.txt @@ -4,7 +4,7 @@ =========================== The table below contains a listing of plugins found in PyPI and -their status when tested using py.test **2.6.2.dev1** and python 2.7 and +their status when tested using py.test **2.6.4.dev1** and python 2.7 and 3.3. A complete listing can also be found at @@ -12,154 +12,160 @@ status against other py.test releases. -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - Name Py27 Py34 Repo Summary -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - `pytest-allure-adaptor-1.4.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports - :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/allure-framework/allure-python - `pytest-bdd-2.3.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BDD for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd - `pytest-beds-0.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps - :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kaste/pytest-beds - `pytest-bench-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Benchmark utility that plugs into pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/concordusapps/pytest-bench - `pytest-blockage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Disable network requests during a test run. - :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/rob-b/pytest-blockage - `pytest-browsermob-proxy-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy - `pytest-bugzilla-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nibrahim/pytest_bugzilla - `pytest-cache-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ - `pytest-capturelog-0.7 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to capture log messages - :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview - `pytest-codecheckers-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) - :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ - `pytest-config-0.0.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/buzzfeed/pytest_config - `pytest-contextfixture-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Define pytest fixtures as context managers. - :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-contextfixture/ - `pytest-couchdbkit-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit - :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit - `pytest-cov-1.8.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing - :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schlamar/pytest-cov - `pytest-cpp-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-cpp - `pytest-dbfixtures-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Databases fixtures plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures - `pytest-dbus-notification-1.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png D-BUS notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification - `pytest-diffeo-0.1.8.dev1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Common py.test support for Diffeo packages - :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/diffeo/pytest-diffeo - `pytest-django-2.6.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.2.dev1 `http://pytest-django.readthedocs.org/ `_ A Django plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.2.dev1 - `pytest-django-haystack-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Cleanup your Haystack indexes between tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/rouge8/pytest-django-haystack - `pytest-django-lite-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dcramer/pytest-django-lite - `pytest-echo-1.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 `http://pypi.python.org/pypi/pytest-echo/ `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes - :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 - `pytest-eradicate-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check for commented out code - :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/spil-johan/pytest-eradicate - `pytest-figleaf-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf - `pytest-fixture-tools-1.0.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 ? Plugin for pytest which provides tools for fixtures - :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 - `pytest-flakes-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check source code with pyflakes - :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/fschulze/pytest-flakes - `pytest-greendots-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 ? Green progress dots - :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 - `pytest-growl-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 ? Growl notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 - `pytest-httpbin-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kevin1024/pytest-httpbin - `pytest-httpretty-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/papaeye/pytest-httpretty - `pytest-incremental-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) - :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental - `pytest-instafail-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to show failures instantly - :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jpvanhal/pytest-instafail - `pytest-ipdb-0.1-prerelease `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. - :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mverteuil/pytest-ipdb - `pytest-jira-0.01 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test JIRA integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/jlaska/pytest_jira - `pytest-knows-0.1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace - :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mapix/ptknows - `pytest-konira-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run Konira DSL tests with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/alfredodeza/pytest-konira - `pytest-localserver-0.3.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. - :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ - `pytest-marker-bugzilla-0.06 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla - `pytest-markfiltration-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration - `pytest-marks-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-marks - `pytest-mock-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nicoddemus/pytest-mock/ - `pytest-monkeyplus-1.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities - :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ - `pytest-mozwebqa-1.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-mozwebqa - `pytest-oerp-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to test OpenERP modules - :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-oerp/ - `pytest-ordering-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to run your tests in a specific order - :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ftobia/pytest-ordering - `pytest-osxnotify-0.1.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OS X notifications for py.test results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dbader/pytest-osxnotify - `pytest-paste-config-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 ? Allow setting the path to a paste config file - :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 - `pytest-pep8-1.0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements - :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ - `pytest-pipeline-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines - :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bow/pytest_pipeline - `pytest-poo-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Visualize your crappy tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-poo - `pytest-pycharm-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jlubcke/pytest-pycharm - `pytest-pydev-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ - `pytest-pythonpath-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bigsassy/pytest-pythonpath - `pytest-qt-1.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest support for PyQt and PySide applications - :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-qt - `pytest-quickcheck-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck - :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ - `pytest-rage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to implement PEP712 - :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-rage/ - `pytest-raisesregexp-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Walkman/pytest_raisesregexp - `pytest-random-0.02 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to randomize tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-random - `pytest-rerunfailures-0.05 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures - :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-rerunfailures - `pytest-runfailed-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png implement a --failed option for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed - `pytest-runner-2.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/jaraco/pytest-runner - `pytest-sftpserver-1.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. - :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/ulope/pytest-sftpserver/ - `pytest-spec-0.2.22 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION - :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/pchomik/pytest-spec - `pytest-splinter-1.0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Splinter subplugin for Pytest BDD plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/paylogic/pytest-splinter - `pytest-stepwise-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run a test suite one failing test at a time. - :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nip3o/pytest-stepwise - `pytest-sugar-0.3.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). - :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Frozenball/pytest-sugar - `pytest-timeout-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ - `pytest-twisted-1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A twisted plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schmir/pytest-twisted - `pytest-xdist-1.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes - :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist - `pytest-xprocess-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ - `pytest-yamlwsgi-0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 ? Run tests against wsgi apps defined in yaml - :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 - `pytest-zap-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OWASP ZAP plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-zap +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + Name Py27 Py34 Home Summary +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + `pytest-allure-adaptor `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports + :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/allure-framework/allure-python + `pytest-bdd `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BDD for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd + `pytest-beds `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps + :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kaste/pytest-beds + `pytest-bench `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Benchmark utility that plugs into pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/concordusapps/pytest-bench + `pytest-blockage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Disable network requests during a test run. + :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/rob-b/pytest-blockage + `pytest-browsermob-proxy `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy + `pytest-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nibrahim/pytest_bugzilla + `pytest-cache `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ + `pytest-capturelog `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to capture log messages + :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview + `pytest-codecheckers `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) + :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ + `pytest-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/buzzfeed/pytest_config + `pytest-contextfixture `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Define pytest fixtures as context managers. + :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-contextfixture/ + `pytest-couchdbkit `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit + :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit + `pytest-cov `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing + :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schlamar/pytest-cov + `pytest-cpp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-cpp + `pytest-dbfixtures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Databases fixtures plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures + `pytest-dbus-notification `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png D-BUS notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification + `pytest-describe `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Describe-style plugin for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ropez/pytest-describe + `pytest-diffeo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Common py.test support for Diffeo packages + :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/diffeo/pytest-diffeo + `pytest-django `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.4.dev1 `link `_ A Django plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.4.dev1 + `pytest-django-haystack `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Cleanup your Haystack indexes between tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/rouge8/pytest-django-haystack + `pytest-django-lite `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dcramer/pytest-django-lite + `pytest-echo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 `link `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes + :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 + `pytest-eradicate `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check for commented out code + :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/spil-johan/pytest-eradicate + `pytest-figleaf `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf + `pytest-fixture-tools `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 ? Plugin for pytest which provides tools for fixtures + :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 + `pytest-flakes `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check source code with pyflakes + :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/fschulze/pytest-flakes + `pytest-flask `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A set of py.test fixtures to test Flask applications. + :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/vitalk/pytest-flask + `pytest-greendots `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 ? Green progress dots + :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 + `pytest-growl `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 ? Growl notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 + `pytest-httpbin `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kevin1024/pytest-httpbin + `pytest-httpretty `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/papaeye/pytest-httpretty + `pytest-incremental `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) + :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental + `pytest-instafail `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to show failures instantly + :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jpvanhal/pytest-instafail + `pytest-ipdb `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. + :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mverteuil/pytest-ipdb + `pytest-jira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test JIRA integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/jlaska/pytest_jira + `pytest-knows `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace + :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mapix/ptknows + `pytest-konira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run Konira DSL tests with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/alfredodeza/pytest-konira + `pytest-localserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. + :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ + `pytest-marker-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla + `pytest-markfiltration `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration + `pytest-marks `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-marks + `pytest-mock `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nicoddemus/pytest-mock/ + `pytest-monkeyplus `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities + :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ + `pytest-mozwebqa `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-mozwebqa + `pytest-oerp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to test OpenERP modules + :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-oerp/ + `pytest-ordering `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to run your tests in a specific order + :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ftobia/pytest-ordering + `pytest-osxnotify `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OS X notifications for py.test results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dbader/pytest-osxnotify + `pytest-paste-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 ? Allow setting the path to a paste config file + :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 + `pytest-pep8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements + :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ + `pytest-pipeline `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines + :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bow/pytest_pipeline + `pytest-poo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Visualize your crappy tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-poo + `pytest-pycharm `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jlubcke/pytest-pycharm + `pytest-pydev `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ + `pytest-pythonpath `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bigsassy/pytest-pythonpath + `pytest-qt `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest support for PyQt and PySide applications + :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-qt + `pytest-quickcheck `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck + :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ + `pytest-rage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to implement PEP712 + :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-rage/ + `pytest-raisesregexp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Walkman/pytest_raisesregexp + `pytest-random `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to randomize tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-random + `pytest-regtest `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 `link `_ py.test plugin for regression tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 + `pytest-rerunfailures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures + :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-rerunfailures + `pytest-runfailed `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png implement a --failed option for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed + `pytest-runner `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png Invoke py.test as distutils command with dependency resolution. + :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/jaraco/pytest-runner + `pytest-sftpserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. + :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/ulope/pytest-sftpserver/ + `pytest-spec `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION + :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pchomik/pytest-spec + `pytest-splinter `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Splinter plugin for pytest testing framework + :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pytest-dev/pytest-splinter + `pytest-stepwise `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run a test suite one failing test at a time. + :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nip3o/pytest-stepwise + `pytest-sugar `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). + :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Frozenball/pytest-sugar + `pytest-timeout `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ + `pytest-twisted `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A twisted plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schmir/pytest-twisted + `pytest-xdist `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes + :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist + `pytest-xprocess `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ + `pytest-yamlwsgi `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 ? Run tests against wsgi apps defined in yaml + :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 + `pytest-zap `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OWASP ZAP plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-zap -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= -*(Updated on 2014-08-26)* +*(Updated on 2014-09-27)* diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 79a2d44c6c4757d94b445126c4914c9a77aed95a doc/en/plugins_index/plugins_index.py --- a/doc/en/plugins_index/plugins_index.py +++ b/doc/en/plugins_index/plugins_index.py @@ -61,7 +61,7 @@ yield name, str(loose_version) -def obtain_plugins_table(plugins, client): +def obtain_plugins_table(plugins, client, verbose): """ Returns information to populate a table of plugins, their versions, authors, etc. @@ -72,6 +72,7 @@ :param plugins: list of (name, version) :param client: ServerProxy + :param verbose: print plugin name and version as they are fetch """ def get_repo_markup(repo): """ @@ -96,7 +97,7 @@ pad_right = ('%-' + str(len(target_markup)) + 's') return pad_right % image_markup, target_markup else: - return ('`%s <%s>`_' % (target, target)), '' + return ('`link <%s>`_' % target), '' def sanitize_summary(summary): """Make sure summaries don't break our table formatting. @@ -105,13 +106,14 @@ rows = [] ColumnData = namedtuple('ColumnData', 'text link') - headers = ['Name', 'Py27', 'Py34', 'Repo', 'Summary'] + headers = ['Name', 'Py27', 'Py34', 'Home', 'Summary'] pytest_version = pytest.__version__ repositories = obtain_override_repositories() - print('*** pytest-{0} ***'.format(pytest_version)) + print('Generating plugins_index page (pytest-{0})'.format(pytest_version)) plugins = list(plugins) for index, (package_name, version) in enumerate(plugins): - print(package_name, version, '...', end='') + if verbose: + print(package_name, version, '...', end='') release_data = client.release_data(package_name, version) @@ -128,7 +130,7 @@ image_url = url.format(**common_params) image_url += '?py={py}&pytest={pytest}' row = ( - ColumnData(package_name + "-" + version, release_data['package_url']), + ColumnData(package_name, release_data['package_url']), ColumnData(image_url.format(py='py27', pytest=pytest_version), None), ColumnData(image_url.format(py='py34', pytest=pytest_version), @@ -159,7 +161,10 @@ assert len(row) == len(headers) rows.append(row) - print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + if verbose: + print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + + print('Done: %d plugins' % len(plugins)) return headers, rows @@ -235,16 +240,17 @@ print('*(Updated on %s)*' % today, file=f) -def generate_plugins_index(client, filename): +def generate_plugins_index(client, filename, verbose): """ Generates an RST file with a table of the latest pytest plugins found in PyPI. :param client: ServerProxy :param filename: output filename + :param verbose: print name and version of each plugin as they are fetch """ plugins = get_latest_versions(iter_plugins(client)) - headers, rows = obtain_plugins_table(plugins, client) + headers, rows = obtain_plugins_table(plugins, client, verbose) generate_plugins_index_from_table(filename, headers, rows) @@ -262,13 +268,15 @@ help='output filename [default: %default]') parser.add_option('-u', '--url', default=url, help='url of PyPI server to obtain data from [default: %default]') + parser.add_option('-v', '--verbose', default=False, action='store_true', + help='verbose output') (options, _) = parser.parse_args(argv[1:]) client = get_proxy(options.url) - generate_plugins_index(client, options.filename) + generate_plugins_index(client, options.filename, options.verbose) print() - print('%s Updated.' % options.filename) + print('%s updated.' % options.filename) return 0 diff -r 90704834830321ab6a886ceb6e416de1059fbf39 -r 79a2d44c6c4757d94b445126c4914c9a77aed95a tox.ini --- a/tox.ini +++ b/tox.ini @@ -89,6 +89,7 @@ PyYAML commands= + {envpython} plugins_index/plugins_index.py make clean make html https://bitbucket.org/hpk42/pytest/commits/a3f602f89430/ Changeset: a3f602f89430 User: hpk42 Date: 2014-10-06 09:23:41+00:00 Summary: Merged in nicoddemus/pytest (pull request #214) added plugins_index page generation to tox Affected #: 3 files diff -r 9445d4794a4d41d2900f42cd9ed9214bb217279f -r a3f602f89430fa3b978ce2df7c5cf7f062710a80 doc/en/plugins_index/index.txt --- a/doc/en/plugins_index/index.txt +++ b/doc/en/plugins_index/index.txt @@ -4,7 +4,7 @@ =========================== The table below contains a listing of plugins found in PyPI and -their status when tested using py.test **2.6.2.dev1** and python 2.7 and +their status when tested using py.test **2.6.4.dev1** and python 2.7 and 3.3. A complete listing can also be found at @@ -12,154 +12,160 @@ status against other py.test releases. -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - Name Py27 Py34 Repo Summary -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - `pytest-allure-adaptor-1.4.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports - :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/allure-framework/allure-python - `pytest-bdd-2.3.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BDD for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd - `pytest-beds-0.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps - :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kaste/pytest-beds - `pytest-bench-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Benchmark utility that plugs into pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/concordusapps/pytest-bench - `pytest-blockage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Disable network requests during a test run. - :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/rob-b/pytest-blockage - `pytest-browsermob-proxy-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy - `pytest-bugzilla-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nibrahim/pytest_bugzilla - `pytest-cache-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ - `pytest-capturelog-0.7 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to capture log messages - :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview - `pytest-codecheckers-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) - :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ - `pytest-config-0.0.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/buzzfeed/pytest_config - `pytest-contextfixture-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Define pytest fixtures as context managers. - :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-contextfixture/ - `pytest-couchdbkit-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit - :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit - `pytest-cov-1.8.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing - :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schlamar/pytest-cov - `pytest-cpp-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-cpp - `pytest-dbfixtures-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Databases fixtures plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures - `pytest-dbus-notification-1.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png D-BUS notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification - `pytest-diffeo-0.1.8.dev1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Common py.test support for Diffeo packages - :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/diffeo/pytest-diffeo - `pytest-django-2.6.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.2.dev1 `http://pytest-django.readthedocs.org/ `_ A Django plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.2.dev1 - `pytest-django-haystack-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Cleanup your Haystack indexes between tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/rouge8/pytest-django-haystack - `pytest-django-lite-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dcramer/pytest-django-lite - `pytest-echo-1.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 `http://pypi.python.org/pypi/pytest-echo/ `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes - :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 - `pytest-eradicate-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check for commented out code - :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/spil-johan/pytest-eradicate - `pytest-figleaf-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf - `pytest-fixture-tools-1.0.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 ? Plugin for pytest which provides tools for fixtures - :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 - `pytest-flakes-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check source code with pyflakes - :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/fschulze/pytest-flakes - `pytest-greendots-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 ? Green progress dots - :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 - `pytest-growl-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 ? Growl notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 - `pytest-httpbin-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kevin1024/pytest-httpbin - `pytest-httpretty-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/papaeye/pytest-httpretty - `pytest-incremental-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) - :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental - `pytest-instafail-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to show failures instantly - :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jpvanhal/pytest-instafail - `pytest-ipdb-0.1-prerelease `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. - :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mverteuil/pytest-ipdb - `pytest-jira-0.01 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test JIRA integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/jlaska/pytest_jira - `pytest-knows-0.1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace - :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mapix/ptknows - `pytest-konira-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run Konira DSL tests with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/alfredodeza/pytest-konira - `pytest-localserver-0.3.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. - :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ - `pytest-marker-bugzilla-0.06 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla - `pytest-markfiltration-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration - `pytest-marks-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-marks - `pytest-mock-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nicoddemus/pytest-mock/ - `pytest-monkeyplus-1.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities - :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ - `pytest-mozwebqa-1.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-mozwebqa - `pytest-oerp-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to test OpenERP modules - :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-oerp/ - `pytest-ordering-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to run your tests in a specific order - :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ftobia/pytest-ordering - `pytest-osxnotify-0.1.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OS X notifications for py.test results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dbader/pytest-osxnotify - `pytest-paste-config-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 ? Allow setting the path to a paste config file - :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 - `pytest-pep8-1.0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements - :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ - `pytest-pipeline-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines - :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bow/pytest_pipeline - `pytest-poo-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Visualize your crappy tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-poo - `pytest-pycharm-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jlubcke/pytest-pycharm - `pytest-pydev-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ - `pytest-pythonpath-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bigsassy/pytest-pythonpath - `pytest-qt-1.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest support for PyQt and PySide applications - :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-qt - `pytest-quickcheck-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck - :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ - `pytest-rage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to implement PEP712 - :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-rage/ - `pytest-raisesregexp-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Walkman/pytest_raisesregexp - `pytest-random-0.02 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to randomize tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-random - `pytest-rerunfailures-0.05 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures - :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-rerunfailures - `pytest-runfailed-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png implement a --failed option for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed - `pytest-runner-2.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/jaraco/pytest-runner - `pytest-sftpserver-1.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. - :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/ulope/pytest-sftpserver/ - `pytest-spec-0.2.22 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION - :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/pchomik/pytest-spec - `pytest-splinter-1.0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Splinter subplugin for Pytest BDD plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/paylogic/pytest-splinter - `pytest-stepwise-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run a test suite one failing test at a time. - :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nip3o/pytest-stepwise - `pytest-sugar-0.3.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). - :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Frozenball/pytest-sugar - `pytest-timeout-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ - `pytest-twisted-1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A twisted plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schmir/pytest-twisted - `pytest-xdist-1.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes - :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist - `pytest-xprocess-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ - `pytest-yamlwsgi-0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 ? Run tests against wsgi apps defined in yaml - :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 - `pytest-zap-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OWASP ZAP plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-zap +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + Name Py27 Py34 Home Summary +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + `pytest-allure-adaptor `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports + :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/allure-framework/allure-python + `pytest-bdd `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BDD for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd + `pytest-beds `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps + :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kaste/pytest-beds + `pytest-bench `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Benchmark utility that plugs into pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/concordusapps/pytest-bench + `pytest-blockage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Disable network requests during a test run. + :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/rob-b/pytest-blockage + `pytest-browsermob-proxy `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy + `pytest-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nibrahim/pytest_bugzilla + `pytest-cache `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ + `pytest-capturelog `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to capture log messages + :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview + `pytest-codecheckers `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) + :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ + `pytest-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/buzzfeed/pytest_config + `pytest-contextfixture `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Define pytest fixtures as context managers. + :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-contextfixture/ + `pytest-couchdbkit `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit + :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit + `pytest-cov `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing + :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schlamar/pytest-cov + `pytest-cpp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-cpp + `pytest-dbfixtures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Databases fixtures plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures + `pytest-dbus-notification `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png D-BUS notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification + `pytest-describe `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Describe-style plugin for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ropez/pytest-describe + `pytest-diffeo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Common py.test support for Diffeo packages + :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/diffeo/pytest-diffeo + `pytest-django `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.4.dev1 `link `_ A Django plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.4.dev1 + `pytest-django-haystack `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Cleanup your Haystack indexes between tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/rouge8/pytest-django-haystack + `pytest-django-lite `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dcramer/pytest-django-lite + `pytest-echo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 `link `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes + :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 + `pytest-eradicate `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check for commented out code + :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/spil-johan/pytest-eradicate + `pytest-figleaf `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf + `pytest-fixture-tools `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 ? Plugin for pytest which provides tools for fixtures + :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 + `pytest-flakes `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check source code with pyflakes + :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/fschulze/pytest-flakes + `pytest-flask `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A set of py.test fixtures to test Flask applications. + :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/vitalk/pytest-flask + `pytest-greendots `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 ? Green progress dots + :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 + `pytest-growl `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 ? Growl notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 + `pytest-httpbin `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kevin1024/pytest-httpbin + `pytest-httpretty `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/papaeye/pytest-httpretty + `pytest-incremental `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) + :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental + `pytest-instafail `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to show failures instantly + :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jpvanhal/pytest-instafail + `pytest-ipdb `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. + :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mverteuil/pytest-ipdb + `pytest-jira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test JIRA integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/jlaska/pytest_jira + `pytest-knows `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace + :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mapix/ptknows + `pytest-konira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run Konira DSL tests with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/alfredodeza/pytest-konira + `pytest-localserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. + :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ + `pytest-marker-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla + `pytest-markfiltration `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration + `pytest-marks `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-marks + `pytest-mock `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nicoddemus/pytest-mock/ + `pytest-monkeyplus `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities + :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ + `pytest-mozwebqa `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-mozwebqa + `pytest-oerp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to test OpenERP modules + :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-oerp/ + `pytest-ordering `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to run your tests in a specific order + :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ftobia/pytest-ordering + `pytest-osxnotify `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OS X notifications for py.test results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dbader/pytest-osxnotify + `pytest-paste-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 ? Allow setting the path to a paste config file + :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 + `pytest-pep8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements + :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ + `pytest-pipeline `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines + :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bow/pytest_pipeline + `pytest-poo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Visualize your crappy tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-poo + `pytest-pycharm `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jlubcke/pytest-pycharm + `pytest-pydev `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ + `pytest-pythonpath `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bigsassy/pytest-pythonpath + `pytest-qt `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest support for PyQt and PySide applications + :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-qt + `pytest-quickcheck `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck + :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ + `pytest-rage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to implement PEP712 + :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-rage/ + `pytest-raisesregexp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Walkman/pytest_raisesregexp + `pytest-random `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to randomize tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-random + `pytest-regtest `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 `link `_ py.test plugin for regression tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 + `pytest-rerunfailures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures + :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-rerunfailures + `pytest-runfailed `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png implement a --failed option for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed + `pytest-runner `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png Invoke py.test as distutils command with dependency resolution. + :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/jaraco/pytest-runner + `pytest-sftpserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. + :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/ulope/pytest-sftpserver/ + `pytest-spec `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION + :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pchomik/pytest-spec + `pytest-splinter `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Splinter plugin for pytest testing framework + :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pytest-dev/pytest-splinter + `pytest-stepwise `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run a test suite one failing test at a time. + :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nip3o/pytest-stepwise + `pytest-sugar `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). + :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Frozenball/pytest-sugar + `pytest-timeout `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ + `pytest-twisted `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A twisted plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schmir/pytest-twisted + `pytest-xdist `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes + :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist + `pytest-xprocess `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ + `pytest-yamlwsgi `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 ? Run tests against wsgi apps defined in yaml + :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 + `pytest-zap `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OWASP ZAP plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-zap -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= -*(Updated on 2014-08-26)* +*(Updated on 2014-09-27)* diff -r 9445d4794a4d41d2900f42cd9ed9214bb217279f -r a3f602f89430fa3b978ce2df7c5cf7f062710a80 doc/en/plugins_index/plugins_index.py --- a/doc/en/plugins_index/plugins_index.py +++ b/doc/en/plugins_index/plugins_index.py @@ -61,7 +61,7 @@ yield name, str(loose_version) -def obtain_plugins_table(plugins, client): +def obtain_plugins_table(plugins, client, verbose): """ Returns information to populate a table of plugins, their versions, authors, etc. @@ -72,6 +72,7 @@ :param plugins: list of (name, version) :param client: ServerProxy + :param verbose: print plugin name and version as they are fetch """ def get_repo_markup(repo): """ @@ -96,7 +97,7 @@ pad_right = ('%-' + str(len(target_markup)) + 's') return pad_right % image_markup, target_markup else: - return ('`%s <%s>`_' % (target, target)), '' + return ('`link <%s>`_' % target), '' def sanitize_summary(summary): """Make sure summaries don't break our table formatting. @@ -105,13 +106,14 @@ rows = [] ColumnData = namedtuple('ColumnData', 'text link') - headers = ['Name', 'Py27', 'Py34', 'Repo', 'Summary'] + headers = ['Name', 'Py27', 'Py34', 'Home', 'Summary'] pytest_version = pytest.__version__ repositories = obtain_override_repositories() - print('*** pytest-{0} ***'.format(pytest_version)) + print('Generating plugins_index page (pytest-{0})'.format(pytest_version)) plugins = list(plugins) for index, (package_name, version) in enumerate(plugins): - print(package_name, version, '...', end='') + if verbose: + print(package_name, version, '...', end='') release_data = client.release_data(package_name, version) @@ -128,7 +130,7 @@ image_url = url.format(**common_params) image_url += '?py={py}&pytest={pytest}' row = ( - ColumnData(package_name + "-" + version, release_data['package_url']), + ColumnData(package_name, release_data['package_url']), ColumnData(image_url.format(py='py27', pytest=pytest_version), None), ColumnData(image_url.format(py='py34', pytest=pytest_version), @@ -159,7 +161,10 @@ assert len(row) == len(headers) rows.append(row) - print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + if verbose: + print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + + print('Done: %d plugins' % len(plugins)) return headers, rows @@ -235,16 +240,17 @@ print('*(Updated on %s)*' % today, file=f) -def generate_plugins_index(client, filename): +def generate_plugins_index(client, filename, verbose): """ Generates an RST file with a table of the latest pytest plugins found in PyPI. :param client: ServerProxy :param filename: output filename + :param verbose: print name and version of each plugin as they are fetch """ plugins = get_latest_versions(iter_plugins(client)) - headers, rows = obtain_plugins_table(plugins, client) + headers, rows = obtain_plugins_table(plugins, client, verbose) generate_plugins_index_from_table(filename, headers, rows) @@ -262,13 +268,15 @@ help='output filename [default: %default]') parser.add_option('-u', '--url', default=url, help='url of PyPI server to obtain data from [default: %default]') + parser.add_option('-v', '--verbose', default=False, action='store_true', + help='verbose output') (options, _) = parser.parse_args(argv[1:]) client = get_proxy(options.url) - generate_plugins_index(client, options.filename) + generate_plugins_index(client, options.filename, options.verbose) print() - print('%s Updated.' % options.filename) + print('%s updated.' % options.filename) return 0 diff -r 9445d4794a4d41d2900f42cd9ed9214bb217279f -r a3f602f89430fa3b978ce2df7c5cf7f062710a80 tox.ini --- a/tox.ini +++ b/tox.ini @@ -89,6 +89,7 @@ PyYAML commands= + {envpython} plugins_index/plugins_index.py make clean make html https://bitbucket.org/hpk42/pytest/commits/ccee06825c45/ Changeset: ccee06825c45 User: nicoddemus Date: 2014-10-04 17:48:19+00:00 Summary: Adding docs on how to properly add new hooks and using them in 3rd party plugins Affected #: 1 file diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r ccee06825c45f9b93767f7309deea03ddb064673 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== https://bitbucket.org/hpk42/pytest/commits/697813c66cf0/ Changeset: 697813c66cf0 User: hpk42 Date: 2014-10-06 09:55:35+00:00 Summary: Merged in nicoddemus/pytest/defer-hook-example (pull request #216) Documentation for new hooks and how to use them Affected #: 1 file diff -r a3f602f89430fa3b978ce2df7c5cf7f062710a80 -r 697813c66cf0056af5c24ef4f208f2fae3f9f941 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== https://bitbucket.org/hpk42/pytest/commits/419cf940162f/ Changeset: 419cf940162f User: hpk42 Date: 2014-10-06 09:56:56+00:00 Summary: add some changelog entries Affected #: 1 file diff -r 697813c66cf0056af5c24ef4f208f2fae3f9f941 -r 419cf940162fd36232f2ca745f2328ccdc88737e CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,10 @@ - removed outdated japanese docs from source tree. +- docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. + +- updated plugin index docs. Thanks Bruno Oliveira. + 2.6.3 ----------- https://bitbucket.org/hpk42/pytest/commits/2e20e7451b99/ Changeset: 2e20e7451b99 User: hpk42 Date: 2014-10-06 10:11:48+00:00 Summary: fix issue557: with "-k" we only allow the old style "-" for negation at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. Affected #: 3 files diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r 2e20e7451b991338bb7d9cd9682fc3fd6e9b3687 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,10 @@ - updated plugin index docs. Thanks Bruno Oliveira. +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + 2.6.3 ----------- diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r 2e20e7451b991338bb7d9cd9682fc3fd6e9b3687 _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r 2e20e7451b991338bb7d9cd9682fc3fd6e9b3687 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" https://bitbucket.org/hpk42/pytest/commits/6de55c6ed436/ Changeset: 6de55c6ed436 User: bubenkoff Date: 2014-10-06 11:42:53+00:00 Summary: Close branch issue557 Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/fedc512af8b8/ Changeset: fedc512af8b8 User: bubenkoff Date: 2014-10-06 11:42:53+00:00 Summary: Merged in issue557 (pull request #218) fix issue557: with "-k" we only allow the old style "-" for negation Affected #: 3 files diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r fedc512af8b83c220b41eae7826cd74583749af7 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,10 @@ - updated plugin index docs. Thanks Bruno Oliveira. +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + 2.6.3 ----------- diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r fedc512af8b83c220b41eae7826cd74583749af7 _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 419cf940162fd36232f2ca745f2328ccdc88737e -r fedc512af8b83c220b41eae7826cd74583749af7 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" https://bitbucket.org/hpk42/pytest/commits/b16fd18d4410/ Changeset: b16fd18d4410 User: bubenkoff Date: 2014-10-06 23:06:15+00:00 Summary: merge with default Affected #: 9 files diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,8 +5,15 @@ - removed outdated japanese docs from source tree. -- Escape % character in the assertion message. +- docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. +- updated plugin index docs. Thanks Bruno Oliveira. + +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + +- fix issue604: Escape % character in the assertion message. 2.6.3 ----------- diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 doc/en/plugins_index/index.txt --- a/doc/en/plugins_index/index.txt +++ b/doc/en/plugins_index/index.txt @@ -4,7 +4,7 @@ =========================== The table below contains a listing of plugins found in PyPI and -their status when tested using py.test **2.6.2.dev1** and python 2.7 and +their status when tested using py.test **2.6.4.dev1** and python 2.7 and 3.3. A complete listing can also be found at @@ -12,154 +12,160 @@ status against other py.test releases. -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - Name Py27 Py34 Repo Summary -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - `pytest-allure-adaptor-1.4.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports - :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/allure-framework/allure-python - `pytest-bdd-2.3.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BDD for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd - `pytest-beds-0.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps - :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kaste/pytest-beds - `pytest-bench-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Benchmark utility that plugs into pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/concordusapps/pytest-bench - `pytest-blockage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Disable network requests during a test run. - :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/rob-b/pytest-blockage - `pytest-browsermob-proxy-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy - `pytest-bugzilla-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nibrahim/pytest_bugzilla - `pytest-cache-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ - `pytest-capturelog-0.7 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to capture log messages - :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview - `pytest-codecheckers-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) - :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ - `pytest-config-0.0.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/buzzfeed/pytest_config - `pytest-contextfixture-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Define pytest fixtures as context managers. - :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-contextfixture/ - `pytest-couchdbkit-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit - :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit - `pytest-cov-1.8.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing - :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schlamar/pytest-cov - `pytest-cpp-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-cpp - `pytest-dbfixtures-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Databases fixtures plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures - `pytest-dbus-notification-1.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png D-BUS notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification - `pytest-diffeo-0.1.8.dev1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Common py.test support for Diffeo packages - :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/diffeo/pytest-diffeo - `pytest-django-2.6.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.2.dev1 `http://pytest-django.readthedocs.org/ `_ A Django plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.2.dev1 - `pytest-django-haystack-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Cleanup your Haystack indexes between tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/rouge8/pytest-django-haystack - `pytest-django-lite-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dcramer/pytest-django-lite - `pytest-echo-1.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 `http://pypi.python.org/pypi/pytest-echo/ `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes - :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 - `pytest-eradicate-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check for commented out code - :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/spil-johan/pytest-eradicate - `pytest-figleaf-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf - `pytest-fixture-tools-1.0.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 ? Plugin for pytest which provides tools for fixtures - :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 - `pytest-flakes-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check source code with pyflakes - :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/fschulze/pytest-flakes - `pytest-greendots-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 ? Green progress dots - :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 - `pytest-growl-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 ? Growl notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 - `pytest-httpbin-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kevin1024/pytest-httpbin - `pytest-httpretty-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/papaeye/pytest-httpretty - `pytest-incremental-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) - :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental - `pytest-instafail-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to show failures instantly - :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jpvanhal/pytest-instafail - `pytest-ipdb-0.1-prerelease `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. - :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mverteuil/pytest-ipdb - `pytest-jira-0.01 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test JIRA integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/jlaska/pytest_jira - `pytest-knows-0.1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace - :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mapix/ptknows - `pytest-konira-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run Konira DSL tests with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/alfredodeza/pytest-konira - `pytest-localserver-0.3.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. - :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ - `pytest-marker-bugzilla-0.06 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla - `pytest-markfiltration-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration - `pytest-marks-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-marks - `pytest-mock-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nicoddemus/pytest-mock/ - `pytest-monkeyplus-1.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities - :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ - `pytest-mozwebqa-1.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-mozwebqa - `pytest-oerp-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to test OpenERP modules - :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-oerp/ - `pytest-ordering-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to run your tests in a specific order - :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ftobia/pytest-ordering - `pytest-osxnotify-0.1.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OS X notifications for py.test results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dbader/pytest-osxnotify - `pytest-paste-config-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 ? Allow setting the path to a paste config file - :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 - `pytest-pep8-1.0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements - :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ - `pytest-pipeline-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines - :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bow/pytest_pipeline - `pytest-poo-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Visualize your crappy tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-poo - `pytest-pycharm-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jlubcke/pytest-pycharm - `pytest-pydev-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ - `pytest-pythonpath-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bigsassy/pytest-pythonpath - `pytest-qt-1.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest support for PyQt and PySide applications - :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-qt - `pytest-quickcheck-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck - :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ - `pytest-rage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to implement PEP712 - :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-rage/ - `pytest-raisesregexp-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Walkman/pytest_raisesregexp - `pytest-random-0.02 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to randomize tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-random - `pytest-rerunfailures-0.05 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures - :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-rerunfailures - `pytest-runfailed-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png implement a --failed option for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed - `pytest-runner-2.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/jaraco/pytest-runner - `pytest-sftpserver-1.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. - :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/ulope/pytest-sftpserver/ - `pytest-spec-0.2.22 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION - :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/pchomik/pytest-spec - `pytest-splinter-1.0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Splinter subplugin for Pytest BDD plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/paylogic/pytest-splinter - `pytest-stepwise-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run a test suite one failing test at a time. - :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nip3o/pytest-stepwise - `pytest-sugar-0.3.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). - :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Frozenball/pytest-sugar - `pytest-timeout-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ - `pytest-twisted-1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A twisted plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schmir/pytest-twisted - `pytest-xdist-1.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes - :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist - `pytest-xprocess-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ - `pytest-yamlwsgi-0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 ? Run tests against wsgi apps defined in yaml - :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 - `pytest-zap-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OWASP ZAP plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-zap +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + Name Py27 Py34 Home Summary +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + `pytest-allure-adaptor `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports + :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/allure-framework/allure-python + `pytest-bdd `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BDD for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd + `pytest-beds `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps + :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kaste/pytest-beds + `pytest-bench `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Benchmark utility that plugs into pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/concordusapps/pytest-bench + `pytest-blockage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Disable network requests during a test run. + :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/rob-b/pytest-blockage + `pytest-browsermob-proxy `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy + `pytest-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nibrahim/pytest_bugzilla + `pytest-cache `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ + `pytest-capturelog `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to capture log messages + :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview + `pytest-codecheckers `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) + :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ + `pytest-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/buzzfeed/pytest_config + `pytest-contextfixture `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Define pytest fixtures as context managers. + :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-contextfixture/ + `pytest-couchdbkit `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit + :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit + `pytest-cov `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing + :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schlamar/pytest-cov + `pytest-cpp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-cpp + `pytest-dbfixtures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Databases fixtures plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures + `pytest-dbus-notification `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png D-BUS notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification + `pytest-describe `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Describe-style plugin for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ropez/pytest-describe + `pytest-diffeo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Common py.test support for Diffeo packages + :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/diffeo/pytest-diffeo + `pytest-django `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.4.dev1 `link `_ A Django plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.4.dev1 + `pytest-django-haystack `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Cleanup your Haystack indexes between tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/rouge8/pytest-django-haystack + `pytest-django-lite `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dcramer/pytest-django-lite + `pytest-echo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 `link `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes + :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 + `pytest-eradicate `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check for commented out code + :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/spil-johan/pytest-eradicate + `pytest-figleaf `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf + `pytest-fixture-tools `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 ? Plugin for pytest which provides tools for fixtures + :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 + `pytest-flakes `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check source code with pyflakes + :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/fschulze/pytest-flakes + `pytest-flask `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A set of py.test fixtures to test Flask applications. + :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/vitalk/pytest-flask + `pytest-greendots `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 ? Green progress dots + :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 + `pytest-growl `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 ? Growl notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 + `pytest-httpbin `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kevin1024/pytest-httpbin + `pytest-httpretty `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/papaeye/pytest-httpretty + `pytest-incremental `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) + :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental + `pytest-instafail `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to show failures instantly + :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jpvanhal/pytest-instafail + `pytest-ipdb `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. + :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mverteuil/pytest-ipdb + `pytest-jira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test JIRA integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/jlaska/pytest_jira + `pytest-knows `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace + :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mapix/ptknows + `pytest-konira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run Konira DSL tests with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/alfredodeza/pytest-konira + `pytest-localserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. + :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ + `pytest-marker-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla + `pytest-markfiltration `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration + `pytest-marks `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-marks + `pytest-mock `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nicoddemus/pytest-mock/ + `pytest-monkeyplus `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities + :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ + `pytest-mozwebqa `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-mozwebqa + `pytest-oerp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to test OpenERP modules + :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-oerp/ + `pytest-ordering `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to run your tests in a specific order + :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ftobia/pytest-ordering + `pytest-osxnotify `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OS X notifications for py.test results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dbader/pytest-osxnotify + `pytest-paste-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 ? Allow setting the path to a paste config file + :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 + `pytest-pep8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements + :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ + `pytest-pipeline `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines + :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bow/pytest_pipeline + `pytest-poo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Visualize your crappy tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-poo + `pytest-pycharm `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jlubcke/pytest-pycharm + `pytest-pydev `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ + `pytest-pythonpath `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bigsassy/pytest-pythonpath + `pytest-qt `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest support for PyQt and PySide applications + :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-qt + `pytest-quickcheck `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck + :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ + `pytest-rage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to implement PEP712 + :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-rage/ + `pytest-raisesregexp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Walkman/pytest_raisesregexp + `pytest-random `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to randomize tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-random + `pytest-regtest `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 `link `_ py.test plugin for regression tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 + `pytest-rerunfailures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures + :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-rerunfailures + `pytest-runfailed `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png implement a --failed option for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed + `pytest-runner `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png Invoke py.test as distutils command with dependency resolution. + :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/jaraco/pytest-runner + `pytest-sftpserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. + :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/ulope/pytest-sftpserver/ + `pytest-spec `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION + :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pchomik/pytest-spec + `pytest-splinter `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Splinter plugin for pytest testing framework + :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pytest-dev/pytest-splinter + `pytest-stepwise `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run a test suite one failing test at a time. + :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nip3o/pytest-stepwise + `pytest-sugar `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). + :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Frozenball/pytest-sugar + `pytest-timeout `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ + `pytest-twisted `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A twisted plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schmir/pytest-twisted + `pytest-xdist `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes + :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist + `pytest-xprocess `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ + `pytest-yamlwsgi `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 ? Run tests against wsgi apps defined in yaml + :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 + `pytest-zap `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OWASP ZAP plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-zap -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= -*(Updated on 2014-08-26)* +*(Updated on 2014-09-27)* diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 doc/en/plugins_index/plugins_index.py --- a/doc/en/plugins_index/plugins_index.py +++ b/doc/en/plugins_index/plugins_index.py @@ -61,7 +61,7 @@ yield name, str(loose_version) -def obtain_plugins_table(plugins, client): +def obtain_plugins_table(plugins, client, verbose): """ Returns information to populate a table of plugins, their versions, authors, etc. @@ -72,6 +72,7 @@ :param plugins: list of (name, version) :param client: ServerProxy + :param verbose: print plugin name and version as they are fetch """ def get_repo_markup(repo): """ @@ -96,7 +97,7 @@ pad_right = ('%-' + str(len(target_markup)) + 's') return pad_right % image_markup, target_markup else: - return ('`%s <%s>`_' % (target, target)), '' + return ('`link <%s>`_' % target), '' def sanitize_summary(summary): """Make sure summaries don't break our table formatting. @@ -105,13 +106,14 @@ rows = [] ColumnData = namedtuple('ColumnData', 'text link') - headers = ['Name', 'Py27', 'Py34', 'Repo', 'Summary'] + headers = ['Name', 'Py27', 'Py34', 'Home', 'Summary'] pytest_version = pytest.__version__ repositories = obtain_override_repositories() - print('*** pytest-{0} ***'.format(pytest_version)) + print('Generating plugins_index page (pytest-{0})'.format(pytest_version)) plugins = list(plugins) for index, (package_name, version) in enumerate(plugins): - print(package_name, version, '...', end='') + if verbose: + print(package_name, version, '...', end='') release_data = client.release_data(package_name, version) @@ -128,7 +130,7 @@ image_url = url.format(**common_params) image_url += '?py={py}&pytest={pytest}' row = ( - ColumnData(package_name + "-" + version, release_data['package_url']), + ColumnData(package_name, release_data['package_url']), ColumnData(image_url.format(py='py27', pytest=pytest_version), None), ColumnData(image_url.format(py='py34', pytest=pytest_version), @@ -159,7 +161,10 @@ assert len(row) == len(headers) rows.append(row) - print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + if verbose: + print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + + print('Done: %d plugins' % len(plugins)) return headers, rows @@ -235,16 +240,17 @@ print('*(Updated on %s)*' % today, file=f) -def generate_plugins_index(client, filename): +def generate_plugins_index(client, filename, verbose): """ Generates an RST file with a table of the latest pytest plugins found in PyPI. :param client: ServerProxy :param filename: output filename + :param verbose: print name and version of each plugin as they are fetch """ plugins = get_latest_versions(iter_plugins(client)) - headers, rows = obtain_plugins_table(plugins, client) + headers, rows = obtain_plugins_table(plugins, client, verbose) generate_plugins_index_from_table(filename, headers, rows) @@ -262,13 +268,15 @@ help='output filename [default: %default]') parser.add_option('-u', '--url', default=url, help='url of PyPI server to obtain data from [default: %default]') + parser.add_option('-v', '--verbose', default=False, action='store_true', + help='verbose output') (options, _) = parser.parse_args(argv[1:]) client = get_proxy(options.url) - generate_plugins_index(client, options.filename) + generate_plugins_index(client, options.filename, options.verbose) print() - print('%s Updated.' % options.filename) + print('%s updated.' % options.filename) return 0 diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" diff -r 0b301cade559f0efb5d007742d98039d20d18c4c -r b16fd18d441098e55346f072da970050893bfb01 tox.ini --- a/tox.ini +++ b/tox.ini @@ -89,6 +89,7 @@ PyYAML commands= + {envpython} plugins_index/plugins_index.py make clean make html https://bitbucket.org/hpk42/pytest/commits/6e1a00b31341/ Changeset: 6e1a00b31341 User: hpk42 Date: 2014-10-07 07:06:47+00:00 Summary: Merged in bubenkoff/pytest/test_for_issue_604 (pull request #220) Escape % character in the assertion message Affected #: 3 files diff -r fedc512af8b83c220b41eae7826cd74583749af7 -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,8 @@ at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. +- fix issue604: Escape % character in the assertion message. + 2.6.3 ----------- diff -r fedc512af8b83c220b41eae7826cd74583749af7 -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff -r fedc512af8b83c220b41eae7826cd74583749af7 -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False https://bitbucket.org/hpk42/pytest/commits/3c6af943684b/ Changeset: 3c6af943684b User: hpk42 Date: 2014-10-01 10:19:11+00:00 Summary: refine internal management of plugins and conftest files Affected #: 4 files diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd _pytest/config.py --- a/_pytest/config.py +++ b/_pytest/config.py @@ -682,11 +682,8 @@ setattr(self.option, opt.dest, opt.default) def _getmatchingplugins(self, fspath): - allconftests = self._conftest._conftestpath2mod.values() - plugins = [x for x in self.pluginmanager.getplugins() - if x not in allconftests] - plugins += self._conftest.getconftestmodules(fspath) - return plugins + return self.pluginmanager._plugins + \ + self._conftest.getconftestmodules(fspath) def pytest_load_initial_conftests(self, early_config): self._conftest.setinitial(early_config.known_args_namespace) diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -72,6 +72,7 @@ self._name2plugin = {} self._listattrcache = {} self._plugins = [] + self._conftestplugins = [] self._warnings = [] self.trace = TagTracer().get("pluginmanage") self._plugin_distinfo = [] @@ -86,7 +87,7 @@ assert not hasattr(self, "_registercallback") self._registercallback = callback - def register(self, plugin, name=None, prepend=False): + def register(self, plugin, name=None, prepend=False, conftest=False): if self._name2plugin.get(name, None) == -1: return name = name or getattr(plugin, '__name__', str(id(plugin))) @@ -98,16 +99,22 @@ reg = getattr(self, "_registercallback", None) if reg is not None: reg(plugin, name) - if not prepend: - self._plugins.append(plugin) + if conftest: + self._conftestplugins.append(plugin) else: - self._plugins.insert(0, plugin) + if not prepend: + self._plugins.append(plugin) + else: + self._plugins.insert(0, plugin) return True def unregister(self, plugin=None, name=None): if plugin is None: plugin = self.getplugin(name=name) - self._plugins.remove(plugin) + try: + self._plugins.remove(plugin) + except KeyError: + self._conftestplugins.remove(plugin) for name, value in list(self._name2plugin.items()): if value == plugin: del self._name2plugin[name] @@ -119,7 +126,7 @@ while self._shutdown: func = self._shutdown.pop() func() - self._plugins = [] + self._plugins = self._conftestplugins = [] self._name2plugin.clear() self._listattrcache.clear() @@ -134,7 +141,7 @@ self.hook._addhooks(spec, prefix=prefix) def getplugins(self): - return list(self._plugins) + return self._plugins + self._conftestplugins def skipifmissing(self, name): if not self.hasplugin(name): @@ -198,7 +205,8 @@ self.import_plugin(arg) def consider_conftest(self, conftestmodule): - if self.register(conftestmodule, name=conftestmodule.__file__): + if self.register(conftestmodule, name=conftestmodule.__file__, + conftest=True): self.consider_module(conftestmodule) def consider_module(self, mod): @@ -233,12 +241,7 @@ def listattr(self, attrname, plugins=None): if plugins is None: - plugins = self._plugins - key = (attrname,) + tuple(plugins) - try: - return list(self._listattrcache[key]) - except KeyError: - pass + plugins = self._plugins + self._conftestplugins l = [] last = [] wrappers = [] @@ -257,7 +260,7 @@ l.append(meth) l.extend(last) l.extend(wrappers) - self._listattrcache[key] = list(l) + #self._listattrcache[key] = list(l) return l def call_plugin(self, plugin, methname, kwargs): @@ -397,6 +400,29 @@ raise ValueError("did not find new %r hooks in %r" %( prefix, hookspecs,)) + def _getcaller(self, name, plugins): + caller = getattr(self, name) + methods = self._pm.listattr(name, plugins=plugins) + return CachedHookCaller(caller, methods) + + +class CachedHookCaller: + def __init__(self, hookmethod, methods): + self.hookmethod = hookmethod + self.methods = methods + + def __call__(self, **kwargs): + return self.hookmethod._docall(self.methods, kwargs) + + def callextra(self, methods, **kwargs): + # XXX in theory we should respect "tryfirst/trylast" if set + # on the added methods but we currently only use it for + # pytest_generate_tests and it doesn't make sense there i'd think + all = self.methods + if methods: + all = all + methods + return self.hookmethod._docall(all, kwargs) + class HookCaller: def __init__(self, hookrelay, name, firstresult): @@ -412,10 +438,6 @@ methods = self.hookrelay._pm.listattr(self.name) return self._docall(methods, kwargs) - def pcall(self, plugins, **kwargs): - methods = self.hookrelay._pm.listattr(self.name, plugins=plugins) - return self._docall(methods, kwargs) - def _docall(self, methods, kwargs): self.trace(self.name, kwargs) self.trace.root.indent += 1 diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -153,19 +153,39 @@ ignore_paths.extend([py.path.local(x) for x in excludeopt]) return path in ignore_paths -class HookProxy(object): +class FSHookProxy(object): def __init__(self, fspath, config): self.fspath = fspath self.config = config def __getattr__(self, name): - config = object.__getattribute__(self, "config") - hookmethod = getattr(config.hook, name) + plugins = self.config._getmatchingplugins(self.fspath) + x = self.config.hook._getcaller(name, plugins) + self.__dict__[name] = x + return x - def call_matching_hooks(**kwargs): - plugins = self.config._getmatchingplugins(self.fspath) - return hookmethod.pcall(plugins, **kwargs) - return call_matching_hooks + hookmethod = getattr(self.config.hook, name) + methods = self.config.pluginmanager.listattr(name, plugins=plugins) + self.__dict__[name] = x = HookCaller(hookmethod, methods) + return x + + +class HookCaller: + def __init__(self, hookmethod, methods): + self.hookmethod = hookmethod + self.methods = methods + + def __call__(self, **kwargs): + return self.hookmethod._docall(self.methods, kwargs) + + def callextra(self, methods, **kwargs): + # XXX in theory we should respect "tryfirst/trylast" if set + # on the added methods but we currently only use it for + # pytest_generate_tests and it doesn't make sense there i'd think + all = self.methods + if methods: + all = all + methods + return self.hookmethod._docall(all, kwargs) def compatproperty(name): def fget(self): @@ -520,6 +540,7 @@ self.trace = config.trace.root.get("collection") self._norecursepatterns = config.getini("norecursedirs") self.startdir = py.path.local() + self._fs2hookproxy = {} def pytest_collectstart(self): if self.shouldstop: @@ -538,7 +559,11 @@ return path in self._initialpaths def gethookproxy(self, fspath): - return HookProxy(fspath, self.config) + try: + return self._fs2hookproxy[fspath] + except KeyError: + self._fs2hookproxy[fspath] = x = FSHookProxy(fspath, self.config) + return x def perform_collect(self, args=None, genitems=True): hook = self.config.hook diff -r 20ee36010a19d7273b3635af9796016622d5a719 -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -353,12 +353,14 @@ fixtureinfo = fm.getfixtureinfo(self, funcobj, cls) metafunc = Metafunc(funcobj, fixtureinfo, self.config, cls=cls, module=module) - gentesthook = self.config.hook.pytest_generate_tests - extra = [module] - if cls is not None: - extra.append(cls()) - plugins = self.getplugins() + extra - gentesthook.pcall(plugins, metafunc=metafunc) + try: + methods = [module.pytest_generate_tests] + except AttributeError: + methods = [] + if hasattr(cls, "pytest_generate_tests"): + methods.append(cls().pytest_generate_tests) + self.ihook.pytest_generate_tests.callextra(methods, metafunc=metafunc) + Function = self._getcustomclass("Function") if not metafunc._calls: yield Function(name, parent=self) https://bitbucket.org/hpk42/pytest/commits/d23fdaba227f/ Changeset: d23fdaba227f User: hpk42 Date: 2014-10-01 10:20:11+00:00 Summary: call scanning of plugins directly, code is shifted from helpconfig.py to core.py Affected #: 6 files diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -95,10 +95,11 @@ raise ValueError("Plugin already registered: %s=%s\n%s" %( name, plugin, self._name2plugin)) #self.trace("registering", name, plugin) - self._name2plugin[name] = plugin reg = getattr(self, "_registercallback", None) if reg is not None: - reg(plugin, name) + reg(plugin, name) # may call addhooks + self.hook._scan_plugin(plugin) + self._name2plugin[name] = plugin if conftest: self._conftestplugins.append(plugin) else: @@ -403,41 +404,86 @@ def _getcaller(self, name, plugins): caller = getattr(self, name) methods = self._pm.listattr(name, plugins=plugins) - return CachedHookCaller(caller, methods) + if methods: + return caller.new_cached_caller(methods) + return caller + def _scan_plugin(self, plugin): + methods = collectattr(plugin) + hooks = {} + for hookspec in self._hookspecs: + hooks.update(collectattr(hookspec)) -class CachedHookCaller: - def __init__(self, hookmethod, methods): - self.hookmethod = hookmethod - self.methods = methods + stringio = py.io.TextIO() + def Print(*args): + if args: + stringio.write(" ".join(map(str, args))) + stringio.write("\n") - def __call__(self, **kwargs): - return self.hookmethod._docall(self.methods, kwargs) + fail = False + while methods: + name, method = methods.popitem() + #print "checking", name + if isgenerichook(name): + continue + if name not in hooks: + if not getattr(method, 'optionalhook', False): + Print("found unknown hook:", name) + fail = True + else: + #print "checking", method + method_args = list(varnames(method)) + if '__multicall__' in method_args: + method_args.remove('__multicall__') + hook = hooks[name] + hookargs = varnames(hook) + for arg in method_args: + if arg not in hookargs: + Print("argument %r not available" %(arg, )) + Print("actual definition: %s" %(formatdef(method))) + Print("available hook arguments: %s" % + ", ".join(hookargs)) + fail = True + break + #if not fail: + # print "matching hook:", formatdef(method) + getattr(self, name).clear_method_cache() - def callextra(self, methods, **kwargs): - # XXX in theory we should respect "tryfirst/trylast" if set - # on the added methods but we currently only use it for - # pytest_generate_tests and it doesn't make sense there i'd think - all = self.methods - if methods: - all = all + methods - return self.hookmethod._docall(all, kwargs) + if fail: + name = getattr(plugin, '__name__', plugin) + raise PluginValidationError("%s:\n%s" % (name, stringio.getvalue())) class HookCaller: - def __init__(self, hookrelay, name, firstresult): + def __init__(self, hookrelay, name, firstresult, methods=None): self.hookrelay = hookrelay self.name = name self.firstresult = firstresult self.trace = self.hookrelay.trace + self.methods = methods + + def new_cached_caller(self, methods): + return HookCaller(self.hookrelay, self.name, self.firstresult, + methods=methods) def __repr__(self): return "" %(self.name,) + def clear_method_cache(self): + self.methods = None + def __call__(self, **kwargs): - methods = self.hookrelay._pm.listattr(self.name) + methods = self.methods + if self.methods is None: + self.methods = methods = self.hookrelay._pm.listattr(self.name) + methods = self.methods return self._docall(methods, kwargs) + def callextra(self, methods, **kwargs): + if self.methods is None: + self.reload_methods() + return self._docall(self.methods + methods, kwargs) + def _docall(self, methods, kwargs): self.trace(self.name, kwargs) self.trace.root.indent += 1 @@ -450,3 +496,25 @@ self.trace.root.indent -= 1 return res + + +class PluginValidationError(Exception): + """ plugin failed validation. """ + +def isgenerichook(name): + return name == "pytest_plugins" or \ + name.startswith("pytest_funcarg__") + +def collectattr(obj): + methods = {} + for apiname in dir(obj): + if apiname.startswith("pytest_"): + methods[apiname] = getattr(obj, apiname) + return methods + +def formatdef(func): + return "%s%s" % ( + func.__name__, + inspect.formatargspec(*inspect.getargspec(func)) + ) + diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 _pytest/helpconfig.py --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -127,70 +127,3 @@ return lines -# ===================================================== -# validate plugin syntax and hooks -# ===================================================== - -def pytest_plugin_registered(manager, plugin): - methods = collectattr(plugin) - hooks = {} - for hookspec in manager.hook._hookspecs: - hooks.update(collectattr(hookspec)) - - stringio = py.io.TextIO() - def Print(*args): - if args: - stringio.write(" ".join(map(str, args))) - stringio.write("\n") - - fail = False - while methods: - name, method = methods.popitem() - #print "checking", name - if isgenerichook(name): - continue - if name not in hooks: - if not getattr(method, 'optionalhook', False): - Print("found unknown hook:", name) - fail = True - else: - #print "checking", method - method_args = list(varnames(method)) - if '__multicall__' in method_args: - method_args.remove('__multicall__') - hook = hooks[name] - hookargs = varnames(hook) - for arg in method_args: - if arg not in hookargs: - Print("argument %r not available" %(arg, )) - Print("actual definition: %s" %(formatdef(method))) - Print("available hook arguments: %s" % - ", ".join(hookargs)) - fail = True - break - #if not fail: - # print "matching hook:", formatdef(method) - if fail: - name = getattr(plugin, '__name__', plugin) - raise PluginValidationError("%s:\n%s" % (name, stringio.getvalue())) - -class PluginValidationError(Exception): - """ plugin failed validation. """ - -def isgenerichook(name): - return name == "pytest_plugins" or \ - name.startswith("pytest_funcarg__") - -def collectattr(obj): - methods = {} - for apiname in dir(obj): - if apiname.startswith("pytest_"): - methods[apiname] = getattr(obj, apiname) - return methods - -def formatdef(func): - return "%s%s" % ( - func.__name__, - inspect.formatargspec(*inspect.getargspec(func)) - ) - diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -164,28 +164,6 @@ self.__dict__[name] = x return x - hookmethod = getattr(self.config.hook, name) - methods = self.config.pluginmanager.listattr(name, plugins=plugins) - self.__dict__[name] = x = HookCaller(hookmethod, methods) - return x - - -class HookCaller: - def __init__(self, hookmethod, methods): - self.hookmethod = hookmethod - self.methods = methods - - def __call__(self, **kwargs): - return self.hookmethod._docall(self.methods, kwargs) - - def callextra(self, methods, **kwargs): - # XXX in theory we should respect "tryfirst/trylast" if set - # on the added methods but we currently only use it for - # pytest_generate_tests and it doesn't make sense there i'd think - all = self.methods - if methods: - all = all + methods - return self.hookmethod._docall(all, kwargs) def compatproperty(name): def fget(self): diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 _pytest/pytester.py --- a/_pytest/pytester.py +++ b/_pytest/pytester.py @@ -47,7 +47,6 @@ def gethookrecorder(self, hook): hookrecorder = HookRecorder(hook._pm) - hookrecorder.start_recording(hook._hookspecs) self.request.addfinalizer(hookrecorder.finish_recording) return hookrecorder @@ -69,9 +68,7 @@ self.calls = [] self._recorders = {} - def start_recording(self, hookspecs): - if not isinstance(hookspecs, (list, tuple)): - hookspecs = [hookspecs] + hookspecs = self._pluginmanager.hook._hookspecs for hookspec in hookspecs: assert hookspec not in self._recorders class RecordCalls: diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 testing/test_helpconfig.py --- a/testing/test_helpconfig.py +++ b/testing/test_helpconfig.py @@ -1,5 +1,5 @@ import py, pytest -from _pytest.helpconfig import collectattr +from _pytest.core import collectattr def test_version(testdir, pytestconfig): result = testdir.runpytest("--version") diff -r 3c6af943684b5059b9a99dbbfcf18592f8c3b9dd -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 testing/test_pytester.py --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -71,28 +71,38 @@ "*1 passed*" ]) -def test_hookrecorder_basic(): - rec = HookRecorder(PluginManager()) - class ApiClass: + +def make_holder(): + class apiclass: def pytest_xyz(self, arg): "x" - rec.start_recording(ApiClass) + def pytest_xyz_noarg(self): + "x" + + apimod = type(os)('api') + def pytest_xyz(arg): + "x" + def pytest_xyz_noarg(): + "x" + apimod.pytest_xyz = pytest_xyz + apimod.pytest_xyz_noarg = pytest_xyz_noarg + return apiclass, apimod + + + at pytest.mark.parametrize("holder", make_holder()) +def test_hookrecorder_basic(holder): + pm = PluginManager() + pm.hook._addhooks(holder, "pytest_") + rec = HookRecorder(pm) rec.hook.pytest_xyz(arg=123) call = rec.popcall("pytest_xyz") assert call.arg == 123 assert call._name == "pytest_xyz" pytest.raises(pytest.fail.Exception, "rec.popcall('abc')") + rec.hook.pytest_xyz_noarg() + call = rec.popcall("pytest_xyz_noarg") + assert call._name == "pytest_xyz_noarg" -def test_hookrecorder_basic_no_args_hook(): - rec = HookRecorder(PluginManager()) - apimod = type(os)('api') - def pytest_xyz(): - "x" - apimod.pytest_xyz = pytest_xyz - rec.start_recording(apimod) - rec.hook.pytest_xyz() - call = rec.popcall("pytest_xyz") - assert call._name == "pytest_xyz" def test_functional(testdir, linecomp): reprec = testdir.inline_runsource(""" @@ -102,8 +112,9 @@ def test_func(_pytest): class ApiClass: def pytest_xyz(self, arg): "x" - hook = HookRelay([ApiClass], PluginManager()) - rec = _pytest.gethookrecorder(hook) + pm = PluginManager() + pm.hook._addhooks(ApiClass, "pytest_") + rec = _pytest.gethookrecorder(pm.hook) class Plugin: def pytest_xyz(self, arg): return arg + 1 https://bitbucket.org/hpk42/pytest/commits/3d253d2b5e61/ Changeset: 3d253d2b5e61 User: hpk42 Date: 2014-10-01 11:57:35+00:00 Summary: simplify _scan_plugin implementation and store argnames on HookCaller Affected #: 2 files diff -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 -r 3d253d2b5e613699703444012ef3c84a56008f1e _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -68,7 +68,7 @@ return self.__class__(self.root, self.tags + (name,)) class PluginManager(object): - def __init__(self, hookspecs=None): + def __init__(self, hookspecs=None, prefix="pytest_"): self._name2plugin = {} self._listattrcache = {} self._plugins = [] @@ -77,7 +77,7 @@ self.trace = TagTracer().get("pluginmanage") self._plugin_distinfo = [] self._shutdown = [] - self.hook = HookRelay(hookspecs or [], pm=self) + self.hook = HookRelay(hookspecs or [], pm=self, prefix=prefix) def do_configure(self, config): # backward compatibility @@ -384,22 +384,25 @@ self._hookspecs = [] self._pm = pm self.trace = pm.trace.root.get("hook") + self.prefix = prefix for hookspec in hookspecs: self._addhooks(hookspec, prefix) - def _addhooks(self, hookspecs, prefix): - self._hookspecs.append(hookspecs) + def _addhooks(self, hookspec, prefix): + self._hookspecs.append(hookspec) added = False - for name, method in vars(hookspecs).items(): + for name in dir(hookspec): if name.startswith(prefix): + method = getattr(hookspec, name) firstresult = getattr(method, 'firstresult', False) - hc = HookCaller(self, name, firstresult=firstresult) + hc = HookCaller(self, name, firstresult=firstresult, + argnames=varnames(method)) setattr(self, name, hc) added = True #print ("setting new hook", name) if not added: raise ValueError("did not find new %r hooks in %r" %( - prefix, hookspecs,)) + prefix, hookspec,)) def _getcaller(self, name, plugins): caller = getattr(self, name) @@ -409,62 +412,44 @@ return caller def _scan_plugin(self, plugin): - methods = collectattr(plugin) - hooks = {} - for hookspec in self._hookspecs: - hooks.update(collectattr(hookspec)) + def fail(msg, *args): + name = getattr(plugin, '__name__', plugin) + raise PluginValidationError("plugin %r\n%s" %(name, msg % args)) - stringio = py.io.TextIO() - def Print(*args): - if args: - stringio.write(" ".join(map(str, args))) - stringio.write("\n") - - fail = False - while methods: - name, method = methods.popitem() - #print "checking", name - if isgenerichook(name): + for name in dir(plugin): + if not name.startswith(self.prefix): continue - if name not in hooks: - if not getattr(method, 'optionalhook', False): - Print("found unknown hook:", name) - fail = True - else: - #print "checking", method - method_args = list(varnames(method)) - if '__multicall__' in method_args: - method_args.remove('__multicall__') - hook = hooks[name] - hookargs = varnames(hook) - for arg in method_args: - if arg not in hookargs: - Print("argument %r not available" %(arg, )) - Print("actual definition: %s" %(formatdef(method))) - Print("available hook arguments: %s" % - ", ".join(hookargs)) - fail = True - break - #if not fail: - # print "matching hook:", formatdef(method) - getattr(self, name).clear_method_cache() - - if fail: - name = getattr(plugin, '__name__', plugin) - raise PluginValidationError("%s:\n%s" % (name, stringio.getvalue())) + hook = getattr(self, name, None) + method = getattr(plugin, name) + if hook is None: + is_optional = getattr(method, 'optionalhook', False) + if not isgenerichook(name) and not is_optional: + fail("found unknown hook: %r", name) + continue + for arg in varnames(method): + if arg not in hook.argnames: + fail("argument %r not available\n" + "actual definition: %s\n" + "available hookargs: %s", + arg, formatdef(method), + ", ".join(hook.argnames)) + getattr(self, name).clear_method_cache() class HookCaller: - def __init__(self, hookrelay, name, firstresult, methods=None): + def __init__(self, hookrelay, name, firstresult, argnames, methods=None): self.hookrelay = hookrelay self.name = name self.firstresult = firstresult self.trace = self.hookrelay.trace self.methods = methods + self.argnames = ["__multicall__"] + self.argnames.extend(argnames) + assert "self" not in argnames def new_cached_caller(self, methods): return HookCaller(self.hookrelay, self.name, self.firstresult, - methods=methods) + argnames=self.argnames, methods=methods) def __repr__(self): return "" %(self.name,) @@ -474,14 +459,13 @@ def __call__(self, **kwargs): methods = self.methods - if self.methods is None: + if methods is None: self.methods = methods = self.hookrelay._pm.listattr(self.name) - methods = self.methods return self._docall(methods, kwargs) def callextra(self, methods, **kwargs): - if self.methods is None: - self.reload_methods() + #if self.methods is None: + # self.reload_methods() return self._docall(self.methods + methods, kwargs) def _docall(self, methods, kwargs): diff -r d23fdaba227f3c4c3c9bf52612b8748b4d6384b1 -r 3d253d2b5e613699703444012ef3c84a56008f1e testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -630,6 +630,18 @@ assert l == [4] assert not hasattr(mcm, 'world') + def test_argmismatch(self): + class Api: + def hello(self, arg): + "api hook 1" + pm = PluginManager(Api, prefix="he") + class Plugin: + def hello(self, argwrong): + return arg + 1 + with pytest.raises(PluginValidationError) as exc: + pm.register(Plugin()) + assert "argwrong" in str(exc.value) + def test_only_kwargs(self): pm = PluginManager() class Api: https://bitbucket.org/hpk42/pytest/commits/d44f10b1b4c8/ Changeset: d44f10b1b4c8 User: hpk42 Date: 2014-10-01 12:55:54+00:00 Summary: optimize argument slicing when calling plugin hooks Affected #: 3 files diff -r 3d253d2b5e613699703444012ef3c84a56008f1e -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -292,6 +292,7 @@ def __init__(self, methods, kwargs, firstresult=False): self.methods = list(methods) self.kwargs = kwargs + self.kwargs["__multicall__"] = self self.results = [] self.firstresult = firstresult @@ -302,11 +303,12 @@ def execute(self): next_finalizers = [] try: + all_kwargs = self.kwargs while self.methods: method = self.methods.pop() - kwargs = self.getkwargs(method) + args = [all_kwargs[argname] for argname in varnames(method)] if hasattr(method, "hookwrapper"): - it = method(**kwargs) + it = method(*args) next = getattr(it, "next", None) if next is None: next = getattr(it, "__next__", None) @@ -316,7 +318,7 @@ res = next() next_finalizers.append((method, next)) else: - res = method(**kwargs) + res = method(*args) if res is not None: self.results.append(res) if self.firstresult: @@ -334,16 +336,6 @@ "wrapper contain more than one yield") - def getkwargs(self, method): - kwargs = {} - for argname in varnames(method): - try: - kwargs[argname] = self.kwargs[argname] - except KeyError: - if argname == "__multicall__": - kwargs[argname] = self - return kwargs - def varnames(func): """ return argument name tuple for a function, method, class or callable. @@ -371,12 +363,17 @@ x = rawcode.co_varnames[ismethod:rawcode.co_argcount] except AttributeError: x = () + else: + defaults = func.__defaults__ + if defaults: + x = x[:-len(defaults)] try: cache["_varnames"] = x except TypeError: pass return x + class HookRelay: def __init__(self, hookspecs, pm, prefix="pytest_"): if not isinstance(hookspecs, list): diff -r 3d253d2b5e613699703444012ef3c84a56008f1e -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 _pytest/hookspec.py --- a/_pytest/hookspec.py +++ b/_pytest/hookspec.py @@ -142,7 +142,7 @@ # ------------------------------------------------------------------------- # generic runtest related hooks # ------------------------------------------------------------------------- -def pytest_itemstart(item, node=None): +def pytest_itemstart(item, node): """ (deprecated, use pytest_runtest_logstart). """ def pytest_runtest_protocol(item, nextitem): diff -r 3d253d2b5e613699703444012ef3c84a56008f1e -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -436,6 +436,11 @@ assert varnames(A().f) == ('y',) assert varnames(B()) == ('z',) +def test_varnames_default(): + def f(x, y=3): + pass + assert varnames(f) == ("x",) + def test_varnames_class(): class C: def __init__(self, x): @@ -494,12 +499,10 @@ return x + z reslist = MultiCall([f], dict(x=23, y=24)).execute() assert reslist == [24] - reslist = MultiCall([f], dict(x=23, z=2)).execute() - assert reslist == [25] def test_tags_call_error(self): multicall = MultiCall([lambda x: x], {}) - pytest.raises(TypeError, multicall.execute) + pytest.raises(KeyError, multicall.execute) def test_call_subexecute(self): def m(__multicall__): https://bitbucket.org/hpk42/pytest/commits/db138f0eeda4/ Changeset: db138f0eeda4 User: hpk42 Date: 2014-10-02 13:25:42+00:00 Summary: remove overhead for tracing of hook calls and remove some old unused code Affected #: 5 files diff -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 _pytest/config.py --- a/_pytest/config.py +++ b/_pytest/config.py @@ -98,7 +98,7 @@ err = py.io.dupfile(err, encoding=encoding) except Exception: pass - self.trace.root.setwriter(err.write) + self.set_tracing(err.write) def pytest_configure(self, config): config.addinivalue_line("markers", diff -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -70,7 +70,6 @@ class PluginManager(object): def __init__(self, hookspecs=None, prefix="pytest_"): self._name2plugin = {} - self._listattrcache = {} self._plugins = [] self._conftestplugins = [] self._warnings = [] @@ -79,6 +78,26 @@ self._shutdown = [] self.hook = HookRelay(hookspecs or [], pm=self, prefix=prefix) + def set_tracing(self, writer): + self.trace.root.setwriter(writer) + # we reconfigure HookCalling to perform tracing + # and we avoid doing the "do we need to trace" check dynamically + # for speed reasons + assert HookCaller._docall.__name__ == "_docall" + real_docall = HookCaller._docall + def docall_tracing(self, methods, kwargs): + trace = self.hookrelay.trace + trace.root.indent += 1 + trace(self.name, kwargs) + try: + res = real_docall(self, methods, kwargs) + if res: + trace("finish", self.name, "-->", res) + finally: + trace.root.indent -= 1 + return res + HookCaller._docall = docall_tracing + def do_configure(self, config): # backward compatibility config.do_configure() @@ -129,7 +148,6 @@ func() self._plugins = self._conftestplugins = [] self._name2plugin.clear() - self._listattrcache.clear() def isregistered(self, plugin, name=None): if self.getplugin(name) is not None: @@ -261,7 +279,6 @@ l.append(meth) l.extend(last) l.extend(wrappers) - #self._listattrcache[key] = list(l) return l def call_plugin(self, plugin, methname, kwargs): @@ -336,7 +353,7 @@ "wrapper contain more than one yield") -def varnames(func): +def varnames(func, startindex=None): """ return argument name tuple for a function, method, class or callable. In case of a class, its "__init__" method is considered. @@ -353,14 +370,16 @@ func = func.__init__ except AttributeError: return () - ismethod = True + startindex = 1 else: if not inspect.isfunction(func) and not inspect.ismethod(func): func = getattr(func, '__call__', func) - ismethod = inspect.ismethod(func) + if startindex is None: + startindex = int(inspect.ismethod(func)) + rawcode = py.code.getrawcode(func) try: - x = rawcode.co_varnames[ismethod:rawcode.co_argcount] + x = rawcode.co_varnames[startindex:rawcode.co_argcount] except AttributeError: x = () else: @@ -388,12 +407,12 @@ def _addhooks(self, hookspec, prefix): self._hookspecs.append(hookspec) added = False - for name in dir(hookspec): + isclass = int(inspect.isclass(hookspec)) + for name, method in vars(hookspec).items(): if name.startswith(prefix): - method = getattr(hookspec, name) firstresult = getattr(method, 'firstresult', False) hc = HookCaller(self, name, firstresult=firstresult, - argnames=varnames(method)) + argnames=varnames(method, startindex=isclass)) setattr(self, name, hc) added = True #print ("setting new hook", name) @@ -438,11 +457,10 @@ self.hookrelay = hookrelay self.name = name self.firstresult = firstresult - self.trace = self.hookrelay.trace self.methods = methods self.argnames = ["__multicall__"] self.argnames.extend(argnames) - assert "self" not in argnames + assert "self" not in argnames # prevent oversights def new_cached_caller(self, methods): return HookCaller(self.hookrelay, self.name, self.firstresult, @@ -461,22 +479,11 @@ return self._docall(methods, kwargs) def callextra(self, methods, **kwargs): - #if self.methods is None: - # self.reload_methods() return self._docall(self.methods + methods, kwargs) def _docall(self, methods, kwargs): - self.trace(self.name, kwargs) - self.trace.root.indent += 1 - mc = MultiCall(methods, kwargs, firstresult=self.firstresult) - try: - res = mc.execute() - if res: - self.trace("finish", self.name, "-->", res) - finally: - self.trace.root.indent -= 1 - return res - + return MultiCall(methods, kwargs, + firstresult=self.firstresult).execute() class PluginValidationError(Exception): @@ -486,13 +493,6 @@ return name == "pytest_plugins" or \ name.startswith("pytest_funcarg__") -def collectattr(obj): - methods = {} - for apiname in dir(obj): - if apiname.startswith("pytest_"): - methods[apiname] = getattr(obj, apiname) - return methods - def formatdef(func): return "%s%s" % ( func.__name__, diff -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 _pytest/helpconfig.py --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -1,8 +1,7 @@ """ version info, help messages, tracing configuration. """ import py import pytest -import os, inspect, sys -from _pytest.core import varnames +import os, sys def pytest_addoption(parser): group = parser.getgroup('debugconfig') @@ -32,7 +31,7 @@ f.write("versions pytest-%s, py-%s, python-%s\ncwd=%s\nargs=%s\n\n" %( pytest.__version__, py.__version__, ".".join(map(str, sys.version_info)), os.getcwd(), config._origargs)) - config.trace.root.setwriter(f.write) + config.pluginmanager.set_tracing(f.write) sys.stderr.write("writing pytestdebug information to %s\n" % path) return config diff -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -274,7 +274,7 @@ saveindent.append(pm.trace.root.indent) raise ValueError(42) l = [] - pm.trace.root.setwriter(l.append) + pm.set_tracing(l.append) indent = pm.trace.root.indent p = api1() pm.register(p) @@ -405,11 +405,7 @@ pluginmanager.register(p3) methods = pluginmanager.listattr('m') assert methods == [p2.m, p3.m, p1.m] - # listattr keeps a cache and deleting - # a function attribute requires clearing it - pluginmanager._listattrcache.clear() del P1.m.__dict__['tryfirst'] - pytest.mark.trylast(getattr(P2.m, 'im_func', P2.m)) methods = pluginmanager.listattr('m') assert methods == [p2.m, p1.m, p3.m] diff -r d44f10b1b4c8ba2db59b5e60a66c6c26dd236e02 -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 testing/test_helpconfig.py --- a/testing/test_helpconfig.py +++ b/testing/test_helpconfig.py @@ -1,5 +1,4 @@ -import py, pytest -from _pytest.core import collectattr +import pytest def test_version(testdir, pytestconfig): result = testdir.runpytest("--version") @@ -25,18 +24,6 @@ *to see*fixtures*py.test --fixtures* """) -def test_collectattr(): - class A: - def pytest_hello(self): - pass - class B(A): - def pytest_world(self): - pass - methods = py.builtin.sorted(collectattr(B)) - assert list(methods) == ['pytest_hello', 'pytest_world'] - methods = py.builtin.sorted(collectattr(B())) - assert list(methods) == ['pytest_hello', 'pytest_world'] - def test_hookvalidation_unknown(testdir): testdir.makeconftest(""" def pytest_hello(xyz): https://bitbucket.org/hpk42/pytest/commits/8cf10f8df3da/ Changeset: 8cf10f8df3da User: hpk42 Date: 2014-10-04 13:49:31+00:00 Summary: factor out a small "wrapping" helper Affected #: 2 files diff -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 -r 8cf10f8df3dad3d518f65e3ebcb4bd9875ee6c5b _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -67,6 +67,24 @@ def get(self, name): return self.__class__(self.root, self.tags + (name,)) +def add_method_controller(cls, func): + name = func.__name__ + oldcall = getattr(cls, name) + def wrap_exec(*args, **kwargs): + gen = func(*args, **kwargs) + gen.next() # first yield + res = oldcall(*args, **kwargs) + try: + gen.send(res) + except StopIteration: + pass + else: + raise ValueError("expected StopIteration") + return res + setattr(cls, name, wrap_exec) + return lambda: setattr(cls, name, oldcall) + + class PluginManager(object): def __init__(self, hookspecs=None, prefix="pytest_"): self._name2plugin = {} @@ -80,23 +98,24 @@ def set_tracing(self, writer): self.trace.root.setwriter(writer) - # we reconfigure HookCalling to perform tracing - # and we avoid doing the "do we need to trace" check dynamically - # for speed reasons - assert HookCaller._docall.__name__ == "_docall" - real_docall = HookCaller._docall - def docall_tracing(self, methods, kwargs): + # reconfigure HookCalling to perform tracing + assert not hasattr(self, "_wrapping") + self._wrapping = True + + def _docall(self, methods, kwargs): trace = self.hookrelay.trace trace.root.indent += 1 trace(self.name, kwargs) + res = None try: - res = real_docall(self, methods, kwargs) + res = yield + finally: if res: trace("finish", self.name, "-->", res) - finally: trace.root.indent -= 1 - return res - HookCaller._docall = docall_tracing + + undo = add_method_controller(HookCaller, _docall) + self.add_shutdown(undo) def do_configure(self, config): # backward compatibility diff -r db138f0eeda4dd71b893fa25e5b45bd6842b57b6 -r 8cf10f8df3dad3d518f65e3ebcb4bd9875ee6c5b testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -765,3 +765,23 @@ assert "qwe" not in str(excinfo.value) assert "aaaa" in str(excinfo.value) + +def test_wrapping(): + class A: + def f(self): + return "A.f" + + shutdown = [] + l = [] + def f(self): + l.append(1) + x = yield + l.append(2) + undo = add_method_controller(A, f) + + assert A().f() == "A.f" + assert l == [1,2] + undo() + l[:] = [] + assert A().f() == "A.f" + assert l == [] https://bitbucket.org/hpk42/pytest/commits/9bb382c36d5f/ Changeset: 9bb382c36d5f User: hpk42 Date: 2014-10-04 13:49:31+00:00 Summary: simplify method to record calls Affected #: 3 files diff -r 8cf10f8df3dad3d518f65e3ebcb4bd9875ee6c5b -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -416,7 +416,6 @@ def __init__(self, hookspecs, pm, prefix="pytest_"): if not isinstance(hookspecs, list): hookspecs = [hookspecs] - self._hookspecs = [] self._pm = pm self.trace = pm.trace.root.get("hook") self.prefix = prefix @@ -424,7 +423,6 @@ self._addhooks(hookspec, prefix) def _addhooks(self, hookspec, prefix): - self._hookspecs.append(hookspec) added = False isclass = int(inspect.isclass(hookspec)) for name, method in vars(hookspec).items(): diff -r 8cf10f8df3dad3d518f65e3ebcb4bd9875ee6c5b -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 _pytest/pytester.py --- a/_pytest/pytester.py +++ b/_pytest/pytester.py @@ -12,7 +12,7 @@ import py import pytest from py.builtin import print_ -from _pytest.core import HookRelay +from _pytest.core import HookRelay, HookCaller, Wrapping from _pytest.main import Session, EXIT_OK @@ -51,10 +51,8 @@ return hookrecorder class ParsedCall: - def __init__(self, name, locals): - assert '_name' not in locals - self.__dict__.update(locals) - self.__dict__.pop('self') + def __init__(self, name, kwargs): + self.__dict__.update(kwargs) self._name = name def __repr__(self): @@ -62,64 +60,24 @@ del d['_name'] return "" %(self._name, d) + class HookRecorder: def __init__(self, pluginmanager): self._pluginmanager = pluginmanager self.calls = [] - self._recorders = {} - - hookspecs = self._pluginmanager.hook._hookspecs - for hookspec in hookspecs: - assert hookspec not in self._recorders - class RecordCalls: - _recorder = self - for name, method in vars(hookspec).items(): - if name[0] != "_": - setattr(RecordCalls, name, self._makecallparser(method)) - recorder = RecordCalls() - self._recorders[hookspec] = recorder - self._pluginmanager.register(recorder) - self.hook = HookRelay(hookspecs, pm=self._pluginmanager, - prefix="pytest_") + self.wrapping = Wrapping() + @self.wrapping.method(HookCaller) + def _docall(hookcaller, methods, kwargs): + self.calls.append(ParsedCall(hookcaller.name, kwargs)) + yield def finish_recording(self): - for recorder in self._recorders.values(): - if self._pluginmanager.isregistered(recorder): - self._pluginmanager.unregister(recorder) - self._recorders.clear() - - def _makecallparser(self, method): - name = method.__name__ - args, varargs, varkw, default = inspect.getargspec(method) - if not args or args[0] != "self": - args.insert(0, 'self') - fspec = inspect.formatargspec(args, varargs, varkw, default) - # we use exec because we want to have early type - # errors on wrong input arguments, using - # *args/**kwargs delays this and gives errors - # elsewhere - exec (py.code.compile(""" - def %(name)s%(fspec)s: - self._recorder.calls.append( - ParsedCall(%(name)r, locals())) - """ % locals())) - return locals()[name] + self.wrapping.undo() def getcalls(self, names): if isinstance(names, str): names = names.split() - for name in names: - for cls in self._recorders: - if name in vars(cls): - break - else: - raise ValueError("callname %r not found in %r" %( - name, self._recorders.keys())) - l = [] - for call in self.calls: - if call._name in names: - l.append(call) - return l + return [call for call in self.calls if call._name in names] def contains(self, entries): __tracebackhide__ = True @@ -228,10 +186,9 @@ obj = obj.config if hasattr(obj, 'hook'): obj = obj.hook - assert hasattr(obj, '_hookspecs'), obj + assert isinstance(obj, HookRelay) reprec = ReportRecorder(obj) reprec.hookrecorder = self._pytest.gethookrecorder(obj) - reprec.hook = reprec.hookrecorder.hook return reprec def chdir(self): diff -r 8cf10f8df3dad3d518f65e3ebcb4bd9875ee6c5b -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 testing/test_pytester.py --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -94,12 +94,12 @@ pm = PluginManager() pm.hook._addhooks(holder, "pytest_") rec = HookRecorder(pm) - rec.hook.pytest_xyz(arg=123) + pm.hook.pytest_xyz(arg=123) call = rec.popcall("pytest_xyz") assert call.arg == 123 assert call._name == "pytest_xyz" pytest.raises(pytest.fail.Exception, "rec.popcall('abc')") - rec.hook.pytest_xyz_noarg() + pm.hook.pytest_xyz_noarg() call = rec.popcall("pytest_xyz_noarg") assert call._name == "pytest_xyz_noarg" @@ -119,7 +119,7 @@ def pytest_xyz(self, arg): return arg + 1 rec._pluginmanager.register(Plugin()) - res = rec.hook.pytest_xyz(arg=41) + res = pm.hook.pytest_xyz(arg=41) assert res == [42] """) reprec.assertoutcome(passed=1) https://bitbucket.org/hpk42/pytest/commits/3f39cb1d904d/ Changeset: 3f39cb1d904d User: hpk42 Date: 2014-10-06 11:37:57+00:00 Summary: simplify internal pytester machinery Affected #: 6 files diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -72,7 +72,7 @@ oldcall = getattr(cls, name) def wrap_exec(*args, **kwargs): gen = func(*args, **kwargs) - gen.next() # first yield + next(gen) # first yield res = oldcall(*args, **kwargs) try: gen.send(res) diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b _pytest/pytester.py --- a/_pytest/pytester.py +++ b/_pytest/pytester.py @@ -1,5 +1,4 @@ """ (disabled by default) support for testing pytest and pytest plugins. """ -import inspect import sys import os import codecs @@ -12,7 +11,7 @@ import py import pytest from py.builtin import print_ -from _pytest.core import HookRelay, HookCaller, Wrapping +from _pytest.core import HookCaller, add_method_controller from _pytest.main import Session, EXIT_OK @@ -38,17 +37,6 @@ _pytest_fullpath = os.path.abspath(pytest.__file__.rstrip("oc")) _pytest_fullpath = _pytest_fullpath.replace("$py.class", ".py") -def pytest_funcarg___pytest(request): - return PytestArg(request) - -class PytestArg: - def __init__(self, request): - self.request = request - - def gethookrecorder(self, hook): - hookrecorder = HookRecorder(hook._pm) - self.request.addfinalizer(hookrecorder.finish_recording) - return hookrecorder class ParsedCall: def __init__(self, name, kwargs): @@ -65,21 +53,22 @@ def __init__(self, pluginmanager): self._pluginmanager = pluginmanager self.calls = [] - self.wrapping = Wrapping() - @self.wrapping.method(HookCaller) + def _docall(hookcaller, methods, kwargs): self.calls.append(ParsedCall(hookcaller.name, kwargs)) yield + self._undo_wrapping = add_method_controller(HookCaller, _docall) + pluginmanager.add_shutdown(self._undo_wrapping) def finish_recording(self): - self.wrapping.undo() + self._undo_wrapping() def getcalls(self, names): if isinstance(names, str): names = names.split() return [call for call in self.calls if call._name in names] - def contains(self, entries): + def assert_contains(self, entries): __tracebackhide__ = True i = 0 entries = list(entries) @@ -115,6 +104,69 @@ assert len(l) == 1, (name, l) return l[0] + # functionality for test reports + + def getreports(self, + names="pytest_runtest_logreport pytest_collectreport"): + return [x.report for x in self.getcalls(names)] + + def matchreport(self, inamepart="", + names="pytest_runtest_logreport pytest_collectreport", when=None): + """ return a testreport whose dotted import path matches """ + l = [] + for rep in self.getreports(names=names): + try: + if not when and rep.when != "call" and rep.passed: + # setup/teardown passing reports - let's ignore those + continue + except AttributeError: + pass + if when and getattr(rep, 'when', None) != when: + continue + if not inamepart or inamepart in rep.nodeid.split("::"): + l.append(rep) + if not l: + raise ValueError("could not find test report matching %r: " + "no test reports at all!" % (inamepart,)) + if len(l) > 1: + raise ValueError( + "found 2 or more testreports matching %r: %s" %(inamepart, l)) + return l[0] + + def getfailures(self, + names='pytest_runtest_logreport pytest_collectreport'): + return [rep for rep in self.getreports(names) if rep.failed] + + def getfailedcollections(self): + return self.getfailures('pytest_collectreport') + + def listoutcomes(self): + passed = [] + skipped = [] + failed = [] + for rep in self.getreports( + "pytest_collectreport pytest_runtest_logreport"): + if rep.passed: + if getattr(rep, "when", None) == "call": + passed.append(rep) + elif rep.skipped: + skipped.append(rep) + elif rep.failed: + failed.append(rep) + return passed, skipped, failed + + def countoutcomes(self): + return [len(x) for x in self.listoutcomes()] + + def assertoutcome(self, passed=0, skipped=0, failed=0): + realpassed, realskipped, realfailed = self.listoutcomes() + assert passed == len(realpassed) + assert skipped == len(realskipped) + assert failed == len(realfailed) + + def clear(self): + self.calls[:] = [] + def pytest_funcarg__linecomp(request): return LineComp() @@ -150,7 +202,6 @@ def __init__(self, request): self.request = request self.Config = request.config.__class__ - self._pytest = request.getfuncargvalue("_pytest") # XXX remove duplication with tmpdir plugin basetmp = request.config._tmpdirhandler.ensuretemp("testdir") name = request.function.__name__ @@ -181,14 +232,10 @@ if fn and fn.startswith(str(self.tmpdir)): del sys.modules[name] - def getreportrecorder(self, obj): - if hasattr(obj, 'config'): - obj = obj.config - if hasattr(obj, 'hook'): - obj = obj.hook - assert isinstance(obj, HookRelay) - reprec = ReportRecorder(obj) - reprec.hookrecorder = self._pytest.gethookrecorder(obj) + def make_hook_recorder(self, pluginmanager): + assert not hasattr(pluginmanager, "reprec") + pluginmanager.reprec = reprec = HookRecorder(pluginmanager) + self.request.addfinalizer(reprec.finish_recording) return reprec def chdir(self): @@ -307,26 +354,23 @@ def inline_genitems(self, *args): return self.inprocess_run(list(args) + ['--collectonly']) - def inline_run(self, *args): - items, rec = self.inprocess_run(args) - return rec + def inprocess_run(self, args, plugins=()): + rec = self.inline_run(*args, plugins=plugins) + items = [x.item for x in rec.getcalls("pytest_itemcollected")] + return items, rec - def inprocess_run(self, args, plugins=None): + def inline_run(self, *args, **kwargs): rec = [] - items = [] class Collect: def pytest_configure(x, config): - rec.append(self.getreportrecorder(config)) - def pytest_itemcollected(self, item): - items.append(item) - if not plugins: - plugins = [] + rec.append(self.make_hook_recorder(config.pluginmanager)) + plugins = kwargs.get("plugins") or [] plugins.append(Collect()) ret = pytest.main(list(args), plugins=plugins) + assert len(rec) == 1 reprec = rec[0] reprec.ret = ret - assert len(rec) == 1 - return items, reprec + return reprec def parseconfig(self, *args): args = [str(x) for x in args] @@ -501,86 +545,6 @@ return "INTERNAL not-utf8-decodeable, truncated string:\n%s" % ( py.io.saferepr(out),) -class ReportRecorder(object): - def __init__(self, hook): - self.hook = hook - self.pluginmanager = hook._pm - self.pluginmanager.register(self) - - def getcall(self, name): - return self.hookrecorder.getcall(name) - - def popcall(self, name): - return self.hookrecorder.popcall(name) - - def getcalls(self, names): - """ return list of ParsedCall instances matching the given eventname. """ - return self.hookrecorder.getcalls(names) - - # functionality for test reports - - def getreports(self, names="pytest_runtest_logreport pytest_collectreport"): - return [x.report for x in self.getcalls(names)] - - def matchreport(self, inamepart="", - names="pytest_runtest_logreport pytest_collectreport", when=None): - """ return a testreport whose dotted import path matches """ - l = [] - for rep in self.getreports(names=names): - try: - if not when and rep.when != "call" and rep.passed: - # setup/teardown passing reports - let's ignore those - continue - except AttributeError: - pass - if when and getattr(rep, 'when', None) != when: - continue - if not inamepart or inamepart in rep.nodeid.split("::"): - l.append(rep) - if not l: - raise ValueError("could not find test report matching %r: no test reports at all!" % - (inamepart,)) - if len(l) > 1: - raise ValueError("found more than one testreport matching %r: %s" %( - inamepart, l)) - return l[0] - - def getfailures(self, names='pytest_runtest_logreport pytest_collectreport'): - return [rep for rep in self.getreports(names) if rep.failed] - - def getfailedcollections(self): - return self.getfailures('pytest_collectreport') - - def listoutcomes(self): - passed = [] - skipped = [] - failed = [] - for rep in self.getreports( - "pytest_collectreport pytest_runtest_logreport"): - if rep.passed: - if getattr(rep, "when", None) == "call": - passed.append(rep) - elif rep.skipped: - skipped.append(rep) - elif rep.failed: - failed.append(rep) - return passed, skipped, failed - - def countoutcomes(self): - return [len(x) for x in self.listoutcomes()] - - def assertoutcome(self, passed=0, skipped=0, failed=0): - realpassed, realskipped, realfailed = self.listoutcomes() - assert passed == len(realpassed) - assert skipped == len(realskipped) - assert failed == len(realfailed) - - def clear(self): - self.hookrecorder.calls[:] = [] - - def unregister(self): - self.pluginmanager.unregister(self) - self.hookrecorder.finish_recording() class LineComp: def __init__(self): diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b bench/bench.py --- a/bench/bench.py +++ b/bench/bench.py @@ -9,4 +9,4 @@ p = pstats.Stats("prof") p.strip_dirs() p.sort_stats('cumulative') - print(p.print_stats(250)) + print(p.print_stats(500)) diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -334,9 +334,9 @@ assert item.name == "test_func" newid = item.nodeid assert newid == id - py.std.pprint.pprint(hookrec.hookrecorder.calls) + py.std.pprint.pprint(hookrec.calls) topdir = testdir.tmpdir # noqa - hookrec.hookrecorder.contains([ + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == topdir"), ("pytest_make_collect_report", "collector.fspath == topdir"), ("pytest_collectstart", "collector.fspath == p"), @@ -381,9 +381,9 @@ id = p.basename items, hookrec = testdir.inline_genitems(id) - py.std.pprint.pprint(hookrec.hookrecorder.calls) + py.std.pprint.pprint(hookrec.calls) assert len(items) == 2 - hookrec.hookrecorder.contains([ + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == collector.session.fspath"), ("pytest_collectstart", @@ -404,8 +404,8 @@ items, hookrec = testdir.inline_genitems() assert len(items) == 1 - py.std.pprint.pprint(hookrec.hookrecorder.calls) - hookrec.hookrecorder.contains([ + py.std.pprint.pprint(hookrec.calls) + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == test_aaa"), ("pytest_pycollect_makeitem", "name == 'test_func'"), ("pytest_collectreport", @@ -425,8 +425,8 @@ items, hookrec = testdir.inline_genitems(id) assert len(items) == 2 - py.std.pprint.pprint(hookrec.hookrecorder.calls) - hookrec.hookrecorder.contains([ + py.std.pprint.pprint(hookrec.calls) + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == test_aaa"), ("pytest_pycollect_makeitem", "name == 'test_func'"), ("pytest_collectreport", "report.nodeid == 'aaa/test_aaa.py'"), diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -149,7 +149,7 @@ mod.pytest_plugins = "pytest_a" aplugin = testdir.makepyfile(pytest_a="#") pluginmanager = get_plugin_manager() - reprec = testdir.getreportrecorder(pluginmanager) + reprec = testdir.make_hook_recorder(pluginmanager) #syspath.prepend(aplugin.dirpath()) py.std.sys.path.insert(0, str(aplugin.dirpath())) pluginmanager.consider_module(mod) @@ -771,11 +771,10 @@ def f(self): return "A.f" - shutdown = [] l = [] def f(self): l.append(1) - x = yield + yield l.append(2) undo = add_method_controller(A, f) diff -r 9bb382c36d5ffc1864220a52a39e55a581f76db6 -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b testing/test_pytester.py --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -3,9 +3,9 @@ from _pytest.pytester import HookRecorder from _pytest.core import PluginManager -def test_reportrecorder(testdir): +def test_make_hook_recorder(testdir): item = testdir.getitem("def test_func(): pass") - recorder = testdir.getreportrecorder(item.config) + recorder = testdir.make_hook_recorder(item.config.pluginmanager) assert not recorder.getfailures() pytest.xfail("internal reportrecorder tests need refactoring") @@ -104,27 +104,6 @@ assert call._name == "pytest_xyz_noarg" -def test_functional(testdir, linecomp): - reprec = testdir.inline_runsource(""" - import pytest - from _pytest.core import HookRelay, PluginManager - pytest_plugins="pytester" - def test_func(_pytest): - class ApiClass: - def pytest_xyz(self, arg): "x" - pm = PluginManager() - pm.hook._addhooks(ApiClass, "pytest_") - rec = _pytest.gethookrecorder(pm.hook) - class Plugin: - def pytest_xyz(self, arg): - return arg + 1 - rec._pluginmanager.register(Plugin()) - res = pm.hook.pytest_xyz(arg=41) - assert res == [42] - """) - reprec.assertoutcome(passed=1) - - def test_makepyfile_unicode(testdir): global unichr try: https://bitbucket.org/hpk42/pytest/commits/2d8d1399aae6/ Changeset: 2d8d1399aae6 User: hpk42 Date: 2014-10-06 12:06:17+00:00 Summary: cleanup core collection of python methods and remove unncessary cache Affected #: 1 file diff -r 3f39cb1d904d71343a02bbf0d7d3c4bf1316e08b -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -363,7 +363,7 @@ Function = self._getcustomclass("Function") if not metafunc._calls: - yield Function(name, parent=self) + yield Function(name, parent=self, fixtureinfo=fixtureinfo) else: # add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs add_funcarg_pseudo_fixture_def(self, metafunc, fm) @@ -372,6 +372,7 @@ subname = "%s[%s]" %(name, callspec.id) yield Function(name=subname, parent=self, callspec=callspec, callobj=funcobj, + fixtureinfo=fixtureinfo, keywords={callspec.id:True}) def add_funcarg_pseudo_fixture_def(collector, metafunc, fixturemanager): @@ -1067,28 +1068,27 @@ """ _genid = None def __init__(self, name, parent, args=None, config=None, - callspec=None, callobj=NOTSET, keywords=None, session=None): + callspec=None, callobj=NOTSET, keywords=None, session=None, + fixtureinfo=None): super(Function, self).__init__(name, parent, config=config, session=session) self._args = args if callobj is not NOTSET: self.obj = callobj - for name, val in (py.builtin._getfuncdict(self.obj) or {}).items(): - self.keywords[name] = val + self.keywords.update(self.obj.__dict__) if callspec: - for name, val in callspec.keywords.items(): - self.keywords[name] = val + self.callspec = callspec + self.keywords.update(callspec.keywords) if keywords: - for name, val in keywords.items(): - self.keywords[name] = val + self.keywords.update(keywords) - isyield = self._isyieldedfunction() - self._fixtureinfo = fi = self.session._fixturemanager.getfixtureinfo( - self.parent, self.obj, self.cls, funcargs=not isyield) - self.fixturenames = fi.names_closure - if callspec is not None: - self.callspec = callspec + if fixtureinfo is None: + fixtureinfo = self.session._fixturemanager.getfixtureinfo( + self.parent, self.obj, self.cls, + funcargs=not self._isyieldedfunction()) + self._fixtureinfo = fixtureinfo + self.fixturenames = fixtureinfo.names_closure self._initrequest() def _initrequest(self): @@ -1573,15 +1573,8 @@ self._nodeid_and_autousenames = [("", self.config.getini("usefixtures"))] session.config.pluginmanager.register(self, "funcmanage") - self._nodename2fixtureinfo = {} def getfixtureinfo(self, node, func, cls, funcargs=True): - # node is the "collection node" for "func" - key = (node, func) - try: - return self._nodename2fixtureinfo[key] - except KeyError: - pass if funcargs and not hasattr(node, "nofuncargs"): if cls is not None: startindex = 1 @@ -1597,10 +1590,7 @@ fm = node.session._fixturemanager names_closure, arg2fixturedefs = fm.getfixtureclosure(initialnames, node) - fixtureinfo = FuncFixtureInfo(argnames, names_closure, - arg2fixturedefs) - self._nodename2fixtureinfo[key] = fixtureinfo - return fixtureinfo + return FuncFixtureInfo(argnames, names_closure, arg2fixturedefs) ### XXX this hook should be called for historic events like pytest_configure ### so that we don't have to do the below pytest_configure hook https://bitbucket.org/hpk42/pytest/commits/fc5bd1abf7b7/ Changeset: fc5bd1abf7b7 User: hpk42 Date: 2014-10-06 12:26:03+00:00 Summary: docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. updated plugin index docs. Thanks Bruno Oliveira. fix issue557: with "-k" we only allow the old style "-" for negation at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. Affected #: 9 files diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,14 @@ - removed outdated japanese docs from source tree. +- docs for "pytest_addhooks" hook. Thanks Bruno Oliveira. + +- updated plugin index docs. Thanks Bruno Oliveira. + +- fix issue557: with "-k" we only allow the old style "-" for negation + at the beginning of strings and even that is deprecated. Use "not" instead. + This should allow to pick parametrized tests where "-" appeared in the parameter. + 2.6.3 ----------- diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -24,7 +24,7 @@ def pytest_addoption(parser): parser.addini("norecursedirs", "directory patterns to avoid for recursion", - type="args", default=('.*', 'CVS', '_darcs', '{arch}', '*.egg')) + type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg']) #parser.addini("dirpatterns", # "patterns specifying possible locations of test files", # type="linelist", default=["**/test_*.txt", diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -56,6 +56,11 @@ matchexpr = config.option.markexpr if not keywordexpr and not matchexpr: return + # pytest used to allow "-" for negating + # but today we just allow "-" at the beginning, use "not" instead + # we probably remove "-" alltogether soon + if keywordexpr.startswith("-"): + keywordexpr = "not " + keywordexpr[1:] selectuntil = False if keywordexpr[-1:] == ":": selectuntil = True @@ -122,7 +127,6 @@ Additionally, matches on names in the 'extra_keyword_matches' set of any item, as well as names directly assigned to test functions. """ - keywordexpr = keywordexpr.replace("-", "not ") mapped_names = set() # Add the names of the current item and any parent items diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -124,11 +124,11 @@ parser.addini("usefixtures", type="args", default=[], help="list of default fixtures to be used with this project") parser.addini("python_files", type="args", - default=('test_*.py', '*_test.py'), + default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") - parser.addini("python_classes", type="args", default=("Test",), + parser.addini("python_classes", type="args", default=["Test",], help="prefixes for Python test class discovery") - parser.addini("python_functions", type="args", default=("test",), + parser.addini("python_functions", type="args", default=["test",], help="prefixes for Python test function and method discovery") def pytest_cmdline_main(config): diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -384,6 +384,54 @@ .. autofunction:: pytest_keyboard_interrupt .. autofunction:: pytest_exception_interact + +Declaring new hooks +------------------------ + +Plugins and ``conftest.py`` files may declare new hooks that can then be +implemented by other plugins in order to alter behaviour or interact with +the new plugin: + +.. autofunction:: pytest_addhooks + +Hooks are usually declared as do-nothing functions that contain only +documentation describing when the hook will be called and what return values +are expected. + +For an example, see `newhooks.py`_ from :ref:`xdist`. + +.. _`newhooks.py`: https://bitbucket.org/hpk42/pytest-xdist/src/52082f70e7dd04b00361091b8af906c60fd6700f/xdist/newhooks.py?at=default + + +Using hooks from 3rd party plugins +------------------------------------- + +Using new hooks from plugins as explained above might be a little tricky +because the standard `Hook specification and validation`_ mechanism: +if you depend on a plugin that is not installed, +validation will fail and the error message will not make much sense to your users. + +One approach is to defer the hook implementation to a new plugin instead of +declaring the hook functions directly in your plugin module, for example:: + + # contents of myplugin.py + + class DeferPlugin(object): + """Simple plugin to defer pytest-xdist hook functions.""" + + def pytest_testnodedown(self, node, error): + """standard xdist hook function. + """ + + def pytest_configure(config): + if config.pluginmanager.hasplugin('xdist'): + config.pluginmanager.register(DeferPlugin()) + + +This has the added benefit of allowing you to conditionally install hooks +depending on which plugins are installed. + + Reference of objects involved in hooks =========================================================== diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 doc/en/plugins_index/index.txt --- a/doc/en/plugins_index/index.txt +++ b/doc/en/plugins_index/index.txt @@ -4,7 +4,7 @@ =========================== The table below contains a listing of plugins found in PyPI and -their status when tested using py.test **2.6.2.dev1** and python 2.7 and +their status when tested using py.test **2.6.4.dev1** and python 2.7 and 3.3. A complete listing can also be found at @@ -12,154 +12,160 @@ status against other py.test releases. -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - Name Py27 Py34 Repo Summary -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= - `pytest-allure-adaptor-1.4.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports - :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/allure-framework/allure-python - `pytest-bdd-2.3.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BDD for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd - `pytest-beds-0.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps - :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kaste/pytest-beds - `pytest-bench-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Benchmark utility that plugs into pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/concordusapps/pytest-bench - `pytest-blockage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Disable network requests during a test run. - :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/rob-b/pytest-blockage - `pytest-browsermob-proxy-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy - `pytest-bugzilla-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nibrahim/pytest_bugzilla - `pytest-cache-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ - `pytest-capturelog-0.7 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to capture log messages - :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview - `pytest-codecheckers-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) - :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ - `pytest-config-0.0.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. - :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/buzzfeed/pytest_config - `pytest-contextfixture-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Define pytest fixtures as context managers. - :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-contextfixture/ - `pytest-couchdbkit-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit - :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit - `pytest-cov-1.8.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing - :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schlamar/pytest-cov - `pytest-cpp-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-cpp - `pytest-dbfixtures-0.5.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Databases fixtures plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures - `pytest-dbus-notification-1.0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png D-BUS notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification - `pytest-diffeo-0.1.8.dev1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Common py.test support for Diffeo packages - :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/diffeo/pytest-diffeo - `pytest-django-2.6.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.2.dev1 `http://pytest-django.readthedocs.org/ `_ A Django plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.2.dev1 - `pytest-django-haystack-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Cleanup your Haystack indexes between tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/rouge8/pytest-django-haystack - `pytest-django-lite-0.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. - :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dcramer/pytest-django-lite - `pytest-echo-1.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 `http://pypi.python.org/pypi/pytest-echo/ `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes - :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.2.dev1 - `pytest-eradicate-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check for commented out code - :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/spil-johan/pytest-eradicate - `pytest-figleaf-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf - `pytest-fixture-tools-1.0.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 ? Plugin for pytest which provides tools for fixtures - :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.2.dev1 - `pytest-flakes-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to check source code with pyflakes - :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/fschulze/pytest-flakes - `pytest-greendots-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 ? Green progress dots - :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.2.dev1 - `pytest-growl-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 ? Growl notifications for pytest results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.2.dev1 - `pytest-httpbin-0.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/kevin1024/pytest-httpbin - `pytest-httpretty-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/papaeye/pytest-httpretty - `pytest-incremental-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) - :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental - `pytest-instafail-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to show failures instantly - :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jpvanhal/pytest-instafail - `pytest-ipdb-0.1-prerelease `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. - :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mverteuil/pytest-ipdb - `pytest-jira-0.01 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test JIRA integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/jlaska/pytest_jira - `pytest-knows-0.1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace - :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/mapix/ptknows - `pytest-konira-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run Konira DSL tests with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/alfredodeza/pytest-konira - `pytest-localserver-0.3.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. - :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ - `pytest-marker-bugzilla-0.06 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers - :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla - `pytest-markfiltration-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration - `pytest-marks-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/adamgoucher/pytest-marks - `pytest-mock-0.3.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test - :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nicoddemus/pytest-mock/ - `pytest-monkeyplus-1.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities - :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ - `pytest-mozwebqa-1.1.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-mozwebqa - `pytest-oerp-0.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to test OpenERP modules - :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-oerp/ - `pytest-ordering-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to run your tests in a specific order - :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/ftobia/pytest-ordering - `pytest-osxnotify-0.1.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OS X notifications for py.test results. - :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/dbader/pytest-osxnotify - `pytest-paste-config-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 ? Allow setting the path to a paste config file - :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.2.dev1 - `pytest-pep8-1.0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements - :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ - `pytest-pipeline-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines - :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bow/pytest_pipeline - `pytest-poo-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Visualize your crappy tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/pelme/pytest-poo - `pytest-pycharm-0.1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/jlubcke/pytest-pycharm - `pytest-pydev-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ - `pytest-pythonpath-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. - :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/bigsassy/pytest-pythonpath - `pytest-qt-1.2.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest support for PyQt and PySide applications - :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/nicoddemus/pytest-qt - `pytest-quickcheck-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck - :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ - `pytest-rage-0.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to implement PEP712 - :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/santagada/pytest-rage/ - `pytest-raisesregexp-1.0 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions - :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Walkman/pytest_raisesregexp - `pytest-random-0.02 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to randomize tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-random - `pytest-rerunfailures-0.05 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures - :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/klrmn/pytest-rerunfailures - `pytest-runfailed-0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png implement a --failed option for pytest - :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed - `pytest-runner-2.1 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png UNKNOWN - :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.2.dev1 :target: https://bitbucket.org/jaraco/pytest-runner - `pytest-sftpserver-1.0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. - :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.2.dev1 :target: http://github.com/ulope/pytest-sftpserver/ - `pytest-spec-0.2.22 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION - :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/pchomik/pytest-spec - `pytest-splinter-1.0.3 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Splinter subplugin for Pytest BDD plugin - :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/paylogic/pytest-splinter - `pytest-stepwise-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png Run a test suite one failing test at a time. - :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/nip3o/pytest-stepwise - `pytest-sugar-0.3.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). - :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/Frozenball/pytest-sugar - `pytest-timeout-0.4 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests - :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ - `pytest-twisted-1.5 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png A twisted plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/schmir/pytest-twisted - `pytest-xdist-1.10 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes - :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist - `pytest-xprocess-0.8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs - :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.2.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ - `pytest-yamlwsgi-0.6 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 ? Run tests against wsgi apps defined in yaml - :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.2.dev1 - `pytest-zap-0.2 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 .. image:: github.png OWASP ZAP plugin for py.test. - :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.2.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.2.dev1 :target: https://github.com/davehunt/pytest-zap +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + Name Py27 Py34 Home Summary +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= + `pytest-allure-adaptor `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to generate allure xml reports + :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-allure-adaptor-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/allure-framework/allure-python + `pytest-bdd `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BDD for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bdd-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/olegpidsadnyi/pytest-bdd + `pytest-beds `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Fixtures for testing Google Appengine (GAE) apps + :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-beds-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kaste/pytest-beds + `pytest-bench `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Benchmark utility that plugs into pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bench-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/concordusapps/pytest-bench + `pytest-blockage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Disable network requests during a test run. + :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-blockage-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/rob-b/pytest-blockage + `pytest-browsermob-proxy `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png BrowserMob proxy plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-browsermob-proxy-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-browsermob-proxy + `pytest-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nibrahim/pytest_bugzilla + `pytest-cache `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin with mechanisms for caching across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cache-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-cache/ + `pytest-capturelog `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to capture log messages + :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-capturelog-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/memedough/pytest-capturelog/overview + `pytest-codecheckers `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to add source code sanity checks (pep8 and friends) + :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-codecheckers-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-codecheckers/ + `pytest-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-config-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Base configurations and utilities for developing your Python project test suite with pytest. + :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-config-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/buzzfeed/pytest_config + `pytest-contextfixture `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Define pytest fixtures as context managers. + :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-contextfixture-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-contextfixture/ + `pytest-couchdbkit `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test extension for per-test couchdb databases using couchdbkit + :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-couchdbkit-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/RonnyPfannschmidt/pytest-couchdbkit + `pytest-cov `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing + :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cov-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schlamar/pytest-cov + `pytest-cpp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Use pytest's runner to discover and execute C++ tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-cpp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-cpp + `pytest-dbfixtures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Databases fixtures plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbfixtures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ClearcodeHQ/pytest-dbfixtures + `pytest-dbus-notification `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png D-BUS notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-dbus-notification-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bmathieu33/pytest-dbus-notification + `pytest-describe `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Describe-style plugin for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-describe-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ropez/pytest-describe + `pytest-diffeo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Common py.test support for Diffeo packages + :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-diffeo-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/diffeo/pytest-diffeo + `pytest-django `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-latest?py=py34&pytest=2.6.4.dev1 `link `_ A Django plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-latest?py=py34&pytest=2.6.4.dev1 + `pytest-django-haystack `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Cleanup your Haystack indexes between tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-haystack-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/rouge8/pytest-django-haystack + `pytest-django-lite `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png The bare minimum to integrate py.test with Django. + :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-django-lite-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dcramer/pytest-django-lite + `pytest-echo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 `link `_ pytest plugin with mechanisms for echoing environment variables, package version and generic attributes + :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-echo-latest?py=py34&pytest=2.6.4.dev1 + `pytest-eradicate `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check for commented out code + :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-eradicate-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/spil-johan/pytest-eradicate + `pytest-figleaf `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test figleaf coverage plugin + :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-figleaf-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-figleaf + `pytest-fixture-tools `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 ? Plugin for pytest which provides tools for fixtures + :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-fixture-tools-latest?py=py34&pytest=2.6.4.dev1 + `pytest-flakes `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to check source code with pyflakes + :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flakes-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/fschulze/pytest-flakes + `pytest-flask `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A set of py.test fixtures to test Flask applications. + :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-flask-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/vitalk/pytest-flask + `pytest-greendots `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 ? Green progress dots + :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-greendots-latest?py=py34&pytest=2.6.4.dev1 + `pytest-growl `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 ? Growl notifications for pytest results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-growl-latest?py=py34&pytest=2.6.4.dev1 + `pytest-httpbin `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Easily test your HTTP library against a local copy of httpbin + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpbin-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/kevin1024/pytest-httpbin + `pytest-httpretty `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A thin wrapper of HTTPretty for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-httpretty-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/papaeye/pytest-httpretty + `pytest-incremental `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png an incremental test runner (pytest plugin) + :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-incremental-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/schettino72/pytest-incremental + `pytest-instafail `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to show failures instantly + :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-instafail-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jpvanhal/pytest-instafail + `pytest-ipdb `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A py.test plug-in to enable drop to ipdb debugger on test failure. + :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ipdb-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mverteuil/pytest-ipdb + `pytest-jira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test JIRA integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-jira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/jlaska/pytest_jira + `pytest-knows `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A pytest plugin that can automaticly skip test case based on dependence info calculated by trace + :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-knows-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/mapix/ptknows + `pytest-konira `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run Konira DSL tests with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-konira-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/alfredodeza/pytest-konira + `pytest-localserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to test server connections locally. + :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-localserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-localserver/ + `pytest-marker-bugzilla `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test bugzilla integration plugin, using markers + :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marker-bugzilla-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/eanxgeek/pytest_marker_bugzilla + `pytest-markfiltration `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-markfiltration-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-markfiltration + `pytest-marks `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png UNKNOWN + :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-marks-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/adamgoucher/pytest-marks + `pytest-mock `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Thin-wrapper around the mock package for easier use with py.test + :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mock-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nicoddemus/pytest-mock/ + `pytest-monkeyplus `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest's monkeypatch subclass with extra functionalities + :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-monkeyplus-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hsoft/pytest-monkeyplus/ + `pytest-mozwebqa `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Mozilla WebQA plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-mozwebqa-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-mozwebqa + `pytest-oerp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to test OpenERP modules + :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-oerp-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-oerp/ + `pytest-ordering `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to run your tests in a specific order + :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-ordering-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/ftobia/pytest-ordering + `pytest-osxnotify `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OS X notifications for py.test results. + :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-osxnotify-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/dbader/pytest-osxnotify + `pytest-paste-config `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 ? Allow setting the path to a paste config file + :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-paste-config-latest?py=py34&pytest=2.6.4.dev1 + `pytest-pep8 `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to check PEP8 requirements + :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pep8-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-pep8/ + `pytest-pipeline `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Pytest plugin for functional testing of data analysis pipelines + :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pipeline-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bow/pytest_pipeline + `pytest-poo `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Visualize your crappy tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-poo-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/pelme/pytest-poo + `pytest-pycharm `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Plugin for py.test to enter PyCharm debugger on uncaught exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pycharm-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/jlubcke/pytest-pycharm + `pytest-pydev `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to connect to a remote debug server with PyDev or PyCharm. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pydev-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/basti/pytest-pydev/ + `pytest-pythonpath `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin for adding to the PYTHONPATH from command line or configs. + :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-pythonpath-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/bigsassy/pytest-pythonpath + `pytest-qt `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest support for PyQt and PySide applications + :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-qt-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/nicoddemus/pytest-qt + `pytest-quickcheck `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to generate random data inspired by QuickCheck + :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-quickcheck-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/t2y/pytest-quickcheck/ + `pytest-rage `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to implement PEP712 + :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rage-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/santagada/pytest-rage/ + `pytest-raisesregexp `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Simple pytest plugin to look for regex in Exceptions + :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-raisesregexp-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Walkman/pytest_raisesregexp + `pytest-random `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-random-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to randomize tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-random-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-random + `pytest-regtest `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 `link `_ py.test plugin for regression tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-regtest-latest?py=py34&pytest=2.6.4.dev1 + `pytest-rerunfailures `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to re-run tests to eliminate flakey failures + :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-rerunfailures-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/klrmn/pytest-rerunfailures + `pytest-runfailed `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png implement a --failed option for pytest + :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runfailed-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/dmerejkowsky/pytest-runfailed + `pytest-runner `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png Invoke py.test as distutils command with dependency resolution. + :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-runner-latest?py=py34&pytest=2.6.4.dev1 :target: https://bitbucket.org/jaraco/pytest-runner + `pytest-sftpserver `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test plugin to locally test sftp server connections. + :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sftpserver-latest?py=py34&pytest=2.6.4.dev1 :target: http://github.com/ulope/pytest-sftpserver/ + `pytest-spec `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png pytest plugin to display test execution output like a SPECIFICATION + :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-spec-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pchomik/pytest-spec + `pytest-splinter `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Splinter plugin for pytest testing framework + :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-splinter-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/pytest-dev/pytest-splinter + `pytest-stepwise `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png Run a test suite one failing test at a time. + :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-stepwise-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/nip3o/pytest-stepwise + `pytest-sugar `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png py.test is a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly). + :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-sugar-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/Frozenball/pytest-sugar + `pytest-timeout `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test plugin to abort hanging tests + :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-timeout-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/flub/pytest-timeout/ + `pytest-twisted `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png A twisted plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-twisted-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/schmir/pytest-twisted + `pytest-xdist `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png py.test xdist plugin for distributed testing and loop-on-failing modes + :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xdist-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xdist + `pytest-xprocess `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 .. image:: bitbucket.png pytest plugin to manage external processes across test runs + :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-xprocess-latest?py=py34&pytest=2.6.4.dev1 :target: http://bitbucket.org/hpk42/pytest-xprocess/ + `pytest-yamlwsgi `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 ? Run tests against wsgi apps defined in yaml + :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-yamlwsgi-latest?py=py34&pytest=2.6.4.dev1 + `pytest-zap `_ .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 .. image:: http://pytest-plugs.herokuapp.com/status/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 .. image:: github.png OWASP ZAP plugin for py.test. + :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py27&pytest=2.6.4.dev1 :target: http://pytest-plugs.herokuapp.com/output/pytest-zap-latest?py=py34&pytest=2.6.4.dev1 :target: https://github.com/davehunt/pytest-zap -========================================================================================== ================================================================================================================= ================================================================================================================= ======================================================================================== ============================================================================================================================================= +==================================================================================== ================================================================================================================= ================================================================================================================= =========================================================================== ============================================================================================================================================= -*(Updated on 2014-08-26)* +*(Updated on 2014-09-27)* diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 doc/en/plugins_index/plugins_index.py --- a/doc/en/plugins_index/plugins_index.py +++ b/doc/en/plugins_index/plugins_index.py @@ -61,7 +61,7 @@ yield name, str(loose_version) -def obtain_plugins_table(plugins, client): +def obtain_plugins_table(plugins, client, verbose): """ Returns information to populate a table of plugins, their versions, authors, etc. @@ -72,6 +72,7 @@ :param plugins: list of (name, version) :param client: ServerProxy + :param verbose: print plugin name and version as they are fetch """ def get_repo_markup(repo): """ @@ -96,7 +97,7 @@ pad_right = ('%-' + str(len(target_markup)) + 's') return pad_right % image_markup, target_markup else: - return ('`%s <%s>`_' % (target, target)), '' + return ('`link <%s>`_' % target), '' def sanitize_summary(summary): """Make sure summaries don't break our table formatting. @@ -105,13 +106,14 @@ rows = [] ColumnData = namedtuple('ColumnData', 'text link') - headers = ['Name', 'Py27', 'Py34', 'Repo', 'Summary'] + headers = ['Name', 'Py27', 'Py34', 'Home', 'Summary'] pytest_version = pytest.__version__ repositories = obtain_override_repositories() - print('*** pytest-{0} ***'.format(pytest_version)) + print('Generating plugins_index page (pytest-{0})'.format(pytest_version)) plugins = list(plugins) for index, (package_name, version) in enumerate(plugins): - print(package_name, version, '...', end='') + if verbose: + print(package_name, version, '...', end='') release_data = client.release_data(package_name, version) @@ -128,7 +130,7 @@ image_url = url.format(**common_params) image_url += '?py={py}&pytest={pytest}' row = ( - ColumnData(package_name + "-" + version, release_data['package_url']), + ColumnData(package_name, release_data['package_url']), ColumnData(image_url.format(py='py27', pytest=pytest_version), None), ColumnData(image_url.format(py='py34', pytest=pytest_version), @@ -159,7 +161,10 @@ assert len(row) == len(headers) rows.append(row) - print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + if verbose: + print('OK (%d%%)' % ((index + 1) * 100 / len(plugins))) + + print('Done: %d plugins' % len(plugins)) return headers, rows @@ -235,16 +240,17 @@ print('*(Updated on %s)*' % today, file=f) -def generate_plugins_index(client, filename): +def generate_plugins_index(client, filename, verbose): """ Generates an RST file with a table of the latest pytest plugins found in PyPI. :param client: ServerProxy :param filename: output filename + :param verbose: print name and version of each plugin as they are fetch """ plugins = get_latest_versions(iter_plugins(client)) - headers, rows = obtain_plugins_table(plugins, client) + headers, rows = obtain_plugins_table(plugins, client, verbose) generate_plugins_index_from_table(filename, headers, rows) @@ -262,13 +268,15 @@ help='output filename [default: %default]') parser.add_option('-u', '--url', default=url, help='url of PyPI server to obtain data from [default: %default]') + parser.add_option('-v', '--verbose', default=False, action='store_true', + help='verbose output') (options, _) = parser.parse_args(argv[1:]) client = get_proxy(options.url) - generate_plugins_index(client, options.filename) + generate_plugins_index(client, options.filename, options.verbose) print() - print('%s Updated.' % options.filename) + print('%s updated.' % options.filename) return 0 diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -234,12 +234,13 @@ @pytest.mark.parametrize("spec", [ ("None", ("test_func[None]",)), - ("1.3", ("test_func[1.3]",)) + ("1.3", ("test_func[1.3]",)), + ("2-3", ("test_func[2-3]",)) ]) def test_keyword_option_parametrize(spec, testdir): testdir.makepyfile(""" import pytest - @pytest.mark.parametrize("arg", [None, 1.3]) + @pytest.mark.parametrize("arg", [None, 1.3, "2-3"]) def test_func(arg): pass """) @@ -497,7 +498,7 @@ check('TestClass and test', 'test_method_one') @pytest.mark.parametrize("keyword", [ - 'xxx', 'xxx and test_2', 'TestClass', 'xxx and -test_1', + 'xxx', 'xxx and test_2', 'TestClass', 'xxx and not test_1', 'TestClass and test_2', 'xxx and TestClass and test_2']) def test_select_extra_keywords(self, testdir, keyword): p = testdir.makepyfile(test_select=""" diff -r 2d8d1399aae61ede48e6b5fcc3ec3ee12b400e71 -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 tox.ini --- a/tox.ini +++ b/tox.ini @@ -89,6 +89,7 @@ PyYAML commands= + {envpython} plugins_index/plugins_index.py make clean make html https://bitbucket.org/hpk42/pytest/commits/f18c5f2f7794/ Changeset: f18c5f2f7794 User: hpk42 Date: 2014-10-07 14:16:47+00:00 Summary: fix add_method_controller to deal properly in the event of exceptions. add a docstring as well. Affected #: 2 files diff -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 -r f18c5f2f7794af9e86e63080cf6efc8d820ce3b5 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -67,20 +67,39 @@ def get(self, name): return self.__class__(self.root, self.tags + (name,)) + def add_method_controller(cls, func): + """ Use func as the method controler for the method found + at the class named func.__name__. + + A method controler is invoked with the same arguments + as the function it substitutes and is required to yield once + which will trigger calling the controlled method. + If it yields a second value, the value will be returned + as the result of the invocation. Errors in the controlled function + are re-raised to the controller during the first yield. + """ name = func.__name__ oldcall = getattr(cls, name) def wrap_exec(*args, **kwargs): gen = func(*args, **kwargs) next(gen) # first yield - res = oldcall(*args, **kwargs) try: - gen.send(res) - except StopIteration: - pass + res = oldcall(*args, **kwargs) + except Exception: + excinfo = sys.exc_info() + try: + # reraise exception to controller + res = gen.throw(*excinfo) + except StopIteration: + py.builtin._reraise(*excinfo) else: - raise ValueError("expected StopIteration") + try: + res = gen.send(res) + except StopIteration: + pass return res + setattr(cls, name, wrap_exec) return lambda: setattr(cls, name, oldcall) diff -r fc5bd1abf7b7d98a71088643b886c8c4ee511001 -r f18c5f2f7794af9e86e63080cf6efc8d820ce3b5 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -765,22 +765,96 @@ assert "qwe" not in str(excinfo.value) assert "aaaa" in str(excinfo.value) +class TestWrapMethod: + def test_basic_happypath(self): + class A: + def f(self): + return "A.f" -def test_wrapping(): - class A: + l = [] def f(self): - return "A.f" + l.append(1) + yield + l.append(2) + undo = add_method_controller(A, f) - l = [] - def f(self): - l.append(1) - yield - l.append(2) - undo = add_method_controller(A, f) + assert A().f() == "A.f" + assert l == [1,2] + undo() + l[:] = [] + assert A().f() == "A.f" + assert l == [] - assert A().f() == "A.f" - assert l == [1,2] - undo() - l[:] = [] - assert A().f() == "A.f" - assert l == [] + def test_method_raises(self): + class A: + def error(self, val): + raise ValueError(val) + + l = [] + def error(self, val): + l.append(val) + try: + yield + except ValueError: + l.append(None) + raise + + + undo = add_method_controller(A, error) + + with pytest.raises(ValueError): + A().error(42) + assert l == [42, None] + undo() + l[:] = [] + with pytest.raises(ValueError): + A().error(42) + assert l == [] + + def test_controller_swallows_method_raises(self): + class A: + def error(self, val): + raise ValueError(val) + + def error(self, val): + try: + yield + except ValueError: + yield 2 + + add_method_controller(A, error) + assert A().error(42) == 2 + + def test_reraise_on_controller_StopIteration(self): + class A: + def error(self, val): + raise ValueError(val) + + def error(self, val): + try: + yield + except ValueError: + pass + + add_method_controller(A, error) + with pytest.raises(ValueError): + A().error(42) + + @pytest.mark.xfail(reason="if needed later") + def test_modify_call_args(self): + class A: + def error(self, val1, val2): + raise ValueError(val1+val2) + + l = [] + def error(self): + try: + yield (1,), {'val2': 2} + except ValueError as ex: + assert ex.args == (3,) + l.append(1) + + add_method_controller(A, error) + with pytest.raises(ValueError): + A().error() + assert l == [1] https://bitbucket.org/hpk42/pytest/commits/fd286a7511c9/ Changeset: fd286a7511c9 User: hpk42 Date: 2014-10-07 16:11:15+00:00 Summary: merge pytest default Affected #: 12 files diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/config.py --- a/_pytest/config.py +++ b/_pytest/config.py @@ -98,7 +98,7 @@ err = py.io.dupfile(err, encoding=encoding) except Exception: pass - self.trace.root.setwriter(err.write) + self.set_tracing(err.write) def pytest_configure(self, config): config.addinivalue_line("markers", @@ -682,11 +682,8 @@ setattr(self.option, opt.dest, opt.default) def _getmatchingplugins(self, fspath): - allconftests = self._conftest._conftestpath2mod.values() - plugins = [x for x in self.pluginmanager.getplugins() - if x not in allconftests] - plugins += self._conftest.getconftestmodules(fspath) - return plugins + return self.pluginmanager._plugins + \ + self._conftest.getconftestmodules(fspath) def pytest_load_initial_conftests(self, early_config): self._conftest.setinitial(early_config.known_args_namespace) diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -67,16 +67,74 @@ def get(self, name): return self.__class__(self.root, self.tags + (name,)) + +def add_method_controller(cls, func): + """ Use func as the method controler for the method found + at the class named func.__name__. + + A method controler is invoked with the same arguments + as the function it substitutes and is required to yield once + which will trigger calling the controlled method. + If it yields a second value, the value will be returned + as the result of the invocation. Errors in the controlled function + are re-raised to the controller during the first yield. + """ + name = func.__name__ + oldcall = getattr(cls, name) + def wrap_exec(*args, **kwargs): + gen = func(*args, **kwargs) + next(gen) # first yield + try: + res = oldcall(*args, **kwargs) + except Exception: + excinfo = sys.exc_info() + try: + # reraise exception to controller + res = gen.throw(*excinfo) + except StopIteration: + py.builtin._reraise(*excinfo) + else: + try: + res = gen.send(res) + except StopIteration: + pass + return res + + setattr(cls, name, wrap_exec) + return lambda: setattr(cls, name, oldcall) + + class PluginManager(object): - def __init__(self, hookspecs=None): + def __init__(self, hookspecs=None, prefix="pytest_"): self._name2plugin = {} - self._listattrcache = {} self._plugins = [] + self._conftestplugins = [] self._warnings = [] self.trace = TagTracer().get("pluginmanage") self._plugin_distinfo = [] self._shutdown = [] - self.hook = HookRelay(hookspecs or [], pm=self) + self.hook = HookRelay(hookspecs or [], pm=self, prefix=prefix) + + def set_tracing(self, writer): + self.trace.root.setwriter(writer) + # reconfigure HookCalling to perform tracing + assert not hasattr(self, "_wrapping") + self._wrapping = True + + def _docall(self, methods, kwargs): + trace = self.hookrelay.trace + trace.root.indent += 1 + trace(self.name, kwargs) + res = None + try: + res = yield + finally: + if res: + trace("finish", self.name, "-->", res) + trace.root.indent -= 1 + + undo = add_method_controller(HookCaller, _docall) + self.add_shutdown(undo) def do_configure(self, config): # backward compatibility @@ -86,7 +144,7 @@ assert not hasattr(self, "_registercallback") self._registercallback = callback - def register(self, plugin, name=None, prepend=False): + def register(self, plugin, name=None, prepend=False, conftest=False): if self._name2plugin.get(name, None) == -1: return name = name or getattr(plugin, '__name__', str(id(plugin))) @@ -94,20 +152,27 @@ raise ValueError("Plugin already registered: %s=%s\n%s" %( name, plugin, self._name2plugin)) #self.trace("registering", name, plugin) - self._name2plugin[name] = plugin reg = getattr(self, "_registercallback", None) if reg is not None: - reg(plugin, name) - if not prepend: - self._plugins.append(plugin) + reg(plugin, name) # may call addhooks + self.hook._scan_plugin(plugin) + self._name2plugin[name] = plugin + if conftest: + self._conftestplugins.append(plugin) else: - self._plugins.insert(0, plugin) + if not prepend: + self._plugins.append(plugin) + else: + self._plugins.insert(0, plugin) return True def unregister(self, plugin=None, name=None): if plugin is None: plugin = self.getplugin(name=name) - self._plugins.remove(plugin) + try: + self._plugins.remove(plugin) + except KeyError: + self._conftestplugins.remove(plugin) for name, value in list(self._name2plugin.items()): if value == plugin: del self._name2plugin[name] @@ -119,9 +184,8 @@ while self._shutdown: func = self._shutdown.pop() func() - self._plugins = [] + self._plugins = self._conftestplugins = [] self._name2plugin.clear() - self._listattrcache.clear() def isregistered(self, plugin, name=None): if self.getplugin(name) is not None: @@ -134,7 +198,7 @@ self.hook._addhooks(spec, prefix=prefix) def getplugins(self): - return list(self._plugins) + return self._plugins + self._conftestplugins def skipifmissing(self, name): if not self.hasplugin(name): @@ -198,7 +262,8 @@ self.import_plugin(arg) def consider_conftest(self, conftestmodule): - if self.register(conftestmodule, name=conftestmodule.__file__): + if self.register(conftestmodule, name=conftestmodule.__file__, + conftest=True): self.consider_module(conftestmodule) def consider_module(self, mod): @@ -233,12 +298,7 @@ def listattr(self, attrname, plugins=None): if plugins is None: - plugins = self._plugins - key = (attrname,) + tuple(plugins) - try: - return list(self._listattrcache[key]) - except KeyError: - pass + plugins = self._plugins + self._conftestplugins l = [] last = [] wrappers = [] @@ -257,7 +317,6 @@ l.append(meth) l.extend(last) l.extend(wrappers) - self._listattrcache[key] = list(l) return l def call_plugin(self, plugin, methname, kwargs): @@ -288,6 +347,7 @@ def __init__(self, methods, kwargs, firstresult=False): self.methods = list(methods) self.kwargs = kwargs + self.kwargs["__multicall__"] = self self.results = [] self.firstresult = firstresult @@ -298,11 +358,12 @@ def execute(self): next_finalizers = [] try: + all_kwargs = self.kwargs while self.methods: method = self.methods.pop() - kwargs = self.getkwargs(method) + args = [all_kwargs[argname] for argname in varnames(method)] if hasattr(method, "hookwrapper"): - it = method(**kwargs) + it = method(*args) next = getattr(it, "next", None) if next is None: next = getattr(it, "__next__", None) @@ -312,7 +373,7 @@ res = next() next_finalizers.append((method, next)) else: - res = method(**kwargs) + res = method(*args) if res is not None: self.results.append(res) if self.firstresult: @@ -330,17 +391,7 @@ "wrapper contain more than one yield") - def getkwargs(self, method): - kwargs = {} - for argname in varnames(method): - try: - kwargs[argname] = self.kwargs[argname] - except KeyError: - if argname == "__multicall__": - kwargs[argname] = self - return kwargs - -def varnames(func): +def varnames(func, startindex=None): """ return argument name tuple for a function, method, class or callable. In case of a class, its "__init__" method is considered. @@ -357,74 +408,130 @@ func = func.__init__ except AttributeError: return () - ismethod = True + startindex = 1 else: if not inspect.isfunction(func) and not inspect.ismethod(func): func = getattr(func, '__call__', func) - ismethod = inspect.ismethod(func) + if startindex is None: + startindex = int(inspect.ismethod(func)) + rawcode = py.code.getrawcode(func) try: - x = rawcode.co_varnames[ismethod:rawcode.co_argcount] + x = rawcode.co_varnames[startindex:rawcode.co_argcount] except AttributeError: x = () + else: + defaults = func.__defaults__ + if defaults: + x = x[:-len(defaults)] try: cache["_varnames"] = x except TypeError: pass return x + class HookRelay: def __init__(self, hookspecs, pm, prefix="pytest_"): if not isinstance(hookspecs, list): hookspecs = [hookspecs] - self._hookspecs = [] self._pm = pm self.trace = pm.trace.root.get("hook") + self.prefix = prefix for hookspec in hookspecs: self._addhooks(hookspec, prefix) - def _addhooks(self, hookspecs, prefix): - self._hookspecs.append(hookspecs) + def _addhooks(self, hookspec, prefix): added = False - for name, method in vars(hookspecs).items(): + isclass = int(inspect.isclass(hookspec)) + for name, method in vars(hookspec).items(): if name.startswith(prefix): firstresult = getattr(method, 'firstresult', False) - hc = HookCaller(self, name, firstresult=firstresult) + hc = HookCaller(self, name, firstresult=firstresult, + argnames=varnames(method, startindex=isclass)) setattr(self, name, hc) added = True #print ("setting new hook", name) if not added: raise ValueError("did not find new %r hooks in %r" %( - prefix, hookspecs,)) + prefix, hookspec,)) + + def _getcaller(self, name, plugins): + caller = getattr(self, name) + methods = self._pm.listattr(name, plugins=plugins) + if methods: + return caller.new_cached_caller(methods) + return caller + + def _scan_plugin(self, plugin): + def fail(msg, *args): + name = getattr(plugin, '__name__', plugin) + raise PluginValidationError("plugin %r\n%s" %(name, msg % args)) + + for name in dir(plugin): + if not name.startswith(self.prefix): + continue + hook = getattr(self, name, None) + method = getattr(plugin, name) + if hook is None: + is_optional = getattr(method, 'optionalhook', False) + if not isgenerichook(name) and not is_optional: + fail("found unknown hook: %r", name) + continue + for arg in varnames(method): + if arg not in hook.argnames: + fail("argument %r not available\n" + "actual definition: %s\n" + "available hookargs: %s", + arg, formatdef(method), + ", ".join(hook.argnames)) + getattr(self, name).clear_method_cache() class HookCaller: - def __init__(self, hookrelay, name, firstresult): + def __init__(self, hookrelay, name, firstresult, argnames, methods=None): self.hookrelay = hookrelay self.name = name self.firstresult = firstresult - self.trace = self.hookrelay.trace + self.methods = methods + self.argnames = ["__multicall__"] + self.argnames.extend(argnames) + assert "self" not in argnames # prevent oversights + + def new_cached_caller(self, methods): + return HookCaller(self.hookrelay, self.name, self.firstresult, + argnames=self.argnames, methods=methods) def __repr__(self): return "" %(self.name,) + def clear_method_cache(self): + self.methods = None + def __call__(self, **kwargs): - methods = self.hookrelay._pm.listattr(self.name) + methods = self.methods + if methods is None: + self.methods = methods = self.hookrelay._pm.listattr(self.name) return self._docall(methods, kwargs) - def pcall(self, plugins, **kwargs): - methods = self.hookrelay._pm.listattr(self.name, plugins=plugins) - return self._docall(methods, kwargs) + def callextra(self, methods, **kwargs): + return self._docall(self.methods + methods, kwargs) def _docall(self, methods, kwargs): - self.trace(self.name, kwargs) - self.trace.root.indent += 1 - mc = MultiCall(methods, kwargs, firstresult=self.firstresult) - try: - res = mc.execute() - if res: - self.trace("finish", self.name, "-->", res) - finally: - self.trace.root.indent -= 1 - return res + return MultiCall(methods, kwargs, + firstresult=self.firstresult).execute() + +class PluginValidationError(Exception): + """ plugin failed validation. """ + +def isgenerichook(name): + return name == "pytest_plugins" or \ + name.startswith("pytest_funcarg__") + +def formatdef(func): + return "%s%s" % ( + func.__name__, + inspect.formatargspec(*inspect.getargspec(func)) + ) + diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/helpconfig.py --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -1,8 +1,7 @@ """ version info, help messages, tracing configuration. """ import py import pytest -import os, inspect, sys -from _pytest.core import varnames +import os, sys def pytest_addoption(parser): group = parser.getgroup('debugconfig') @@ -32,7 +31,7 @@ f.write("versions pytest-%s, py-%s, python-%s\ncwd=%s\nargs=%s\n\n" %( pytest.__version__, py.__version__, ".".join(map(str, sys.version_info)), os.getcwd(), config._origargs)) - config.trace.root.setwriter(f.write) + config.pluginmanager.set_tracing(f.write) sys.stderr.write("writing pytestdebug information to %s\n" % path) return config @@ -127,70 +126,3 @@ return lines -# ===================================================== -# validate plugin syntax and hooks -# ===================================================== - -def pytest_plugin_registered(manager, plugin): - methods = collectattr(plugin) - hooks = {} - for hookspec in manager.hook._hookspecs: - hooks.update(collectattr(hookspec)) - - stringio = py.io.TextIO() - def Print(*args): - if args: - stringio.write(" ".join(map(str, args))) - stringio.write("\n") - - fail = False - while methods: - name, method = methods.popitem() - #print "checking", name - if isgenerichook(name): - continue - if name not in hooks: - if not getattr(method, 'optionalhook', False): - Print("found unknown hook:", name) - fail = True - else: - #print "checking", method - method_args = list(varnames(method)) - if '__multicall__' in method_args: - method_args.remove('__multicall__') - hook = hooks[name] - hookargs = varnames(hook) - for arg in method_args: - if arg not in hookargs: - Print("argument %r not available" %(arg, )) - Print("actual definition: %s" %(formatdef(method))) - Print("available hook arguments: %s" % - ", ".join(hookargs)) - fail = True - break - #if not fail: - # print "matching hook:", formatdef(method) - if fail: - name = getattr(plugin, '__name__', plugin) - raise PluginValidationError("%s:\n%s" % (name, stringio.getvalue())) - -class PluginValidationError(Exception): - """ plugin failed validation. """ - -def isgenerichook(name): - return name == "pytest_plugins" or \ - name.startswith("pytest_funcarg__") - -def collectattr(obj): - methods = {} - for apiname in dir(obj): - if apiname.startswith("pytest_"): - methods[apiname] = getattr(obj, apiname) - return methods - -def formatdef(func): - return "%s%s" % ( - func.__name__, - inspect.formatargspec(*inspect.getargspec(func)) - ) - diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/hookspec.py --- a/_pytest/hookspec.py +++ b/_pytest/hookspec.py @@ -142,7 +142,7 @@ # ------------------------------------------------------------------------- # generic runtest related hooks # ------------------------------------------------------------------------- -def pytest_itemstart(item, node=None): +def pytest_itemstart(item, node): """ (deprecated, use pytest_runtest_logstart). """ def pytest_runtest_protocol(item, nextitem): diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -153,19 +153,17 @@ ignore_paths.extend([py.path.local(x) for x in excludeopt]) return path in ignore_paths -class HookProxy(object): +class FSHookProxy(object): def __init__(self, fspath, config): self.fspath = fspath self.config = config def __getattr__(self, name): - config = object.__getattribute__(self, "config") - hookmethod = getattr(config.hook, name) + plugins = self.config._getmatchingplugins(self.fspath) + x = self.config.hook._getcaller(name, plugins) + self.__dict__[name] = x + return x - def call_matching_hooks(**kwargs): - plugins = self.config._getmatchingplugins(self.fspath) - return hookmethod.pcall(plugins, **kwargs) - return call_matching_hooks def compatproperty(name): def fget(self): @@ -520,6 +518,7 @@ self.trace = config.trace.root.get("collection") self._norecursepatterns = config.getini("norecursedirs") self.startdir = py.path.local() + self._fs2hookproxy = {} def pytest_collectstart(self): if self.shouldstop: @@ -538,7 +537,11 @@ return path in self._initialpaths def gethookproxy(self, fspath): - return HookProxy(fspath, self.config) + try: + return self._fs2hookproxy[fspath] + except KeyError: + self._fs2hookproxy[fspath] = x = FSHookProxy(fspath, self.config) + return x def perform_collect(self, args=None, genitems=True): hook = self.config.hook diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/pytester.py --- a/_pytest/pytester.py +++ b/_pytest/pytester.py @@ -1,5 +1,4 @@ """ (disabled by default) support for testing pytest and pytest plugins. """ -import inspect import sys import os import codecs @@ -12,7 +11,7 @@ import py import pytest from py.builtin import print_ -from _pytest.core import HookRelay +from _pytest.core import HookCaller, add_method_controller from _pytest.main import Session, EXIT_OK @@ -38,24 +37,10 @@ _pytest_fullpath = os.path.abspath(pytest.__file__.rstrip("oc")) _pytest_fullpath = _pytest_fullpath.replace("$py.class", ".py") -def pytest_funcarg___pytest(request): - return PytestArg(request) - -class PytestArg: - def __init__(self, request): - self.request = request - - def gethookrecorder(self, hook): - hookrecorder = HookRecorder(hook._pm) - hookrecorder.start_recording(hook._hookspecs) - self.request.addfinalizer(hookrecorder.finish_recording) - return hookrecorder class ParsedCall: - def __init__(self, name, locals): - assert '_name' not in locals - self.__dict__.update(locals) - self.__dict__.pop('self') + def __init__(self, name, kwargs): + self.__dict__.update(kwargs) self._name = name def __repr__(self): @@ -63,68 +48,27 @@ del d['_name'] return "" %(self._name, d) + class HookRecorder: def __init__(self, pluginmanager): self._pluginmanager = pluginmanager self.calls = [] - self._recorders = {} - def start_recording(self, hookspecs): - if not isinstance(hookspecs, (list, tuple)): - hookspecs = [hookspecs] - for hookspec in hookspecs: - assert hookspec not in self._recorders - class RecordCalls: - _recorder = self - for name, method in vars(hookspec).items(): - if name[0] != "_": - setattr(RecordCalls, name, self._makecallparser(method)) - recorder = RecordCalls() - self._recorders[hookspec] = recorder - self._pluginmanager.register(recorder) - self.hook = HookRelay(hookspecs, pm=self._pluginmanager, - prefix="pytest_") + def _docall(hookcaller, methods, kwargs): + self.calls.append(ParsedCall(hookcaller.name, kwargs)) + yield + self._undo_wrapping = add_method_controller(HookCaller, _docall) + pluginmanager.add_shutdown(self._undo_wrapping) def finish_recording(self): - for recorder in self._recorders.values(): - if self._pluginmanager.isregistered(recorder): - self._pluginmanager.unregister(recorder) - self._recorders.clear() - - def _makecallparser(self, method): - name = method.__name__ - args, varargs, varkw, default = inspect.getargspec(method) - if not args or args[0] != "self": - args.insert(0, 'self') - fspec = inspect.formatargspec(args, varargs, varkw, default) - # we use exec because we want to have early type - # errors on wrong input arguments, using - # *args/**kwargs delays this and gives errors - # elsewhere - exec (py.code.compile(""" - def %(name)s%(fspec)s: - self._recorder.calls.append( - ParsedCall(%(name)r, locals())) - """ % locals())) - return locals()[name] + self._undo_wrapping() def getcalls(self, names): if isinstance(names, str): names = names.split() - for name in names: - for cls in self._recorders: - if name in vars(cls): - break - else: - raise ValueError("callname %r not found in %r" %( - name, self._recorders.keys())) - l = [] - for call in self.calls: - if call._name in names: - l.append(call) - return l + return [call for call in self.calls if call._name in names] - def contains(self, entries): + def assert_contains(self, entries): __tracebackhide__ = True i = 0 entries = list(entries) @@ -160,6 +104,69 @@ assert len(l) == 1, (name, l) return l[0] + # functionality for test reports + + def getreports(self, + names="pytest_runtest_logreport pytest_collectreport"): + return [x.report for x in self.getcalls(names)] + + def matchreport(self, inamepart="", + names="pytest_runtest_logreport pytest_collectreport", when=None): + """ return a testreport whose dotted import path matches """ + l = [] + for rep in self.getreports(names=names): + try: + if not when and rep.when != "call" and rep.passed: + # setup/teardown passing reports - let's ignore those + continue + except AttributeError: + pass + if when and getattr(rep, 'when', None) != when: + continue + if not inamepart or inamepart in rep.nodeid.split("::"): + l.append(rep) + if not l: + raise ValueError("could not find test report matching %r: " + "no test reports at all!" % (inamepart,)) + if len(l) > 1: + raise ValueError( + "found 2 or more testreports matching %r: %s" %(inamepart, l)) + return l[0] + + def getfailures(self, + names='pytest_runtest_logreport pytest_collectreport'): + return [rep for rep in self.getreports(names) if rep.failed] + + def getfailedcollections(self): + return self.getfailures('pytest_collectreport') + + def listoutcomes(self): + passed = [] + skipped = [] + failed = [] + for rep in self.getreports( + "pytest_collectreport pytest_runtest_logreport"): + if rep.passed: + if getattr(rep, "when", None) == "call": + passed.append(rep) + elif rep.skipped: + skipped.append(rep) + elif rep.failed: + failed.append(rep) + return passed, skipped, failed + + def countoutcomes(self): + return [len(x) for x in self.listoutcomes()] + + def assertoutcome(self, passed=0, skipped=0, failed=0): + realpassed, realskipped, realfailed = self.listoutcomes() + assert passed == len(realpassed) + assert skipped == len(realskipped) + assert failed == len(realfailed) + + def clear(self): + self.calls[:] = [] + def pytest_funcarg__linecomp(request): return LineComp() @@ -195,7 +202,6 @@ def __init__(self, request): self.request = request self.Config = request.config.__class__ - self._pytest = request.getfuncargvalue("_pytest") # XXX remove duplication with tmpdir plugin basetmp = request.config._tmpdirhandler.ensuretemp("testdir") name = request.function.__name__ @@ -226,15 +232,10 @@ if fn and fn.startswith(str(self.tmpdir)): del sys.modules[name] - def getreportrecorder(self, obj): - if hasattr(obj, 'config'): - obj = obj.config - if hasattr(obj, 'hook'): - obj = obj.hook - assert hasattr(obj, '_hookspecs'), obj - reprec = ReportRecorder(obj) - reprec.hookrecorder = self._pytest.gethookrecorder(obj) - reprec.hook = reprec.hookrecorder.hook + def make_hook_recorder(self, pluginmanager): + assert not hasattr(pluginmanager, "reprec") + pluginmanager.reprec = reprec = HookRecorder(pluginmanager) + self.request.addfinalizer(reprec.finish_recording) return reprec def chdir(self): @@ -353,26 +354,23 @@ def inline_genitems(self, *args): return self.inprocess_run(list(args) + ['--collectonly']) - def inline_run(self, *args): - items, rec = self.inprocess_run(args) - return rec + def inprocess_run(self, args, plugins=()): + rec = self.inline_run(*args, plugins=plugins) + items = [x.item for x in rec.getcalls("pytest_itemcollected")] + return items, rec - def inprocess_run(self, args, plugins=None): + def inline_run(self, *args, **kwargs): rec = [] - items = [] class Collect: def pytest_configure(x, config): - rec.append(self.getreportrecorder(config)) - def pytest_itemcollected(self, item): - items.append(item) - if not plugins: - plugins = [] + rec.append(self.make_hook_recorder(config.pluginmanager)) + plugins = kwargs.get("plugins") or [] plugins.append(Collect()) ret = pytest.main(list(args), plugins=plugins) + assert len(rec) == 1 reprec = rec[0] reprec.ret = ret - assert len(rec) == 1 - return items, reprec + return reprec def parseconfig(self, *args): args = [str(x) for x in args] @@ -547,86 +545,6 @@ return "INTERNAL not-utf8-decodeable, truncated string:\n%s" % ( py.io.saferepr(out),) -class ReportRecorder(object): - def __init__(self, hook): - self.hook = hook - self.pluginmanager = hook._pm - self.pluginmanager.register(self) - - def getcall(self, name): - return self.hookrecorder.getcall(name) - - def popcall(self, name): - return self.hookrecorder.popcall(name) - - def getcalls(self, names): - """ return list of ParsedCall instances matching the given eventname. """ - return self.hookrecorder.getcalls(names) - - # functionality for test reports - - def getreports(self, names="pytest_runtest_logreport pytest_collectreport"): - return [x.report for x in self.getcalls(names)] - - def matchreport(self, inamepart="", - names="pytest_runtest_logreport pytest_collectreport", when=None): - """ return a testreport whose dotted import path matches """ - l = [] - for rep in self.getreports(names=names): - try: - if not when and rep.when != "call" and rep.passed: - # setup/teardown passing reports - let's ignore those - continue - except AttributeError: - pass - if when and getattr(rep, 'when', None) != when: - continue - if not inamepart or inamepart in rep.nodeid.split("::"): - l.append(rep) - if not l: - raise ValueError("could not find test report matching %r: no test reports at all!" % - (inamepart,)) - if len(l) > 1: - raise ValueError("found more than one testreport matching %r: %s" %( - inamepart, l)) - return l[0] - - def getfailures(self, names='pytest_runtest_logreport pytest_collectreport'): - return [rep for rep in self.getreports(names) if rep.failed] - - def getfailedcollections(self): - return self.getfailures('pytest_collectreport') - - def listoutcomes(self): - passed = [] - skipped = [] - failed = [] - for rep in self.getreports( - "pytest_collectreport pytest_runtest_logreport"): - if rep.passed: - if getattr(rep, "when", None) == "call": - passed.append(rep) - elif rep.skipped: - skipped.append(rep) - elif rep.failed: - failed.append(rep) - return passed, skipped, failed - - def countoutcomes(self): - return [len(x) for x in self.listoutcomes()] - - def assertoutcome(self, passed=0, skipped=0, failed=0): - realpassed, realskipped, realfailed = self.listoutcomes() - assert passed == len(realpassed) - assert skipped == len(realskipped) - assert failed == len(realfailed) - - def clear(self): - self.hookrecorder.calls[:] = [] - - def unregister(self): - self.pluginmanager.unregister(self) - self.hookrecorder.finish_recording() class LineComp: def __init__(self): diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -353,15 +353,17 @@ fixtureinfo = fm.getfixtureinfo(self, funcobj, cls) metafunc = Metafunc(funcobj, fixtureinfo, self.config, cls=cls, module=module) - gentesthook = self.config.hook.pytest_generate_tests - extra = [module] - if cls is not None: - extra.append(cls()) - plugins = self.getplugins() + extra - gentesthook.pcall(plugins, metafunc=metafunc) + try: + methods = [module.pytest_generate_tests] + except AttributeError: + methods = [] + if hasattr(cls, "pytest_generate_tests"): + methods.append(cls().pytest_generate_tests) + self.ihook.pytest_generate_tests.callextra(methods, metafunc=metafunc) + Function = self._getcustomclass("Function") if not metafunc._calls: - yield Function(name, parent=self) + yield Function(name, parent=self, fixtureinfo=fixtureinfo) else: # add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs add_funcarg_pseudo_fixture_def(self, metafunc, fm) @@ -370,6 +372,7 @@ subname = "%s[%s]" %(name, callspec.id) yield Function(name=subname, parent=self, callspec=callspec, callobj=funcobj, + fixtureinfo=fixtureinfo, keywords={callspec.id:True}) def add_funcarg_pseudo_fixture_def(collector, metafunc, fixturemanager): @@ -1065,28 +1068,27 @@ """ _genid = None def __init__(self, name, parent, args=None, config=None, - callspec=None, callobj=NOTSET, keywords=None, session=None): + callspec=None, callobj=NOTSET, keywords=None, session=None, + fixtureinfo=None): super(Function, self).__init__(name, parent, config=config, session=session) self._args = args if callobj is not NOTSET: self.obj = callobj - for name, val in (py.builtin._getfuncdict(self.obj) or {}).items(): - self.keywords[name] = val + self.keywords.update(self.obj.__dict__) if callspec: - for name, val in callspec.keywords.items(): - self.keywords[name] = val + self.callspec = callspec + self.keywords.update(callspec.keywords) if keywords: - for name, val in keywords.items(): - self.keywords[name] = val + self.keywords.update(keywords) - isyield = self._isyieldedfunction() - self._fixtureinfo = fi = self.session._fixturemanager.getfixtureinfo( - self.parent, self.obj, self.cls, funcargs=not isyield) - self.fixturenames = fi.names_closure - if callspec is not None: - self.callspec = callspec + if fixtureinfo is None: + fixtureinfo = self.session._fixturemanager.getfixtureinfo( + self.parent, self.obj, self.cls, + funcargs=not self._isyieldedfunction()) + self._fixtureinfo = fixtureinfo + self.fixturenames = fixtureinfo.names_closure self._initrequest() def _initrequest(self): @@ -1571,15 +1573,8 @@ self._nodeid_and_autousenames = [("", self.config.getini("usefixtures"))] session.config.pluginmanager.register(self, "funcmanage") - self._nodename2fixtureinfo = {} def getfixtureinfo(self, node, func, cls, funcargs=True): - # node is the "collection node" for "func" - key = (node, func) - try: - return self._nodename2fixtureinfo[key] - except KeyError: - pass if funcargs and not hasattr(node, "nofuncargs"): if cls is not None: startindex = 1 @@ -1595,10 +1590,7 @@ fm = node.session._fixturemanager names_closure, arg2fixturedefs = fm.getfixtureclosure(initialnames, node) - fixtureinfo = FuncFixtureInfo(argnames, names_closure, - arg2fixturedefs) - self._nodename2fixtureinfo[key] = fixtureinfo - return fixtureinfo + return FuncFixtureInfo(argnames, names_closure, arg2fixturedefs) ### XXX this hook should be called for historic events like pytest_configure ### so that we don't have to do the below pytest_configure hook diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d bench/bench.py --- a/bench/bench.py +++ b/bench/bench.py @@ -9,4 +9,4 @@ p = pstats.Stats("prof") p.strip_dirs() p.sort_stats('cumulative') - print(p.print_stats(250)) + print(p.print_stats(500)) diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -334,9 +334,9 @@ assert item.name == "test_func" newid = item.nodeid assert newid == id - py.std.pprint.pprint(hookrec.hookrecorder.calls) + py.std.pprint.pprint(hookrec.calls) topdir = testdir.tmpdir # noqa - hookrec.hookrecorder.contains([ + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == topdir"), ("pytest_make_collect_report", "collector.fspath == topdir"), ("pytest_collectstart", "collector.fspath == p"), @@ -381,9 +381,9 @@ id = p.basename items, hookrec = testdir.inline_genitems(id) - py.std.pprint.pprint(hookrec.hookrecorder.calls) + py.std.pprint.pprint(hookrec.calls) assert len(items) == 2 - hookrec.hookrecorder.contains([ + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == collector.session.fspath"), ("pytest_collectstart", @@ -404,8 +404,8 @@ items, hookrec = testdir.inline_genitems() assert len(items) == 1 - py.std.pprint.pprint(hookrec.hookrecorder.calls) - hookrec.hookrecorder.contains([ + py.std.pprint.pprint(hookrec.calls) + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == test_aaa"), ("pytest_pycollect_makeitem", "name == 'test_func'"), ("pytest_collectreport", @@ -425,8 +425,8 @@ items, hookrec = testdir.inline_genitems(id) assert len(items) == 2 - py.std.pprint.pprint(hookrec.hookrecorder.calls) - hookrec.hookrecorder.contains([ + py.std.pprint.pprint(hookrec.calls) + hookrec.assert_contains([ ("pytest_collectstart", "collector.fspath == test_aaa"), ("pytest_pycollect_makeitem", "name == 'test_func'"), ("pytest_collectreport", "report.nodeid == 'aaa/test_aaa.py'"), diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -149,7 +149,7 @@ mod.pytest_plugins = "pytest_a" aplugin = testdir.makepyfile(pytest_a="#") pluginmanager = get_plugin_manager() - reprec = testdir.getreportrecorder(pluginmanager) + reprec = testdir.make_hook_recorder(pluginmanager) #syspath.prepend(aplugin.dirpath()) py.std.sys.path.insert(0, str(aplugin.dirpath())) pluginmanager.consider_module(mod) @@ -274,7 +274,7 @@ saveindent.append(pm.trace.root.indent) raise ValueError(42) l = [] - pm.trace.root.setwriter(l.append) + pm.set_tracing(l.append) indent = pm.trace.root.indent p = api1() pm.register(p) @@ -405,11 +405,7 @@ pluginmanager.register(p3) methods = pluginmanager.listattr('m') assert methods == [p2.m, p3.m, p1.m] - # listattr keeps a cache and deleting - # a function attribute requires clearing it - pluginmanager._listattrcache.clear() del P1.m.__dict__['tryfirst'] - pytest.mark.trylast(getattr(P2.m, 'im_func', P2.m)) methods = pluginmanager.listattr('m') assert methods == [p2.m, p1.m, p3.m] @@ -436,6 +432,11 @@ assert varnames(A().f) == ('y',) assert varnames(B()) == ('z',) +def test_varnames_default(): + def f(x, y=3): + pass + assert varnames(f) == ("x",) + def test_varnames_class(): class C: def __init__(self, x): @@ -494,12 +495,10 @@ return x + z reslist = MultiCall([f], dict(x=23, y=24)).execute() assert reslist == [24] - reslist = MultiCall([f], dict(x=23, z=2)).execute() - assert reslist == [25] def test_tags_call_error(self): multicall = MultiCall([lambda x: x], {}) - pytest.raises(TypeError, multicall.execute) + pytest.raises(KeyError, multicall.execute) def test_call_subexecute(self): def m(__multicall__): @@ -630,6 +629,18 @@ assert l == [4] assert not hasattr(mcm, 'world') + def test_argmismatch(self): + class Api: + def hello(self, arg): + "api hook 1" + pm = PluginManager(Api, prefix="he") + class Plugin: + def hello(self, argwrong): + return arg + 1 + with pytest.raises(PluginValidationError) as exc: + pm.register(Plugin()) + assert "argwrong" in str(exc.value) + def test_only_kwargs(self): pm = PluginManager() class Api: @@ -754,3 +765,96 @@ assert "qwe" not in str(excinfo.value) assert "aaaa" in str(excinfo.value) +class TestWrapMethod: + def test_basic_happypath(self): + class A: + def f(self): + return "A.f" + + l = [] + def f(self): + l.append(1) + yield + l.append(2) + undo = add_method_controller(A, f) + + assert A().f() == "A.f" + assert l == [1,2] + undo() + l[:] = [] + assert A().f() == "A.f" + assert l == [] + + def test_method_raises(self): + class A: + def error(self, val): + raise ValueError(val) + + l = [] + def error(self, val): + l.append(val) + try: + yield + except ValueError: + l.append(None) + raise + + + undo = add_method_controller(A, error) + + with pytest.raises(ValueError): + A().error(42) + assert l == [42, None] + undo() + l[:] = [] + with pytest.raises(ValueError): + A().error(42) + assert l == [] + + def test_controller_swallows_method_raises(self): + class A: + def error(self, val): + raise ValueError(val) + + def error(self, val): + try: + yield + except ValueError: + yield 2 + + add_method_controller(A, error) + assert A().error(42) == 2 + + def test_reraise_on_controller_StopIteration(self): + class A: + def error(self, val): + raise ValueError(val) + + def error(self, val): + try: + yield + except ValueError: + pass + + add_method_controller(A, error) + with pytest.raises(ValueError): + A().error(42) + + @pytest.mark.xfail(reason="if needed later") + def test_modify_call_args(self): + class A: + def error(self, val1, val2): + raise ValueError(val1+val2) + + l = [] + def error(self): + try: + yield (1,), {'val2': 2} + except ValueError as ex: + assert ex.args == (3,) + l.append(1) + + add_method_controller(A, error) + with pytest.raises(ValueError): + A().error() + assert l == [1] diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d testing/test_helpconfig.py --- a/testing/test_helpconfig.py +++ b/testing/test_helpconfig.py @@ -1,5 +1,4 @@ -import py, pytest -from _pytest.helpconfig import collectattr +import pytest def test_version(testdir, pytestconfig): result = testdir.runpytest("--version") @@ -25,18 +24,6 @@ *to see*fixtures*py.test --fixtures* """) -def test_collectattr(): - class A: - def pytest_hello(self): - pass - class B(A): - def pytest_world(self): - pass - methods = py.builtin.sorted(collectattr(B)) - assert list(methods) == ['pytest_hello', 'pytest_world'] - methods = py.builtin.sorted(collectattr(B())) - assert list(methods) == ['pytest_hello', 'pytest_world'] - def test_hookvalidation_unknown(testdir): testdir.makeconftest(""" def pytest_hello(xyz): diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r fd286a7511c9ff84b0f643e0831ea9046770835d testing/test_pytester.py --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -3,9 +3,9 @@ from _pytest.pytester import HookRecorder from _pytest.core import PluginManager -def test_reportrecorder(testdir): +def test_make_hook_recorder(testdir): item = testdir.getitem("def test_func(): pass") - recorder = testdir.getreportrecorder(item.config) + recorder = testdir.make_hook_recorder(item.config.pluginmanager) assert not recorder.getfailures() pytest.xfail("internal reportrecorder tests need refactoring") @@ -71,47 +71,37 @@ "*1 passed*" ]) -def test_hookrecorder_basic(): - rec = HookRecorder(PluginManager()) - class ApiClass: + +def make_holder(): + class apiclass: def pytest_xyz(self, arg): "x" - rec.start_recording(ApiClass) - rec.hook.pytest_xyz(arg=123) + def pytest_xyz_noarg(self): + "x" + + apimod = type(os)('api') + def pytest_xyz(arg): + "x" + def pytest_xyz_noarg(): + "x" + apimod.pytest_xyz = pytest_xyz + apimod.pytest_xyz_noarg = pytest_xyz_noarg + return apiclass, apimod + + + at pytest.mark.parametrize("holder", make_holder()) +def test_hookrecorder_basic(holder): + pm = PluginManager() + pm.hook._addhooks(holder, "pytest_") + rec = HookRecorder(pm) + pm.hook.pytest_xyz(arg=123) call = rec.popcall("pytest_xyz") assert call.arg == 123 assert call._name == "pytest_xyz" pytest.raises(pytest.fail.Exception, "rec.popcall('abc')") - -def test_hookrecorder_basic_no_args_hook(): - rec = HookRecorder(PluginManager()) - apimod = type(os)('api') - def pytest_xyz(): - "x" - apimod.pytest_xyz = pytest_xyz - rec.start_recording(apimod) - rec.hook.pytest_xyz() - call = rec.popcall("pytest_xyz") - assert call._name == "pytest_xyz" - -def test_functional(testdir, linecomp): - reprec = testdir.inline_runsource(""" - import pytest - from _pytest.core import HookRelay, PluginManager - pytest_plugins="pytester" - def test_func(_pytest): - class ApiClass: - def pytest_xyz(self, arg): "x" - hook = HookRelay([ApiClass], PluginManager()) - rec = _pytest.gethookrecorder(hook) - class Plugin: - def pytest_xyz(self, arg): - return arg + 1 - rec._pluginmanager.register(Plugin()) - res = rec.hook.pytest_xyz(arg=41) - assert res == [42] - """) - reprec.assertoutcome(passed=1) + pm.hook.pytest_xyz_noarg() + call = rec.popcall("pytest_xyz_noarg") + assert call._name == "pytest_xyz_noarg" def test_makepyfile_unicode(testdir): https://bitbucket.org/hpk42/pytest/commits/474b4fbab1d6/ Changeset: 474b4fbab1d6 User: hpk42 Date: 2014-10-08 09:27:14+00:00 Summary: - refactor wrapped call support to also accomodate pytest.mark.hookwrapper - introduce a CallOutcome class to hold the result/excinfo status of calling a function. - rename add_method_controller to add_method_wrapper Affected #: 3 files diff -r fd286a7511c9ff84b0f643e0831ea9046770835d -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -10,6 +10,8 @@ assert py.__version__.split(".")[:2] >= ['1', '4'], ("installation problem: " "%s is too old, remove or upgrade 'py'" % (py.__version__)) +py3 = sys.version_info > (3,0) + class TagTracer: def __init__(self): self._tag2proc = {} @@ -68,42 +70,62 @@ return self.__class__(self.root, self.tags + (name,)) -def add_method_controller(cls, func): - """ Use func as the method controler for the method found - at the class named func.__name__. +def add_method_wrapper(cls, wrapper_func): + """ Substitute the function named "wrapperfunc.__name__" at class + "cls" with a function that wraps the call to the original function. + Return an undo function which can be called to reset the class to use + the old method again. - A method controler is invoked with the same arguments - as the function it substitutes and is required to yield once - which will trigger calling the controlled method. - If it yields a second value, the value will be returned - as the result of the invocation. Errors in the controlled function - are re-raised to the controller during the first yield. + wrapper_func is called with the same arguments as the method + it wraps and its result is used as a wrap_controller for + calling the original function. """ - name = func.__name__ + name = wrapper_func.__name__ oldcall = getattr(cls, name) def wrap_exec(*args, **kwargs): - gen = func(*args, **kwargs) - next(gen) # first yield - try: - res = oldcall(*args, **kwargs) - except Exception: - excinfo = sys.exc_info() - try: - # reraise exception to controller - res = gen.throw(*excinfo) - except StopIteration: - py.builtin._reraise(*excinfo) - else: - try: - res = gen.send(res) - except StopIteration: - pass - return res + gen = wrapper_func(*args, **kwargs) + return wrapped_call(gen, lambda: oldcall(*args, **kwargs)) setattr(cls, name, wrap_exec) return lambda: setattr(cls, name, oldcall) +def wrapped_call(wrap_controller, func): + """ Wrap calling to a function with a generator. The first yield + will trigger calling the function and receive an according CallOutcome + object representing an exception or a result. + """ + next(wrap_controller) # first yield + call_outcome = CallOutcome(func) + try: + wrap_controller.send(call_outcome) + co = wrap_controller.gi_frame.f_code + raise RuntimeError("wrap_controller for %r %s:%d has second yield" % + (co.co_name, co.co_filename, co.co_firstlineno)) + except StopIteration: + pass + if call_outcome.excinfo is None: + return call_outcome.result + else: + ex = call_outcome.excinfo + if py3: + raise ex[1].with_traceback(ex[2]) + py.builtin._reraise(*ex) + + +class CallOutcome: + excinfo = None + def __init__(self, func): + try: + self.result = func() + except Exception: + self.excinfo = sys.exc_info() + + def force_result(self, result): + self.result = result + self.excinfo = None + + class PluginManager(object): def __init__(self, hookspecs=None, prefix="pytest_"): self._name2plugin = {} @@ -125,15 +147,12 @@ trace = self.hookrelay.trace trace.root.indent += 1 trace(self.name, kwargs) - res = None - try: - res = yield - finally: - if res: - trace("finish", self.name, "-->", res) - trace.root.indent -= 1 + box = yield + if box.excinfo is None: + trace("finish", self.name, "-->", box.result) + trace.root.indent -= 1 - undo = add_method_controller(HookCaller, _docall) + undo = add_method_wrapper(HookCaller, _docall) self.add_shutdown(undo) def do_configure(self, config): @@ -356,39 +375,19 @@ return "" %(status, self.kwargs) def execute(self): - next_finalizers = [] - try: - all_kwargs = self.kwargs - while self.methods: - method = self.methods.pop() - args = [all_kwargs[argname] for argname in varnames(method)] - if hasattr(method, "hookwrapper"): - it = method(*args) - next = getattr(it, "next", None) - if next is None: - next = getattr(it, "__next__", None) - if next is None: - raise self.WrongHookWrapper(method, - "wrapper does not contain a yield") - res = next() - next_finalizers.append((method, next)) - else: - res = method(*args) - if res is not None: - self.results.append(res) - if self.firstresult: - return res - if not self.firstresult: - return self.results - finally: - for method, fin in reversed(next_finalizers): - try: - fin() - except StopIteration: - pass - else: - raise self.WrongHookWrapper(method, - "wrapper contain more than one yield") + all_kwargs = self.kwargs + while self.methods: + method = self.methods.pop() + args = [all_kwargs[argname] for argname in varnames(method)] + if hasattr(method, "hookwrapper"): + return wrapped_call(method(*args), self.execute) + res = method(*args) + if res is not None: + self.results.append(res) + if self.firstresult: + return res + if not self.firstresult: + return self.results def varnames(func, startindex=None): diff -r fd286a7511c9ff84b0f643e0831ea9046770835d -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 _pytest/pytester.py --- a/_pytest/pytester.py +++ b/_pytest/pytester.py @@ -11,7 +11,7 @@ import py import pytest from py.builtin import print_ -from _pytest.core import HookCaller, add_method_controller +from _pytest.core import HookCaller, add_method_wrapper from _pytest.main import Session, EXIT_OK @@ -57,7 +57,7 @@ def _docall(hookcaller, methods, kwargs): self.calls.append(ParsedCall(hookcaller.name, kwargs)) yield - self._undo_wrapping = add_method_controller(HookCaller, _docall) + self._undo_wrapping = add_method_wrapper(HookCaller, _docall) pluginmanager.add_shutdown(self._undo_wrapping) def finish_recording(self): diff -r fd286a7511c9ff84b0f643e0831ea9046770835d -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -280,8 +280,9 @@ pm.register(p) assert pm.trace.root.indent == indent - assert len(l) == 1 + assert len(l) == 2 assert 'pytest_plugin_registered' in l[0] + assert 'finish' in l[1] pytest.raises(ValueError, lambda: pm.register(api1())) assert pm.trace.root.indent == indent assert saveindent[0] > indent @@ -555,7 +556,7 @@ l.append("m2 finish") m2.hookwrapper = True res = MultiCall([m2, m1], {}).execute() - assert res == [1, 2] + assert res == [] assert l == ["m1 init", "m2 init", "m2 finish", "m1 finish"] def test_listattr_hookwrapper_ordering(self): @@ -593,10 +594,8 @@ m1.hookwrapper = True mc = MultiCall([m1], {}) - with pytest.raises(mc.WrongHookWrapper) as ex: + with pytest.raises(TypeError): mc.execute() - assert ex.value.func == m1 - assert ex.value.message def test_hookwrapper_too_many_yield(self): def m1(): @@ -605,10 +604,10 @@ m1.hookwrapper = True mc = MultiCall([m1], {}) - with pytest.raises(mc.WrongHookWrapper) as ex: + with pytest.raises(RuntimeError) as ex: mc.execute() - assert ex.value.func == m1 - assert ex.value.message + assert "m1" in str(ex.value) + assert "test_core.py:" in str(ex.value) class TestHookRelay: @@ -774,9 +773,10 @@ l = [] def f(self): l.append(1) - yield + box = yield + assert box.result == "A.f" l.append(2) - undo = add_method_controller(A, f) + undo = add_method_wrapper(A, f) assert A().f() == "A.f" assert l == [1,2] @@ -793,14 +793,10 @@ l = [] def error(self, val): l.append(val) - try: - yield - except ValueError: - l.append(None) - raise + yield + l.append(None) - - undo = add_method_controller(A, error) + undo = add_method_wrapper(A, error) with pytest.raises(ValueError): A().error(42) @@ -817,12 +813,10 @@ raise ValueError(val) def error(self, val): - try: - yield - except ValueError: - yield 2 + box = yield + box.force_result(2) - add_method_controller(A, error) + add_method_wrapper(A, error) assert A().error(42) == 2 def test_reraise_on_controller_StopIteration(self): @@ -836,7 +830,7 @@ except ValueError: pass - add_method_controller(A, error) + add_method_wrapper(A, error) with pytest.raises(ValueError): A().error(42) @@ -848,13 +842,11 @@ l = [] def error(self): - try: - yield (1,), {'val2': 2} - except ValueError as ex: - assert ex.args == (3,) - l.append(1) + box = yield (1,), {'val2': 2} + assert box.excinfo[1].args == (3,) + l.append(1) - add_method_controller(A, error) + add_method_wrapper(A, error) with pytest.raises(ValueError): A().error() assert l == [1] https://bitbucket.org/hpk42/pytest/commits/5724a5fd0bb5/ Changeset: 5724a5fd0bb5 User: hpk42 Date: 2014-10-08 18:23:40+00:00 Summary: remove all occurences of "__multicall__" on hook impls in pytest/*. also simplify pytest_runtest_markereport hook in _pytest/skipping.py while touching the code anyway. Affected #: 11 files diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/capture.py --- a/_pytest/capture.py +++ b/_pytest/capture.py @@ -29,8 +29,8 @@ help="shortcut for --capture=no.") - at pytest.mark.tryfirst -def pytest_load_initial_conftests(early_config, parser, args, __multicall__): + at pytest.mark.hookwrapper +def pytest_load_initial_conftests(early_config, parser, args): ns = early_config.known_args_namespace pluginmanager = early_config.pluginmanager capman = CaptureManager(ns.capture) @@ -47,15 +47,11 @@ # finally trigger conftest loading but while capturing (issue93) capman.init_capturings() - try: - try: - return __multicall__.execute() - finally: - out, err = capman.suspendcapture() - except: + outcome = yield + out, err = capman.suspendcapture() + if outcome.excinfo is not None: sys.stdout.write(out) sys.stderr.write(err) - raise class CaptureManager: @@ -105,20 +101,19 @@ if capfuncarg is not None: capfuncarg.close() - @pytest.mark.tryfirst - def pytest_make_collect_report(self, __multicall__, collector): - if not isinstance(collector, pytest.File): - return - self.resumecapture() - try: - rep = __multicall__.execute() - finally: + @pytest.mark.hookwrapper + def pytest_make_collect_report(self, collector): + if isinstance(collector, pytest.File): + self.resumecapture() + outcome = yield out, err = self.suspendcapture() - if out: - rep.sections.append(("Captured stdout", out)) - if err: - rep.sections.append(("Captured stderr", err)) - return rep + rep = outcome.get_result() + if out: + rep.sections.append(("Captured stdout", out)) + if err: + rep.sections.append(("Captured stderr", err)) + else: + yield @pytest.mark.hookwrapper def pytest_runtest_setup(self, item): diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -95,7 +95,10 @@ will trigger calling the function and receive an according CallOutcome object representing an exception or a result. """ - next(wrap_controller) # first yield + try: + next(wrap_controller) # first yield + except StopIteration: + return call_outcome = CallOutcome(func) try: wrap_controller.send(call_outcome) @@ -104,13 +107,7 @@ (co.co_name, co.co_filename, co.co_firstlineno)) except StopIteration: pass - if call_outcome.excinfo is None: - return call_outcome.result - else: - ex = call_outcome.excinfo - if py3: - raise ex[1].with_traceback(ex[2]) - py.builtin._reraise(*ex) + return call_outcome.get_result() class CallOutcome: @@ -125,6 +122,15 @@ self.result = result self.excinfo = None + def get_result(self): + if self.excinfo is None: + return self.result + else: + ex = self.excinfo + if py3: + raise ex[1].with_traceback(ex[2]) + py.builtin._reraise(*ex) + class PluginManager(object): def __init__(self, hookspecs=None, prefix="pytest_"): diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/helpconfig.py --- a/_pytest/helpconfig.py +++ b/_pytest/helpconfig.py @@ -22,18 +22,21 @@ help="store internal tracing debug information in 'pytestdebug.log'.") -def pytest_cmdline_parse(__multicall__): - config = __multicall__.execute() + at pytest.mark.hookwrapper +def pytest_cmdline_parse(): + outcome = yield + config = outcome.get_result() if config.option.debug: path = os.path.abspath("pytestdebug.log") f = open(path, 'w') config._debugfile = f - f.write("versions pytest-%s, py-%s, python-%s\ncwd=%s\nargs=%s\n\n" %( - pytest.__version__, py.__version__, ".".join(map(str, sys.version_info)), + f.write("versions pytest-%s, py-%s, " + "python-%s\ncwd=%s\nargs=%s\n\n" %( + pytest.__version__, py.__version__, + ".".join(map(str, sys.version_info)), os.getcwd(), config._origargs)) config.pluginmanager.set_tracing(f.write) sys.stderr.write("writing pytestdebug information to %s\n" % path) - return config @pytest.mark.trylast def pytest_unconfigure(config): diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/nose.py --- a/_pytest/nose.py +++ b/_pytest/nose.py @@ -16,7 +16,7 @@ return tuple(skip_classes) -def pytest_runtest_makereport(__multicall__, item, call): +def pytest_runtest_makereport(item, call): if call.excinfo and call.excinfo.errisinstance(get_skip_exceptions()): # let's substitute the excinfo with a pytest.skip one call2 = call.__class__(lambda: diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/pastebin.py --- a/_pytest/pastebin.py +++ b/_pytest/pastebin.py @@ -1,5 +1,7 @@ """ submit failure or test session information to a pastebin service. """ +import pytest import py, sys +import tempfile class url: base = "http://bpaste.net" @@ -13,9 +15,8 @@ choices=['failed', 'all'], help="send failed|all info to bpaste.net pastebin service.") -def pytest_configure(__multicall__, config): - import tempfile - __multicall__.execute() + at pytest.mark.trylast +def pytest_configure(config): if config.option.pastebin == "all": config._pastebinfile = tempfile.TemporaryFile('w+') tr = config.pluginmanager.getplugin('terminalreporter') diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -183,17 +183,18 @@ return request.config -def pytest_pyfunc_call(__multicall__, pyfuncitem): - if not __multicall__.execute(): - testfunction = pyfuncitem.obj - if pyfuncitem._isyieldedfunction(): - testfunction(*pyfuncitem._args) - else: - funcargs = pyfuncitem.funcargs - testargs = {} - for arg in pyfuncitem._fixtureinfo.argnames: - testargs[arg] = funcargs[arg] - testfunction(**testargs) + at pytest.mark.trylast +def pytest_pyfunc_call(pyfuncitem): + testfunction = pyfuncitem.obj + if pyfuncitem._isyieldedfunction(): + testfunction(*pyfuncitem._args) + else: + funcargs = pyfuncitem.funcargs + testargs = {} + for arg in pyfuncitem._fixtureinfo.argnames: + testargs[arg] = funcargs[arg] + testfunction(**testargs) + return True def pytest_collect_file(path, parent): ext = path.ext @@ -210,30 +211,31 @@ def pytest_pycollect_makemodule(path, parent): return Module(path, parent) -def pytest_pycollect_makeitem(__multicall__, collector, name, obj): - res = __multicall__.execute() + at pytest.mark.hookwrapper +def pytest_pycollect_makeitem(collector, name, obj): + outcome = yield + res = outcome.get_result() if res is not None: - return res + raise StopIteration + # nothing was collected elsewhere, let's do it here if isclass(obj): - #if hasattr(collector.obj, 'unittest'): - # return # we assume it's a mixin class for a TestCase derived one if collector.classnamefilter(name): Class = collector._getcustomclass("Class") - return Class(name, parent=collector) - elif collector.funcnamefilter(name) and hasattr(obj, "__call__") and \ + outcome.force_result(Class(name, parent=collector)) + elif collector.funcnamefilter(name) and hasattr(obj, "__call__") and\ getfixturemarker(obj) is None: - # mock seems to store unbound methods (issue473), let's normalize it + # mock seems to store unbound methods (issue473), normalize it obj = getattr(obj, "__func__", obj) if not isfunction(obj): collector.warn(code="C2", message= "cannot collect %r because it is not a function." % name, ) - return if getattr(obj, "__test__", True): if is_generator(obj): - return Generator(name, parent=collector) + res = Generator(name, parent=collector) else: - return list(collector._genfunctions(name, obj)) + res = list(collector._genfunctions(name, obj)) + outcome.force_result(res) def is_generator(func): try: diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/skipping.py --- a/_pytest/skipping.py +++ b/_pytest/skipping.py @@ -57,7 +57,7 @@ @property def holder(self): - return self.item.keywords.get(self.name, None) + return self.item.keywords.get(self.name) def __bool__(self): return bool(self.holder) @@ -75,9 +75,7 @@ def istrue(self): try: return self._istrue() - except KeyboardInterrupt: - raise - except: + except Exception: self.exc = sys.exc_info() if isinstance(self.exc[1], SyntaxError): msg = [" " * (self.exc[1].offset + 4) + "^",] @@ -153,44 +151,32 @@ if not evalxfail.get('run', True): pytest.xfail("[NOTRUN] " + evalxfail.getexplanation()) -def pytest_runtest_makereport(__multicall__, item, call): + at pytest.mark.hookwrapper +def pytest_runtest_makereport(item, call): + outcome = yield + rep = outcome.get_result() + evalxfail = getattr(item, '_evalxfail', None) # unitttest special case, see setting of _unexpectedsuccess - if hasattr(item, '_unexpectedsuccess'): - rep = __multicall__.execute() - if rep.when == "call": - # we need to translate into how pytest encodes xpass - rep.wasxfail = "reason: " + repr(item._unexpectedsuccess) - rep.outcome = "failed" - return rep - if not (call.excinfo and - call.excinfo.errisinstance(pytest.xfail.Exception)): - evalxfail = getattr(item, '_evalxfail', None) - if not evalxfail: - return - if call.excinfo and call.excinfo.errisinstance(pytest.xfail.Exception): - if not item.config.getvalue("runxfail"): - rep = __multicall__.execute() - rep.wasxfail = "reason: " + call.excinfo.value.msg - rep.outcome = "skipped" - return rep - rep = __multicall__.execute() - evalxfail = item._evalxfail - if not rep.skipped: - if not item.config.option.runxfail: - if evalxfail.wasvalid() and evalxfail.istrue(): - if call.excinfo: - if evalxfail.invalidraise(call.excinfo.value): - rep.outcome = "failed" - return rep - else: - rep.outcome = "skipped" - elif call.when == "call": - rep.outcome = "failed" - else: - return rep + if hasattr(item, '_unexpectedsuccess') and rep.when == "call": + # we need to translate into how pytest encodes xpass + rep.wasxfail = "reason: " + repr(item._unexpectedsuccess) + rep.outcome = "failed" + elif item.config.option.runxfail: + pass # don't interefere + elif call.excinfo and call.excinfo.errisinstance(pytest.xfail.Exception): + rep.wasxfail = "reason: " + call.excinfo.value.msg + rep.outcome = "skipped" + elif evalxfail and not rep.skipped and evalxfail.wasvalid() and \ + evalxfail.istrue(): + if call.excinfo: + if evalxfail.invalidraise(call.excinfo.value): + rep.outcome = "failed" + else: + rep.outcome = "skipped" rep.wasxfail = evalxfail.getexplanation() - return rep - return rep + elif call.when == "call": + rep.outcome = "failed" # xpass outcome + rep.wasxfail = evalxfail.getexplanation() # called by terminalreporter progress reporting def pytest_report_teststatus(report): diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/terminal.py --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -345,8 +345,10 @@ indent = (len(stack) - 1) * " " self._tw.line("%s%s" % (indent, col)) - def pytest_sessionfinish(self, exitstatus, __multicall__): - __multicall__.execute() + @pytest.mark.hookwrapper + def pytest_sessionfinish(self, exitstatus): + outcome = yield + outcome.get_result() self._tw.line("") if exitstatus in (0, 1, 2, 4): self.summary_errors() diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 _pytest/unittest.py --- a/_pytest/unittest.py +++ b/_pytest/unittest.py @@ -151,30 +151,33 @@ pass # twisted trial support -def pytest_runtest_protocol(item, __multicall__): - if isinstance(item, TestCaseFunction): - if 'twisted.trial.unittest' in sys.modules: - ut = sys.modules['twisted.python.failure'] - Failure__init__ = ut.Failure.__init__ - check_testcase_implements_trial_reporter() - def excstore(self, exc_value=None, exc_type=None, exc_tb=None, - captureVars=None): - if exc_value is None: - self._rawexcinfo = sys.exc_info() - else: - if exc_type is None: - exc_type = type(exc_value) - self._rawexcinfo = (exc_type, exc_value, exc_tb) - try: - Failure__init__(self, exc_value, exc_type, exc_tb, - captureVars=captureVars) - except TypeError: - Failure__init__(self, exc_value, exc_type, exc_tb) - ut.Failure.__init__ = excstore + + at pytest.mark.hookwrapper +def pytest_runtest_protocol(item): + if isinstance(item, TestCaseFunction) and \ + 'twisted.trial.unittest' in sys.modules: + ut = sys.modules['twisted.python.failure'] + Failure__init__ = ut.Failure.__init__ + check_testcase_implements_trial_reporter() + def excstore(self, exc_value=None, exc_type=None, exc_tb=None, + captureVars=None): + if exc_value is None: + self._rawexcinfo = sys.exc_info() + else: + if exc_type is None: + exc_type = type(exc_value) + self._rawexcinfo = (exc_type, exc_value, exc_tb) try: - return __multicall__.execute() - finally: - ut.Failure.__init__ = Failure__init__ + Failure__init__(self, exc_value, exc_type, exc_tb, + captureVars=captureVars) + except TypeError: + Failure__init__(self, exc_value, exc_type, exc_tb) + ut.Failure.__init__ = excstore + yield + ut.Failure.__init__ = Failure__init__ + else: + yield + def check_testcase_implements_trial_reporter(done=[]): if done: diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 testing/python/collect.py --- a/testing/python/collect.py +++ b/testing/python/collect.py @@ -525,12 +525,15 @@ def test_customized_pymakeitem(self, testdir): b = testdir.mkdir("a").mkdir("b") b.join("conftest.py").write(py.code.Source(""" - def pytest_pycollect_makeitem(__multicall__): - result = __multicall__.execute() - if result: - for func in result: - func._some123 = "world" - return result + import pytest + @pytest.mark.hookwrapper + def pytest_pycollect_makeitem(): + outcome = yield + if outcome.excinfo is None: + result = outcome.result + if result: + for func in result: + func._some123 = "world" """)) b.join("test_module.py").write(py.code.Source(""" import pytest diff -r 474b4fbab1d6d6b22e4ccc1e7527a32f2ec3eb45 -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 testing/test_mark.py --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -509,11 +509,13 @@ pass """) testdir.makepyfile(conftest=""" - def pytest_pycollect_makeitem(__multicall__, name): + import pytest + @pytest.mark.hookwrapper + def pytest_pycollect_makeitem(name): + outcome = yield if name == "TestClass": - item = __multicall__.execute() + item = outcome.get_result() item.extra_keyword_matches.add("xxx") - return item """) reprec = testdir.inline_run(p.dirpath(), '-s', '-k', keyword) py.builtin.print_("keyword", repr(keyword)) https://bitbucket.org/hpk42/pytest/commits/7d7cdc701d44/ Changeset: 7d7cdc701d44 User: hpk42 Date: 2014-10-09 07:55:46+00:00 Summary: improve docstring, remove unused custom Exception Affected #: 1 file diff -r 5724a5fd0bb5ba6a093c01a9f7b4785dc80a0666 -r 7d7cdc701d44cb4b484cebbacab542dc593c2568 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -93,7 +93,9 @@ def wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator. The first yield will trigger calling the function and receive an according CallOutcome - object representing an exception or a result. + object representing an exception or a result. The generator then + needs to finish (raise StopIteration) in order for the wrapped call + to complete. """ try: next(wrap_controller) # first yield @@ -362,13 +364,6 @@ class MultiCall: """ execute a call into multiple python functions/methods. """ - class WrongHookWrapper(Exception): - """ a hook wrapper does not behave correctly. """ - def __init__(self, func, message): - Exception.__init__(self, func, message) - self.func = func - self.message = message - def __init__(self, methods, kwargs, firstresult=False): self.methods = list(methods) self.kwargs = kwargs https://bitbucket.org/hpk42/pytest/commits/c88367cc1ea2/ Changeset: c88367cc1ea2 User: hpk42 Date: 2014-10-09 08:47:32+00:00 Summary: re-scan methods during plugin register and unregister and not during hook calling anymore. Simplify register/getplugin api of PluginManager Affected #: 2 files diff -r 7d7cdc701d44cb4b484cebbacab542dc593c2568 -r c88367cc1ea246bde8798805201369603f4446f6 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -139,6 +139,7 @@ self._name2plugin = {} self._plugins = [] self._conftestplugins = [] + self._plugin2hookcallers = {} self._warnings = [] self.trace = TagTracer().get("pluginmanage") self._plugin_distinfo = [] @@ -182,7 +183,8 @@ reg = getattr(self, "_registercallback", None) if reg is not None: reg(plugin, name) # may call addhooks - self.hook._scan_plugin(plugin) + hookcallers = list(self.hook._scan_plugin(plugin)) + self._plugin2hookcallers[plugin] = hookcallers self._name2plugin[name] = plugin if conftest: self._conftestplugins.append(plugin) @@ -191,11 +193,12 @@ self._plugins.append(plugin) else: self._plugins.insert(0, plugin) + # finally make sure that the methods of the new plugin take part + for hookcaller in hookcallers: + hookcaller.scan_methods() return True - def unregister(self, plugin=None, name=None): - if plugin is None: - plugin = self.getplugin(name=name) + def unregister(self, plugin): try: self._plugins.remove(plugin) except KeyError: @@ -203,6 +206,9 @@ for name, value in list(self._name2plugin.items()): if value == plugin: del self._name2plugin[name] + hookcallers = self._plugin2hookcallers.pop(plugin) + for hookcaller in hookcallers: + hookcaller.scan_methods() def add_shutdown(self, func): self._shutdown.append(func) @@ -217,9 +223,7 @@ def isregistered(self, plugin, name=None): if self.getplugin(name) is not None: return True - for val in self._name2plugin.values(): - if plugin == val: - return True + return plugin in self._plugins or plugin in self._conftestplugins def addhooks(self, spec, prefix="pytest_"): self.hook._addhooks(spec, prefix=prefix) @@ -281,8 +285,9 @@ def consider_pluginarg(self, arg): if arg.startswith("no:"): name = arg[3:] - if self.getplugin(name) is not None: - self.unregister(None, name=name) + plugin = self.getplugin(name) + if plugin is not None: + self.unregister(plugin) self._name2plugin[name] = -1 else: if self.getplugin(arg) is None: @@ -485,18 +490,18 @@ "available hookargs: %s", arg, formatdef(method), ", ".join(hook.argnames)) - getattr(self, name).clear_method_cache() + yield hook class HookCaller: - def __init__(self, hookrelay, name, firstresult, argnames, methods=None): + def __init__(self, hookrelay, name, firstresult, argnames, methods=()): self.hookrelay = hookrelay self.name = name self.firstresult = firstresult - self.methods = methods self.argnames = ["__multicall__"] self.argnames.extend(argnames) - assert "self" not in argnames # prevent oversights + assert "self" not in argnames # sanity check + self.methods = methods def new_cached_caller(self, methods): return HookCaller(self.hookrelay, self.name, self.firstresult, @@ -505,14 +510,11 @@ def __repr__(self): return "" %(self.name,) - def clear_method_cache(self): - self.methods = None + def scan_methods(self): + self.methods = self.hookrelay._pm.listattr(self.name) def __call__(self, **kwargs): - methods = self.methods - if methods is None: - self.methods = methods = self.hookrelay._pm.listattr(self.name) - return self._docall(methods, kwargs) + return self._docall(self.methods, kwargs) def callextra(self, methods, **kwargs): return self._docall(self.methods + methods, kwargs) diff -r 7d7cdc701d44cb4b484cebbacab542dc593c2568 -r c88367cc1ea246bde8798805201369603f4446f6 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -184,8 +184,6 @@ assert pp.getplugin('hello') == a2 pp.unregister(a1) assert not pp.isregistered(a1) - pp.unregister(name="hello") - assert not pp.isregistered(a2) def test_pm_ordering(self): pp = PluginManager() @@ -612,21 +610,23 @@ class TestHookRelay: def test_happypath(self): - pm = PluginManager() class Api: def hello(self, arg): "api hook 1" - - mcm = HookRelay(hookspecs=Api, pm=pm, prefix="he") - assert hasattr(mcm, 'hello') - assert repr(mcm.hello).find("hello") != -1 + pm = PluginManager([Api], prefix="he") + hook = pm.hook + assert hasattr(hook, 'hello') + assert repr(hook.hello).find("hello") != -1 class Plugin: def hello(self, arg): return arg + 1 - pm.register(Plugin()) - l = mcm.hello(arg=3) + plugin = Plugin() + pm.register(plugin) + l = hook.hello(arg=3) assert l == [4] - assert not hasattr(mcm, 'world') + assert not hasattr(hook, 'world') + pm.unregister(plugin) + assert hook.hello(arg=3) == [] def test_argmismatch(self): class Api: @@ -649,18 +649,16 @@ pytest.raises(TypeError, lambda: mcm.hello(3)) def test_firstresult_definition(self): - pm = PluginManager() class Api: def hello(self, arg): "api hook 1" hello.firstresult = True - - mcm = HookRelay(hookspecs=Api, pm=pm, prefix="he") + pm = PluginManager([Api], "he") class Plugin: def hello(self, arg): return arg + 1 pm.register(Plugin()) - res = mcm.hello(arg=3) + res = pm.hook.hello(arg=3) assert res == 4 class TestTracer: https://bitbucket.org/hpk42/pytest/commits/d1ffbf9f4ef5/ Changeset: d1ffbf9f4ef5 User: hpk42 Date: 2014-10-09 10:21:01+00:00 Summary: some docs and refined semantics for wrappers Affected #: 3 files diff -r c88367cc1ea246bde8798805201369603f4446f6 -r d1ffbf9f4ef5e842e6df19b2adc8336d77b716e1 _pytest/core.py --- a/_pytest/core.py +++ b/_pytest/core.py @@ -89,30 +89,34 @@ setattr(cls, name, wrap_exec) return lambda: setattr(cls, name, oldcall) +def raise_wrapfail(wrap_controller, msg): + co = wrap_controller.gi_code + raise RuntimeError("wrap_controller at %r %s:%d %s" % + (co.co_name, co.co_filename, co.co_firstlineno, msg)) def wrapped_call(wrap_controller, func): - """ Wrap calling to a function with a generator. The first yield - will trigger calling the function and receive an according CallOutcome - object representing an exception or a result. The generator then - needs to finish (raise StopIteration) in order for the wrapped call - to complete. + """ Wrap calling to a function with a generator which needs to yield + exactly once. The yield point will trigger calling the wrapped function + and return its CallOutcome to the yield point. The generator then needs + to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: - return + raise_wrapfail(wrap_controller, "did not yield") call_outcome = CallOutcome(func) try: wrap_controller.send(call_outcome) - co = wrap_controller.gi_frame.f_code - raise RuntimeError("wrap_controller for %r %s:%d has second yield" % - (co.co_name, co.co_filename, co.co_firstlineno)) + raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass return call_outcome.get_result() class CallOutcome: + """ Outcome of a function call, either an exception or a proper result. + Calling the ``get_result`` method will return the result or reraise + the exception raised when the function was called. """ excinfo = None def __init__(self, func): try: diff -r c88367cc1ea246bde8798805201369603f4446f6 -r d1ffbf9f4ef5e842e6df19b2adc8336d77b716e1 doc/en/plugins.txt --- a/doc/en/plugins.txt +++ b/doc/en/plugins.txt @@ -187,8 +187,8 @@ invocation: - if no test paths are specified use current dir as a test path - - if exists, load ``conftest.py`` and ``test*/conftest.py`` relative - to the directory part of the first test path. + - if exists, load ``conftest.py`` and ``test*/conftest.py`` relative + to the directory part of the first test path. Note that pytest does not find ``conftest.py`` files in deeper nested sub directories at tool startup. It is usually a good idea to keep @@ -431,6 +431,41 @@ This has the added benefit of allowing you to conditionally install hooks depending on which plugins are installed. +hookwrapper: executing around other hooks +------------------------------------------------- + +.. currentmodule:: _pytest.core + +.. versionadded:: 2.7 (experimental) + +pytest plugins can implement hook wrappers which which wrap the execution +of other hook implementations. A hook wrapper is a generator function +which yields exactly once. When pytest invokes hooks it first executes +hook wrappers and passes the same arguments as to the regular hooks. + +At the yield point of the hook wrapper pytest will execute the next hook +implementations and return their result to the yield point in the form of +a :py:class:`CallOutcome` instance which encapsulates a result or +exception info. The yield point itself will thus typically not raise +exceptions (unless there are bugs). + +Here is an example definition of a hook wrapper:: + + import pytest + + @pytest.mark.hookwrapper + def pytest_pyfunc_call(pyfuncitem): + # do whatever you want before the next hook executes + outcome = yield + # outcome.excinfo may be None or a (cls, val, tb) tuple + res = outcome.get_result() # will raise if outcome was exception + # postprocess result + +Note that hook wrappers don't return results themselves, they merely +perform tracing or other side effects around the actual hook implementations. +If the result of the underlying hook is a mutable object, they may modify +that result, however. + Reference of objects involved in hooks =========================================================== @@ -470,3 +505,6 @@ .. autoclass:: _pytest.runner.TestReport() :members: +.. autoclass:: _pytest.core.CallOutcome() + :members: + diff -r c88367cc1ea246bde8798805201369603f4446f6 -r d1ffbf9f4ef5e842e6df19b2adc8336d77b716e1 testing/test_core.py --- a/testing/test_core.py +++ b/testing/test_core.py @@ -783,6 +783,22 @@ assert A().f() == "A.f" assert l == [] + def test_no_yield(self): + class A: + def method(self): + return + + def method(self): + if 0: + yield + + add_method_wrapper(A, method) + with pytest.raises(RuntimeError) as excinfo: + A().method() + + assert "method" in str(excinfo.value) + assert "did not yield" in str(excinfo.value) + def test_method_raises(self): class A: def error(self, val): https://bitbucket.org/hpk42/pytest/commits/6518db2c3a72/ Changeset: 6518db2c3a72 User: hpk42 Date: 2014-10-09 10:29:57+00:00 Summary: add changelog entry for new hookwrapper mechanism Affected #: 1 file diff -r d1ffbf9f4ef5e842e6df19b2adc8336d77b716e1 -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,17 @@ -Unreleased +2.7.0.dev +---------- + +- introduce and document new hookwrapper mechanism useful for plugins + which want to wrap the execution of certain hooks for their purposes. + This supersedes the undocumented ``__multicall__`` protocol which + pytest itself and some external plugins use. Note that pytest-2.8 + is scheduled to drop supporting the old ``__multicall__`` + and only support the hookwrapper protocol. + +- use hookwrapper mechanism in builtin pytest plugins. + + +2.6.4.dev ---------- - Improve assertion failure reporting on iterables, by using ndiff and pprint. https://bitbucket.org/hpk42/pytest/commits/79a04c3db387/ Changeset: 79a04c3db387 User: HolgerPeters Date: 2014-10-08 12:31:17+00:00 Summary: Add configuration option for doctest flags Affected #: 2 files diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r 79a04c3db38775125b5de556459aa67f97fa4070 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -6,6 +6,8 @@ from py._code.code import TerminalRepr, ReprFileLocation def pytest_addoption(parser): + parser.addini('doctest_optionflags', 'option flags for doctests', + type="args", default=["ELLIPSIS"]) group = parser.getgroup("collect") group.addoption("--doctest-modules", action="store_true", default=False, @@ -87,6 +89,27 @@ def reportinfo(self): return self.fspath, None, "[doctest] %s" % self.name +def _get_flag_lookup(): + import doctest + return dict(DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) + +def get_optionflags(parent): + import doctest + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + if not optionflags_str: + return doctest.ELLIPSIS + + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + class DoctestTextfile(DoctestItem, pytest.File): def runtest(self): import doctest @@ -101,7 +124,7 @@ fixture_request._fillfixtures() failed, tot = doctest.testfile( str(self.fspath), module_relative=False, - optionflags=doctest.ELLIPSIS, + optionflags=get_optionflags(self), extraglobs=dict(getfixture=fixture_request.getfuncargvalue), raise_on_error=True, verbose=0) @@ -119,7 +142,8 @@ doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) # uses internal doctest module parsing mechanism finder = doctest.DocTestFinder() - runner = doctest.DebugRunner(verbose=0, optionflags=doctest.ELLIPSIS) + optionflags= get_optionflags(self) + runner = doctest.DebugRunner(verbose=0, optionflags=optionflags) for test in finder.find(module, module.__name__, extraglobs=doctest_globals): if test.examples: # skip empty doctests diff -r 6e1a00b3134194ee0f8633d099b15e1cc401dafc -r 79a04c3db38775125b5de556459aa67f97fa4070 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -289,3 +289,37 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=1) + + def test_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(failed=1, passed=0) https://bitbucket.org/hpk42/pytest/commits/5858326d9c35/ Changeset: 5858326d9c35 User: HolgerPeters Date: 2014-10-08 13:48:41+00:00 Summary: Add documentation for doctest flags and remove dead code Affected #: 4 files diff -r 79a04c3db38775125b5de556459aa67f97fa4070 -r 5858326d9c359b1a909ebcbc751cd91337692089 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ Unreleased ---------- +- add a doctest option for doctest flags + - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. diff -r 79a04c3db38775125b5de556459aa67f97fa4070 -r 5858326d9c359b1a909ebcbc751cd91337692089 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -102,9 +102,6 @@ import doctest optionflags_str = parent.config.getini("doctest_optionflags") flag_lookup_table = _get_flag_lookup() - if not optionflags_str: - return doctest.ELLIPSIS - flag_acc = 0 for flag in optionflags_str: flag_acc |= flag_lookup_table[flag] diff -r 79a04c3db38775125b5de556459aa67f97fa4070 -r 5858326d9c359b1a909ebcbc751cd91337692089 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -126,3 +126,8 @@ derived class. See :ref:`change naming conventions` for examples. + +.. confval:: doctest_optionflags + + One or more doctest flag names from the standard ``doctest`` module. + `See how py.test handles doctests `_. diff -r 79a04c3db38775125b5de556459aa67f97fa4070 -r 5858326d9c359b1a909ebcbc751cd91337692089 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -60,3 +60,12 @@ Also, :ref:`usefixtures` and :ref:`autouse` fixtures are supported when executing text doctest files. + +The standard ``doctest`` module provides some setting flags to configure the +strictness of doctest tests. In py.test You can enable those flags those flags +using the configuration file. To make pytest ignore trailing whitespaces and +ignore lengthy exception stack traces you can just write:: + + # content of pytest.ini + [pytest] + doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL https://bitbucket.org/hpk42/pytest/commits/e936c745ac02/ Changeset: e936c745ac02 User: HolgerPeters Date: 2014-10-08 13:54:08+00:00 Summary: Add a doctest for module docstrings Affected #: 1 file diff -r 5858326d9c359b1a909ebcbc751cd91337692089 -r e936c745ac02a698a77314123ee34d44909662e0 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -323,3 +323,29 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=0) + + def test_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(failed=1, passed=0) https://bitbucket.org/hpk42/pytest/commits/3cd7345264b5/ Changeset: 3cd7345264b5 User: HolgerPeters Date: 2014-10-09 14:59:42+00:00 Summary: link fix: Use restructured text :doc: link instead of html link Affected #: 1 file diff -r e936c745ac02a698a77314123ee34d44909662e0 -r 3cd7345264b5bf04929431f033a3cc38f1733982 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -130,4 +130,4 @@ .. confval:: doctest_optionflags One or more doctest flag names from the standard ``doctest`` module. - `See how py.test handles doctests `_. + :doc:`See how py.test handles doctests `. https://bitbucket.org/hpk42/pytest/commits/9eed8cdf4c9c/ Changeset: 9eed8cdf4c9c User: hpk42 Date: 2014-10-09 15:05:48+00:00 Summary: Merged in HolgerPeters/pytest (pull request #221) Make doctest flags configurable Affected #: 5 files diff -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,8 @@ 2.6.4.dev ---------- +- add a doctest option for doctest flags + - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. diff -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -6,6 +6,8 @@ from py._code.code import TerminalRepr, ReprFileLocation def pytest_addoption(parser): + parser.addini('doctest_optionflags', 'option flags for doctests', + type="args", default=["ELLIPSIS"]) group = parser.getgroup("collect") group.addoption("--doctest-modules", action="store_true", default=False, @@ -87,6 +89,24 @@ def reportinfo(self): return self.fspath, None, "[doctest] %s" % self.name +def _get_flag_lookup(): + import doctest + return dict(DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, + DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, + NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, + ELLIPSIS=doctest.ELLIPSIS, + IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, + COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) + +def get_optionflags(parent): + import doctest + optionflags_str = parent.config.getini("doctest_optionflags") + flag_lookup_table = _get_flag_lookup() + flag_acc = 0 + for flag in optionflags_str: + flag_acc |= flag_lookup_table[flag] + return flag_acc + class DoctestTextfile(DoctestItem, pytest.File): def runtest(self): import doctest @@ -101,7 +121,7 @@ fixture_request._fillfixtures() failed, tot = doctest.testfile( str(self.fspath), module_relative=False, - optionflags=doctest.ELLIPSIS, + optionflags=get_optionflags(self), extraglobs=dict(getfixture=fixture_request.getfuncargvalue), raise_on_error=True, verbose=0) @@ -119,7 +139,8 @@ doctest_globals = dict(getfixture=fixture_request.getfuncargvalue) # uses internal doctest module parsing mechanism finder = doctest.DocTestFinder() - runner = doctest.DebugRunner(verbose=0, optionflags=doctest.ELLIPSIS) + optionflags= get_optionflags(self) + runner = doctest.DebugRunner(verbose=0, optionflags=optionflags) for test in finder.find(module, module.__name__, extraglobs=doctest_globals): if test.examples: # skip empty doctests diff -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -126,3 +126,8 @@ derived class. See :ref:`change naming conventions` for examples. + +.. confval:: doctest_optionflags + + One or more doctest flag names from the standard ``doctest`` module. + :doc:`See how py.test handles doctests `. diff -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -60,3 +60,12 @@ Also, :ref:`usefixtures` and :ref:`autouse` fixtures are supported when executing text doctest files. + +The standard ``doctest`` module provides some setting flags to configure the +strictness of doctest tests. In py.test You can enable those flags those flags +using the configuration file. To make pytest ignore trailing whitespaces and +ignore lengthy exception stack traces you can just write:: + + # content of pytest.ini + [pytest] + doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL diff -r 6518db2c3a72b06a81d31e6b4ee3f465ae01aa8d -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 testing/test_doctest.py --- a/testing/test_doctest.py +++ b/testing/test_doctest.py @@ -289,3 +289,63 @@ """) reprec = testdir.inline_run(p, "--doctest-modules") reprec.assertoutcome(failed=1, passed=1) + + def test_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.makepyfile(""" + class MyClass: + ''' + >>> a = "foo " + >>> print(a) + foo + ''' + pass + """) + reprec = testdir.inline_run(p, "--doctest-modules") + reprec.assertoutcome(failed=1, passed=0) + + def test_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS NORMALIZE_WHITESPACE + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(passed=1) + + def test_non_ignored_whitespace_glob(self, testdir): + testdir.makeini(""" + [pytest] + doctest_optionflags = ELLIPSIS + """) + p = testdir.maketxtfile(xdoc=""" + >>> a = "foo " + >>> print(a) + foo + """) + reprec = testdir.inline_run(p, "--doctest-glob=x*.txt") + reprec.assertoutcome(failed=1, passed=0) https://bitbucket.org/hpk42/pytest/commits/f8e346902150/ Changeset: f8e346902150 User: hpk42 Date: 2014-10-09 15:06:39+00:00 Summary: fix changelog Affected #: 1 file diff -r 9eed8cdf4c9cd62abb9db1e62ce40e210564f382 -r f8e346902150b9d894f1b9c484acb79e4f986c38 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -10,12 +10,11 @@ - use hookwrapper mechanism in builtin pytest plugins. +- add a doctest option for doctest flags, thanks Holger Peters. 2.6.4.dev ---------- -- add a doctest option for doctest flags - - Improve assertion failure reporting on iterables, by using ndiff and pprint. - removed outdated japanese docs from source tree. https://bitbucket.org/hpk42/pytest/commits/b761ba8552e5/ Changeset: b761ba8552e5 User: hpk42 Date: 2014-10-09 20:45:33+00:00 Summary: remove unused import Affected #: 2 files diff -r f8e346902150b9d894f1b9c484acb79e4f986c38 -r b761ba8552e51c6d6f701b9f410b651c4e8f56a7 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -10,7 +10,7 @@ - use hookwrapper mechanism in builtin pytest plugins. -- add a doctest option for doctest flags, thanks Holger Peters. +- add a doctest ini option for doctest flags, thanks Holger Peters. 2.6.4.dev ---------- diff -r f8e346902150b9d894f1b9c484acb79e4f986c38 -r b761ba8552e51c6d6f701b9f410b651c4e8f56a7 _pytest/doctest.py --- a/_pytest/doctest.py +++ b/_pytest/doctest.py @@ -99,7 +99,6 @@ COMPARISON_FLAGS=doctest.COMPARISON_FLAGS) def get_optionflags(parent): - import doctest optionflags_str = parent.config.getini("doctest_optionflags") flag_lookup_table = _get_flag_lookup() flag_acc = 0 https://bitbucket.org/hpk42/pytest/commits/3a4ae8624da7/ Changeset: 3a4ae8624da7 User: nicoddemus Date: 2014-10-10 20:43:33+00:00 Summary: Adding "auto" to help for "--tb" option Affected #: 1 file diff -r b761ba8552e51c6d6f701b9f410b651c4e8f56a7 -r 3a4ae8624da70e3811f9ea305eecfa924485562a _pytest/terminal.py --- a/_pytest/terminal.py +++ b/_pytest/terminal.py @@ -27,7 +27,7 @@ group._addoption('--tb', metavar="style", action="store", dest="tbstyle", default='auto', choices=['auto', 'long', 'short', 'no', 'line', 'native'], - help="traceback print mode (long/short/line/native/no).") + help="traceback print mode (auto/long/short/line/native/no).") group._addoption('--fulltrace', '--full-trace', action="store_true", default=False, help="don't cut any tracebacks (default is to cut).") https://bitbucket.org/hpk42/pytest/commits/2d7daaa350c7/ Changeset: 2d7daaa350c7 Branch: some_spelling_fixes User: tomviner Date: 2014-10-13 22:12:01+00:00 Summary: fix some spelling mistakes Affected #: 8 files diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -428,7 +428,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. @@ -495,7 +495,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 ISSUES.txt --- a/ISSUES.txt +++ b/ISSUES.txt @@ -49,7 +49,7 @@ the marker-mechanism with respect to a test module but puts it to a directory scale. -When doing larger scoped parametrization it probably becomes neccessary +When doing larger scoped parametrization it probably becomes necessary to allow parametrization to be ignored if the according parameter is not used (currently any parametrized argument that is not present in a function will cause a ValueError). Example: @@ -77,7 +77,7 @@ different values for self.db. This could also work with unittest/nose style tests, i.e. it leverages existing test suites without needing to rewrite them. Together with the previously mentioned setup_test() -maybe the setupfunc could be ommitted? +maybe the setupfunc could be omitted? optimizations --------------------------------------------------------------- @@ -229,7 +229,7 @@ pytest.ensuretemp and pytest.config are probably the last objects containing global state. Often using them is not -neccessary. This is about trying to get rid of them, i.e. +necessary. This is about trying to get rid of them, i.e. deprecating them and checking with PyPy's usages as well as others. @@ -298,7 +298,7 @@ The idea is that you can e.g. import modules in a test and afterwards sys.modules, sys.meta_path etc would be reverted. It can go further -then just importing however, e.g. current working direcroty, file +then just importing however, e.g. current working directory, file descriptors, ... This would probably be done by marking:: @@ -357,7 +357,7 @@ id, call = prepare_check(check) # bubble should only prevent exception propagation after a failure # the whole test should still fail - # there might be need for a loer level api and taking custom markers into account + # there might be need for a lower level api and taking custom markers into account with pytest.section(id, bubble=False): call() diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -455,7 +455,7 @@ for an overview of how this works. The entry point here is .run() which will iterate over all the - statenemts in an ast.Module and for each ast.Assert statement it + statements in an ast.Module and for each ast.Assert statement it finds call .visit() with it. Then .visit_Assert() takes over and is responsible for creating new ast statements to replace the original assert statement: it re-writes the test of an assertion diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 doc/en/announce/release-2.4.0.txt --- a/doc/en/announce/release-2.4.0.txt +++ b/doc/en/announce/release-2.4.0.txt @@ -34,7 +34,7 @@ influence the environment before conftest files import ``django``. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. + failures/errors occurred or everything passed. The documentation has been updated to accomodate the changes, see `http://pytest.org `_ @@ -95,7 +95,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 doc/en/announce/release-2.4.2.txt --- a/doc/en/announce/release-2.4.2.txt +++ b/doc/en/announce/release-2.4.2.txt @@ -21,7 +21,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 doc/en/index.txt --- a/doc/en/index.txt +++ b/doc/en/index.txt @@ -31,7 +31,7 @@ **scales from simple unit to complex functional testing** - :ref:`modular parametrizeable fixtures ` (new in 2.3, - continously improved) + continuously improved) - :ref:`parametrized test functions ` - :ref:`mark` - :ref:`skipping` (improved in 2.4) diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 doc/en/monkeypatch.txt --- a/doc/en/monkeypatch.txt +++ b/doc/en/monkeypatch.txt @@ -57,7 +57,7 @@ example: setting an attribute on some class ------------------------------------------------------ -If you need to patch out ``os.getcwd()`` to return an artifical +If you need to patch out ``os.getcwd()`` to return an artificial value:: def test_some_interaction(monkeypatch): diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 2d7daaa350c7aa26fbeaf312b42d7070aa8af742 doc/en/projects.txt --- a/doc/en/projects.txt +++ b/doc/en/projects.txt @@ -78,6 +78,6 @@ * `Stups department of Heinrich Heine University Duesseldorf `_ * `cellzome `_ * `Open End, Gothenborg `_ -* `Laboraratory of Bioinformatics, Warsaw `_ +* `Laboratory of Bioinformatics, Warsaw `_ * `merlinux, Germany `_ * many more ... (please be so kind to send a note via :ref:`contact`) https://bitbucket.org/hpk42/pytest/commits/cb1ab2ce0f47/ Changeset: cb1ab2ce0f47 User: hpk42 Date: 2014-10-14 07:59:49+00:00 Summary: Merged in tomviner/pytest/some_spelling_fixes (pull request #224) A few spelling fixes Affected #: 8 files diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -428,7 +428,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. @@ -495,7 +495,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f ISSUES.txt --- a/ISSUES.txt +++ b/ISSUES.txt @@ -49,7 +49,7 @@ the marker-mechanism with respect to a test module but puts it to a directory scale. -When doing larger scoped parametrization it probably becomes neccessary +When doing larger scoped parametrization it probably becomes necessary to allow parametrization to be ignored if the according parameter is not used (currently any parametrized argument that is not present in a function will cause a ValueError). Example: @@ -77,7 +77,7 @@ different values for self.db. This could also work with unittest/nose style tests, i.e. it leverages existing test suites without needing to rewrite them. Together with the previously mentioned setup_test() -maybe the setupfunc could be ommitted? +maybe the setupfunc could be omitted? optimizations --------------------------------------------------------------- @@ -229,7 +229,7 @@ pytest.ensuretemp and pytest.config are probably the last objects containing global state. Often using them is not -neccessary. This is about trying to get rid of them, i.e. +necessary. This is about trying to get rid of them, i.e. deprecating them and checking with PyPy's usages as well as others. @@ -298,7 +298,7 @@ The idea is that you can e.g. import modules in a test and afterwards sys.modules, sys.meta_path etc would be reverted. It can go further -then just importing however, e.g. current working direcroty, file +then just importing however, e.g. current working directory, file descriptors, ... This would probably be done by marking:: @@ -357,7 +357,7 @@ id, call = prepare_check(check) # bubble should only prevent exception propagation after a failure # the whole test should still fail - # there might be need for a loer level api and taking custom markers into account + # there might be need for a lower level api and taking custom markers into account with pytest.section(id, bubble=False): call() diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -455,7 +455,7 @@ for an overview of how this works. The entry point here is .run() which will iterate over all the - statenemts in an ast.Module and for each ast.Assert statement it + statements in an ast.Module and for each ast.Assert statement it finds call .visit() with it. Then .visit_Assert() takes over and is responsible for creating new ast statements to replace the original assert statement: it re-writes the test of an assertion diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/announce/release-2.4.0.txt --- a/doc/en/announce/release-2.4.0.txt +++ b/doc/en/announce/release-2.4.0.txt @@ -34,7 +34,7 @@ influence the environment before conftest files import ``django``. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. + failures/errors occurred or everything passed. The documentation has been updated to accomodate the changes, see `http://pytest.org `_ @@ -95,7 +95,7 @@ as strings will remain fully supported. - reporting: color the last line red or green depending if - failures/errors occured or everything passed. thanks Christian + failures/errors occurred or everything passed. thanks Christian Theunert. - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/announce/release-2.4.2.txt --- a/doc/en/announce/release-2.4.2.txt +++ b/doc/en/announce/release-2.4.2.txt @@ -21,7 +21,7 @@ - introduce node.get_marker/node.add_marker API for plugins like pytest-pep8 and pytest-flakes to avoid the messy - details of the node.keywords pseudo-dicts. Adapated + details of the node.keywords pseudo-dicts. Adapted docs. - remove attempt to "dup" stdout at startup as it's icky. diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/index.txt --- a/doc/en/index.txt +++ b/doc/en/index.txt @@ -31,7 +31,7 @@ **scales from simple unit to complex functional testing** - :ref:`modular parametrizeable fixtures ` (new in 2.3, - continously improved) + continuously improved) - :ref:`parametrized test functions ` - :ref:`mark` - :ref:`skipping` (improved in 2.4) diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/monkeypatch.txt --- a/doc/en/monkeypatch.txt +++ b/doc/en/monkeypatch.txt @@ -57,7 +57,7 @@ example: setting an attribute on some class ------------------------------------------------------ -If you need to patch out ``os.getcwd()`` to return an artifical +If you need to patch out ``os.getcwd()`` to return an artificial value:: def test_some_interaction(monkeypatch): diff -r b661b59125202291e8d01272eafd71dc7ea2d8ab -r cb1ab2ce0f47d7ce77ccf3e2c2caa52e1e729e2f doc/en/projects.txt --- a/doc/en/projects.txt +++ b/doc/en/projects.txt @@ -78,6 +78,6 @@ * `Stups department of Heinrich Heine University Duesseldorf `_ * `cellzome `_ * `Open End, Gothenborg `_ -* `Laboraratory of Bioinformatics, Warsaw `_ +* `Laboratory of Bioinformatics, Warsaw `_ * `merlinux, Germany `_ * many more ... (please be so kind to send a note via :ref:`contact`) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Wed Oct 15 21:44:27 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 15 Oct 2014 19:44:27 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141015194427.16520.94532@app06.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/7d3f7feeaae9/ Changeset: 7d3f7feeaae9 Branch: assert_percent_test User: tomviner Date: 2014-10-13 08:26:18+00:00 Summary: test for issue615: compound assert with percent Affected #: 1 file diff -r 3a4ae8624da70e3811f9ea305eecfa924485562a -r 7d3f7feeaae9bc407cd00ac2188d66a0d38cdda1 testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,6 +270,16 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" + @pytest.mark.xfail(reason='unfixed') + def test_and_or_percent(self): + # issue 615 - ValueError on compound assert with percent + def f(): + assert 3 % 2 or False + assert getmsg(f) == "assert (3 % 2) or False" + def f(): + assert True and 7 % 3 + assert getmsg(f) == "assert True and (7 % 3)" + def test_call(self): def g(a=42, *args, **kwargs): return False https://bitbucket.org/hpk42/pytest/commits/4696fc59a5a1/ Changeset: 4696fc59a5a1 User: flub Date: 2014-10-15 19:44:24+00:00 Summary: Merged in tomviner/pytest/assert_percent_test (pull request #223) Test for issue615: compound assert with percent Affected #: 1 file diff -r 1d2fa202e54cb8e61d5b8eaceffb93da5fe7ed9b -r 4696fc59a5a15f9c79902d34489865bf7f840b6c testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,6 +270,16 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" + @pytest.mark.xfail(reason='unfixed') + def test_and_or_percent(self): + # issue 615 - ValueError on compound assert with percent + def f(): + assert 3 % 2 or False + assert getmsg(f) == "assert (3 % 2) or False" + def f(): + assert True and 7 % 3 + assert getmsg(f) == "assert True and (7 % 3)" + def test_call(self): def g(a=42, *args, **kwargs): return False Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Wed Oct 15 21:44:29 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 15 Oct 2014 19:44:29 -0000 Subject: [Pytest-commit] commit/pytest: flub: Merged in tomviner/pytest/assert_percent_test (pull request #223) Message-ID: <20141015194429.20781.32627@app08.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/4696fc59a5a1/ Changeset: 4696fc59a5a1 User: flub Date: 2014-10-15 19:44:24+00:00 Summary: Merged in tomviner/pytest/assert_percent_test (pull request #223) Test for issue615: compound assert with percent Affected #: 1 file diff -r 1d2fa202e54cb8e61d5b8eaceffb93da5fe7ed9b -r 4696fc59a5a15f9c79902d34489865bf7f840b6c testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,6 +270,16 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" + @pytest.mark.xfail(reason='unfixed') + def test_and_or_percent(self): + # issue 615 - ValueError on compound assert with percent + def f(): + assert 3 % 2 or False + assert getmsg(f) == "assert (3 % 2) or False" + def f(): + assert True and 7 % 3 + assert getmsg(f) == "assert True and (7 % 3)" + def test_call(self): def g(a=42, *args, **kwargs): return False Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Wed Oct 15 21:46:11 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 15 Oct 2014 19:46:11 -0000 Subject: [Pytest-commit] commit/pytest: flub: Close branch Message-ID: <20141015194611.25146.97109@app03.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/7fd2ea5d8f43/ Changeset: 7fd2ea5d8f43 Branch: assert_percent_test User: flub Date: 2014-10-15 19:45:51+00:00 Summary: Close branch Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Wed Oct 15 21:51:51 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 15 Oct 2014 19:51:51 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 356 Message-ID: <20141015195019.1825.58247@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/356 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3898:4696fc59a5a1 Author : Floris Bruynooghe Branch : default Message: Merged in tomviner/pytest/assert_percent_test (pull request #223) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Wed Oct 15 21:56:54 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 15 Oct 2014 19:56:54 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 357 Message-ID: <20141015195633.52931.71432@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/357 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3899:7fd2ea5d8f43 Author : Floris Bruynooghe Branch : default Message: Close branch -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Wed Oct 15 22:03:12 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 15 Oct 2014 20:03:12 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 358 Message-ID: <20141015200217.1837.74588@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/358 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3756:7fd2ea5d8f43 Author : Floris Bruynooghe Branch : assert_percent_test Message: Close branch -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Fri Oct 17 01:14:57 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 16 Oct 2014 23:14:57 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141016231457.14674.48206@app06.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/622a0ec45e89/ Changeset: 622a0ec45e89 Branch: some_spelling_fixes User: flub Date: 2014-10-16 23:14:16+00:00 Summary: closing branch Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/8aaab290aeec/ Changeset: 8aaab290aeec Branch: test_for_issue_604 User: flub Date: 2014-10-16 23:14:27+00:00 Summary: closing branch Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Fri Oct 17 01:15:07 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 16 Oct 2014 23:15:07 +0000 Subject: [Pytest-commit] [FAIL] pytest - # 359 Message-ID: <20141016231457.17064.36832@drone.io> Build Failed Build : https://drone.io/bitbucket.org/hpk42/pytest/359 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : Author : Branch : test_for_issue_604 Message: -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Sun Oct 19 13:40:23 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sun, 19 Oct 2014 11:40:23 -0000 Subject: [Pytest-commit] commit/pytest: drothlis: Fix assertion.rewrite on read-only filesystem Message-ID: <20141019114023.11904.59765@app05.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/78def8dd5c94/ Changeset: 78def8dd5c94 User: drothlis Date: 2014-10-17 20:18:37+00:00 Summary: Fix assertion.rewrite on read-only filesystem Affected #: 1 file diff -r 4696fc59a5a15f9c79902d34489865bf7f840b6c -r 78def8dd5c941ec312994f87fd31f8a422943879 _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -122,7 +122,7 @@ # One of the path components was not a directory, likely # because we're in a zip file. write = False - elif e == errno.EACCES: + elif e in [errno.EACCES, errno.EROFS]: state.trace("read only directory: %r" % fn_pypath.dirname) write = False else: Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Sun Oct 19 13:47:21 2014 From: builds at drone.io (Drone.io Build) Date: Sun, 19 Oct 2014 11:47:21 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 360 Message-ID: <20141019114721.41878.550@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/360 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3902:78def8dd5c94 Author : David R?thlisberger Branch : default Message: Fix assertion.rewrite on read-only filesystem -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Mon Oct 20 16:02:50 2014 From: issues-reply at bitbucket.org (Chris B) Date: Mon, 20 Oct 2014 14:02:50 -0000 Subject: [Pytest-commit] Issue #616: (2.6.3) Conftest is ran, but fixtures not brought in. (hpk42/pytest) Message-ID: <20141020140250.15113.43175@app13.ash-private.bitbucket.org> New issue 616: (2.6.3) Conftest is ran, but fixtures not brought in. https://bitbucket.org/hpk42/pytest/issue/616/263-conftest-is-ran-but-fixtures-not Chris B: Framework: ``` #! .drivers\ .logs\ .plugins\ .sessions\ .testbeds\ .tests\ .utils\ .conftest.py ``` All files in the directories (except for the logs) are python files. There is no extra conftest.py file within any of these directories. When using a command line start, there is a user defined option to bring in a testbed module. This is defined in the conftest.py file along with how to import it into a test (through fixtures). These fixtures would be seen by a test in the tests directory **prior to 2.6.3**. When trying to do the same command line with 2.6.3, an error is shown: ``` #! =================================== ERRORS ==================================== _____________ ERROR at setup of ______________ file \.py, line def test_test ( self , tb_testbed , request ): fixture 'tb_testbed' not found available fixtures: , pytestconfig, recwarn, monkeypatch, capfd, capsys, tmpdir use 'py.test --fixtures [testpath]' for help on them. \.py: ===================== 1 xfailed, 1 error in 0.05 seconds ====================== ``` If the test is moved to the top level directory, then the fixtures are seen. If the line: ``` #!python from conftest import tb_testbed, tb_name ``` is added to the test, then the fixtures are brought in as well. Is this a bug or a previous bug that was fixed? Thank you very much for your time. conftest.py: ``` #!python import pytest import telnetlib import time import datetime import os import sys import logging import importlib import re from time import gmtime, strftime, localtime full_path = os.path.realpath(__file__) tempTopLevelDir, file = os.path.split(os.path.realpath(__file__)) # add specific dirs to the sys.path so you can import any modules created there. tempDriversDir = os.path.join(tempTopLevelDir,'drivers') tempPluginsDir = os.path.join(tempTopLevelDir,'plugins') tempSessionsDir = os.path.join(tempTopLevelDir,'sessions') tempTestbedsDir = os.path.join(tempTopLevelDir,'testbeds') tempUtilsDir = os.path.join(tempTopLevelDir,'utils') sys.path.extend( [tempDriversDir, tempPluginsDir, tempSessionsDir, tempTestbedsDir, tempUtilsDir] ) #allow for testbed option def pytest_addoption(parser): parser.addoption("--testbed", action = "store", help = "Specify testbed for test run") #get testbed option @pytest.fixture(scope="session") def tb_name(request): request.config.tb_name = request.config.getoption("--testbed") return request.config.tb_name @pytest.fixture(scope="module") def tb_testbed(request, tb_name): #get testbed information for test assert tb_name != None, "--testbed command line option required" try: testbed = importlib.import_module('testbeds.' + tb_name) return testbed except: raise Exception("testbed not found!") ``` From issues-reply at bitbucket.org Mon Oct 20 21:49:23 2014 From: issues-reply at bitbucket.org (=?utf-8?q?Joe_Pich=C3=A9?=) Date: Mon, 20 Oct 2014 19:49:23 -0000 Subject: [Pytest-commit] Issue #617: Iterative tmpdir folders lost when using --basetemp (hpk42/pytest) Message-ID: <20141020194923.29567.89522@app11.ash-private.bitbucket.org> New issue 617: Iterative tmpdir folders lost when using --basetemp https://bitbucket.org/hpk42/pytest/issue/617/iterative-tmpdir-folders-lost-when-using Joe Pich?: When specifying a --basetemp folder, the iterative folders feature is lost. It would be great to be able to use a specific basetemp folder and still keep the automatic numbering feature of pytest's tmpdir fixture. [From a question on stackoverflow](http://stackoverflow.com/questions/26302497/specify-basetemp-while-keeping-the-per-session-folder-behavior) From issues-reply at bitbucket.org Tue Oct 21 16:18:57 2014 From: issues-reply at bitbucket.org (holger krekel) Date: Tue, 21 Oct 2014 14:18:57 -0000 Subject: [Pytest-commit] Issue #199: Sometimes wrong "toxresults" are produced (hpk42/tox) Message-ID: <20141021141857.11486.92319@app14.ash-private.bitbucket.org> New issue 199: Sometimes wrong "toxresults" are produced https://bitbucket.org/hpk42/tox/issue/199/sometimes-wrong-toxresults-are-produced holger krekel: there are sometimes toxresult files which don't contain proper platform information. Responsible: hpk42 From commits-noreply at bitbucket.org Tue Oct 21 16:38:28 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 21 Oct 2014 14:38:28 -0000 Subject: [Pytest-commit] commit/tox: 3 new changesets Message-ID: <20141021143828.28721.7750@app12.ash-private.bitbucket.org> 3 new commits in tox: https://bitbucket.org/hpk42/tox/commits/54204edbaa7e/ Changeset: 54204edbaa7e User: carljm Date: 2014-10-06 23:36:05+00:00 Summary: Add --pre and testenv pip_pre options, no --pre by default. Affected #: 6 files diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +1.9.0.dev +----------- + +- fix issue193: Remove ``--pre`` from the default ``install_command``; by + default tox will now only install final releases from PyPI for unpinned + dependencies. Use ``pip_pre = true`` in a testenv or the ``--pre`` + command-line option to restore the previous behavior. + + 1.8.1.dev ----------- diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e doc/config.txt --- a/doc/config.txt +++ b/doc/config.txt @@ -106,7 +106,22 @@ **default**:: - pip install --pre {opts} {packages} + pip install {opts} {packages} + +.. confval:: pip_pre=True|False(default) + + .. versionadded:: 1.9 + + If ``True``, adds ``--pre`` to the ``opts`` passed to + :confval:`install_command`. If :confval:`install_command` uses pip, this + will cause it to install the latest available pre-release of any + dependencies without a specified version. If ``False`` (the default), pip + will only install final releases of unpinned dependencies. + + Passing the ``--pre`` command-line option to tox will force this to + ``True`` for all testenvs. + + Don't set this option if your :confval:`install_command` does not use pip. .. confval:: whitelist_externals=MULTI-LINE-LIST diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -106,6 +106,7 @@ envconfig = config.envconfigs['python'] assert envconfig.args_are_paths assert not envconfig.recreate + assert not envconfig.pip_pre def test_defaults_distshare(self, tmpdir, newconfig): config = newconfig([], "") @@ -620,6 +621,24 @@ 'some_install', '--arg=%s/foo' % config.toxinidir, 'python', '{opts}', '{packages}'] + def test_pip_pre(self, newconfig): + config = newconfig(""" + [testenv] + pip_pre=true + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + + def test_pip_pre_cmdline_override(self, newconfig): + config = newconfig( + ['--pre'], + """ + [testenv] + pip_pre=false + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + def test_downloadcache(self, newconfig, monkeypatch): monkeypatch.delenv("PIP_DOWNLOAD_CACHE", raising=False) config = newconfig(""" diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e tests/test_venv.py --- a/tests/test_venv.py +++ b/tests/test_venv.py @@ -211,6 +211,25 @@ assert "-i ABC" in args assert "dep3" in args +def test_install_deps_pre(newmocksession): + mocksession = newmocksession([], """ + [testenv] + pip_pre=true + deps= + dep1 + """) + venv = mocksession.getenv('python') + venv.create() + l = mocksession._pcalls + assert len(l) == 1 + l[:] = [] + + venv.install_deps() + assert len(l) == 1 + args = " ".join(l[0].args) + assert "--pre " in args + assert "dep1" in args + def test_installpkg_indexserver(newmocksession, tmpdir): mocksession = newmocksession([], """ [tox] diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -105,6 +105,8 @@ dest="indexurl", metavar="URL", help="set indexserver url (if URL is of form name=url set the " "url for the 'name' indexserver, specifically)") + parser.add_argument("--pre", action="store_true", dest="pre", + help="pass --pre option to install_command") parser.add_argument("-r", "--recreate", action="store_true", dest="recreate", help="force recreation of virtual environments") @@ -381,15 +383,17 @@ downloadcache = os.environ.get("PIP_DOWNLOAD_CACHE", downloadcache) vc.downloadcache = py.path.local(downloadcache) - pip_default_opts = ["--pre", "{opts}", "{packages}"] vc.install_command = reader.getargv( section, "install_command", - "pip install " + " ".join(pip_default_opts), + "pip install {opts} {packages}", ) if '{packages}' not in vc.install_command: raise tox.exception.ConfigError( "'install_command' must contain '{packages}' substitution") + vc.pip_pre = config.option.pre or reader.getbool( + section, "pip_pre", False) + return vc def _getenvdata(self, reader, toxsection): diff -r e89dddec56e6c5844aeb6cc50ea5e2956f53bca6 -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e tox/_venv.py --- a/tox/_venv.py +++ b/tox/_venv.py @@ -260,6 +260,8 @@ if self.envconfig.downloadcache: self.envconfig.downloadcache.ensure(dir=1) l.append("--download-cache=%s" % self.envconfig.downloadcache) + if self.envconfig.pip_pre: + l.append("--pre") return l def run_install_command(self, packages, options=(), https://bitbucket.org/hpk42/tox/commits/dc37c2432796/ Changeset: dc37c2432796 User: carljm Date: 2014-10-07 16:44:37+00:00 Summary: Expand help text for --pre option. Affected #: 1 file diff -r 54204edbaa7e82c125a1034ba3e1f124ff0cbb1e -r dc37c2432796b22e0dcee512f8baffb3a223b4e0 tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -106,7 +106,8 @@ help="set indexserver url (if URL is of form name=url set the " "url for the 'name' indexserver, specifically)") parser.add_argument("--pre", action="store_true", dest="pre", - help="pass --pre option to install_command") + help="install pre-releases and development versions of dependencies. " + "This will pass the --pre option to install_command (pip by default).") parser.add_argument("-r", "--recreate", action="store_true", dest="recreate", help="force recreation of virtual environments") https://bitbucket.org/hpk42/tox/commits/d4916d4cc83a/ Changeset: d4916d4cc83a User: hpk42 Date: 2014-10-21 14:38:21+00:00 Summary: Merged in carljm/tox (pull request #123) Add --pre and testenv pip_pre options, no --pre by default. Affected #: 6 files diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +1.9.0.dev +----------- + +- fix issue193: Remove ``--pre`` from the default ``install_command``; by + default tox will now only install final releases from PyPI for unpinned + dependencies. Use ``pip_pre = true`` in a testenv or the ``--pre`` + command-line option to restore the previous behavior. + + 1.8.1.dev ----------- diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc doc/config.txt --- a/doc/config.txt +++ b/doc/config.txt @@ -106,7 +106,22 @@ **default**:: - pip install --pre {opts} {packages} + pip install {opts} {packages} + +.. confval:: pip_pre=True|False(default) + + .. versionadded:: 1.9 + + If ``True``, adds ``--pre`` to the ``opts`` passed to + :confval:`install_command`. If :confval:`install_command` uses pip, this + will cause it to install the latest available pre-release of any + dependencies without a specified version. If ``False`` (the default), pip + will only install final releases of unpinned dependencies. + + Passing the ``--pre`` command-line option to tox will force this to + ``True`` for all testenvs. + + Don't set this option if your :confval:`install_command` does not use pip. .. confval:: whitelist_externals=MULTI-LINE-LIST diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -106,6 +106,7 @@ envconfig = config.envconfigs['python'] assert envconfig.args_are_paths assert not envconfig.recreate + assert not envconfig.pip_pre def test_defaults_distshare(self, tmpdir, newconfig): config = newconfig([], "") @@ -620,6 +621,24 @@ 'some_install', '--arg=%s/foo' % config.toxinidir, 'python', '{opts}', '{packages}'] + def test_pip_pre(self, newconfig): + config = newconfig(""" + [testenv] + pip_pre=true + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + + def test_pip_pre_cmdline_override(self, newconfig): + config = newconfig( + ['--pre'], + """ + [testenv] + pip_pre=false + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + def test_downloadcache(self, newconfig, monkeypatch): monkeypatch.delenv("PIP_DOWNLOAD_CACHE", raising=False) config = newconfig(""" diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tests/test_venv.py --- a/tests/test_venv.py +++ b/tests/test_venv.py @@ -211,6 +211,25 @@ assert "-i ABC" in args assert "dep3" in args +def test_install_deps_pre(newmocksession): + mocksession = newmocksession([], """ + [testenv] + pip_pre=true + deps= + dep1 + """) + venv = mocksession.getenv('python') + venv.create() + l = mocksession._pcalls + assert len(l) == 1 + l[:] = [] + + venv.install_deps() + assert len(l) == 1 + args = " ".join(l[0].args) + assert "--pre " in args + assert "dep1" in args + def test_installpkg_indexserver(newmocksession, tmpdir): mocksession = newmocksession([], """ [tox] diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -105,6 +105,9 @@ dest="indexurl", metavar="URL", help="set indexserver url (if URL is of form name=url set the " "url for the 'name' indexserver, specifically)") + parser.add_argument("--pre", action="store_true", dest="pre", + help="install pre-releases and development versions of dependencies. " + "This will pass the --pre option to install_command (pip by default).") parser.add_argument("-r", "--recreate", action="store_true", dest="recreate", help="force recreation of virtual environments") @@ -381,15 +384,17 @@ downloadcache = os.environ.get("PIP_DOWNLOAD_CACHE", downloadcache) vc.downloadcache = py.path.local(downloadcache) - pip_default_opts = ["--pre", "{opts}", "{packages}"] vc.install_command = reader.getargv( section, "install_command", - "pip install " + " ".join(pip_default_opts), + "pip install {opts} {packages}", ) if '{packages}' not in vc.install_command: raise tox.exception.ConfigError( "'install_command' must contain '{packages}' substitution") + vc.pip_pre = config.option.pre or reader.getbool( + section, "pip_pre", False) + return vc def _getenvdata(self, reader, toxsection): diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tox/_venv.py --- a/tox/_venv.py +++ b/tox/_venv.py @@ -260,6 +260,8 @@ if self.envconfig.downloadcache: self.envconfig.downloadcache.ensure(dir=1) l.append("--download-cache=%s" % self.envconfig.downloadcache) + if self.envconfig.pip_pre: + l.append("--pre") return l def run_install_command(self, packages, options=(), Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 21 16:38:28 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 21 Oct 2014 14:38:28 -0000 Subject: [Pytest-commit] commit/tox: hpk42: Merged in carljm/tox (pull request #123) Message-ID: <20141021143828.4747.21328@app02.ash-private.bitbucket.org> 1 new commit in tox: https://bitbucket.org/hpk42/tox/commits/d4916d4cc83a/ Changeset: d4916d4cc83a User: hpk42 Date: 2014-10-21 14:38:21+00:00 Summary: Merged in carljm/tox (pull request #123) Add --pre and testenv pip_pre options, no --pre by default. Affected #: 6 files diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +1.9.0.dev +----------- + +- fix issue193: Remove ``--pre`` from the default ``install_command``; by + default tox will now only install final releases from PyPI for unpinned + dependencies. Use ``pip_pre = true`` in a testenv or the ``--pre`` + command-line option to restore the previous behavior. + + 1.8.1.dev ----------- diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc doc/config.txt --- a/doc/config.txt +++ b/doc/config.txt @@ -106,7 +106,22 @@ **default**:: - pip install --pre {opts} {packages} + pip install {opts} {packages} + +.. confval:: pip_pre=True|False(default) + + .. versionadded:: 1.9 + + If ``True``, adds ``--pre`` to the ``opts`` passed to + :confval:`install_command`. If :confval:`install_command` uses pip, this + will cause it to install the latest available pre-release of any + dependencies without a specified version. If ``False`` (the default), pip + will only install final releases of unpinned dependencies. + + Passing the ``--pre`` command-line option to tox will force this to + ``True`` for all testenvs. + + Don't set this option if your :confval:`install_command` does not use pip. .. confval:: whitelist_externals=MULTI-LINE-LIST diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -106,6 +106,7 @@ envconfig = config.envconfigs['python'] assert envconfig.args_are_paths assert not envconfig.recreate + assert not envconfig.pip_pre def test_defaults_distshare(self, tmpdir, newconfig): config = newconfig([], "") @@ -620,6 +621,24 @@ 'some_install', '--arg=%s/foo' % config.toxinidir, 'python', '{opts}', '{packages}'] + def test_pip_pre(self, newconfig): + config = newconfig(""" + [testenv] + pip_pre=true + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + + def test_pip_pre_cmdline_override(self, newconfig): + config = newconfig( + ['--pre'], + """ + [testenv] + pip_pre=false + """) + envconfig = config.envconfigs['python'] + assert envconfig.pip_pre + def test_downloadcache(self, newconfig, monkeypatch): monkeypatch.delenv("PIP_DOWNLOAD_CACHE", raising=False) config = newconfig(""" diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tests/test_venv.py --- a/tests/test_venv.py +++ b/tests/test_venv.py @@ -211,6 +211,25 @@ assert "-i ABC" in args assert "dep3" in args +def test_install_deps_pre(newmocksession): + mocksession = newmocksession([], """ + [testenv] + pip_pre=true + deps= + dep1 + """) + venv = mocksession.getenv('python') + venv.create() + l = mocksession._pcalls + assert len(l) == 1 + l[:] = [] + + venv.install_deps() + assert len(l) == 1 + args = " ".join(l[0].args) + assert "--pre " in args + assert "dep1" in args + def test_installpkg_indexserver(newmocksession, tmpdir): mocksession = newmocksession([], """ [tox] diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tox/_config.py --- a/tox/_config.py +++ b/tox/_config.py @@ -105,6 +105,9 @@ dest="indexurl", metavar="URL", help="set indexserver url (if URL is of form name=url set the " "url for the 'name' indexserver, specifically)") + parser.add_argument("--pre", action="store_true", dest="pre", + help="install pre-releases and development versions of dependencies. " + "This will pass the --pre option to install_command (pip by default).") parser.add_argument("-r", "--recreate", action="store_true", dest="recreate", help="force recreation of virtual environments") @@ -381,15 +384,17 @@ downloadcache = os.environ.get("PIP_DOWNLOAD_CACHE", downloadcache) vc.downloadcache = py.path.local(downloadcache) - pip_default_opts = ["--pre", "{opts}", "{packages}"] vc.install_command = reader.getargv( section, "install_command", - "pip install " + " ".join(pip_default_opts), + "pip install {opts} {packages}", ) if '{packages}' not in vc.install_command: raise tox.exception.ConfigError( "'install_command' must contain '{packages}' substitution") + vc.pip_pre = config.option.pre or reader.getbool( + section, "pip_pre", False) + return vc def _getenvdata(self, reader, toxsection): diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r d4916d4cc83a6abb7706383e9a249242fb4337fc tox/_venv.py --- a/tox/_venv.py +++ b/tox/_venv.py @@ -260,6 +260,8 @@ if self.envconfig.downloadcache: self.envconfig.downloadcache.ensure(dir=1) l.append("--download-cache=%s" % self.envconfig.downloadcache) + if self.envconfig.pip_pre: + l.append("--pre") return l def run_install_command(self, packages, options=(), Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Wed Oct 22 07:14:14 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 22 Oct 2014 05:14:14 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in nicoddemus/pytest/python-classes-glob (pull request #225) Message-ID: <20141022051414.2155.75112@app09.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/e9bfc62abed3/ Changeset: e9bfc62abed3 User: hpk42 Date: 2014-10-22 05:14:10+00:00 Summary: Merged in nicoddemus/pytest/python-classes-glob (pull request #225) added support for glob-style patterns to python_classes and python_functions config options Affected #: 5 files diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,9 @@ parameter is a callable, you also need to pass in a reason to disambiguate it from the "decorator" case. Thanks Tom Viner. +- "python_classes" and "python_functions" options now support glob-patterns + for test discovery, as discussed in issue600. Thanks Ldiary Translations. + 2.6.4.dev ---------- @@ -86,7 +89,7 @@ Thanks sontek. - Implement issue549: user-provided assertion messages now no longer - replace the py.test instrospection message but are shown in addition + replace the py.test introspection message but are shown in addition to them. 2.6.1 diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1,4 +1,5 @@ """ Python test discovery, setup and run of test functions. """ +import fnmatch import py import inspect import sys @@ -127,9 +128,10 @@ default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") parser.addini("python_classes", type="args", default=["Test",], - help="prefixes for Python test class discovery") + help="prefixes or glob names for Python test class discovery") parser.addini("python_functions", type="args", default=["test",], - help="prefixes for Python test function and method discovery") + help="prefixes or glob names for Python test function and " + "method discovery") def pytest_cmdline_main(config): if config.option.showfixtures: @@ -307,14 +309,26 @@ class PyCollector(PyobjMixin, pytest.Collector): def funcnamefilter(self, name): - for prefix in self.config.getini("python_functions"): - if name.startswith(prefix): - return True + return self._matches_prefix_or_glob_option('python_functions', name) def classnamefilter(self, name): - for prefix in self.config.getini("python_classes"): - if name.startswith(prefix): + return self._matches_prefix_or_glob_option('python_classes', name) + + def _matches_prefix_or_glob_option(self, option_name, name): + """ + checks if the given name matches the prefix or glob-pattern defined + in ini configuration. + """ + for option in self.config.getini(option_name): + if name.startswith(option): return True + # check that name looks like a glob-string before calling fnmatch + # because this is called for every name in each collected module, + # and fnmatch is somewhat expensive to call + elif ('*' in option or '?' in option or '[' in option) and \ + fnmatch.fnmatch(name, option): + return True + return False def collect(self): if not getattr(self.obj, "__test__", True): diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -115,17 +115,33 @@ .. confval:: python_classes - One or more name prefixes determining which test classes - are considered as test modules. + One or more name prefixes or glob-style patterns determining which classes + are considered for test collection. Here is an example of how to collect + tests from classes that end in ``Suite``:: + + # content of pytest.ini + [pytest] + python_classes = *Suite + + Note that ``unittest.TestCase`` derived classes are always collected + regardless of this option, as ``unittest``'s own collection framework is used + to collect those tests. .. confval:: python_functions - One or more name prefixes determining which test functions - and methods are considered as test modules. Note that this - has no effect on methods that live on a ``unittest.TestCase`` - derived class. + One or more name prefixes or glob-patterns determining which test functions + and methods are considered tests. Here is an example of how + to collect test functions and methods that end in ``_test``:: - See :ref:`change naming conventions` for examples. + # content of pytest.ini + [pytest] + python_functions = *_test + + Note that this has no effect on methods that live on a ``unittest + .TestCase`` derived class, as ``unittest``'s own collection framework is used + to collect those tests. + + See :ref:`change naming conventions` for more detailed examples. .. confval:: doctest_optionflags diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 doc/en/example/pythoncollection.txt --- a/doc/en/example/pythoncollection.txt +++ b/doc/en/example/pythoncollection.txt @@ -26,17 +26,17 @@ [pytest] python_files=check_*.py python_classes=Check - python_functions=check + python_functions=*_check -This would make ``pytest`` look for ``check_`` prefixes in -Python filenames, ``Check`` prefixes in classes and ``check`` prefixes -in functions and classes. For example, if we have:: +This would make ``pytest`` look for tests in files that match the ``check_* +.py`` glob-pattern, ``Check`` prefixes in classes, and functions and methods +that match ``*_check``. For example, if we have:: # content of check_myapp.py class CheckMyApp: - def check_simple(self): + def simple_check(self): pass - def check_complex(self): + def complex_check(self): pass then the test collection looks like this:: @@ -48,14 +48,14 @@ - - + + ============================= in 0.01 seconds ============================= .. note:: - the ``python_functions`` and ``python_classes`` has no effect + the ``python_functions`` and ``python_classes`` options has no effect for ``unittest.TestCase`` test discovery because pytest delegates detection of test case methods to unittest code. diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -528,6 +528,30 @@ assert s.endswith("test_example_items1.testone") print(s) + def test_class_and_functions_discovery_using_glob(self, testdir): + """ + tests that python_classes and python_functions config options work + as prefixes and glob-like patterns (issue #600). + """ + testdir.makeini(""" + [pytest] + python_classes = *Suite Test + python_functions = *_test test + """) + p = testdir.makepyfile(''' + class MyTestSuite: + def x_test(self): + pass + + class TestCase: + def test_y(self): + pass + ''') + items, reprec = testdir.inline_genitems(p) + ids = [x.getmodpath() for x in items] + assert ids == ['MyTestSuite.x_test', 'TestCase.test_y'] + + def test_matchnodes_two_collections_same_file(testdir): testdir.makeconftest(""" import pytest Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Wed Oct 22 07:14:14 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 22 Oct 2014 05:14:14 -0000 Subject: [Pytest-commit] commit/pytest: 4 new changesets Message-ID: <20141022051414.3009.94574@app13.ash-private.bitbucket.org> 4 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/4fb4cb5ae00f/ Changeset: 4fb4cb5ae00f Branch: python-classes-glob User: nicoddemus Date: 2014-10-16 22:27:10+00:00 Summary: added support for glob-style patterns to python_classes and python_functions config options fixes #600 Affected #: 4 files diff -r 4696fc59a5a15f9c79902d34489865bf7f840b6c -r 4fb4cb5ae00f6ca77992b2a566eefb073f299d27 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1,4 +1,5 @@ """ Python test discovery, setup and run of test functions. """ +import fnmatch import py import inspect import sys @@ -127,9 +128,10 @@ default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") parser.addini("python_classes", type="args", default=["Test",], - help="prefixes for Python test class discovery") + help="prefixes or glob names for Python test class discovery") parser.addini("python_functions", type="args", default=["test",], - help="prefixes for Python test function and method discovery") + help="prefixes or glob names for Python test function and " + "method discovery") def pytest_cmdline_main(config): if config.option.showfixtures: @@ -307,14 +309,22 @@ class PyCollector(PyobjMixin, pytest.Collector): def funcnamefilter(self, name): - for prefix in self.config.getini("python_functions"): - if name.startswith(prefix): - return True + return self._matches_prefix_or_glob_option('python_functions', name) def classnamefilter(self, name): - for prefix in self.config.getini("python_classes"): - if name.startswith(prefix): + return self._matches_prefix_or_glob_option('python_classes', name) + + def _matches_prefix_or_glob_option(self, option_name, name): + """ + checks if the given name matches the prefix or glob-pattern defined + in ini configuration. + """ + for option in self.config.getini(option_name): + if name.startswith(option): return True + elif fnmatch.fnmatch(name, option): + return True + return False def collect(self): if not getattr(self.obj, "__test__", True): diff -r 4696fc59a5a15f9c79902d34489865bf7f840b6c -r 4fb4cb5ae00f6ca77992b2a566eefb073f299d27 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -115,17 +115,33 @@ .. confval:: python_classes - One or more name prefixes determining which test classes - are considered as test modules. + One or more name prefixes or glob-style patterns determining which classes + are considered for test collection. Here is an example of how to collect + tests from classes that end in ``Suite``:: + + # content of pytest.ini + [pytest] + python_classes = *Suite + + Note that ``unittest.TestCase`` derived classes are always collected + regardless of this option, as ``unittest``'s own collection framework is used + to collect those tests. .. confval:: python_functions - One or more name prefixes determining which test functions - and methods are considered as test modules. Note that this - has no effect on methods that live on a ``unittest.TestCase`` - derived class. + One or more name prefixes or glob-patterns determining which test functions + and methods are considered tests. Here is an example of how + to collect test functions and methods that end in ``_test``:: - See :ref:`change naming conventions` for examples. + # content of pytest.ini + [pytest] + python_functions = *_test + + Note that this has no effect on methods that live on a ``unittest + .TestCase`` derived class, as ``unittest``'s own collection framework is used + to collect those tests. + + See :ref:`change naming conventions` for more detailed examples. .. confval:: doctest_optionflags diff -r 4696fc59a5a15f9c79902d34489865bf7f840b6c -r 4fb4cb5ae00f6ca77992b2a566eefb073f299d27 doc/en/example/pythoncollection.txt --- a/doc/en/example/pythoncollection.txt +++ b/doc/en/example/pythoncollection.txt @@ -26,17 +26,17 @@ [pytest] python_files=check_*.py python_classes=Check - python_functions=check + python_functions=*_check -This would make ``pytest`` look for ``check_`` prefixes in -Python filenames, ``Check`` prefixes in classes and ``check`` prefixes -in functions and classes. For example, if we have:: +This would make ``pytest`` look for tests in files that match the ``check_* +.py`` glob-pattern, ``Check`` prefixes in classes, and functions and methods +that match ``*_check``. For example, if we have:: # content of check_myapp.py class CheckMyApp: - def check_simple(self): + def simple_check(self): pass - def check_complex(self): + def complex_check(self): pass then the test collection looks like this:: @@ -48,14 +48,14 @@ - - + + ============================= in 0.01 seconds ============================= .. note:: - the ``python_functions`` and ``python_classes`` has no effect + the ``python_functions`` and ``python_classes`` options has no effect for ``unittest.TestCase`` test discovery because pytest delegates detection of test case methods to unittest code. diff -r 4696fc59a5a15f9c79902d34489865bf7f840b6c -r 4fb4cb5ae00f6ca77992b2a566eefb073f299d27 testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -528,6 +528,30 @@ assert s.endswith("test_example_items1.testone") print(s) + def test_class_and_functions_discovery_using_glob(self, testdir): + """ + tests that python_classes and python_functions config options work + as prefixes and glob-like patterns (issue #600). + """ + testdir.makeini(""" + [pytest] + python_classes = *Suite Test + python_functions = *_test test + """) + p = testdir.makepyfile(''' + class MyTestSuite: + def x_test(self): + pass + + class TestCase: + def test_y(self): + pass + ''') + items, reprec = testdir.inline_genitems(p) + ids = [x.getmodpath() for x in items] + assert ids == ['MyTestSuite.x_test', 'TestCase.test_y'] + + def test_matchnodes_two_collections_same_file(testdir): testdir.makeconftest(""" import pytest https://bitbucket.org/hpk42/pytest/commits/f975c55d571f/ Changeset: f975c55d571f Branch: python-classes-glob User: nicoddemus Date: 2014-10-20 20:36:31+00:00 Summary: checking that option contains glob characters before calling fnmatch requested during code review Affected #: 1 file diff -r 4fb4cb5ae00f6ca77992b2a566eefb073f299d27 -r f975c55d571f3d08a1e3a02d6b2c13a9f4257d48 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -322,7 +322,11 @@ for option in self.config.getini(option_name): if name.startswith(option): return True - elif fnmatch.fnmatch(name, option): + # check that name looks like a glob-string before calling fnmatch + # because this is called for every name in each collected module, + # and fnmatch is somewhat expensive to call + elif ('*' in option or '?' in option or '[' in option) and \ + fnmatch.fnmatch(name, option): return True return False https://bitbucket.org/hpk42/pytest/commits/447020d27a8e/ Changeset: 447020d27a8e Branch: python-classes-glob User: nicoddemus Date: 2014-10-21 21:22:53+00:00 Summary: added changelog entry about glob-patterns in python_classes and python_functions - also fixed small typo Affected #: 1 file diff -r f975c55d571f3d08a1e3a02d6b2c13a9f4257d48 -r 447020d27a8ef51b4a03b76fab923a0b8c4b2000 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,9 @@ parameter is a callable, you also need to pass in a reason to disambiguate it from the "decorator" case. Thanks Tom Viner. +- "python_classes" and "python_functions" options now support glob-patterns + for test discovery, as discussed in issue600. Thanks Ldiary Translations. + 2.6.4.dev ---------- @@ -86,7 +89,7 @@ Thanks sontek. - Implement issue549: user-provided assertion messages now no longer - replace the py.test instrospection message but are shown in addition + replace the py.test introspection message but are shown in addition to them. 2.6.1 https://bitbucket.org/hpk42/pytest/commits/e9bfc62abed3/ Changeset: e9bfc62abed3 User: hpk42 Date: 2014-10-22 05:14:10+00:00 Summary: Merged in nicoddemus/pytest/python-classes-glob (pull request #225) added support for glob-style patterns to python_classes and python_functions config options Affected #: 5 files diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,9 @@ parameter is a callable, you also need to pass in a reason to disambiguate it from the "decorator" case. Thanks Tom Viner. +- "python_classes" and "python_functions" options now support glob-patterns + for test discovery, as discussed in issue600. Thanks Ldiary Translations. + 2.6.4.dev ---------- @@ -86,7 +89,7 @@ Thanks sontek. - Implement issue549: user-provided assertion messages now no longer - replace the py.test instrospection message but are shown in addition + replace the py.test introspection message but are shown in addition to them. 2.6.1 diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1,4 +1,5 @@ """ Python test discovery, setup and run of test functions. """ +import fnmatch import py import inspect import sys @@ -127,9 +128,10 @@ default=['test_*.py', '*_test.py'], help="glob-style file patterns for Python test module discovery") parser.addini("python_classes", type="args", default=["Test",], - help="prefixes for Python test class discovery") + help="prefixes or glob names for Python test class discovery") parser.addini("python_functions", type="args", default=["test",], - help="prefixes for Python test function and method discovery") + help="prefixes or glob names for Python test function and " + "method discovery") def pytest_cmdline_main(config): if config.option.showfixtures: @@ -307,14 +309,26 @@ class PyCollector(PyobjMixin, pytest.Collector): def funcnamefilter(self, name): - for prefix in self.config.getini("python_functions"): - if name.startswith(prefix): - return True + return self._matches_prefix_or_glob_option('python_functions', name) def classnamefilter(self, name): - for prefix in self.config.getini("python_classes"): - if name.startswith(prefix): + return self._matches_prefix_or_glob_option('python_classes', name) + + def _matches_prefix_or_glob_option(self, option_name, name): + """ + checks if the given name matches the prefix or glob-pattern defined + in ini configuration. + """ + for option in self.config.getini(option_name): + if name.startswith(option): return True + # check that name looks like a glob-string before calling fnmatch + # because this is called for every name in each collected module, + # and fnmatch is somewhat expensive to call + elif ('*' in option or '?' in option or '[' in option) and \ + fnmatch.fnmatch(name, option): + return True + return False def collect(self): if not getattr(self.obj, "__test__", True): diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 doc/en/customize.txt --- a/doc/en/customize.txt +++ b/doc/en/customize.txt @@ -115,17 +115,33 @@ .. confval:: python_classes - One or more name prefixes determining which test classes - are considered as test modules. + One or more name prefixes or glob-style patterns determining which classes + are considered for test collection. Here is an example of how to collect + tests from classes that end in ``Suite``:: + + # content of pytest.ini + [pytest] + python_classes = *Suite + + Note that ``unittest.TestCase`` derived classes are always collected + regardless of this option, as ``unittest``'s own collection framework is used + to collect those tests. .. confval:: python_functions - One or more name prefixes determining which test functions - and methods are considered as test modules. Note that this - has no effect on methods that live on a ``unittest.TestCase`` - derived class. + One or more name prefixes or glob-patterns determining which test functions + and methods are considered tests. Here is an example of how + to collect test functions and methods that end in ``_test``:: - See :ref:`change naming conventions` for examples. + # content of pytest.ini + [pytest] + python_functions = *_test + + Note that this has no effect on methods that live on a ``unittest + .TestCase`` derived class, as ``unittest``'s own collection framework is used + to collect those tests. + + See :ref:`change naming conventions` for more detailed examples. .. confval:: doctest_optionflags diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 doc/en/example/pythoncollection.txt --- a/doc/en/example/pythoncollection.txt +++ b/doc/en/example/pythoncollection.txt @@ -26,17 +26,17 @@ [pytest] python_files=check_*.py python_classes=Check - python_functions=check + python_functions=*_check -This would make ``pytest`` look for ``check_`` prefixes in -Python filenames, ``Check`` prefixes in classes and ``check`` prefixes -in functions and classes. For example, if we have:: +This would make ``pytest`` look for tests in files that match the ``check_* +.py`` glob-pattern, ``Check`` prefixes in classes, and functions and methods +that match ``*_check``. For example, if we have:: # content of check_myapp.py class CheckMyApp: - def check_simple(self): + def simple_check(self): pass - def check_complex(self): + def complex_check(self): pass then the test collection looks like this:: @@ -48,14 +48,14 @@ - - + + ============================= in 0.01 seconds ============================= .. note:: - the ``python_functions`` and ``python_classes`` has no effect + the ``python_functions`` and ``python_classes`` options has no effect for ``unittest.TestCase`` test discovery because pytest delegates detection of test case methods to unittest code. diff -r 78def8dd5c941ec312994f87fd31f8a422943879 -r e9bfc62abed3c6151cd6978167377f4bb1566802 testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -528,6 +528,30 @@ assert s.endswith("test_example_items1.testone") print(s) + def test_class_and_functions_discovery_using_glob(self, testdir): + """ + tests that python_classes and python_functions config options work + as prefixes and glob-like patterns (issue #600). + """ + testdir.makeini(""" + [pytest] + python_classes = *Suite Test + python_functions = *_test test + """) + p = testdir.makepyfile(''' + class MyTestSuite: + def x_test(self): + pass + + class TestCase: + def test_y(self): + pass + ''') + items, reprec = testdir.inline_genitems(p) + ids = [x.getmodpath() for x in items] + assert ids == ['MyTestSuite.x_test', 'TestCase.test_y'] + + def test_matchnodes_two_collections_same_file(testdir): testdir.makeconftest(""" import pytest Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Wed Oct 22 07:20:21 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 22 Oct 2014 05:20:21 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 361 Message-ID: <20141022052008.122967.76244@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/361 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3906:e9bfc62abed3 Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest/python-classes-glob (pull request #225) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Wed Oct 22 07:27:03 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 22 Oct 2014 05:27:03 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 362 Message-ID: <20141022052701.65458.70552@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/362 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3906:e9bfc62abed3 Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest/python-classes-glob (pull request #225) -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Wed Oct 22 10:03:51 2014 From: issues-reply at bitbucket.org (Dinu Gherman) Date: Wed, 22 Oct 2014 08:03:51 -0000 Subject: [Pytest-commit] Issue #618: Generating runtests.py for Python 2.6 is failing althout argparse exists (hpk42/pytest) Message-ID: <20141022080351.4339.7340@app06.ash-private.bitbucket.org> New issue 618: Generating runtests.py for Python 2.6 is failing althout argparse exists https://bitbucket.org/hpk42/pytest/issue/618/generating-runtestspy-for-python-26-is Dinu Gherman: Using py.test 2.6.3 I try the follwowing in order to generate a `runtests.py` file as described on http://pytest.org/latest/goodpractises.html?highlight=test_suite, but the `argparse` package cannot be found although it is installed. ``` #!bash $ py.test-2.7 --genscript=runtests.py WARNING: generated script will not run on python2.6 due to 'argparse' dependency. Use python2.6 to generate a python2.6 compatible script generated pytest standalone script: /Users/dinu/myproject/runtests.py $ py.test-2.6 --genscript=runtests.py generated script will run on python2.6-python3.3++ Traceback (most recent call last): File "/opt/bin/py.test-2.6", line 8, in load_entry_point('pytest==2.6.3', 'console_scripts', 'py.test-2.6')() File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/config.py", line 41, in main return config.hook.pytest_cmdline_main(config=config) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/core.py", line 413, in __call__ return self._docall(methods, kwargs) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/core.py", line 424, in _docall res = mc.execute() File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/core.py", line 315, in execute res = method(**kwargs) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/genscript.py", line 82, in pytest_cmdline_main deps, File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/genscript.py", line 54, in generate_script data = compress_packages(packages) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/genscript.py", line 50, in compress_packages mapping.update(pkg_to_mapping(name)) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/genscript.py", line 28, in pkg_to_mapping toplevel = find_toplevel(name) File "/opt/lib/python2.6/site-packages/pytest-2.6.3-py2.6.egg/_pytest/genscript.py", line 21, in find_toplevel raise LookupError(name) LookupError: argparse $ python2.6 -m argparse $ ``` From commits-noreply at bitbucket.org Thu Oct 23 00:23:17 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Wed, 22 Oct 2014 22:23:17 -0000 Subject: [Pytest-commit] commit/pytest: 7 new changesets Message-ID: <20141022222317.17103.98935@app09.ash-private.bitbucket.org> 7 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/6845bca4e5ee/ Changeset: 6845bca4e5ee Branch: issue351 User: pfctdayelise Date: 2014-04-17 19:08:49+00:00 Summary: issue351: Add ability to specify parametrize ids as a callable, to generate custom test ids. + tests, docs Affected #: 3 files diff -r 229f3213f7a629f547e6b89a20263a41611807a1 -r 6845bca4e5eea15fbfe186e465e0dcb8f249c964 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -771,9 +771,14 @@ function so that it can perform more expensive setups during the setup phase of a test rather than at collection time. - :arg ids: list of string ids each corresponding to the argvalues so - that they are part of the test id. If no ids are provided they will - be generated automatically from the argvalues. + :arg ids: list of string ids, or a callable. + If strings, each is corresponding to the argvalues so that they are + part of the test id. + If callable, it should take one argument (a single argvalue) and return + a string or return None. If None, the automatically generated id for that + argument will be used. + If no ids are provided they will be generated automatically from + the argvalues. :arg scope: if specified it denotes the scope of the parameters. The scope is used for grouping tests by parameter instances. @@ -813,11 +818,15 @@ raise ValueError("%r uses no fixture %r" %( self.function, arg)) valtype = indirect and "params" or "funcargs" + idfn = None + if callable(ids): + idfn = ids + ids = None if ids and len(ids) != len(argvalues): raise ValueError('%d tests specified with %d ids' %( len(argvalues), len(ids))) if not ids: - ids = idmaker(argnames, argvalues) + ids = idmaker(argnames, argvalues, idfn) newcalls = [] for callspec in self._calls or [CallSpec2(self)]: for param_index, valset in enumerate(argvalues): @@ -865,17 +874,31 @@ cs.setall(funcargs, id, param) self._calls.append(cs) -def idmaker(argnames, argvalues): - idlist = [] - for valindex, valset in enumerate(argvalues): - this_id = [] - for nameindex, val in enumerate(valset): - if not isinstance(val, (float, int, str, bool, NoneType)): - this_id.append(str(argnames[nameindex])+str(valindex)) - else: - this_id.append(str(val)) - idlist.append("-".join(this_id)) - return idlist + +def _idval(val, argname, idx, idfn): + if idfn: + try: + s = idfn(val) + if s: + return s + except Exception: + pass + if isinstance(val, (float, int, str, bool, NoneType)): + return str(val) + return str(argname)+str(idx) + +def _idvalset(idx, valset, argnames, idfn): + this_id = [_idval(val, argname, idx, idfn) + for val, argname in zip(valset, argnames)] + return "-".join(this_id) + +def idmaker(argnames, argvalues, idfn=None): + ids = [_idvalset(valindex, valset, argnames, idfn) + for valindex, valset in enumerate(argvalues)] + if len(set(ids)) < len(ids): + # the user may have provided a bad idfn which means the ids are not unique + ids = ["{}".format(i) + testid for i, testid in enumerate(ids)] + return ids def showfixtures(config): from _pytest.main import wrap_session diff -r 229f3213f7a629f547e6b89a20263a41611807a1 -r 6845bca4e5eea15fbfe186e465e0dcb8f249c964 doc/en/example/parametrize.txt --- a/doc/en/example/parametrize.txt +++ b/doc/en/example/parametrize.txt @@ -68,6 +68,81 @@ As expected when running the full range of ``param1`` values we'll get an error on the last one. + +Different options for test IDs +------------------------------------ + +pytest will build a string that is the test ID for each set of values in a +parametrized test. These IDs can be used with "-k" to select specific cases +to run, and they will also identify the specific case when one is failing. +Running pytest with --collect-only will show the generated IDs. + +Numbers, strings, booleans and None will have their usual string representation +used in the test ID. For other objects, pytest will make a string based on +the argument name:: + + # contents of test_time.py + + from datetime import datetime, timedelta + + testdata = [(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)), + (datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)), + ] + + + @pytest.mark.parametrize("a,b,expected", testdata) + def test_timedistance_v0(a, b, expected): + diff = a - b + assert diff == expected + + + @pytest.mark.parametrize("a,b,expected", testdata, ids=["forward", "backward"]) + def test_timedistance_v1(a, b, expected): + diff = a - b + assert diff == expected + + + def idfn(val): + if isinstance(val, (datetime,)): + # note this wouldn't show any hours/minutes/seconds + return val.strftime('%Y%m%d') + + + @pytest.mark.parametrize("a,b,expected", testdata, ids=idfn) + def test_timedistance_v2(a, b, expected): + diff = a - b + assert diff == expected + + +In ``test_timedistance_v0``, we let pytest generate the test IDs. + +In ``test_timedistance_v1``, we specified ``ids`` as a list of strings which were +used as the test IDs. These are succinct, but can be a pain to maintain. + +In ``test_timedistance_v2``, we specified ``ids`` as a function that can generate a +string representation to make part of the test ID. So our ``datetime`` values use the +label generated by ``idfn``, but because we didn't generate a label for ``timedelta`` +objects, they are still using the default pytest representation:: + + + $ py.test test_time.py --collect-only + ============================ test session starts ============================= + platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.6.0.dev1 + plugins: cache + collected 6 items + + + + + + + + + ============================== in 0.04 seconds =============================== + + + + A quick port of "testscenarios" ------------------------------------ diff -r 229f3213f7a629f547e6b89a20263a41611807a1 -r 6845bca4e5eea15fbfe186e465e0dcb8f249c964 testing/python/metafunc.py --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -151,6 +151,52 @@ "a6-b6", "a7-b7"] + @pytest.mark.issue351 + def test_idmaker_idfn(self): + from _pytest.python import idmaker + def ids(val): + if isinstance(val, Exception): + return repr(val) + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["10.0-IndexError()", + "20-KeyError()", + "three-b2", + ] + + @pytest.mark.issue351 + def test_idmaker_idfn_unique_names(self): + from _pytest.python import idmaker + def ids(val): + return 'a' + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["0a-a", + "1a-a", + "2a-a", + ] + + @pytest.mark.issue351 + def test_idmaker_idfn_exception(self): + from _pytest.python import idmaker + def ids(val): + raise Exception("bad code") + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["10.0-b0", + "20-b1", + "three-b2", + ] + def test_addcall_and_parametrize(self): def func(x, y): pass metafunc = self.Metafunc(func) https://bitbucket.org/hpk42/pytest/commits/899b817f5de1/ Changeset: 899b817f5de1 Branch: issue351 User: flub Date: 2014-10-07 23:11:32+00:00 Summary: Functional tests for id function Affected #: 1 file diff -r 6845bca4e5eea15fbfe186e465e0dcb8f249c964 -r 899b817f5de1f119c1c8d7d38028447a442d3f50 testing/python/integration.py --- a/testing/python/integration.py +++ b/testing/python/integration.py @@ -262,5 +262,58 @@ call = reprec.getcalls("pytest_collection_modifyitems")[0] assert len(call.items) == 1 assert call.items[0].cls.__name__ == "TC" - + + at pytest.mark.issue351 +class TestParameterize: + + def test_idfn_marker(self, testdir): + testdir.makepyfile(""" + import pytest + + def idfn(param): + if param == 0: + return 'spam' + elif param == 1: + return 'ham' + else: + return None + + @pytest.mark.parametrize('a,b', [(0, 2), (1, 2)], ids=idfn) + def test_params(a, b): + pass + """) + res = testdir.runpytest('--collect-only') + res.stdout.fnmatch_lines([ + "*spam-2*", + "*ham-2*", + ]) + + def test_idfn_fixture(self, testdir): + testdir.makepyfile(""" + import pytest + + def idfn(param): + if param == 0: + return 'spam' + elif param == 1: + return 'ham' + else: + return None + + @pytest.fixture(params=[0, 1], ids=idfn) + def a(request): + return request.param + + @pytest.fixture(params=[1, 2], ids=idfn) + def b(request): + return request.param + + def test_params(a, b): + pass + """) + res = testdir.runpytest('--collect-only') + res.stdout.fnmatch_lines([ + "*spam-2*", + "*ham-2*", + ]) https://bitbucket.org/hpk42/pytest/commits/27d71618e41a/ Changeset: 27d71618e41a Branch: issue351 User: flub Date: 2014-10-07 23:43:27+00:00 Summary: Document the ids keyword for fixture parametrisation Affected #: 2 files diff -r 899b817f5de1f119c1c8d7d38028447a442d3f50 -r 27d71618e41af0a36f9aaffbe169a7f7bbe4bc1e doc/en/example/parametrize.txt --- a/doc/en/example/parametrize.txt +++ b/doc/en/example/parametrize.txt @@ -73,9 +73,9 @@ ------------------------------------ pytest will build a string that is the test ID for each set of values in a -parametrized test. These IDs can be used with "-k" to select specific cases +parametrized test. These IDs can be used with ``-k`` to select specific cases to run, and they will also identify the specific case when one is failing. -Running pytest with --collect-only will show the generated IDs. +Running pytest with ``--collect-only`` will show the generated IDs. Numbers, strings, booleans and None will have their usual string representation used in the test ID. For other objects, pytest will make a string based on diff -r 899b817f5de1f119c1c8d7d38028447a442d3f50 -r 27d71618e41af0a36f9aaffbe169a7f7bbe4bc1e doc/en/fixture.txt --- a/doc/en/fixture.txt +++ b/doc/en/fixture.txt @@ -431,6 +431,61 @@ connection the second test fails in ``test_ehlo`` because a different server string is expected than what arrived. +pytest will build a string that is the test ID for each fixture value +in a parametrized fixture, e.g. ``test_ehlo[merlinux.eu]`` and +``test_ehlo[mail.python.org]`` in the above examples. These IDs can +be used with ``-k`` to select specific cases to run, and they will +also identify the specific case when one is failing. Running pytest +with ``--collect-only`` will show the generated IDs. + +Numbers, strings, booleans and None will have their usual string +representation used in the test ID. For other objects, pytest will +make a string based on the argument name. It is possible to customise +the string used in a test ID for a certain fixture value by using the +``ids`` keyword argument:: + + import pytest + + @pytest.fixture(params=[0, 1], ids=["spam", "ham"]) + def a(request): + return request.param + + def test_a(a): + pass + + def idfn(fixture_value): + if fixture_value == 0: + return "eggs" + else: + return None + + @pytest.fixture(params=[0, 1], ids=idfn) + def b(request): + return request.param + + def test_b(b): + pass + +The above shows how ``ids`` can be either a list of strings to use or +a function which will be called with the fixture value and then +has to return a string to use. In the latter case if the function +return ``None`` then pytest's auto-generated ID will be used. + +Running the above tests results in the following test IDs being used:: + + $ py.test --collect-only + ========================== test session starts ========================== + platform linux2 -- Python 2.7.6 -- py-1.4.25.dev2 -- pytest-2.6.0.dev1 + plugins: xdist + collected 4 items + + + + + + + =========================== in 0.05 seconds ============================ + .. _`interdependent fixtures`: https://bitbucket.org/hpk42/pytest/commits/c710cf744edc/ Changeset: c710cf744edc User: flub Date: 2014-10-22 22:18:01+00:00 Summary: Merged in pfctdayelise/pytest/issue351 (pull request #161) Fixes issue351: Add ability to specify parametrize ids as a callable, to generate custom test ids. + tests, docs Hg branch merge Affected #: 5 files diff -r e9bfc62abed3c6151cd6978167377f4bb1566802 -r c710cf744edc7053cae1c5a08903d15df5e82679 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -798,9 +798,14 @@ function so that it can perform more expensive setups during the setup phase of a test rather than at collection time. - :arg ids: list of string ids each corresponding to the argvalues so - that they are part of the test id. If no ids are provided they will - be generated automatically from the argvalues. + :arg ids: list of string ids, or a callable. + If strings, each is corresponding to the argvalues so that they are + part of the test id. + If callable, it should take one argument (a single argvalue) and return + a string or return None. If None, the automatically generated id for that + argument will be used. + If no ids are provided they will be generated automatically from + the argvalues. :arg scope: if specified it denotes the scope of the parameters. The scope is used for grouping tests by parameter instances. @@ -840,11 +845,15 @@ raise ValueError("%r uses no fixture %r" %( self.function, arg)) valtype = indirect and "params" or "funcargs" + idfn = None + if callable(ids): + idfn = ids + ids = None if ids and len(ids) != len(argvalues): raise ValueError('%d tests specified with %d ids' %( len(argvalues), len(ids))) if not ids: - ids = idmaker(argnames, argvalues) + ids = idmaker(argnames, argvalues, idfn) newcalls = [] for callspec in self._calls or [CallSpec2(self)]: for param_index, valset in enumerate(argvalues): @@ -892,17 +901,31 @@ cs.setall(funcargs, id, param) self._calls.append(cs) -def idmaker(argnames, argvalues): - idlist = [] - for valindex, valset in enumerate(argvalues): - this_id = [] - for nameindex, val in enumerate(valset): - if not isinstance(val, (float, int, str, bool, NoneType)): - this_id.append(str(argnames[nameindex])+str(valindex)) - else: - this_id.append(str(val)) - idlist.append("-".join(this_id)) - return idlist + +def _idval(val, argname, idx, idfn): + if idfn: + try: + s = idfn(val) + if s: + return s + except Exception: + pass + if isinstance(val, (float, int, str, bool, NoneType)): + return str(val) + return str(argname)+str(idx) + +def _idvalset(idx, valset, argnames, idfn): + this_id = [_idval(val, argname, idx, idfn) + for val, argname in zip(valset, argnames)] + return "-".join(this_id) + +def idmaker(argnames, argvalues, idfn=None): + ids = [_idvalset(valindex, valset, argnames, idfn) + for valindex, valset in enumerate(argvalues)] + if len(set(ids)) < len(ids): + # the user may have provided a bad idfn which means the ids are not unique + ids = ["{}".format(i) + testid for i, testid in enumerate(ids)] + return ids def showfixtures(config): from _pytest.main import wrap_session diff -r e9bfc62abed3c6151cd6978167377f4bb1566802 -r c710cf744edc7053cae1c5a08903d15df5e82679 doc/en/example/parametrize.txt --- a/doc/en/example/parametrize.txt +++ b/doc/en/example/parametrize.txt @@ -68,6 +68,81 @@ As expected when running the full range of ``param1`` values we'll get an error on the last one. + +Different options for test IDs +------------------------------------ + +pytest will build a string that is the test ID for each set of values in a +parametrized test. These IDs can be used with ``-k`` to select specific cases +to run, and they will also identify the specific case when one is failing. +Running pytest with ``--collect-only`` will show the generated IDs. + +Numbers, strings, booleans and None will have their usual string representation +used in the test ID. For other objects, pytest will make a string based on +the argument name:: + + # contents of test_time.py + + from datetime import datetime, timedelta + + testdata = [(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)), + (datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)), + ] + + + @pytest.mark.parametrize("a,b,expected", testdata) + def test_timedistance_v0(a, b, expected): + diff = a - b + assert diff == expected + + + @pytest.mark.parametrize("a,b,expected", testdata, ids=["forward", "backward"]) + def test_timedistance_v1(a, b, expected): + diff = a - b + assert diff == expected + + + def idfn(val): + if isinstance(val, (datetime,)): + # note this wouldn't show any hours/minutes/seconds + return val.strftime('%Y%m%d') + + + @pytest.mark.parametrize("a,b,expected", testdata, ids=idfn) + def test_timedistance_v2(a, b, expected): + diff = a - b + assert diff == expected + + +In ``test_timedistance_v0``, we let pytest generate the test IDs. + +In ``test_timedistance_v1``, we specified ``ids`` as a list of strings which were +used as the test IDs. These are succinct, but can be a pain to maintain. + +In ``test_timedistance_v2``, we specified ``ids`` as a function that can generate a +string representation to make part of the test ID. So our ``datetime`` values use the +label generated by ``idfn``, but because we didn't generate a label for ``timedelta`` +objects, they are still using the default pytest representation:: + + + $ py.test test_time.py --collect-only + ============================ test session starts ============================= + platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.6.0.dev1 + plugins: cache + collected 6 items + + + + + + + + + ============================== in 0.04 seconds =============================== + + + + A quick port of "testscenarios" ------------------------------------ diff -r e9bfc62abed3c6151cd6978167377f4bb1566802 -r c710cf744edc7053cae1c5a08903d15df5e82679 doc/en/fixture.txt --- a/doc/en/fixture.txt +++ b/doc/en/fixture.txt @@ -429,6 +429,61 @@ connection the second test fails in ``test_ehlo`` because a different server string is expected than what arrived. +pytest will build a string that is the test ID for each fixture value +in a parametrized fixture, e.g. ``test_ehlo[merlinux.eu]`` and +``test_ehlo[mail.python.org]`` in the above examples. These IDs can +be used with ``-k`` to select specific cases to run, and they will +also identify the specific case when one is failing. Running pytest +with ``--collect-only`` will show the generated IDs. + +Numbers, strings, booleans and None will have their usual string +representation used in the test ID. For other objects, pytest will +make a string based on the argument name. It is possible to customise +the string used in a test ID for a certain fixture value by using the +``ids`` keyword argument:: + + import pytest + + @pytest.fixture(params=[0, 1], ids=["spam", "ham"]) + def a(request): + return request.param + + def test_a(a): + pass + + def idfn(fixture_value): + if fixture_value == 0: + return "eggs" + else: + return None + + @pytest.fixture(params=[0, 1], ids=idfn) + def b(request): + return request.param + + def test_b(b): + pass + +The above shows how ``ids`` can be either a list of strings to use or +a function which will be called with the fixture value and then +has to return a string to use. In the latter case if the function +return ``None`` then pytest's auto-generated ID will be used. + +Running the above tests results in the following test IDs being used:: + + $ py.test --collect-only + ========================== test session starts ========================== + platform linux2 -- Python 2.7.6 -- py-1.4.25.dev2 -- pytest-2.6.0.dev1 + plugins: xdist + collected 4 items + + + + + + + =========================== in 0.05 seconds ============================ + .. _`interdependent fixtures`: diff -r e9bfc62abed3c6151cd6978167377f4bb1566802 -r c710cf744edc7053cae1c5a08903d15df5e82679 testing/python/integration.py --- a/testing/python/integration.py +++ b/testing/python/integration.py @@ -282,5 +282,58 @@ call = reprec.getcalls("pytest_collection_modifyitems")[0] assert len(call.items) == 1 assert call.items[0].cls.__name__ == "TC" - + + at pytest.mark.issue351 +class TestParameterize: + + def test_idfn_marker(self, testdir): + testdir.makepyfile(""" + import pytest + + def idfn(param): + if param == 0: + return 'spam' + elif param == 1: + return 'ham' + else: + return None + + @pytest.mark.parametrize('a,b', [(0, 2), (1, 2)], ids=idfn) + def test_params(a, b): + pass + """) + res = testdir.runpytest('--collect-only') + res.stdout.fnmatch_lines([ + "*spam-2*", + "*ham-2*", + ]) + + def test_idfn_fixture(self, testdir): + testdir.makepyfile(""" + import pytest + + def idfn(param): + if param == 0: + return 'spam' + elif param == 1: + return 'ham' + else: + return None + + @pytest.fixture(params=[0, 1], ids=idfn) + def a(request): + return request.param + + @pytest.fixture(params=[1, 2], ids=idfn) + def b(request): + return request.param + + def test_params(a, b): + pass + """) + res = testdir.runpytest('--collect-only') + res.stdout.fnmatch_lines([ + "*spam-2*", + "*ham-2*", + ]) diff -r e9bfc62abed3c6151cd6978167377f4bb1566802 -r c710cf744edc7053cae1c5a08903d15df5e82679 testing/python/metafunc.py --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -151,6 +151,52 @@ "a6-b6", "a7-b7"] + @pytest.mark.issue351 + def test_idmaker_idfn(self): + from _pytest.python import idmaker + def ids(val): + if isinstance(val, Exception): + return repr(val) + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["10.0-IndexError()", + "20-KeyError()", + "three-b2", + ] + + @pytest.mark.issue351 + def test_idmaker_idfn_unique_names(self): + from _pytest.python import idmaker + def ids(val): + return 'a' + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["0a-a", + "1a-a", + "2a-a", + ] + + @pytest.mark.issue351 + def test_idmaker_idfn_exception(self): + from _pytest.python import idmaker + def ids(val): + raise Exception("bad code") + + result = idmaker(("a", "b"), [(10.0, IndexError()), + (20, KeyError()), + ("three", [1, 2, 3]), + ], idfn=ids) + assert result == ["10.0-b0", + "20-b1", + "three-b2", + ] + def test_addcall_and_parametrize(self): def func(x, y): pass metafunc = self.Metafunc(func) https://bitbucket.org/hpk42/pytest/commits/3b0a3f176786/ Changeset: 3b0a3f176786 User: flub Date: 2014-10-22 22:20:27+00:00 Summary: Mention issue351/PR161 in changelog Affected #: 1 file diff -r c710cf744edc7053cae1c5a08903d15df5e82679 -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,10 @@ 2.7.0.dev ---------- +- implement issue351: add ability to specify parametrize ids as a callable + to generate custom test ids. Thanks Brianna Laugher for the idea and + implementation. + - introduce and document new hookwrapper mechanism useful for plugins which want to wrap the execution of certain hooks for their purposes. This supersedes the undocumented ``__multicall__`` protocol which https://bitbucket.org/hpk42/pytest/commits/0baa494c9d7a/ Changeset: 0baa494c9d7a Branch: issue351 User: flub Date: 2014-10-22 22:21:42+00:00 Summary: closing branch Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/7f1df35743c6/ Changeset: 7f1df35743c6 Branch: python-classes-glob User: flub Date: 2014-10-22 22:21:58+00:00 Summary: closing branch Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Thu Oct 23 00:23:36 2014 From: builds at drone.io (Drone.io Build) Date: Wed, 22 Oct 2014 22:23:36 +0000 Subject: [Pytest-commit] [FAIL] pytest - # 363 Message-ID: <20141022222334.82098.76722@drone.io> Build Failed Build : https://drone.io/bitbucket.org/hpk42/pytest/363 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3811:7f1df35743c6 Author : Floris Bruynooghe Branch : python-classes-glob Message: closing branch -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Thu Oct 23 02:10:14 2014 From: issues-reply at bitbucket.org (Alex Gaynor) Date: Thu, 23 Oct 2014 00:10:14 -0000 Subject: [Pytest-commit] Issue #619: Very large test suites take *far* too much RAM (hpk42/pytest) Message-ID: <20141023001014.16048.35774@app11.ash-private.bitbucket.org> New issue 619: Very large test suites take *far* too much RAM https://bitbucket.org/hpk42/pytest/issue/619/very-large-test-suites-take-far-too-much Alex Gaynor: The cryptography test suite on OS X -- which is 149150 test functions (almost entirely generated with `@pytest.mark.parametrize`) -- results in a CPython 2.7 process which, after collection, takes 1.26GB or so. This is about 8KB per test. This seems like *way* too much, it would be fantastic to bring this significantly down. From commits-noreply at bitbucket.org Thu Oct 23 09:08:35 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 23 Oct 2014 07:08:35 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in nicoddemus/pytest/fix-pastebin (pull request #228) Message-ID: <20141023070835.9702.23085@app08.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/d6a644c4399a/ Changeset: d6a644c4399a User: hpk42 Date: 2014-10-23 07:08:30+00:00 Summary: Merged in nicoddemus/pytest/fix-pastebin (pull request #228) Fix --pastebin option Affected #: 3 files diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,9 @@ - "python_classes" and "python_functions" options now support glob-patterns for test discovery, as discussed in issue600. Thanks Ldiary Translations. +- fix issue614: fixed pastebin support. + + 2.6.4.dev ---------- diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc _pytest/pastebin.py --- a/_pytest/pastebin.py +++ b/_pytest/pastebin.py @@ -3,10 +3,6 @@ import py, sys import tempfile -class url: - base = "http://bpaste.net" - xmlrpc = base + "/xmlrpc/" - show = base + "/show/" def pytest_addoption(parser): group = parser.getgroup("terminal reporting") @@ -28,22 +24,45 @@ def pytest_unconfigure(config): if hasattr(config, '_pastebinfile'): + # get terminal contents and delete file config._pastebinfile.seek(0) sessionlog = config._pastebinfile.read() config._pastebinfile.close() del config._pastebinfile - proxyid = getproxy().newPaste("python", sessionlog) - pastebinurl = "%s%s" % (url.show, proxyid) - sys.stderr.write("pastebin session-log: %s\n" % pastebinurl) + # undo our patching in the terminal reporter tr = config.pluginmanager.getplugin('terminalreporter') del tr._tw.__dict__['write'] + # write summary + tr.write_sep("=", "Sending information to Paste Service") + pastebinurl = create_new_paste(sessionlog) + tr.write_line("pastebin session-log: %s\n" % pastebinurl) -def getproxy(): +def create_new_paste(contents): + """ + Creates a new paste using bpaste.net service. + + :contents: paste contents + :returns: url to the pasted contents + """ + import re if sys.version_info < (3, 0): - from xmlrpclib import ServerProxy + from urllib import urlopen, urlencode else: - from xmlrpc.client import ServerProxy - return ServerProxy(url.xmlrpc).pastes + from urllib.request import urlopen + from urllib.parse import urlencode + + params = { + 'code': contents, + 'lexer': 'python3' if sys.version_info[0] == 3 else 'python', + 'expiry': '1week', + } + url = 'https://bpaste.net' + response = urlopen(url, data=urlencode(params)).read() + m = re.search(r'href="/raw/(\w+)"', response) + if m: + return '%s/show/%s' % (url, m.group(1)) + else: + return 'bad response: ' + response def pytest_terminal_summary(terminalreporter): if terminalreporter.config.option.pastebin != "failed": @@ -51,9 +70,6 @@ tr = terminalreporter if 'failed' in tr.stats: terminalreporter.write_sep("=", "Sending information to Paste Service") - if tr.config.option.debug: - terminalreporter.write_line("xmlrpcurl: %s" %(url.xmlrpc,)) - serverproxy = getproxy() for rep in terminalreporter.stats.get('failed'): try: msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc @@ -63,6 +79,5 @@ rep.toterminal(tw) s = tw.stringio.getvalue() assert len(s) - proxyid = serverproxy.newPaste("python", s) - pastebinurl = "%s%s" % (url.show, proxyid) + pastebinurl = create_new_paste(s) tr.write_line("%s --> %s" %(msg, pastebinurl)) diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc testing/test_pastebin.py --- a/testing/test_pastebin.py +++ b/testing/test_pastebin.py @@ -1,13 +1,13 @@ +import sys +import pytest class TestPasting: - def pytest_funcarg__pastebinlist(self, request): - mp = request.getfuncargvalue("monkeypatch") + + @pytest.fixture + def pastebinlist(self, monkeypatch, request): pastebinlist = [] - class MockProxy: - def newPaste(self, language, code): - pastebinlist.append((language, code)) plugin = request.config.pluginmanager.getplugin('pastebin') - mp.setattr(plugin, 'getproxy', MockProxy) + monkeypatch.setattr(plugin, 'create_new_paste', pastebinlist.append) return pastebinlist def test_failed(self, testdir, pastebinlist): @@ -22,8 +22,7 @@ """) reprec = testdir.inline_run(testpath, "--paste=failed") assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] + s = pastebinlist[0] assert s.find("def test_fail") != -1 assert reprec.countoutcomes() == [1,1,1] @@ -37,22 +36,52 @@ def test_skip(): pytest.skip("") """) - reprec = testdir.inline_run(testpath, "--pastebin=all") + reprec = testdir.inline_run(testpath, "--pastebin=all", '-v') assert reprec.countoutcomes() == [1,1,1] assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] - for x in 'test_fail test_skip skipped'.split(): - assert s.find(x), (s, x) + s = pastebinlist[0] + for x in 'test_fail test_skip test_pass'.split(): + assert x in s -class TestRPCClient: - def pytest_funcarg__pastebin(self, request): +class TestPaste: + + @pytest.fixture + def pastebin(self, request): return request.config.pluginmanager.getplugin('pastebin') - def test_getproxy(self, pastebin): - proxy = pastebin.getproxy() - assert proxy is not None - assert proxy.__class__.__module__.startswith('xmlrpc') + @pytest.fixture + def mocked_urlopen(self, monkeypatch): + """ + monkeypatch the actual urlopen calls done by the internal plugin + function that connects to bpaste service. + """ + calls = [] + def mocked(url, data): + calls.append((url, data)) + class DummyFile: + def read(self): + # part of html of a normal response + return 'View raw.' + return DummyFile() + if sys.version_info < (3, 0): + import urllib + monkeypatch.setattr(urllib, 'urlopen', mocked) + else: + import urllib.request + monkeypatch.setattr(urllib.request, 'urlopen', mocked) + return calls + def test_create_new_paste(self, pastebin, mocked_urlopen): + result = pastebin.create_new_paste('full-paste-contents') + assert result == 'https://bpaste.net/show/3c0c6750bd' + assert len(mocked_urlopen) == 1 + url, data = mocked_urlopen[0] + lexer = 'python3' if sys.version_info[0] == 3 else 'python' + assert url == 'https://bpaste.net' + assert 'lexer=%s' % lexer in data + assert 'code=full-paste-contents' in data + assert 'expiry=1week' in data + + Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Thu Oct 23 09:08:35 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 23 Oct 2014 07:08:35 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141023070835.32031.19147@app13.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/5f75f34c3ef7/ Changeset: 5f75f34c3ef7 Branch: fix-pastebin User: nicoddemus Date: 2014-10-22 23:52:40+00:00 Summary: Fixing --pastebin option by using a POST request instead of a XMLRPC call fixes #614 Affected #: 3 files diff -r 7f1df35743c6fcd112d839efaf705d5f34d78dc2 -r 5f75f34c3ef75674994c6111fe4b8728e2709ce8 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -19,6 +19,9 @@ - "python_classes" and "python_functions" options now support glob-patterns for test discovery, as discussed in issue600. Thanks Ldiary Translations. +- fix issue614: fixed pastebin support. + + 2.6.4.dev ---------- diff -r 7f1df35743c6fcd112d839efaf705d5f34d78dc2 -r 5f75f34c3ef75674994c6111fe4b8728e2709ce8 _pytest/pastebin.py --- a/_pytest/pastebin.py +++ b/_pytest/pastebin.py @@ -3,10 +3,6 @@ import py, sys import tempfile -class url: - base = "http://bpaste.net" - xmlrpc = base + "/xmlrpc/" - show = base + "/show/" def pytest_addoption(parser): group = parser.getgroup("terminal reporting") @@ -28,22 +24,45 @@ def pytest_unconfigure(config): if hasattr(config, '_pastebinfile'): + # get terminal contents and delete file config._pastebinfile.seek(0) sessionlog = config._pastebinfile.read() config._pastebinfile.close() del config._pastebinfile - proxyid = getproxy().newPaste("python", sessionlog) - pastebinurl = "%s%s" % (url.show, proxyid) - sys.stderr.write("pastebin session-log: %s\n" % pastebinurl) + # undo our patching in the terminal reporter tr = config.pluginmanager.getplugin('terminalreporter') del tr._tw.__dict__['write'] + # write summary + tr.write_sep("=", "Sending information to Paste Service") + pastebinurl = create_new_paste(sessionlog) + tr.write_line("pastebin session-log: %s\n" % pastebinurl) -def getproxy(): +def create_new_paste(contents): + """ + Creates a new paste using bpaste.net service. + + :contents: paste contents + :returns: url to the pasted contents + """ + import re if sys.version_info < (3, 0): - from xmlrpclib import ServerProxy + from urllib import urlopen, urlencode else: - from xmlrpc.client import ServerProxy - return ServerProxy(url.xmlrpc).pastes + from urllib.request import urlopen + from urllib.parse import urlencode + + params = { + 'code': contents, + 'lexer': 'python3' if sys.version_info[0] == 3 else 'python', + 'expiry': '1week', + } + url = 'https://bpaste.net' + response = urlopen(url, data=urlencode(params)).read() + m = re.search(r'href="/raw/(\w+)"', response) + if m: + return '%s/show/%s' % (url, m.group(1)) + else: + return 'bad response: ' + response def pytest_terminal_summary(terminalreporter): if terminalreporter.config.option.pastebin != "failed": @@ -51,9 +70,6 @@ tr = terminalreporter if 'failed' in tr.stats: terminalreporter.write_sep("=", "Sending information to Paste Service") - if tr.config.option.debug: - terminalreporter.write_line("xmlrpcurl: %s" %(url.xmlrpc,)) - serverproxy = getproxy() for rep in terminalreporter.stats.get('failed'): try: msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc @@ -63,6 +79,5 @@ rep.toterminal(tw) s = tw.stringio.getvalue() assert len(s) - proxyid = serverproxy.newPaste("python", s) - pastebinurl = "%s%s" % (url.show, proxyid) + pastebinurl = create_new_paste(s) tr.write_line("%s --> %s" %(msg, pastebinurl)) diff -r 7f1df35743c6fcd112d839efaf705d5f34d78dc2 -r 5f75f34c3ef75674994c6111fe4b8728e2709ce8 testing/test_pastebin.py --- a/testing/test_pastebin.py +++ b/testing/test_pastebin.py @@ -1,13 +1,13 @@ +import sys +import pytest class TestPasting: - def pytest_funcarg__pastebinlist(self, request): - mp = request.getfuncargvalue("monkeypatch") + + @pytest.fixture + def pastebinlist(self, monkeypatch, request): pastebinlist = [] - class MockProxy: - def newPaste(self, language, code): - pastebinlist.append((language, code)) plugin = request.config.pluginmanager.getplugin('pastebin') - mp.setattr(plugin, 'getproxy', MockProxy) + monkeypatch.setattr(plugin, 'create_new_paste', pastebinlist.append) return pastebinlist def test_failed(self, testdir, pastebinlist): @@ -22,8 +22,7 @@ """) reprec = testdir.inline_run(testpath, "--paste=failed") assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] + s = pastebinlist[0] assert s.find("def test_fail") != -1 assert reprec.countoutcomes() == [1,1,1] @@ -37,22 +36,52 @@ def test_skip(): pytest.skip("") """) - reprec = testdir.inline_run(testpath, "--pastebin=all") + reprec = testdir.inline_run(testpath, "--pastebin=all", '-v') assert reprec.countoutcomes() == [1,1,1] assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] - for x in 'test_fail test_skip skipped'.split(): - assert s.find(x), (s, x) + s = pastebinlist[0] + for x in 'test_fail test_skip test_pass'.split(): + assert x in s -class TestRPCClient: - def pytest_funcarg__pastebin(self, request): +class TestPaste: + + @pytest.fixture + def pastebin(self, request): return request.config.pluginmanager.getplugin('pastebin') - def test_getproxy(self, pastebin): - proxy = pastebin.getproxy() - assert proxy is not None - assert proxy.__class__.__module__.startswith('xmlrpc') + @pytest.fixture + def mocked_urlopen(self, monkeypatch): + """ + monkeypatch the actual urlopen calls done by the internal plugin + function that connects to bpaste service. + """ + calls = [] + def mocked(url, data): + calls.append((url, data)) + class DummyFile: + def read(self): + # part of html of a normal response + return 'View raw.' + return DummyFile() + if sys.version_info < (3, 0): + import urllib + monkeypatch.setattr(urllib, 'urlopen', mocked) + else: + import urllib.request + monkeypatch.setattr(urllib.request, 'urlopen', mocked) + return calls + def test_create_new_paste(self, pastebin, mocked_urlopen): + result = pastebin.create_new_paste('full-paste-contents') + assert result == 'https://bpaste.net/show/3c0c6750bd' + assert len(mocked_urlopen) == 1 + url, data = mocked_urlopen[0] + lexer = 'python3' if sys.version_info[0] == 3 else 'python' + assert url == 'https://bpaste.net' + assert 'lexer=%s' % lexer in data + assert 'code=full-paste-contents' in data + assert 'expiry=1week' in data + + https://bitbucket.org/hpk42/pytest/commits/d6a644c4399a/ Changeset: d6a644c4399a User: hpk42 Date: 2014-10-23 07:08:30+00:00 Summary: Merged in nicoddemus/pytest/fix-pastebin (pull request #228) Fix --pastebin option Affected #: 3 files diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,9 @@ - "python_classes" and "python_functions" options now support glob-patterns for test discovery, as discussed in issue600. Thanks Ldiary Translations. +- fix issue614: fixed pastebin support. + + 2.6.4.dev ---------- diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc _pytest/pastebin.py --- a/_pytest/pastebin.py +++ b/_pytest/pastebin.py @@ -3,10 +3,6 @@ import py, sys import tempfile -class url: - base = "http://bpaste.net" - xmlrpc = base + "/xmlrpc/" - show = base + "/show/" def pytest_addoption(parser): group = parser.getgroup("terminal reporting") @@ -28,22 +24,45 @@ def pytest_unconfigure(config): if hasattr(config, '_pastebinfile'): + # get terminal contents and delete file config._pastebinfile.seek(0) sessionlog = config._pastebinfile.read() config._pastebinfile.close() del config._pastebinfile - proxyid = getproxy().newPaste("python", sessionlog) - pastebinurl = "%s%s" % (url.show, proxyid) - sys.stderr.write("pastebin session-log: %s\n" % pastebinurl) + # undo our patching in the terminal reporter tr = config.pluginmanager.getplugin('terminalreporter') del tr._tw.__dict__['write'] + # write summary + tr.write_sep("=", "Sending information to Paste Service") + pastebinurl = create_new_paste(sessionlog) + tr.write_line("pastebin session-log: %s\n" % pastebinurl) -def getproxy(): +def create_new_paste(contents): + """ + Creates a new paste using bpaste.net service. + + :contents: paste contents + :returns: url to the pasted contents + """ + import re if sys.version_info < (3, 0): - from xmlrpclib import ServerProxy + from urllib import urlopen, urlencode else: - from xmlrpc.client import ServerProxy - return ServerProxy(url.xmlrpc).pastes + from urllib.request import urlopen + from urllib.parse import urlencode + + params = { + 'code': contents, + 'lexer': 'python3' if sys.version_info[0] == 3 else 'python', + 'expiry': '1week', + } + url = 'https://bpaste.net' + response = urlopen(url, data=urlencode(params)).read() + m = re.search(r'href="/raw/(\w+)"', response) + if m: + return '%s/show/%s' % (url, m.group(1)) + else: + return 'bad response: ' + response def pytest_terminal_summary(terminalreporter): if terminalreporter.config.option.pastebin != "failed": @@ -51,9 +70,6 @@ tr = terminalreporter if 'failed' in tr.stats: terminalreporter.write_sep("=", "Sending information to Paste Service") - if tr.config.option.debug: - terminalreporter.write_line("xmlrpcurl: %s" %(url.xmlrpc,)) - serverproxy = getproxy() for rep in terminalreporter.stats.get('failed'): try: msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc @@ -63,6 +79,5 @@ rep.toterminal(tw) s = tw.stringio.getvalue() assert len(s) - proxyid = serverproxy.newPaste("python", s) - pastebinurl = "%s%s" % (url.show, proxyid) + pastebinurl = create_new_paste(s) tr.write_line("%s --> %s" %(msg, pastebinurl)) diff -r 3b0a3f1767860c9efd2d4e3467187f85985bbf49 -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc testing/test_pastebin.py --- a/testing/test_pastebin.py +++ b/testing/test_pastebin.py @@ -1,13 +1,13 @@ +import sys +import pytest class TestPasting: - def pytest_funcarg__pastebinlist(self, request): - mp = request.getfuncargvalue("monkeypatch") + + @pytest.fixture + def pastebinlist(self, monkeypatch, request): pastebinlist = [] - class MockProxy: - def newPaste(self, language, code): - pastebinlist.append((language, code)) plugin = request.config.pluginmanager.getplugin('pastebin') - mp.setattr(plugin, 'getproxy', MockProxy) + monkeypatch.setattr(plugin, 'create_new_paste', pastebinlist.append) return pastebinlist def test_failed(self, testdir, pastebinlist): @@ -22,8 +22,7 @@ """) reprec = testdir.inline_run(testpath, "--paste=failed") assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] + s = pastebinlist[0] assert s.find("def test_fail") != -1 assert reprec.countoutcomes() == [1,1,1] @@ -37,22 +36,52 @@ def test_skip(): pytest.skip("") """) - reprec = testdir.inline_run(testpath, "--pastebin=all") + reprec = testdir.inline_run(testpath, "--pastebin=all", '-v') assert reprec.countoutcomes() == [1,1,1] assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] - for x in 'test_fail test_skip skipped'.split(): - assert s.find(x), (s, x) + s = pastebinlist[0] + for x in 'test_fail test_skip test_pass'.split(): + assert x in s -class TestRPCClient: - def pytest_funcarg__pastebin(self, request): +class TestPaste: + + @pytest.fixture + def pastebin(self, request): return request.config.pluginmanager.getplugin('pastebin') - def test_getproxy(self, pastebin): - proxy = pastebin.getproxy() - assert proxy is not None - assert proxy.__class__.__module__.startswith('xmlrpc') + @pytest.fixture + def mocked_urlopen(self, monkeypatch): + """ + monkeypatch the actual urlopen calls done by the internal plugin + function that connects to bpaste service. + """ + calls = [] + def mocked(url, data): + calls.append((url, data)) + class DummyFile: + def read(self): + # part of html of a normal response + return 'View raw.' + return DummyFile() + if sys.version_info < (3, 0): + import urllib + monkeypatch.setattr(urllib, 'urlopen', mocked) + else: + import urllib.request + monkeypatch.setattr(urllib.request, 'urlopen', mocked) + return calls + def test_create_new_paste(self, pastebin, mocked_urlopen): + result = pastebin.create_new_paste('full-paste-contents') + assert result == 'https://bpaste.net/show/3c0c6750bd' + assert len(mocked_urlopen) == 1 + url, data = mocked_urlopen[0] + lexer = 'python3' if sys.version_info[0] == 3 else 'python' + assert url == 'https://bpaste.net' + assert 'lexer=%s' % lexer in data + assert 'code=full-paste-contents' in data + assert 'expiry=1week' in data + + Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Thu Oct 23 09:09:13 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 23 Oct 2014 07:09:13 +0000 Subject: [Pytest-commit] [FAIL] pytest - # 364 Message-ID: <20141023070851.66654.88676@drone.io> Build Failed Build : https://drone.io/bitbucket.org/hpk42/pytest/364 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3915:d6a644c4399a Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest/fix-pastebin (pull request #228) -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at drone.io Thu Oct 23 09:22:27 2014 From: builds at drone.io (Drone.io Build) Date: Thu, 23 Oct 2014 07:22:27 +0000 Subject: [Pytest-commit] [FAIL] pytest - # 365 Message-ID: <20141023072219.76741.32397@drone.io> Build Failed Build : https://drone.io/bitbucket.org/hpk42/pytest/365 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3915:d6a644c4399a Author : holger krekel Branch : default Message: Merged in nicoddemus/pytest/fix-pastebin (pull request #228) -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Fri Oct 24 10:47:29 2014 From: issues-reply at bitbucket.org (Dinu Gherman) Date: Fri, 24 Oct 2014 08:47:29 -0000 Subject: [Pytest-commit] Issue #620: Add a friendly description to runtests.py to not scare people from the binary blob inside (hpk42/pytest) Message-ID: <20141024084729.23060.2747@app06.ash-private.bitbucket.org> New issue 620: Add a friendly description to runtests.py to not scare people from the binary blob inside https://bitbucket.org/hpk42/pytest/issue/620/add-a-friendly-description-to-runtestspy Dinu Gherman: Binary blobs in Python source code seem strange to many people because they might do some hidden and/or undesired things. The ``pip`` project removes fears like that in a nice way by adding a comment as a header to the file, see https://bootstrap.pypa.io/get-pip.py cited below. This could be quite easily adapted to ``py.test``. ``` #!python # Hi There! # You may be wondering what this giant blob of binary data here is, you might # even be worried that we're up to something nefarious (good for you for being # paranoid!). This is a base64 encoding of a zip file, this zip file contains # an entire copy of pip. # # Pip is a thing that installs packages, pip itself is a package that someone # might want to install, especially if they're looking to run this get-pip.py # script. Pip has a lot of code to deal with the security of installing # packages, various edge cases on various platforms, and other such sort of # "tribal knowledge" that has been encoded in it's code base. Because of this # we basically include an entire copy of pip inside this blob. We do this # because the alternatives are attempt to implement a "minipip" that probably # doesn't do things correctly and has weird edge cases, or compress pip itself # down into a single file. # # If you're wondering how this is created, the secret is # "contrib/build-installer" from the pip repository. ``` From commits-noreply at bitbucket.org Fri Oct 24 13:51:38 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 11:51:38 -0000 Subject: [Pytest-commit] commit/pytest: deeplook: Added explanation for the binary blob in runtests.py Message-ID: <20141024115138.22699.81577@app06.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/64328a5ea94b/ Changeset: 64328a5ea94b User: deeplook Date: 2014-10-24 11:04:20+00:00 Summary: Added explanation for the binary blob in runtests.py Affected #: 1 file diff -r d6a644c4399ad5fee77a5d0ce1e482b3b7a2bcbc -r 64328a5ea94bdc51909a06cfd6d05a01ef3ad71a _pytest/standalonetemplate.py --- a/_pytest/standalonetemplate.py +++ b/_pytest/standalonetemplate.py @@ -1,5 +1,24 @@ #! /usr/bin/env python +# Hi There! +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base64 encoding of a zip file, this zip file contains +# a fully functional basic pytest script. +# +# Pytest is a thing that tests packages, pytest itself is a package that some- +# one might want to install, especially if they're looking to run tests inside +# some package they want to install. Pytest has a lot of code to collect and +# execute tests, and other such sort of "tribal knowledge" that has been en- +# coded in its code base. Because of this we basically include a basic copy +# of pytest inside this blob. We do this because it let's you as a maintainer +# or application developer who wants people who don't deal with python much to +# easily run tests without installing the complete pytest package. +# +# If you're wondering how this is created: you can create it yourself if you +# have a complete pytest installation by using this command on the command- +# line: ``py.test --genscript=runtests.py``. + sources = """ @SOURCES@""" Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Fri Oct 24 13:53:49 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 11:53:49 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: backport fixed issue620 (doc for genscript) Message-ID: <20141024115349.28781.87734@app04.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/2a242d5129aa/ Changeset: 2a242d5129aa Branch: pytest-2.6 User: hpk42 Date: 2014-10-24 11:53:39+00:00 Summary: backport fixed issue620 (doc for genscript) Affected #: 2 files diff -r a460a4db4589486f62af8716f6960df3edc6d99f -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -15,6 +15,10 @@ - fix issue604: Escape % character in the assertion message. +- fix issue620: add explanation in the --genscript target about what + the binary blob means. Thanks Dinu Gherman. + + 2.6.3 ----------- diff -r a460a4db4589486f62af8716f6960df3edc6d99f -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d _pytest/standalonetemplate.py --- a/_pytest/standalonetemplate.py +++ b/_pytest/standalonetemplate.py @@ -1,5 +1,24 @@ #! /usr/bin/env python +# Hi There! +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base64 encoding of a zip file, this zip file contains +# a fully functional basic pytest script. +# +# Pytest is a thing that tests packages, pytest itself is a package that some- +# one might want to install, especially if they're looking to run tests inside +# some package they want to install. Pytest has a lot of code to collect and +# execute tests, and other such sort of "tribal knowledge" that has been en- +# coded in its code base. Because of this we basically include a basic copy +# of pytest inside this blob. We do this because it let's you as a maintainer +# or application developer who wants people who don't deal with python much to +# easily run tests without installing the complete pytest package. +# +# If you're wondering how this is created: you can create it yourself if you +# have a complete pytest installation by using this command on the command- +# line: ``py.test --genscript=runtests.py``. + sources = """ @SOURCES@""" Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Fri Oct 24 14:02:55 2014 From: builds at drone.io (Drone.io Build) Date: Fri, 24 Oct 2014 12:02:55 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 366 Message-ID: <20141024120252.59762.73305@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/366 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3730:2a242d5129aa Author : holger krekel Branch : pytest-2.6 Message: backport fixed issue620 (doc for genscript) -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits-noreply at bitbucket.org Fri Oct 24 14:04:23 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 12:04:23 -0000 Subject: [Pytest-commit] commit/tox: 7 new changesets Message-ID: <20141024120423.4293.25111@app07.ash-private.bitbucket.org> 7 new commits in tox: https://bitbucket.org/hpk42/tox/commits/fe68af18481d/ Changeset: fe68af18481d Branch: allow_backslash_escape_curly_braces_msabramo_2 User: hpk42 Date: 2014-10-24 12:04:05+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/e67ea714c61d/ Changeset: e67ea714c61d Branch: alex_gaynor/allow-in-factor-names-for-multidimensio-1411745805716 User: hpk42 Date: 2014-10-24 12:04:05+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/5803d3c8d9f9/ Changeset: 5803d3c8d9f9 Branch: Pentusha/docs-add-pypy3-support-1408431512815 User: hpk42 Date: 2014-10-24 12:04:05+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/09a2460582e0/ Changeset: 09a2460582e0 Branch: fix_console_encoding User: hpk42 Date: 2014-10-24 12:04:06+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/500a763ba2fb/ Changeset: 500a763ba2fb Branch: evvers/add-deps-to-basictxt-example-without-dep-1400352654797 User: hpk42 Date: 2014-10-24 12:04:06+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/f2b89d5d72f4/ Changeset: f2b89d5d72f4 Branch: tbekolay/better-setuptools-integration-in-basic-1400524487298 User: hpk42 Date: 2014-10-24 12:04:06+00:00 Summary: close branch Affected #: 0 files https://bitbucket.org/hpk42/tox/commits/992526042da5/ Changeset: 992526042da5 Branch: glarrain/readme-removed-duplicated-line-1378443596400 User: hpk42 Date: 2014-10-24 12:04:06+00:00 Summary: close branch Affected #: 0 files Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Fri Oct 24 14:14:28 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 12:14:28 -0000 Subject: [Pytest-commit] commit/tox: hpk42: add some changelogs for the merged PRs Message-ID: <20141024121428.5165.893@app08.ash-private.bitbucket.org> 1 new commit in tox: https://bitbucket.org/hpk42/tox/commits/c80aa9dd3a33/ Changeset: c80aa9dd3a33 Branch: tox-1.8-maint User: hpk42 Date: 2014-10-24 12:14:11+00:00 Summary: add some changelogs for the merged PRs Affected #: 2 files diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r c80aa9dd3a33c406ac22133f37825003adcee668 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,14 @@ - fix issue190: allow setenv to be empty. +- allow escaping curly braces with "\". Thanks Marc Abramowitz for the PR. + +- allow "." names in environment names such that "py27-django1.7" is a + valid environment name. Thanks Alex Gaynor and Alex Schepanovski. + +- report subprocess exit code when execution fails. Thanks Marius + Gedminas. + 1.8.0 ----------- diff -r 2c1f0d218f7c5c4f3994aa1b7f82aedb7680d3e9 -r c80aa9dd3a33c406ac22133f37825003adcee668 doc/config.txt --- a/doc/config.txt +++ b/doc/config.txt @@ -244,6 +244,10 @@ Any ``key=value`` setting in an ini-file can make use of value substitution through the ``{...}`` string-substitution pattern. +You can escape curly braces with the ``\`` character if you need them, for example:: + + commands = echo "\{posargs\}" = {posargs} + Globally available substitutions ++++++++++++++++++++++++++++++++ Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Fri Oct 24 17:18:37 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 15:18:37 -0000 Subject: [Pytest-commit] commit/pytest: 3 new changesets Message-ID: <20141024151837.29275.49637@app09.ash-private.bitbucket.org> 3 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/e90bc855646d/ Changeset: e90bc855646d Branch: pytest-2.6 User: hpk42 Date: 2014-10-24 13:08:43+00:00 Summary: regen docs Affected #: 20 files diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 _pytest/__init__.py --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.6.4.dev2' +__version__ = '2.6.4' diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/assert.txt --- a/doc/en/assert.txt +++ b/doc/en/assert.txt @@ -26,7 +26,7 @@ $ py.test test_assert1.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_assert1.py F @@ -135,7 +135,7 @@ $ py.test test_assert2.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_assert2.py F @@ -152,6 +152,7 @@ E '1' E Extra items in the right set: E '5' + E Use -v to get the full diff test_assert2.py:5: AssertionError ========================= 1 failed in 0.01 seconds ========================= diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/capture.txt --- a/doc/en/capture.txt +++ b/doc/en/capture.txt @@ -64,7 +64,7 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_module.py .F @@ -78,7 +78,7 @@ test_module.py:9: AssertionError -------------------------- Captured stdout setup --------------------------- - setting up + setting up ==================== 1 failed, 1 passed in 0.01 seconds ==================== Accessing captured output from a test function diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/conf.py --- a/doc/en/conf.py +++ b/doc/en/conf.py @@ -18,7 +18,7 @@ # The full version, including alpha/beta/rc tags. # The short X.Y version. version = "2.6" -release = "2.6.3" +release = "2.6.4" import sys, os diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/doctest.txt --- a/doc/en/doctest.txt +++ b/doc/en/doctest.txt @@ -44,12 +44,12 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items mymodule.py . - ========================= 1 passed in 0.05 seconds ========================= + ========================= 1 passed in 0.06 seconds ========================= It is possible to use fixtures using the ``getfixture`` helper:: diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/markers.txt --- a/doc/en/example/markers.txt +++ b/doc/en/example/markers.txt @@ -31,7 +31,7 @@ $ py.test -v -m webtest =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::test_send_http PASSED @@ -43,7 +43,7 @@ $ py.test -v -m "not webtest" =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::test_something_quick PASSED @@ -62,7 +62,7 @@ $ py.test -v test_server.py::TestClass::test_method =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 5 items test_server.py::TestClass::test_method PASSED @@ -73,7 +73,7 @@ $ py.test -v test_server.py::TestClass =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::TestClass::test_method PASSED @@ -84,7 +84,7 @@ $ py.test -v test_server.py::TestClass test_server.py::test_send_http =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 8 items test_server.py::TestClass::test_method PASSED @@ -120,7 +120,7 @@ $ py.test -v -k http # running with the above defined example module =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::test_send_http PASSED @@ -132,7 +132,7 @@ $ py.test -k "not send_http" -v =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::test_something_quick PASSED @@ -140,13 +140,13 @@ test_server.py::TestClass::test_method PASSED ================= 1 tests deselected by '-knot send_http' ================== - ================== 3 passed, 1 deselected in 0.02 seconds ================== + ================== 3 passed, 1 deselected in 0.01 seconds ================== Or to select "http" and "quick" tests:: $ py.test -k "http or quick" -v =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 4 items test_server.py::test_send_http PASSED @@ -326,7 +326,7 @@ $ py.test -E stage2 =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_someenv.py s @@ -337,7 +337,7 @@ $ py.test -E stage1 =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_someenv.py . @@ -455,12 +455,12 @@ $ py.test -rs # this option reports skip reasons =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_plat.py sss. ========================= short test summary info ========================== - SKIP [3] /tmp/doc-exec-224/conftest.py:12: cannot run on platform linux + SKIP [3] /tmp/doc-exec-68/conftest.py:12: cannot run on platform linux =================== 1 passed, 3 skipped in 0.01 seconds ==================== @@ -468,7 +468,7 @@ $ py.test -m linux2 =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_plat.py s @@ -519,7 +519,7 @@ $ py.test -m interface --tb=short =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_module.py FF @@ -540,7 +540,7 @@ $ py.test -m "interface or event" --tb=short =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_module.py FFF diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/nonpython.txt --- a/doc/en/example/nonpython.txt +++ b/doc/en/example/nonpython.txt @@ -27,10 +27,10 @@ nonpython $ py.test test_simple.yml =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items - test_simple.yml .F + test_simple.yml F. ================================= FAILURES ================================= ______________________________ usecase: hello ______________________________ @@ -56,11 +56,11 @@ nonpython $ py.test -v =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 2 items + test_simple.yml::usecase: hello FAILED test_simple.yml::usecase: ok PASSED - test_simple.yml::usecase: hello FAILED ================================= FAILURES ================================= ______________________________ usecase: hello ______________________________ @@ -74,10 +74,10 @@ nonpython $ py.test --collect-only =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items + - ============================= in 0.03 seconds ============================= diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/parametrize.txt --- a/doc/en/example/parametrize.txt +++ b/doc/en/example/parametrize.txt @@ -106,7 +106,7 @@ $ py.test test_scenarios.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_scenarios.py .... @@ -118,7 +118,7 @@ $ py.test --collect-only test_scenarios.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items @@ -182,7 +182,7 @@ $ py.test test_backends.py --collect-only =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items @@ -197,7 +197,7 @@ ================================= FAILURES ================================= _________________________ test_db_initialized[d2] __________________________ - db = + db = def test_db_initialized(db): # a dummy test @@ -206,7 +206,7 @@ E Failed: deliberately failing for demo purposes test_backends.py:6: Failed - 1 failed, 1 passed in 0.02 seconds + 1 failed, 1 passed in 0.01 seconds The first invocation with ``db == "DB1"`` passed while the second with ``db == "DB2"`` failed. Our ``db`` fixture function has instantiated each of the DB values during the setup phase while the ``pytest_generate_tests`` generated two according calls to the ``test_db_initialized`` during the collection phase. @@ -251,16 +251,16 @@ $ py.test -q F.. ================================= FAILURES ================================= - ________________________ TestClass.test_equals[1-2] ________________________ + ________________________ TestClass.test_equals[2-1] ________________________ - self = , a = 1, b = 2 + self = , a = 1, b = 2 def test_equals(self, a, b): > assert a == b E assert 1 == 2 test_parametrize.py:18: AssertionError - 1 failed, 2 passed in 0.02 seconds + 1 failed, 2 passed in 0.01 seconds Indirect parametrization with multiple fixtures -------------------------------------------------------------- @@ -283,8 +283,8 @@ ================================= FAILURES ================================= ________________ test_basic_objects[python3.4-python2.6-42] ________________ - python1 = - python2 = , obj = 42 + python1 = + python2 = , obj = 42 @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -297,7 +297,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p0/load.py' + cmd = '/home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p0/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -322,9 +322,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p0/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p0/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p0/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p0/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.6/pickle.py", line 1370, in load E return Unpickler(file).load() @@ -336,11 +336,11 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p0/load.py + /tmp/pytest-111/test_basic_objects_python3_4_p0/load.py _______________ test_basic_objects[python3.4-python2.6-obj1] _______________ - python1 = - python2 = , obj = {} + python1 = + python2 = , obj = {} @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -353,7 +353,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p1/load.py' + cmd = '/home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p1/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -378,9 +378,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p1/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p1/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p1/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p1/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.6/pickle.py", line 1370, in load E return Unpickler(file).load() @@ -392,11 +392,11 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p1/load.py + /tmp/pytest-111/test_basic_objects_python3_4_p1/load.py _______________ test_basic_objects[python3.4-python2.6-obj2] _______________ - python1 = - python2 = , obj = {1: 3} + python1 = + python2 = , obj = {1: 3} @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -409,7 +409,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p2/load.py' + cmd = '/home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p2/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -434,9 +434,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-21/test_basic_objects_python3_4_p2/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.6 /tmp/pytest-111/test_basic_objects_python3_4_p2/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p2/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p2/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.6/pickle.py", line 1370, in load E return Unpickler(file).load() @@ -448,11 +448,11 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p2/load.py + /tmp/pytest-111/test_basic_objects_python3_4_p2/load.py ________________ test_basic_objects[python3.4-python2.7-42] ________________ - python1 = - python2 = , obj = 42 + python1 = + python2 = , obj = 42 @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -465,7 +465,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p3/load.py' + cmd = '/home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p3/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -490,9 +490,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p3/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p3/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p3/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p3/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.7/pickle.py", line 1378, in load E return Unpickler(file).load() @@ -504,11 +504,11 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p3/load.py + /tmp/pytest-111/test_basic_objects_python3_4_p3/load.py _______________ test_basic_objects[python3.4-python2.7-obj1] _______________ - python1 = - python2 = , obj = {} + python1 = + python2 = , obj = {} @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -521,7 +521,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p4/load.py' + cmd = '/home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p4/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -546,9 +546,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p4/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p4/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p4/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p4/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.7/pickle.py", line 1378, in load E return Unpickler(file).load() @@ -560,11 +560,11 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p4/load.py + /tmp/pytest-111/test_basic_objects_python3_4_p4/load.py _______________ test_basic_objects[python3.4-python2.7-obj2] _______________ - python1 = - python2 = , obj = {1: 3} + python1 = + python2 = , obj = {1: 3} @pytest.mark.parametrize("obj", [42, {}, {1:3},]) def test_basic_objects(python1, python2, obj): @@ -577,7 +577,7 @@ py.process.cmdexec("%s %s" %(self.pythonpath, loadfile)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - cmd = '/home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p5/load.py' + cmd = '/home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p5/load.py' def cmdexec(cmd): """ return unicode output of executing 'cmd' in a separate process. @@ -602,9 +602,9 @@ status = process.poll() if status: > raise ExecutionFailed(status, status, cmd, out, err) - E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/bin/python2.7 /tmp/pytest-21/test_basic_objects_python3_4_p5/load.py + E py.process.cmdexec.Error: ExecutionFailed: 1 /home/hpk/venv/0/bin/python2.7 /tmp/pytest-111/test_basic_objects_python3_4_p5/load.py E Traceback (most recent call last): - E File "/tmp/pytest-21/test_basic_objects_python3_4_p5/load.py", line 4, in + E File "/tmp/pytest-111/test_basic_objects_python3_4_p5/load.py", line 4, in E obj = pickle.load(f) E File "/usr/lib/python2.7/pickle.py", line 1378, in load E return Unpickler(file).load() @@ -616,8 +616,8 @@ ../../../.tox/regen/lib/python3.4/site-packages/py/_process/cmdexec.py:28: Error --------------------------- Captured stdout call --------------------------- - /tmp/pytest-21/test_basic_objects_python3_4_p5/load.py - 6 failed, 21 passed in 1.36 seconds + /tmp/pytest-111/test_basic_objects_python3_4_p5/load.py + 6 failed, 21 passed in 1.66 seconds Indirect parametrization of optional implementations/imports -------------------------------------------------------------------- @@ -664,12 +664,12 @@ $ py.test -rs test_module.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_module.py .s ========================= short test summary info ========================== - SKIP [1] /tmp/doc-exec-226/conftest.py:10: could not import 'opt2' + SKIP [1] /tmp/doc-exec-70/conftest.py:10: could not import 'opt2' =================== 1 passed, 1 skipped in 0.01 seconds ==================== diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/pythoncollection.txt --- a/doc/en/example/pythoncollection.txt +++ b/doc/en/example/pythoncollection.txt @@ -43,7 +43,7 @@ $ py.test --collect-only =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items @@ -88,7 +88,7 @@ . $ py.test --collect-only pythoncollection.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 3 items @@ -141,10 +141,10 @@ $ py.test --collect-only =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 0 items - ============================= in 0.01 seconds ============================= + ============================= in 0.00 seconds ============================= If you run with a Python3 interpreter the moduled added through the conftest.py file will not be considered for test collection. diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/reportingdemo.txt --- a/doc/en/example/reportingdemo.txt +++ b/doc/en/example/reportingdemo.txt @@ -13,7 +13,7 @@ assertion $ py.test failure_demo.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 42 items failure_demo.py FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF @@ -30,7 +30,7 @@ failure_demo.py:15: AssertionError _________________________ TestFailing.test_simple __________________________ - self = + self = def test_simple(self): def f(): @@ -40,13 +40,13 @@ > assert f() == g() E assert 42 == 43 - E + where 42 = .f at 0x2adb9887e6a8>() - E + and 43 = .g at 0x2adb9887e598>() + E + where 42 = .f at 0x2b4436f1e6a8>() + E + and 43 = .g at 0x2b4436f1e7b8>() failure_demo.py:28: AssertionError ____________________ TestFailing.test_simple_multiline _____________________ - self = + self = def test_simple_multiline(self): otherfunc_multi( @@ -66,19 +66,19 @@ failure_demo.py:11: AssertionError ___________________________ TestFailing.test_not ___________________________ - self = + self = def test_not(self): def f(): return 42 > assert not f() E assert not 42 - E + where 42 = .f at 0x2adb9887e840>() + E + where 42 = .f at 0x2b4436f1ebf8>() failure_demo.py:38: AssertionError _________________ TestSpecialisedExplanations.test_eq_text _________________ - self = + self = def test_eq_text(self): > assert 'spam' == 'eggs' @@ -89,7 +89,7 @@ failure_demo.py:42: AssertionError _____________ TestSpecialisedExplanations.test_eq_similar_text _____________ - self = + self = def test_eq_similar_text(self): > assert 'foo 1 bar' == 'foo 2 bar' @@ -102,7 +102,7 @@ failure_demo.py:45: AssertionError ____________ TestSpecialisedExplanations.test_eq_multiline_text ____________ - self = + self = def test_eq_multiline_text(self): > assert 'foo\nspam\nbar' == 'foo\neggs\nbar' @@ -115,7 +115,7 @@ failure_demo.py:48: AssertionError ______________ TestSpecialisedExplanations.test_eq_long_text _______________ - self = + self = def test_eq_long_text(self): a = '1'*100 + 'a' + '2'*100 @@ -132,7 +132,7 @@ failure_demo.py:53: AssertionError _________ TestSpecialisedExplanations.test_eq_long_text_multiline __________ - self = + self = def test_eq_long_text_multiline(self): a = '1\n'*100 + 'a' + '2\n'*100 @@ -156,17 +156,18 @@ failure_demo.py:58: AssertionError _________________ TestSpecialisedExplanations.test_eq_list _________________ - self = + self = def test_eq_list(self): > assert [0, 1, 2] == [0, 1, 3] E assert [0, 1, 2] == [0, 1, 3] E At index 2 diff: 2 != 3 + E Use -v to get the full diff failure_demo.py:61: AssertionError ______________ TestSpecialisedExplanations.test_eq_list_long _______________ - self = + self = def test_eq_list_long(self): a = [0]*100 + [1] + [3]*100 @@ -174,11 +175,12 @@ > assert a == b E assert [0, 0, 0, 0, 0, 0, ...] == [0, 0, 0, 0, 0, 0, ...] E At index 100 diff: 1 != 2 + E Use -v to get the full diff failure_demo.py:66: AssertionError _________________ TestSpecialisedExplanations.test_eq_dict _________________ - self = + self = def test_eq_dict(self): > assert {'a': 0, 'b': 1, 'c': 0} == {'a': 0, 'b': 2, 'd': 0} @@ -190,11 +192,12 @@ E {'c': 0} E Right contains more items: E {'d': 0} + E Use -v to get the full diff failure_demo.py:69: AssertionError _________________ TestSpecialisedExplanations.test_eq_set __________________ - self = + self = def test_eq_set(self): > assert set([0, 10, 11, 12]) == set([0, 20, 21]) @@ -206,21 +209,23 @@ E Extra items in the right set: E 20 E 21 + E Use -v to get the full diff failure_demo.py:72: AssertionError _____________ TestSpecialisedExplanations.test_eq_longer_list ______________ - self = + self = def test_eq_longer_list(self): > assert [1,2] == [1,2,3] E assert [1, 2] == [1, 2, 3] E Right contains more items, first extra item: 3 + E Use -v to get the full diff failure_demo.py:75: AssertionError _________________ TestSpecialisedExplanations.test_in_list _________________ - self = + self = def test_in_list(self): > assert 1 in [0, 2, 3, 4, 5] @@ -229,7 +234,7 @@ failure_demo.py:78: AssertionError __________ TestSpecialisedExplanations.test_not_in_text_multiline __________ - self = + self = def test_not_in_text_multiline(self): text = 'some multiline\ntext\nwhich\nincludes foo\nand a\ntail' @@ -247,7 +252,7 @@ failure_demo.py:82: AssertionError ___________ TestSpecialisedExplanations.test_not_in_text_single ____________ - self = + self = def test_not_in_text_single(self): text = 'single foo line' @@ -260,7 +265,7 @@ failure_demo.py:86: AssertionError _________ TestSpecialisedExplanations.test_not_in_text_single_long _________ - self = + self = def test_not_in_text_single_long(self): text = 'head ' * 50 + 'foo ' + 'tail ' * 20 @@ -273,7 +278,7 @@ failure_demo.py:90: AssertionError ______ TestSpecialisedExplanations.test_not_in_text_single_long_term _______ - self = + self = def test_not_in_text_single_long_term(self): text = 'head ' * 50 + 'f'*70 + 'tail ' * 20 @@ -292,7 +297,7 @@ i = Foo() > assert i.b == 2 E assert 1 == 2 - E + where 1 = .Foo object at 0x2adb987b5470>.b + E + where 1 = .Foo object at 0x2b4436e42ac8>.b failure_demo.py:101: AssertionError _________________________ test_attribute_instance __________________________ @@ -302,8 +307,8 @@ b = 1 > assert Foo().b == 2 E assert 1 == 2 - E + where 1 = .Foo object at 0x2adb987d0390>.b - E + where .Foo object at 0x2adb987d0390> = .Foo'>() + E + where 1 = .Foo object at 0x2b4436f185c0>.b + E + where .Foo object at 0x2b4436f185c0> = .Foo'>() failure_demo.py:107: AssertionError __________________________ test_attribute_failure __________________________ @@ -319,7 +324,7 @@ failure_demo.py:116: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - self = .Foo object at 0x2adb98822cf8> + self = .Foo object at 0x2b4436f16a58> def _get_b(self): > raise Exception('Failed to get attrib') @@ -335,15 +340,15 @@ b = 2 > assert Foo().b == Bar().b E assert 1 == 2 - E + where 1 = .Foo object at 0x2adb98841dd8>.b - E + where .Foo object at 0x2adb98841dd8> = .Foo'>() - E + and 2 = .Bar object at 0x2adb98841a90>.b - E + where .Bar object at 0x2adb98841a90> = .Bar'>() + E + where 1 = .Foo object at 0x2b4436f12a90>.b + E + where .Foo object at 0x2b4436f12a90> = .Foo'>() + E + and 2 = .Bar object at 0x2b4436f12ac8>.b + E + where .Bar object at 0x2b4436f12ac8> = .Bar'>() failure_demo.py:124: AssertionError __________________________ TestRaises.test_raises __________________________ - self = + self = def test_raises(self): s = 'qwe' @@ -358,7 +363,7 @@ <0-codegen /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1028>:1: ValueError ______________________ TestRaises.test_raises_doesnt _______________________ - self = + self = def test_raises_doesnt(self): > raises(IOError, "int('3')") @@ -367,7 +372,7 @@ failure_demo.py:136: Failed __________________________ TestRaises.test_raise ___________________________ - self = + self = def test_raise(self): > raise ValueError("demo error") @@ -376,7 +381,7 @@ failure_demo.py:139: ValueError ________________________ TestRaises.test_tupleerror ________________________ - self = + self = def test_tupleerror(self): > a,b = [1] @@ -385,7 +390,7 @@ failure_demo.py:142: ValueError ______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______ - self = + self = def test_reinterpret_fails_with_print_for_the_fun_of_it(self): l = [1,2,3] @@ -398,7 +403,7 @@ l is [1, 2, 3] ________________________ TestRaises.test_some_error ________________________ - self = + self = def test_some_error(self): > if namenotexi: @@ -426,7 +431,7 @@ <2-codegen 'abc-123' /home/hpk/p/pytest/doc/en/example/assertion/failure_demo.py:162>:2: AssertionError ____________________ TestMoreErrors.test_complex_error _____________________ - self = + self = def test_complex_error(self): def f(): @@ -450,7 +455,7 @@ failure_demo.py:5: AssertionError ___________________ TestMoreErrors.test_z1_unpack_error ____________________ - self = + self = def test_z1_unpack_error(self): l = [] @@ -460,7 +465,7 @@ failure_demo.py:179: ValueError ____________________ TestMoreErrors.test_z2_type_error _____________________ - self = + self = def test_z2_type_error(self): l = 3 @@ -470,19 +475,19 @@ failure_demo.py:183: TypeError ______________________ TestMoreErrors.test_startswith ______________________ - self = + self = def test_startswith(self): s = "123" g = "456" > assert s.startswith(g) - E assert ('456') - E + where = '123'.startswith + E assert ('456') + E + where = '123'.startswith failure_demo.py:188: AssertionError __________________ TestMoreErrors.test_startswith_nested ___________________ - self = + self = def test_startswith_nested(self): def f(): @@ -490,15 +495,15 @@ def g(): return "456" > assert f().startswith(g()) - E assert ('456') - E + where = '123'.startswith - E + where '123' = .f at 0x2adb9887e9d8>() - E + and '456' = .g at 0x2adb9887e7b8>() + E assert ('456') + E + where = '123'.startswith + E + where '123' = .f at 0x2b4436f1e950>() + E + and '456' = .g at 0x2b4436f1e840>() failure_demo.py:195: AssertionError _____________________ TestMoreErrors.test_global_func ______________________ - self = + self = def test_global_func(self): > assert isinstance(globf(42), float) @@ -508,18 +513,18 @@ failure_demo.py:198: AssertionError _______________________ TestMoreErrors.test_instance _______________________ - self = + self = def test_instance(self): self.x = 6*7 > assert self.x != 42 E assert 42 != 42 - E + where 42 = .x + E + where 42 = .x failure_demo.py:202: AssertionError _______________________ TestMoreErrors.test_compare ________________________ - self = + self = def test_compare(self): > assert globf(10) < 5 @@ -529,7 +534,7 @@ failure_demo.py:205: AssertionError _____________________ TestMoreErrors.test_try_finally ______________________ - self = + self = def test_try_finally(self): x = 1 @@ -540,7 +545,7 @@ failure_demo.py:210: AssertionError ___________________ TestCustomAssertMsg.test_single_line ___________________ - self = + self = def test_single_line(self): class A: @@ -554,7 +559,7 @@ failure_demo.py:221: AssertionError ____________________ TestCustomAssertMsg.test_multiline ____________________ - self = + self = def test_multiline(self): class A: @@ -571,7 +576,7 @@ failure_demo.py:227: AssertionError ___________________ TestCustomAssertMsg.test_custom_repr ___________________ - self = + self = def test_custom_repr(self): class JSON: @@ -589,4 +594,4 @@ E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a failure_demo.py:237: AssertionError - ======================== 42 failed in 0.29 seconds ========================= + ======================== 42 failed in 0.23 seconds ========================= diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/simple.txt --- a/doc/en/example/simple.txt +++ b/doc/en/example/simple.txt @@ -55,7 +55,7 @@ test_sample.py:6: AssertionError --------------------------- Captured stdout call --------------------------- first - 1 failed in 0.02 seconds + 1 failed in 0.01 seconds And now with supplying a command line option:: @@ -108,9 +108,9 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 0 items - + ============================= in 0.00 seconds ============================= .. _`excontrolskip`: @@ -152,12 +152,12 @@ $ py.test -rs # "-rs" means report details on the little 's' =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_module.py .s ========================= short test summary info ========================== - SKIP [1] /tmp/doc-exec-229/conftest.py:9: need --runslow option to run + SKIP [1] /tmp/doc-exec-73/conftest.py:9: need --runslow option to run =================== 1 passed, 1 skipped in 0.01 seconds ==================== @@ -165,11 +165,11 @@ $ py.test --runslow =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items - + test_module.py .. - + ========================= 2 passed in 0.01 seconds ========================= Writing well integrated assertion helpers @@ -256,10 +256,10 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 project deps: mylib-1.1 collected 0 items - + ============================= in 0.00 seconds ============================= .. regendoc:wipe @@ -279,20 +279,20 @@ $ py.test -v =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 info1: did you know that ... did you? collecting ... collected 0 items - + ============================= in 0.00 seconds ============================= and nothing when run plainly:: $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 0 items - + ============================= in 0.00 seconds ============================= profiling test duration @@ -322,7 +322,7 @@ $ py.test --durations=3 =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 3 items test_some_are_slow.py ... @@ -330,8 +330,8 @@ ========================= slowest 3 test durations ========================= 0.20s call test_some_are_slow.py::test_funcslow2 0.10s call test_some_are_slow.py::test_funcslow1 - 0.00s teardown test_some_are_slow.py::test_funcslow1 - ========================= 3 passed in 0.32 seconds ========================= + 0.00s setup test_some_are_slow.py::test_funcslow2 + ========================= 3 passed in 0.31 seconds ========================= incremental testing - test steps --------------------------------------------------- @@ -383,7 +383,7 @@ $ py.test -rx =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 4 items test_step.py .Fx. @@ -391,7 +391,7 @@ ================================= FAILURES ================================= ____________________ TestUserHandling.test_modification ____________________ - self = + self = def test_modification(self): > assert 0 @@ -453,7 +453,7 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 7 items test_step.py .Fx. @@ -463,17 +463,17 @@ ================================== ERRORS ================================== _______________________ ERROR at setup of test_root ________________________ - file /tmp/doc-exec-229/b/test_error.py, line 1 + file /tmp/doc-exec-73/b/test_error.py, line 1 def test_root(db): # no db here, will error out fixture 'db' not found - available fixtures: capsys, pytestconfig, monkeypatch, tmpdir, recwarn, capfd + available fixtures: monkeypatch, pytestconfig, tmpdir, capfd, capsys, recwarn use 'py.test --fixtures [testpath]' for help on them. - /tmp/doc-exec-229/b/test_error.py:1 + /tmp/doc-exec-73/b/test_error.py:1 ================================= FAILURES ================================= ____________________ TestUserHandling.test_modification ____________________ - self = + self = def test_modification(self): > assert 0 @@ -482,25 +482,25 @@ test_step.py:9: AssertionError _________________________________ test_a1 __________________________________ - db = + db = def test_a1(db): > assert 0, db # to show value - E AssertionError: + E AssertionError: E assert 0 a/test_db.py:2: AssertionError _________________________________ test_a2 __________________________________ - db = + db = def test_a2(db): > assert 0, db # to show value - E AssertionError: + E AssertionError: E assert 0 a/test_db2.py:2: AssertionError - ========== 3 failed, 2 passed, 1 xfailed, 1 error in 0.04 seconds ========== + ========== 3 failed, 2 passed, 1 xfailed, 1 error in 0.03 seconds ========== The two test modules in the ``a`` directory see the same ``db`` fixture instance while the one test in the sister-directory ``b`` doesn't see it. We could of course @@ -555,7 +555,7 @@ $ py.test test_module.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_module.py FF @@ -563,7 +563,7 @@ ================================= FAILURES ================================= ________________________________ test_fail1 ________________________________ - tmpdir = local('/tmp/pytest-22/test_fail10') + tmpdir = local('/tmp/pytest-112/test_fail10') def test_fail1(tmpdir): > assert 0 @@ -577,12 +577,12 @@ E assert 0 test_module.py:4: AssertionError - ========================= 2 failed in 0.01 seconds ========================= + ========================= 2 failed in 0.02 seconds ========================= you will have a "failures" file which contains the failing test ids:: $ cat failures - test_module.py::test_fail1 (/tmp/pytest-22/test_fail10) + test_module.py::test_fail1 (/tmp/pytest-112/test_fail10) test_module.py::test_fail2 Making test result information available in fixtures @@ -645,7 +645,7 @@ $ py.test -s test_module.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 3 items test_module.py Esetting up a test failed! test_module.py::test_setup_fails diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/example/special.txt --- a/doc/en/example/special.txt +++ b/doc/en/example/special.txt @@ -69,4 +69,4 @@ .test other .test_unit1 method called . - 4 passed in 0.05 seconds + 4 passed in 0.04 seconds diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/fixture.txt --- a/doc/en/fixture.txt +++ b/doc/en/fixture.txt @@ -76,7 +76,7 @@ $ py.test test_smtpsimple.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_smtpsimple.py F @@ -84,7 +84,7 @@ ================================= FAILURES ================================= ________________________________ test_ehlo _________________________________ - smtp = + smtp = def test_ehlo(smtp): response, msg = smtp.ehlo() @@ -93,7 +93,7 @@ E TypeError: Type str doesn't support the buffer API test_smtpsimple.py:11: TypeError - ========================= 1 failed in 0.20 seconds ========================= + ========================= 1 failed in 0.28 seconds ========================= In the failure traceback we see that the test function was called with a ``smtp`` argument, the ``smtplib.SMTP()`` instance created by the fixture @@ -193,7 +193,7 @@ $ py.test test_module.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_module.py FF @@ -201,7 +201,7 @@ ================================= FAILURES ================================= ________________________________ test_ehlo _________________________________ - smtp = + smtp = def test_ehlo(smtp): response = smtp.ehlo() @@ -212,7 +212,7 @@ test_module.py:5: TypeError ________________________________ test_noop _________________________________ - smtp = + smtp = def test_noop(smtp): response = smtp.noop() @@ -221,7 +221,7 @@ E assert 0 test_module.py:11: AssertionError - ========================= 2 failed in 0.17 seconds ========================= + ========================= 2 failed in 0.28 seconds ========================= You see the two ``assert 0`` failing and more importantly you can also see that the same (module-scoped) ``smtp`` object was passed into the two @@ -269,7 +269,7 @@ $ py.test -s -q --tb=no FFteardown smtp - 2 failed in 0.16 seconds + 2 failed in 0.21 seconds We see that the ``smtp`` instance is finalized after the two tests finished execution. Note that if we decorated our fixture @@ -310,7 +310,7 @@ $ py.test -s -q --tb=no FF - 2 failed in 0.16 seconds + 2 failed in 0.19 seconds Let's quickly create another test module that actually sets the server URL in its module namespace:: @@ -378,7 +378,7 @@ ================================= FAILURES ================================= __________________________ test_ehlo[merlinux.eu] __________________________ - smtp = + smtp = def test_ehlo(smtp): response = smtp.ehlo() @@ -389,7 +389,7 @@ test_module.py:5: TypeError __________________________ test_noop[merlinux.eu] __________________________ - smtp = + smtp = def test_noop(smtp): response = smtp.noop() @@ -400,7 +400,7 @@ test_module.py:11: AssertionError ________________________ test_ehlo[mail.python.org] ________________________ - smtp = + smtp = def test_ehlo(smtp): response = smtp.ehlo() @@ -410,10 +410,10 @@ test_module.py:5: TypeError -------------------------- Captured stdout setup --------------------------- - finalizing + finalizing ________________________ test_noop[mail.python.org] ________________________ - smtp = + smtp = def test_noop(smtp): response = smtp.noop() @@ -422,7 +422,7 @@ E assert 0 test_module.py:11: AssertionError - 4 failed in 6.02 seconds + 4 failed in 7.02 seconds We see that our two test functions each ran twice, against the different ``smtp`` instances. Note also, that with the ``mail.python.org`` @@ -462,13 +462,13 @@ $ py.test -v test_appsetup.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 2 items test_appsetup.py::test_smtp_exists[merlinux.eu] PASSED test_appsetup.py::test_smtp_exists[mail.python.org] PASSED - ========================= 2 passed in 5.45 seconds ========================= + ========================= 2 passed in 6.63 seconds ========================= Due to the parametrization of ``smtp`` the test will run twice with two different ``App`` instances and respective smtp servers. There is no @@ -526,7 +526,7 @@ $ py.test -v -s test_module.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 -- /home/hpk/p/pytest/.tox/regen/bin/python3.4 collecting ... collected 8 items test_module.py::test_0[1] test0 1 diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/getting-started.txt --- a/doc/en/getting-started.txt +++ b/doc/en/getting-started.txt @@ -27,7 +27,7 @@ To check your installation has installed the correct version:: $ py.test --version - This is pytest version 2.6.3, imported from /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/pytest.py + This is pytest version 2.6.4, imported from /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/pytest.py If you get an error checkout :ref:`installation issues`. @@ -49,7 +49,7 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_sample.py F @@ -127,7 +127,7 @@ ================================= FAILURES ================================= ____________________________ TestClass.test_two ____________________________ - self = + self = def test_two(self): x = "hello" @@ -163,7 +163,7 @@ ================================= FAILURES ================================= _____________________________ test_needsfiles ______________________________ - tmpdir = local('/tmp/pytest-18/test_needsfiles0') + tmpdir = local('/tmp/pytest-108/test_needsfiles0') def test_needsfiles(tmpdir): print (tmpdir) @@ -172,8 +172,8 @@ test_tmpdir.py:3: AssertionError --------------------------- Captured stdout call --------------------------- - /tmp/pytest-18/test_needsfiles0 - 1 failed in 0.01 seconds + /tmp/pytest-108/test_needsfiles0 + 1 failed in 0.02 seconds Before the test runs, a unique-per-test-invocation temporary directory was created. More info at :ref:`tmpdir handling`. diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/index.txt --- a/doc/en/index.txt +++ b/doc/en/index.txt @@ -1,11 +1,6 @@ .. _features: -.. note:: - - next training: `professional testing with pytest and tox `_, 24-26th November 2014, Freiburg, Germany - - pytest: helps you write better programs ============================================= diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/parametrize.txt --- a/doc/en/parametrize.txt +++ b/doc/en/parametrize.txt @@ -53,7 +53,7 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 3 items test_expectation.py ..F @@ -100,12 +100,12 @@ $ py.test =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 3 items test_expectation.py ..x - =================== 2 passed, 1 xfailed in 0.02 seconds ==================== + =================== 2 passed, 1 xfailed in 0.01 seconds ==================== The one parameter set which caused a failure previously now shows up as an "xfailed (expected to fail)" test. @@ -170,8 +170,8 @@ def test_valid_string(stringinput): > assert stringinput.isalpha() - E assert () - E + where = '!'.isalpha + E assert () + E + where = '!'.isalpha test_strings.py:3: AssertionError 1 failed in 0.01 seconds @@ -185,7 +185,7 @@ $ py.test -q -rs test_strings.py s ========================= short test summary info ========================== - SKIP [1] /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1139: got empty parameter set, function test_valid_string at /tmp/doc-exec-180/test_strings.py:1 + SKIP [1] /home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/python.py:1139: got empty parameter set, function test_valid_string at /tmp/doc-exec-23/test_strings.py:1 1 skipped in 0.01 seconds For further examples, you might want to look at :ref:`more diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/skipping.txt --- a/doc/en/skipping.txt +++ b/doc/en/skipping.txt @@ -164,7 +164,7 @@ example $ py.test -rx xfail_demo.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 7 items xfail_demo.py xxxxxxx @@ -182,7 +182,7 @@ reason: reason XFAIL xfail_demo.py::test_hello7 - ======================== 7 xfailed in 0.05 seconds ========================= + ======================== 7 xfailed in 0.04 seconds ========================= .. _`skip/xfail with parametrize`: diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/tmpdir.txt --- a/doc/en/tmpdir.txt +++ b/doc/en/tmpdir.txt @@ -29,7 +29,7 @@ $ py.test test_tmpdir.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 1 items test_tmpdir.py F @@ -37,7 +37,7 @@ ================================= FAILURES ================================= _____________________________ test_create_file _____________________________ - tmpdir = local('/tmp/pytest-19/test_create_file0') + tmpdir = local('/tmp/pytest-109/test_create_file0') def test_create_file(tmpdir): p = tmpdir.mkdir("sub").join("hello.txt") @@ -48,7 +48,7 @@ E assert 0 test_tmpdir.py:7: AssertionError - ========================= 1 failed in 0.01 seconds ========================= + ========================= 1 failed in 0.02 seconds ========================= .. _`base temporary directory`: diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 doc/en/unittest.txt --- a/doc/en/unittest.txt +++ b/doc/en/unittest.txt @@ -88,7 +88,7 @@ $ py.test test_unittest_db.py =========================== test session starts ============================ - platform linux -- Python 3.4.0 -- py-1.4.25 -- pytest-2.6.3 + platform linux -- Python 3.4.0 -- py-1.4.26 -- pytest-2.6.4 collected 2 items test_unittest_db.py FF @@ -101,7 +101,7 @@ def test_method1(self): assert hasattr(self, "db") > assert 0, self.db # fail for demo purposes - E AssertionError: .DummyDB object at 0x2b938b865208> + E AssertionError: .DummyDB object at 0x2b98cc5a2e80> E assert 0 test_unittest_db.py:9: AssertionError @@ -111,11 +111,11 @@ def test_method2(self): > assert 0, self.db # fail for demo purposes - E AssertionError: .DummyDB object at 0x2b938b865208> + E AssertionError: .DummyDB object at 0x2b98cc5a2e80> E assert 0 test_unittest_db.py:12: AssertionError - ========================= 2 failed in 0.05 seconds ========================= + ========================= 2 failed in 0.04 seconds ========================= This default pytest traceback shows that the two test methods share the same ``self.db`` instance which was our intention diff -r 2a242d5129aa1e35a07f0979e9b7ddcc1b348c2d -r e90bc855646d43cda0ead0643ad3fc525e5385c4 setup.py --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ name='pytest', description='pytest: simple powerful testing with Python', long_description=long_description, - version='2.6.4.dev2', + version='2.6.4', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], https://bitbucket.org/hpk42/pytest/commits/f03b6de8325f/ Changeset: f03b6de8325f Branch: pytest-2.6 User: hpk42 Date: 2014-10-24 13:24:44+00:00 Summary: backport pastebin fix Affected #: 3 files diff -r e90bc855646d43cda0ead0643ad3fc525e5385c4 -r f03b6de8325f5b6c35cea7c3de092f134ea8ef07 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -2.6.4.dev +2.6.4 ---------- - Improve assertion failure reporting on iterables, by using ndiff and pprint. @@ -18,6 +18,8 @@ - fix issue620: add explanation in the --genscript target about what the binary blob means. Thanks Dinu Gherman. +- fix issue614: fixed pastebin support. + 2.6.3 ----------- diff -r e90bc855646d43cda0ead0643ad3fc525e5385c4 -r f03b6de8325f5b6c35cea7c3de092f134ea8ef07 _pytest/pastebin.py --- a/_pytest/pastebin.py +++ b/_pytest/pastebin.py @@ -1,10 +1,6 @@ """ submit failure or test session information to a pastebin service. """ import py, sys -class url: - base = "http://bpaste.net" - xmlrpc = base + "/xmlrpc/" - show = base + "/show/" def pytest_addoption(parser): group = parser.getgroup("terminal reporting") @@ -27,22 +23,45 @@ def pytest_unconfigure(config): if hasattr(config, '_pastebinfile'): + # get terminal contents and delete file config._pastebinfile.seek(0) sessionlog = config._pastebinfile.read() config._pastebinfile.close() del config._pastebinfile - proxyid = getproxy().newPaste("python", sessionlog) - pastebinurl = "%s%s" % (url.show, proxyid) - sys.stderr.write("pastebin session-log: %s\n" % pastebinurl) + # undo our patching in the terminal reporter tr = config.pluginmanager.getplugin('terminalreporter') del tr._tw.__dict__['write'] + # write summary + tr.write_sep("=", "Sending information to Paste Service") + pastebinurl = create_new_paste(sessionlog) + tr.write_line("pastebin session-log: %s\n" % pastebinurl) -def getproxy(): +def create_new_paste(contents): + """ + Creates a new paste using bpaste.net service. + + :contents: paste contents + :returns: url to the pasted contents + """ + import re if sys.version_info < (3, 0): - from xmlrpclib import ServerProxy + from urllib import urlopen, urlencode else: - from xmlrpc.client import ServerProxy - return ServerProxy(url.xmlrpc).pastes + from urllib.request import urlopen + from urllib.parse import urlencode + + params = { + 'code': contents, + 'lexer': 'python3' if sys.version_info[0] == 3 else 'python', + 'expiry': '1week', + } + url = 'https://bpaste.net' + response = urlopen(url, data=urlencode(params)).read() + m = re.search(r'href="/raw/(\w+)"', response) + if m: + return '%s/show/%s' % (url, m.group(1)) + else: + return 'bad response: ' + response def pytest_terminal_summary(terminalreporter): if terminalreporter.config.option.pastebin != "failed": @@ -50,9 +69,6 @@ tr = terminalreporter if 'failed' in tr.stats: terminalreporter.write_sep("=", "Sending information to Paste Service") - if tr.config.option.debug: - terminalreporter.write_line("xmlrpcurl: %s" %(url.xmlrpc,)) - serverproxy = getproxy() for rep in terminalreporter.stats.get('failed'): try: msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc @@ -62,6 +78,5 @@ rep.toterminal(tw) s = tw.stringio.getvalue() assert len(s) - proxyid = serverproxy.newPaste("python", s) - pastebinurl = "%s%s" % (url.show, proxyid) + pastebinurl = create_new_paste(s) tr.write_line("%s --> %s" %(msg, pastebinurl)) diff -r e90bc855646d43cda0ead0643ad3fc525e5385c4 -r f03b6de8325f5b6c35cea7c3de092f134ea8ef07 testing/test_pastebin.py --- a/testing/test_pastebin.py +++ b/testing/test_pastebin.py @@ -1,13 +1,13 @@ +import sys +import pytest class TestPasting: - def pytest_funcarg__pastebinlist(self, request): - mp = request.getfuncargvalue("monkeypatch") + + @pytest.fixture + def pastebinlist(self, monkeypatch, request): pastebinlist = [] - class MockProxy: - def newPaste(self, language, code): - pastebinlist.append((language, code)) plugin = request.config.pluginmanager.getplugin('pastebin') - mp.setattr(plugin, 'getproxy', MockProxy) + monkeypatch.setattr(plugin, 'create_new_paste', pastebinlist.append) return pastebinlist def test_failed(self, testdir, pastebinlist): @@ -22,8 +22,7 @@ """) reprec = testdir.inline_run(testpath, "--paste=failed") assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] + s = pastebinlist[0] assert s.find("def test_fail") != -1 assert reprec.countoutcomes() == [1,1,1] @@ -37,22 +36,52 @@ def test_skip(): pytest.skip("") """) - reprec = testdir.inline_run(testpath, "--pastebin=all") + reprec = testdir.inline_run(testpath, "--pastebin=all", '-v') assert reprec.countoutcomes() == [1,1,1] assert len(pastebinlist) == 1 - assert pastebinlist[0][0] == "python" - s = pastebinlist[0][1] - for x in 'test_fail test_skip skipped'.split(): - assert s.find(x), (s, x) + s = pastebinlist[0] + for x in 'test_fail test_skip test_pass'.split(): + assert x in s -class TestRPCClient: - def pytest_funcarg__pastebin(self, request): +class TestPaste: + + @pytest.fixture + def pastebin(self, request): return request.config.pluginmanager.getplugin('pastebin') - def test_getproxy(self, pastebin): - proxy = pastebin.getproxy() - assert proxy is not None - assert proxy.__class__.__module__.startswith('xmlrpc') + @pytest.fixture + def mocked_urlopen(self, monkeypatch): + """ + monkeypatch the actual urlopen calls done by the internal plugin + function that connects to bpaste service. + """ + calls = [] + def mocked(url, data): + calls.append((url, data)) + class DummyFile: + def read(self): + # part of html of a normal response + return 'View raw.' + return DummyFile() + if sys.version_info < (3, 0): + import urllib + monkeypatch.setattr(urllib, 'urlopen', mocked) + else: + import urllib.request + monkeypatch.setattr(urllib.request, 'urlopen', mocked) + return calls + def test_create_new_paste(self, pastebin, mocked_urlopen): + result = pastebin.create_new_paste('full-paste-contents') + assert result == 'https://bpaste.net/show/3c0c6750bd' + assert len(mocked_urlopen) == 1 + url, data = mocked_urlopen[0] + lexer = 'python3' if sys.version_info[0] == 3 else 'python' + assert url == 'https://bpaste.net' + assert 'lexer=%s' % lexer in data + assert 'code=full-paste-contents' in data + assert 'expiry=1week' in data + + https://bitbucket.org/hpk42/pytest/commits/773b7c62aaa1/ Changeset: 773b7c62aaa1 Branch: pytest-2.6 User: hpk42 Date: 2014-10-24 15:12:24+00:00 Summary: Added tag 2.6.4 for changeset f03b6de8325f Affected #: 1 file diff -r f03b6de8325f5b6c35cea7c3de092f134ea8ef07 -r 773b7c62aaa11236aaf658fe4f1ddefc2efa7213 .hgtags --- a/.hgtags +++ b/.hgtags @@ -72,3 +72,4 @@ a4f9639702baa3eb4f3b16e162f74f7b69f3f9e1 2.6.1 a4f25c5e649892b5cc746d21be971e4773478af9 2.6.2 2967aa416a4f3cdb65fc75073a2a148e1f372742 2.6.3 +f03b6de8325f5b6c35cea7c3de092f134ea8ef07 2.6.4 Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Fri Oct 24 17:20:06 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 15:20:06 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: fix changelog -- we should have all changes in trunk that are in 2.6.4 Message-ID: <20141024152006.13650.52067@app06.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/44e305c64743/ Changeset: 44e305c64743 User: hpk42 Date: 2014-10-24 15:19:54+00:00 Summary: fix changelog -- we should have all changes in trunk that are in 2.6.4 Affected #: 1 file diff -r 64328a5ea94bdc51909a06cfd6d05a01ef3ad71a -r 44e305c647431b91ecc88d073f201b9d74dff6d8 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,5 @@ -2.7.0.dev ----------- +2.7.0.dev (compared to 2.6.4) +----------------------------- - implement issue351: add ability to specify parametrize ids as a callable to generate custom test ids. Thanks Brianna Laugher for the idea and @@ -23,13 +23,12 @@ - "python_classes" and "python_functions" options now support glob-patterns for test discovery, as discussed in issue600. Thanks Ldiary Translations. -- fix issue614: fixed pastebin support. - - -2.6.4.dev + +2.6.4 ---------- -- Improve assertion failure reporting on iterables, by using ndiff and pprint. +- Improve assertion failure reporting on iterables, by using ndiff and + pprint. - removed outdated japanese docs from source tree. @@ -43,6 +42,11 @@ - fix issue604: Escape % character in the assertion message. +- fix issue620: add explanation in the --genscript target about what + the binary blob means. Thanks Dinu Gherman. + +- fix issue614: fixed pastebin support. + 2.6.3 ----------- Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From builds at drone.io Fri Oct 24 17:28:25 2014 From: builds at drone.io (Drone.io Build) Date: Fri, 24 Oct 2014 15:28:25 +0000 Subject: [Pytest-commit] [SUCCESS] pytest - # 367 Message-ID: <20141024152808.66772.78811@drone.io> Build was Successful Build : https://drone.io/bitbucket.org/hpk42/pytest/367 Project : https://drone.io/bitbucket.org/hpk42/pytest Repository : https://bitbucket.org/hpk42/pytest Version : 3733:773b7c62aaa1 Author : holger krekel Branch : pytest-2.6 Message: Added tag 2.6.4 for changeset f03b6de8325f -------------- next part -------------- An HTML attachment was scrubbed... URL: From issues-reply at bitbucket.org Fri Oct 24 19:31:34 2014 From: issues-reply at bitbucket.org (Alex Gaynor) Date: Fri, 24 Oct 2014 17:31:34 -0000 Subject: [Pytest-commit] Issue #621: Random "object" shows up with multiple parametrization (hpk42/pytest) Message-ID: <20141024173134.30426.25095@app10.ash-private.bitbucket.org> New issue 621: Random "object" shows up with multiple parametrization https://bitbucket.org/hpk42/pytest/issue/621/random-object-shows-up-with-multiple Alex Gaynor: If you parametrize a test twice, with one of them being an empty list, you end up with a random instance of `object` being passed to that fixture. Here is an example: ``` import pytest @pytest.mark.parametrize("b", [1]) @pytest.mark.parametrize("a", []) def test_foo(a, b): raise ZeroDivisionError(a) ``` (this also shows up with `metafunc.parametrize()`, which is how I originally discovered it) If you don't have teh `parametrize("b", [1])`, it correctly skips the test. From commits-noreply at bitbucket.org Fri Oct 24 20:04:19 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 18:04:19 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141024180419.3869.32561@app06.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/a7696e01e03c/ Changeset: a7696e01e03c Branch: alex_gaynor/mark-pytest-as-a-universal-wheel-1414169551518 User: alex_gaynor Date: 2014-10-24 16:52:43+00:00 Summary: Mark pytest as a universal wheel Affected #: 1 file diff -r 44e305c647431b91ecc88d073f201b9d74dff6d8 -r a7696e01e03c0f6d4cd77632cf30462e9e20911f setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -5,3 +5,6 @@ [upload_sphinx] upload-dir = doc/en/build/html + +[wheel] +universal = 1 https://bitbucket.org/hpk42/pytest/commits/3efdfb4625d3/ Changeset: 3efdfb4625d3 User: hpk42 Date: 2014-10-24 18:04:13+00:00 Summary: Merged in alex_gaynor/pytest-1/alex_gaynor/mark-pytest-as-a-universal-wheel-1414169551518 (pull request #230) Mark pytest as a universal wheel Affected #: 1 file diff -r 44e305c647431b91ecc88d073f201b9d74dff6d8 -r 3efdfb4625d3c2603190fb6fe22bf13bf25479e6 setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -5,3 +5,6 @@ [upload_sphinx] upload-dir = doc/en/build/html + +[wheel] +universal = 1 Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Fri Oct 24 20:04:19 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Fri, 24 Oct 2014 18:04:19 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: Merged in alex_gaynor/pytest-1/alex_gaynor/mark-pytest-as-a-universal-wheel-1414169551518 (pull request #230) Message-ID: <20141024180419.16667.16529@app04.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/3efdfb4625d3/ Changeset: 3efdfb4625d3 User: hpk42 Date: 2014-10-24 18:04:13+00:00 Summary: Merged in alex_gaynor/pytest-1/alex_gaynor/mark-pytest-as-a-universal-wheel-1414169551518 (pull request #230) Mark pytest as a universal wheel Affected #: 1 file diff -r 44e305c647431b91ecc88d073f201b9d74dff6d8 -r 3efdfb4625d3c2603190fb6fe22bf13bf25479e6 setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -5,3 +5,6 @@ [upload_sphinx] upload-dir = doc/en/build/html + +[wheel] +universal = 1 Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Sat Oct 25 01:05:27 2014 From: issues-reply at bitbucket.org (Floris Bruynooghe) Date: Fri, 24 Oct 2014 23:05:27 -0000 Subject: [Pytest-commit] Issue #622: Can py.test be a universal wheel? (hpk42/pytest) Message-ID: <20141024230527.6475.19195@app09.ash-private.bitbucket.org> New issue 622: Can py.test be a universal wheel? https://bitbucket.org/hpk42/pytest/issue/622/can-pytest-be-a-universal-wheel Floris Bruynooghe: Because a closed pull-request is probably a place where this will be lost I'll repeat this here, sorry for the noise. The question is whether py.test is a universal wheel, some claim it is not because a wheel built on python 2.6 won't run on 2.7+ or vice versa due to the extra dependency for 2.6. Previous pull requests and issues: https://bitbucket.org/hpk42/pytest/pull-request/179/marked-pytest-as-being-a-universal-wheel/diff https://bitbucket.org/hpk42/pytest/issue/566/pytest-is-no-longer-a-universal-wheel https://bitbucket.org/hpk42/pytest/pull-request/198/removed-marking-pytest-as-universal-py26/diff cc @alex_gaynor @hpk42 @sontek @msabramo From commits-noreply at bitbucket.org Sat Oct 25 07:22:25 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sat, 25 Oct 2014 05:22:25 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: remove "universal wheel" again until the py26/py27 difference (argparse) does not play a role anymore. Message-ID: <20141025052225.22440.63866@app08.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/88ccebd34c49/ Changeset: 88ccebd34c49 User: hpk42 Date: 2014-10-25 05:21:21+00:00 Summary: remove "universal wheel" again until the py26/py27 difference (argparse) does not play a role anymore. Affected #: 1 file diff -r 3efdfb4625d3c2603190fb6fe22bf13bf25479e6 -r 88ccebd34c4905ce28c6ee8465d014c556cc810f setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -6,5 +6,3 @@ [upload_sphinx] upload-dir = doc/en/build/html -[wheel] -universal = 1 Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Sun Oct 26 10:52:34 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sun, 26 Oct 2014 09:52:34 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: bump version to 2.7 on default Message-ID: <20141026095234.8189.2897@app02.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/14f5f7ccc0fe/ Changeset: 14f5f7ccc0fe User: hpk42 Date: 2014-10-26 09:52:04+00:00 Summary: bump version to 2.7 on default Affected #: 2 files diff -r 88ccebd34c4905ce28c6ee8465d014c556cc810f -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 _pytest/__init__.py --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.6.4.dev1' +__version__ = '2.7.0.dev1' diff -r 88ccebd34c4905ce28c6ee8465d014c556cc810f -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 setup.py --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ name='pytest', description='pytest: simple powerful testing with Python', long_description=long_description, - version='2.6.4.dev1', + version='2.7.0.dev1', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Sun Oct 26 11:55:28 2014 From: issues-reply at bitbucket.org (Lutz Prechelt) Date: Sun, 26 Oct 2014 10:55:28 -0000 Subject: [Pytest-commit] Issue #623: capsys: Output is not reported after failing test that called capsys.readouterr() (hpk42/pytest) Message-ID: <20141026105528.11595.55490@app06.ash-private.bitbucket.org> New issue 623: capsys: Output is not reported after failing test that called capsys.readouterr() https://bitbucket.org/hpk42/pytest/issue/623/capsys-output-is-not-reported-after Lutz Prechelt: I see that it might be useful to be *able to suppress* output reporting when using readouterr(). But that this happens automatically and there is no obvious way to turn reporting back on is both surprising and, I think, inconvenient. See a detailed description here: http://stackoverflow.com/questions/26561822/pytest-capsys-checking-output-and-getting-it-reported From commits-noreply at bitbucket.org Mon Oct 27 10:02:23 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 27 Oct 2014 09:02:23 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: fix py26 compatibility Message-ID: <20141027090223.26875.5208@app02.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/fb9d798eba06/ Changeset: fb9d798eba06 User: hpk42 Date: 2014-10-27 09:02:15+00:00 Summary: fix py26 compatibility Affected #: 1 file diff -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -923,8 +923,8 @@ ids = [_idvalset(valindex, valset, argnames, idfn) for valindex, valset in enumerate(argvalues)] if len(set(ids)) < len(ids): - # the user may have provided a bad idfn which means the ids are not unique - ids = ["{}".format(i) + testid for i, testid in enumerate(ids)] + # user may have provided a bad idfn which means the ids are not unique + ids = [str(i) + testid for i, testid in enumerate(ids)] return ids def showfixtures(config): Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Mon Oct 27 16:38:54 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Mon, 27 Oct 2014 15:38:54 -0000 Subject: [Pytest-commit] commit/tox: 6 new changesets Message-ID: <20141027153854.14031.5356@app02.ash-private.bitbucket.org> 6 new commits in tox: https://bitbucket.org/hpk42/tox/commits/0c8a958f574b/ Changeset: 0c8a958f574b Branch: tox-1.8-maint User: hpk42 Date: 2014-10-24 12:58:00+00:00 Summary: adapt test from @msabramo about curly braches (fixes related to issue150) Affected #: 1 file diff -r c80aa9dd3a33c406ac22133f37825003adcee668 -r 0c8a958f574b9d25eb16343e318cf88495087bd5 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -716,12 +716,12 @@ conf = newconfig([], inisource).envconfigs['py24'] argv = conf.commands assert argv[0] == ['echo', '\\{posargs\\}', '='] - assert argv[1] == ['echo', 'posargs ='] + assert argv[1] == ['echo', 'posargs = ', ""] conf = newconfig(['dog', 'cat'], inisource).envconfigs['py24'] argv = conf.commands assert argv[0] == ['echo', '\\{posargs\\}', '=', 'dog', 'cat'] - assert argv[1] == ['echo', 'posargs =', 'dog', 'cat'] + assert argv[1] == ['echo', 'posargs = ', 'dog cat'] def test_rewrite_posargs(self, tmpdir, newconfig): inisource = """ https://bitbucket.org/hpk42/tox/commits/8f476ebf3d18/ Changeset: 8f476ebf3d18 User: hpk42 Date: 2014-10-24 13:00:32+00:00 Summary: port fix of test Affected #: 1 file diff -r d4916d4cc83a6abb7706383e9a249242fb4337fc -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 tests/test_config.py --- a/tests/test_config.py +++ b/tests/test_config.py @@ -735,12 +735,12 @@ conf = newconfig([], inisource).envconfigs['py24'] argv = conf.commands assert argv[0] == ['echo', '\\{posargs\\}', '='] - assert argv[1] == ['echo', 'posargs ='] + assert argv[1] == ['echo', 'posargs = ', ""] conf = newconfig(['dog', 'cat'], inisource).envconfigs['py24'] argv = conf.commands assert argv[0] == ['echo', '\\{posargs\\}', '=', 'dog', 'cat'] - assert argv[1] == ['echo', 'posargs =', 'dog', 'cat'] + assert argv[1] == ['echo', 'posargs = ', 'dog cat'] def test_rewrite_posargs(self, tmpdir, newconfig): inisource = """ https://bitbucket.org/hpk42/tox/commits/2aa9b587d12a/ Changeset: 2aa9b587d12a Branch: tox-1.8-maint User: hpk42 Date: 2014-10-24 18:18:37+00:00 Summary: finalize 1.8.1 Affected #: 4 files diff -r 0c8a958f574b9d25eb16343e318cf88495087bd5 -r 2aa9b587d12ae4b325cb4d5a9a801a222ffc328c CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -1.8.1.dev +1.8.1 ----------- - fix issue190: allow setenv to be empty. diff -r 0c8a958f574b9d25eb16343e318cf88495087bd5 -r 2aa9b587d12ae4b325cb4d5a9a801a222ffc328c doc/conf.py --- a/doc/conf.py +++ b/doc/conf.py @@ -49,7 +49,7 @@ # # The short X.Y version. release = "1.8" -version = "1.8.0" +version = "1.8.1" # The full version, including alpha/beta/rc tags. # The language for content autogenerated by Sphinx. Refer to documentation diff -r 0c8a958f574b9d25eb16343e318cf88495087bd5 -r 2aa9b587d12ae4b325cb4d5a9a801a222ffc328c setup.py --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ description='virtualenv-based automation of test activities', long_description=open("README.rst").read(), url='http://tox.testrun.org/', - version='1.8.1.dev1', + version='1.8.1', license='http://opensource.org/licenses/MIT', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], author='holger krekel', diff -r 0c8a958f574b9d25eb16343e318cf88495087bd5 -r 2aa9b587d12ae4b325cb4d5a9a801a222ffc328c tox/__init__.py --- a/tox/__init__.py +++ b/tox/__init__.py @@ -1,5 +1,5 @@ # -__version__ = '1.8.1.dev1' +__version__ = '1.8.1' class exception: class Error(Exception): https://bitbucket.org/hpk42/tox/commits/5841aacb4950/ Changeset: 5841aacb4950 Branch: tox-1.8-maint User: hpk42 Date: 2014-10-27 15:29:17+00:00 Summary: Added tag 1.8.1 for changeset 2aa9b587d12a Affected #: 1 file diff -r 2aa9b587d12ae4b325cb4d5a9a801a222ffc328c -r 5841aacb49506e93ed2631ca1627f016e911b3c9 .hgtags --- a/.hgtags +++ b/.hgtags @@ -19,3 +19,4 @@ c7155565c89d1bb3684c881ca774d921188223a0 1.7.1 e319e464470a5885505ab3e1da1a3a7abe5f86e2 1.7.2 b7374e501bde055c5c2b572e6512d22e10f60088 1.8.0 +2aa9b587d12ae4b325cb4d5a9a801a222ffc328c 1.8.1 https://bitbucket.org/hpk42/tox/commits/245cd0390513/ Changeset: 245cd0390513 Branch: tox-1.8-maint User: hpk42 Date: 2014-10-27 12:06:29+00:00 Summary: fix issue199 -- fill result log structure ahead of creating virtualenv Affected #: 5 files diff -r 5841aacb49506e93ed2631ca1627f016e911b3c9 -r 245cd0390513e1430e4bb5c73c3c96f6310ce5ab CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +1.8.2.dev +----------- + +- fix issue199: fill resultlog structure ahead of virtualenv creation + 1.8.1 ----------- @@ -11,7 +16,6 @@ - report subprocess exit code when execution fails. Thanks Marius Gedminas. - 1.8.0 ----------- diff -r 5841aacb49506e93ed2631ca1627f016e911b3c9 -r 245cd0390513e1430e4bb5c73c3c96f6310ce5ab setup.py --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ description='virtualenv-based automation of test activities', long_description=open("README.rst").read(), url='http://tox.testrun.org/', - version='1.8.1', + version='1.8.2.dev1', license='http://opensource.org/licenses/MIT', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], author='holger krekel', diff -r 5841aacb49506e93ed2631ca1627f016e911b3c9 -r 245cd0390513e1430e4bb5c73c3c96f6310ce5ab tests/test_result.py --- a/tests/test_result.py +++ b/tests/test_result.py @@ -10,6 +10,18 @@ p.write("whatever") return p +def test_pre_set_header(pkg): + replog = ResultLog() + d = replog.dict + assert replog.dict == d + assert replog.dict["reportversion"] == "1" + assert replog.dict["toxversion"] == tox.__version__ + assert replog.dict["platform"] == sys.platform + assert replog.dict["host"] == py.std.socket.getfqdn() + data = replog.dumps_json() + replog2 = ResultLog.loads_json(data) + assert replog2.dict == replog.dict + def test_set_header(pkg): replog = ResultLog() d = replog.dict diff -r 5841aacb49506e93ed2631ca1627f016e911b3c9 -r 245cd0390513e1430e4bb5c73c3c96f6310ce5ab tox/__init__.py --- a/tox/__init__.py +++ b/tox/__init__.py @@ -1,5 +1,5 @@ # -__version__ = '1.8.1' +__version__ = '1.8.2.dev1' class exception: class Error(Exception): diff -r 5841aacb49506e93ed2631ca1627f016e911b3c9 -r 245cd0390513e1430e4bb5c73c3c96f6310ce5ab tox/result.py --- a/tox/result.py +++ b/tox/result.py @@ -1,9 +1,7 @@ import sys import py -try: - import json -except ImportError: - import simplejson as json +from tox import __version__ as toxver +import json class ResultLog: @@ -11,12 +9,11 @@ if dict is None: dict = {} self.dict = dict - - def set_header(self, installpkg): - from tox import __version__ as toxver self.dict.update({"reportversion": "1", "toxversion": toxver}) self.dict["platform"] = sys.platform self.dict["host"] = py.std.socket.getfqdn() + + def set_header(self, installpkg): self.dict["installpkg"] = dict( md5=installpkg.computehash("md5"), sha256=installpkg.computehash("sha256"), https://bitbucket.org/hpk42/tox/commits/9d8f0d5319e7/ Changeset: 9d8f0d5319e7 User: hpk42 Date: 2014-10-27 15:38:22+00:00 Summary: merge tox-1.8 maintenance Affected #: 9 files diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 .hgtags --- a/.hgtags +++ b/.hgtags @@ -19,3 +19,4 @@ c7155565c89d1bb3684c881ca774d921188223a0 1.7.1 e319e464470a5885505ab3e1da1a3a7abe5f86e2 1.7.2 b7374e501bde055c5c2b572e6512d22e10f60088 1.8.0 +2aa9b587d12ae4b325cb4d5a9a801a222ffc328c 1.8.1 diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -6,12 +6,21 @@ dependencies. Use ``pip_pre = true`` in a testenv or the ``--pre`` command-line option to restore the previous behavior. +- fix issue199: fill resultlog structure ahead of virtualenv creation -1.8.1.dev + +1.8.1 ----------- - fix issue190: allow setenv to be empty. +- allow escaping curly braces with "\". Thanks Marc Abramowitz for the PR. + +- allow "." names in environment names such that "py27-django1.7" is a + valid environment name. Thanks Alex Gaynor and Alex Schepanovski. + +- report subprocess exit code when execution fails. Thanks Marius + Gedminas. 1.8.0 ----------- diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 doc/conf.py --- a/doc/conf.py +++ b/doc/conf.py @@ -49,7 +49,7 @@ # # The short X.Y version. release = "1.8" -version = "1.8.0" +version = "1.8.1" # The full version, including alpha/beta/rc tags. # The language for content autogenerated by Sphinx. Refer to documentation diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 doc/config.txt --- a/doc/config.txt +++ b/doc/config.txt @@ -259,6 +259,10 @@ Any ``key=value`` setting in an ini-file can make use of value substitution through the ``{...}`` string-substitution pattern. +You can escape curly braces with the ``\`` character if you need them, for example:: + + commands = echo "\{posargs\}" = {posargs} + Globally available substitutions ++++++++++++++++++++++++++++++++ diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 setup.py --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ description='virtualenv-based automation of test activities', long_description=open("README.rst").read(), url='http://tox.testrun.org/', - version='1.8.1.dev1', + version='1.8.2.dev1', license='http://opensource.org/licenses/MIT', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], author='holger krekel', diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 tests/test_result.py --- a/tests/test_result.py +++ b/tests/test_result.py @@ -10,6 +10,18 @@ p.write("whatever") return p +def test_pre_set_header(pkg): + replog = ResultLog() + d = replog.dict + assert replog.dict == d + assert replog.dict["reportversion"] == "1" + assert replog.dict["toxversion"] == tox.__version__ + assert replog.dict["platform"] == sys.platform + assert replog.dict["host"] == py.std.socket.getfqdn() + data = replog.dumps_json() + replog2 = ResultLog.loads_json(data) + assert replog2.dict == replog.dict + def test_set_header(pkg): replog = ResultLog() d = replog.dict diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 tox/__init__.py --- a/tox/__init__.py +++ b/tox/__init__.py @@ -1,5 +1,5 @@ # -__version__ = '1.8.1.dev1' +__version__ = '1.8.2.dev1' class exception: class Error(Exception): diff -r 8f476ebf3d18236ff707367a2a604d1fe15b6681 -r 9d8f0d5319e77951c0542ece53c960dc3b2886e7 tox/result.py --- a/tox/result.py +++ b/tox/result.py @@ -1,9 +1,7 @@ import sys import py -try: - import json -except ImportError: - import simplejson as json +from tox import __version__ as toxver +import json class ResultLog: @@ -11,12 +9,11 @@ if dict is None: dict = {} self.dict = dict - - def set_header(self, installpkg): - from tox import __version__ as toxver self.dict.update({"reportversion": "1", "toxversion": toxver}) self.dict["platform"] = sys.platform self.dict["host"] = py.std.socket.getfqdn() + + def set_header(self, installpkg): self.dict["installpkg"] = dict( md5=installpkg.computehash("md5"), sha256=installpkg.computehash("sha256"), Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 28 14:26:26 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 28 Oct 2014 13:26:26 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141028132626.11132.64676@app05.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/d227432fc014/ Changeset: d227432fc014 Branch: format_boolop_percent6 User: tomviner Date: 2014-10-27 08:31:33+00:00 Summary: fix for issue615: _format_boolop must escape % fix test for issue615: expression must eval False Affected #: 3 files diff -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 -r d227432fc014a19cc221946a1175f438dd3916cf AUTHORS --- a/AUTHORS +++ b/AUTHORS @@ -45,3 +45,4 @@ Trevor Bekolay David Mohr Nicolas Delaby +Tom Viner diff -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 -r d227432fc014a19cc221946a1175f438dd3916cf _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -382,7 +382,12 @@ return not hasattr(obj, "__name__") and not py.builtin.callable(obj) def _format_boolop(explanations, is_or): - return "(" + (is_or and " or " or " and ").join(explanations) + ")" + explanation = "(" + (is_or and " or " or " and ").join(explanations) + ")" + if py.builtin._istext(explanation): + t = py.builtin.text + else: + t = py.builtin.bytes + return explanation.replace(t('%'), t('%%')) def _call_reprcompare(ops, results, expls, each_obj): for i, res, expl in zip(range(len(ops)), results, expls): diff -r 14f5f7ccc0fe611e36f8edecb122fb440f500ec9 -r d227432fc014a19cc221946a1175f438dd3916cf testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,15 +270,13 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" - @pytest.mark.xfail(reason='unfixed') - def test_and_or_percent(self): - # issue 615 - ValueError on compound assert with percent + def test_boolop_percent(self): def f(): - assert 3 % 2 or False - assert getmsg(f) == "assert (3 % 2) or False" + assert 3 % 2 and False + assert getmsg(f) == "assert ((3 % 2) and False)" def f(): - assert True and 7 % 3 - assert getmsg(f) == "assert True and (7 % 3)" + assert False or 4 % 2 + assert getmsg(f) == "assert (False or (4 % 2))" def test_call(self): def g(a=42, *args, **kwargs): https://bitbucket.org/hpk42/pytest/commits/4d292f7031ab/ Changeset: 4d292f7031ab User: flub Date: 2014-10-28 13:26:21+00:00 Summary: Merged in tomviner/pytest/format_boolop_percent6 (pull request #231) fix for issue #615: _format_boolop must escape % Affected #: 3 files diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a AUTHORS --- a/AUTHORS +++ b/AUTHORS @@ -45,3 +45,4 @@ Trevor Bekolay David Mohr Nicolas Delaby +Tom Viner diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -382,7 +382,12 @@ return not hasattr(obj, "__name__") and not py.builtin.callable(obj) def _format_boolop(explanations, is_or): - return "(" + (is_or and " or " or " and ").join(explanations) + ")" + explanation = "(" + (is_or and " or " or " and ").join(explanations) + ")" + if py.builtin._istext(explanation): + t = py.builtin.text + else: + t = py.builtin.bytes + return explanation.replace(t('%'), t('%%')) def _call_reprcompare(ops, results, expls, each_obj): for i, res, expl in zip(range(len(ops)), results, expls): diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,15 +270,13 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" - @pytest.mark.xfail(reason='unfixed') - def test_and_or_percent(self): - # issue 615 - ValueError on compound assert with percent + def test_boolop_percent(self): def f(): - assert 3 % 2 or False - assert getmsg(f) == "assert (3 % 2) or False" + assert 3 % 2 and False + assert getmsg(f) == "assert ((3 % 2) and False)" def f(): - assert True and 7 % 3 - assert getmsg(f) == "assert True and (7 % 3)" + assert False or 4 % 2 + assert getmsg(f) == "assert (False or (4 % 2))" def test_call(self): def g(a=42, *args, **kwargs): Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 28 14:26:26 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 28 Oct 2014 13:26:26 -0000 Subject: [Pytest-commit] commit/pytest: flub: Merged in tomviner/pytest/format_boolop_percent6 (pull request #231) Message-ID: <20141028132626.12179.46320@app14.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/4d292f7031ab/ Changeset: 4d292f7031ab User: flub Date: 2014-10-28 13:26:21+00:00 Summary: Merged in tomviner/pytest/format_boolop_percent6 (pull request #231) fix for issue #615: _format_boolop must escape % Affected #: 3 files diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a AUTHORS --- a/AUTHORS +++ b/AUTHORS @@ -45,3 +45,4 @@ Trevor Bekolay David Mohr Nicolas Delaby +Tom Viner diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a _pytest/assertion/rewrite.py --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -382,7 +382,12 @@ return not hasattr(obj, "__name__") and not py.builtin.callable(obj) def _format_boolop(explanations, is_or): - return "(" + (is_or and " or " or " and ").join(explanations) + ")" + explanation = "(" + (is_or and " or " or " and ").join(explanations) + ")" + if py.builtin._istext(explanation): + t = py.builtin.text + else: + t = py.builtin.bytes + return explanation.replace(t('%'), t('%%')) def _call_reprcompare(ops, results, expls, each_obj): for i, res, expl in zip(range(len(ops)), results, expls): diff -r fb9d798eba06ab252e7a00c39be588d3d9dd1fb2 -r 4d292f7031ab164eca0039c1c439393717987a6a testing/test_assertrewrite.py --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -270,15 +270,13 @@ assert not 5 % 4 assert getmsg(f) == "assert not (5 % 4)" - @pytest.mark.xfail(reason='unfixed') - def test_and_or_percent(self): - # issue 615 - ValueError on compound assert with percent + def test_boolop_percent(self): def f(): - assert 3 % 2 or False - assert getmsg(f) == "assert (3 % 2) or False" + assert 3 % 2 and False + assert getmsg(f) == "assert ((3 % 2) and False)" def f(): - assert True and 7 % 3 - assert getmsg(f) == "assert True and (7 % 3)" + assert False or 4 % 2 + assert getmsg(f) == "assert (False or (4 % 2))" def test_call(self): def g(a=42, *args, **kwargs): Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From commits-noreply at bitbucket.org Tue Oct 28 14:31:28 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Tue, 28 Oct 2014 13:31:28 -0000 Subject: [Pytest-commit] commit/pytest: 2 new changesets Message-ID: <20141028133128.16578.88758@app08.ash-private.bitbucket.org> 2 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/32f65d22c7c7/ Changeset: 32f65d22c7c7 Branch: format_boolop_percent6 User: flub Date: 2014-10-28 13:27:01+00:00 Summary: Close branch Affected #: 0 files https://bitbucket.org/hpk42/pytest/commits/6b59253d9874/ Changeset: 6b59253d9874 User: flub Date: 2014-10-28 13:31:09+00:00 Summary: Mention fix for issue 615 in changelog Fixes issue 615. Affected #: 1 file diff -r 4d292f7031ab164eca0039c1c439393717987a6a -r 6b59253d98741c49ccc555884a6511bdc79eabf0 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,11 @@ 2.7.0.dev (compared to 2.6.4) ----------------------------- +- fix issue615: assertion re-writing did not correctly escape % signs + when formatting boolean operations, which tripped over mixing + booleans with modulo operators. Thanks to Tom Viner for the report, + triaging and fix. + - implement issue351: add ability to specify parametrize ids as a callable to generate custom test ids. Thanks Brianna Laugher for the idea and implementation. Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Wed Oct 29 22:51:37 2014 From: issues-reply at bitbucket.org (Brian Kearns) Date: Wed, 29 Oct 2014 21:51:37 -0000 Subject: [Pytest-commit] Issue #624: recursive symlink significantly slows collection (hpk42/pytest) Message-ID: <20141029215137.4180.79151@app03.ash-private.bitbucket.org> New issue 624: recursive symlink significantly slows collection https://bitbucket.org/hpk42/pytest/issue/624/recursive-symlink-significantly-slows Brian Kearns: placing "ln -s . link" in a collected dir significantly slows down collection. it seems collection doesn't keep track of directories visited to prevent unnecessary recursion? From issues-reply at bitbucket.org Thu Oct 30 01:15:42 2014 From: issues-reply at bitbucket.org (Andy Freeland) Date: Thu, 30 Oct 2014 00:15:42 -0000 Subject: [Pytest-commit] Issue #200: tox doesn't create `{envtmpdir}` (hpk42/tox) Message-ID: <20141030001542.4349.12070@app05.ash-private.bitbucket.org> New issue 200: tox doesn't create `{envtmpdir}` https://bitbucket.org/hpk42/tox/issue/200/tox-doesnt-create-envtmpdir Andy Freeland: Tox isn't creating `{envtmpdir}` in my testenvs. The documentation doesn't explicitly state that it will, but I would expect it to be created. Sample `tox.ini`: ``` [tox] envlist = py27,py34 skipsdist = true [testenv] whitelist_externals = /bin/ls commands = ls {envtmpdir} ``` Result: ```console $ tox --version && tox -r 1.8.1 imported from /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/lib/python2.7/site-packages/tox/__init__.py py27 recreate: /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py27 py27 runtests: PYTHONHASHSEED='1998573252' py27 runtests: commands[0] | ls /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py27/tmp ls: /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py27/tmp: No such file or directory ERROR: InvocationError: '/bin/ls /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py27/tmp' py34 recreate: /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py34 py34 runtests: PYTHONHASHSEED='1998573252' py34 runtests: commands[0] | ls /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py34/tmp ls: /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py34/tmp: No such file or directory ERROR: InvocationError: '/bin/ls /Users/rouge8/.virtualenvs/tmp-1127fdbcb2378c33/.tox/py34/tmp' __________________________________________________________________________________ summary __________________________________________________________________________________ ERROR: py27: commands failed ERROR: py34: commands failed ``` From issues-reply at bitbucket.org Thu Oct 30 02:17:51 2014 From: issues-reply at bitbucket.org (Buck Evan) Date: Thu, 30 Oct 2014 01:17:51 -0000 Subject: [Pytest-commit] Issue #625: xdist: deadlock under pypy (hpk42/pytest) Message-ID: <20141030011751.8559.95713@app12.ash-private.bitbucket.org> New issue 625: xdist: deadlock under pypy https://bitbucket.org/hpk42/pytest/issue/625/xdist-deadlock-under-pypy Buck Evan: Below is a minimal reproduction. It seems that a few factors need to conspire to tickle this bug: 1. test uses subprocess.Popen and tmpdir fixture 2. test is not run first 3. runner is passed -n greater than 2 (although exactly 2 makes it most likely) Reproduction script: ``` #!python # This is my commandline, on osx: # $ py.test -vvs -n 2 ./demo.py # # I haven't been able to test linux-pypy, but I can't repro under osx-cpython. # # I also notice that each deadlock leaks a worker process from xdist. # I have to go clean them up with killall def test_dummy(tmpdir): """deadlock doesn't occur if i remove this test, or if i put it second""" return import pytest @pytest.mark.timeout(10) # this is necessary just to get some feedback from the test, the deadlock still happens without it. def test_deadlocks_sometimes(tmpdir): # I haven't seen a deadlock if i remove this fixture. """This deadlocks most often (around 50%) with -n2, but still deadlocks with -n >2. I haven't seen it deadlock with -n1. """ from subprocess import Popen Popen( ('echo', 'hi', 'there!'), # doesn't matter what the command is. close_fds=True, # with True, we get a timeout and two stack traces # with False, I see a FAIL after ten seconds, but it continues to deadlock, # and I get a single, different traceback on ctrl+c ) ``` Traceback with close_fds=True: ``` ____________________________________________________________ test_uncolored_pipe ____________________________________________________________ [gw0] darwin -- Python 3.2.5 /Users/buck/venv/venv-update4/bin/pypy3 tmpdir = local('/private/var/folders/ss/ykf37pld1hl480qcdknf_zc577t9rc/T/pytest-239/popen-gw0/test_uncolored_pipe0') @pytest.mark.timeout(10) def test_uncolored_pipe(tmpdir): tmpdir.chdir() from subprocess import Popen return Popen( ('echo', 'hi', 'there!'), > close_fds=True, ).wait() /Users/buck/trees/yelp/venv-update/color.py:13: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /Users/buck/prefices/brew/Cellar/pypy3/2.3.1_1/libexec/lib-python/3/subprocess.py:744: in __init__ restore_signals, start_new_session) /Users/buck/prefices/brew/Cellar/pypy3/2.3.1_1/libexec/lib-python/3/subprocess.py:1359: in _execute_child part = _eintr_retry_call(os.read, errpipe_read, 50000) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ func = , args = (10, 50000) def _eintr_retry_call(func, *args): while True: try: > return func(*args) E Failed: Timeout >10s /Users/buck/prefices/brew/Cellar/pypy3/2.3.1_1/libexec/lib-python/3/subprocess.py:455: Failed ----------------------------------------------------------- Captured stderr call ------------------------------------------------------------ ~~~~~~~~~~~~~~~~~~~~~~~ Stack of (4433383424) ~~~~~~~~~~~~~~~~~~~~~~~~ File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 254, in _perform_spawn reply.run() File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 192, in run self._result = func(*args, **kwargs) File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 914, in _thread_receiver msg = Message.from_io(io) File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 390, in from_io header = io.read(9) # type 1, channel 4, payload 4 File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 360, in read data = self._read(numbytes-len(buf)) ========================================================== short test summary info ========================================================== FAIL color.py::test_uncolored_pipe ==================================================== 1 failed, 1 passed in 11.21 seconds ==================================================== ``` Traceback with close_fds=False: ``` color.py::test_deadlocks_sometimes [gw1] FAILED color.py::test_deadlocks_sometimes ^CTraceback (most recent call last): File "/Users/buck/venv/venv-update4/bin/py.test", line 9, in load_entry_point('pytest==2.6.4', 'console_scripts', 'py.test')() File "/Users/buck/venv/venv-update4/site-packages/_pytest/config.py", line 41, in main return config.hook.pytest_cmdline_main(config=config) File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 413, in __call__ return self._docall(methods, kwargs) File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 424, in _docall res = mc.execute() File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 315, in execute res = method(**kwargs) File "/Users/buck/venv/venv-update4/site-packages/_pytest/main.py", line 116, in pytest_cmdline_main return wrap_session(config, _main) File "/Users/buck/venv/venv-update4/site-packages/_pytest/main.py", line 109, in wrap_session exitstatus=session.exitstatus) File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 413, in __call__ return self._docall(methods, kwargs) File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 424, in _docall res = mc.execute() File "/Users/buck/venv/venv-update4/site-packages/_pytest/core.py", line 315, in execute res = method(**kwargs) File "/Users/buck/venv/venv-update4/site-packages/xdist/dsession.py", line 487, in pytest_sessionfinish nm.teardown_nodes() File "/Users/buck/venv/venv-update4/site-packages/xdist/slavemanage.py", line 59, in teardown_nodes self.group.terminate(self.EXIT_TIMEOUT) File "/Users/buck/venv/venv-update4/site-packages/execnet/multi.py", line 204, in terminate for gw in self._gateways_to_join]) File "/Users/buck/venv/venv-update4/site-packages/execnet/multi.py", line 293, in safe_terminate workerpool.waitall() File "/Users/buck/venv/venv-update4/site-packages/execnet/gateway_base.py", line 302, in waitall return my_waitall_event.wait(timeout=timeout) File "/Users/buck/prefices/brew/Cellar/pypy3/2.3.1_1/libexec/lib-python/3/threading.py", line 422, in wait signaled = self._cond.wait(timeout) File "/Users/buck/prefices/brew/Cellar/pypy3/2.3.1_1/libexec/lib-python/3/threading.py", line 235, in wait waiter.acquire() KeyboardInterrupt ``` From issues-reply at bitbucket.org Thu Oct 30 02:46:52 2014 From: issues-reply at bitbucket.org (John Dennison) Date: Thu, 30 Oct 2014 01:46:52 -0000 Subject: [Pytest-commit] Issue #626: Add custom message to default assert repr (hpk42/pytest) Message-ID: <20141030014652.5620.55416@app10.ash-private.bitbucket.org> New issue 626: Add custom message to default assert repr https://bitbucket.org/hpk42/pytest/issue/626/add-custom-message-to-default-assert-repr John Dennison: I asked a question on stackoverflow and was asked to add an issue for my use case so here i go: http://stackoverflow.com/questions/26620740/appending-to-default-py-test-assertion-output/26642915#26642915 I would like to add additional output to the default assertion failure output. I am able to over ride the output entirely with pytest_assertrepr_compare but i can't seem to get the default output and add my custom message to it. I have tried: from _pytest.assertion.util import assertrepr_compare def pytest_assertrepr_compare(config, op, left, right): pytest_output = assertrepr_compare(config, op, left, right) # append log output to normal compare, but the pytest_output is always None return pytest_output + ['THIS IS MY CUSTOM MESSAGE'] My actual use case is printing logs from remote servers when an assertion fails. If any of my tests fail. display the regular assertion failure and then my custom message. From commits-noreply at bitbucket.org Thu Oct 30 11:46:35 2014 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Thu, 30 Oct 2014 10:46:35 -0000 Subject: [Pytest-commit] commit/pytest: hpk42: add a py.test placeholder setup that errors out when trying to get installed Message-ID: <20141030104635.8859.81846@app02.ash-private.bitbucket.org> 1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/85e3331b83cd/ Changeset: 85e3331b83cd User: hpk42 Date: 2014-10-30 10:38:13+00:00 Summary: add a py.test placeholder setup that errors out when trying to get installed (this is registered at pypi.python.org already) Affected #: 1 file diff -r 6b59253d98741c49ccc555884a6511bdc79eabf0 -r 85e3331b83cda6eee644c473b3b08f10016a3361 extra/setup-py.test/setup.py --- /dev/null +++ b/extra/setup-py.test/setup.py @@ -0,0 +1,11 @@ +import sys +from distutils.core import setup + +if __name__ == "__main__": + if "sdist" not in sys.argv[1:]: + raise ValueError("please use 'pytest' pypi package instead of 'py.test'") + setup( + name="py.test", + version="0.0", + description="please use 'pytest' for installation", + ) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Fri Oct 31 20:40:25 2014 From: issues-reply at bitbucket.org (Jason S) Date: Fri, 31 Oct 2014 19:40:25 -0000 Subject: [Pytest-commit] Issue #627: record auxiliary data? (hpk42/pytest) Message-ID: <20141031194025.2495.92592@app13.ash-private.bitbucket.org> New issue 627: record auxiliary data? https://bitbucket.org/hpk42/pytest/issue/627/record-auxiliary-data Jason S: I posted [this question on StackOverflow.](http://stackoverflow.com/questions/26664029/pytest-recording-results-in-addition-to-the-pass-fail) I am working with some Python testing for some peer-to-peer networking with an embedded system. In particular there is some functionality that is very hard to perform a completely automated test. There are a lot of things I can write clear pass/fail tests, but others that are more difficuIt, and in addition to the PASS or FAIL status of each of the tests, I would like to record additional auxiliary information that a human being can spot-check just to make sure I haven't missed something obvious and should add another test. Is there a way to use pytest to associate auxiliary information with a particular test?