2 new commits in pytest:
https://bitbucket.org/hpk42/pytest/commits/5968d75acef9/
Changeset: 5968d75acef9
User: hpk42
Date: 2013-09-30 13:42:39
Summary: strike keyword argument in favour of new pytest.yield_fixture
decorator
Affected #: 5 files
diff -r 7da5c02ece03592164e4e681ab7463de2a65cedb -r
5968d75acef96230be6fe6b8d0bd656e1628a731 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -16,9 +16,12 @@
new features:
-- experimentally allow fixture functions to "yield" instead of "return"
- a fixture value, allowing direct integration with with-context managers
- in fixture functions and avoiding registration of finalization callbacks.
+- experimentally introduce a new pytest.yield_fixture decorator which
+ has exactly the same parameters as pytest.fixture but expects
+ a ``yield`` statement instead of a ``return statement`` from fixture
functions.
+ This allows direct integration with with-context managers
+ in fixture functions and generally avoids registering of finalization
callbacks
+ in favour of treating the "after-yield" as teardown code.
Thanks Andreas Pelme, Vladimir Keleshev, Floris Bruynooghe, Ronny
Pfannschmidt
and many others for discussions.
diff -r 7da5c02ece03592164e4e681ab7463de2a65cedb -r
5968d75acef96230be6fe6b8d0bd656e1628a731 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -40,7 +40,7 @@
return function
-def fixture(scope="function", params=None, autouse=False, yieldctx=False):
+def fixture(scope="function", params=None, autouse=False):
""" (return a) decorator to mark a fixture factory function.
This decorator can be used (with or or without parameters) to define
@@ -62,16 +62,29 @@
can see it. If False (the default) then an explicit
reference is needed to activate the fixture.
- :arg yieldctx: if True, the fixture function yields a fixture value.
- Code after such a ``yield`` statement is treated as
- teardown code.
"""
if callable(scope) and params is None and autouse == False:
# direct decoration
return FixtureFunctionMarker(
- "function", params, autouse, yieldctx)(scope)
+ "function", params, autouse)(scope)
else:
- return FixtureFunctionMarker(scope, params, autouse, yieldctx)
+ return FixtureFunctionMarker(scope, params, autouse)
+
+def yield_fixture(scope="function", params=None, autouse=False):
+ """ (return a) decorator to mark a yield-fixture factory function
+ (EXPERIMENTAL).
+
+ This takes the same arguments as :py:func:`pytest.fixture` but
+ expects a fixture function to use a ``yield`` instead of a ``return``
+ statement to provide a fixture. See
+ http://pytest.org/en/latest/yieldfixture.html for more info.
+ """
+ if callable(scope) and params is None and autouse == False:
+ # direct decoration
+ return FixtureFunctionMarker(
+ "function", params, autouse, yieldctx=True)(scope)
+ else:
+ return FixtureFunctionMarker(scope, params, autouse, yieldctx=True)
defaultfuncargprefixmarker = fixture()
@@ -136,6 +149,7 @@
raises.Exception = pytest.fail.Exception
return {
'fixture': fixture,
+ 'yield_fixture': yield_fixture,
'raises' : raises,
'collect': {
'Module': Module, 'Class': Class, 'Instance': Instance,
@@ -1675,7 +1689,7 @@
if yieldctx:
if not is_generator(fixturefunc):
fail_fixturefunc(fixturefunc,
- msg="yieldctx=True requires yield statement")
+ msg="yield_fixture requires yield statement in function")
iter = fixturefunc(**kwargs)
next = getattr(iter, "__next__", None)
if next is None:
@@ -1688,7 +1702,7 @@
pass
else:
fail_fixturefunc(fixturefunc,
- "fixture function has more than one 'yield'")
+ "yield_fixture function has more than one 'yield'")
request.addfinalizer(teardown)
else:
res = fixturefunc(**kwargs)
diff -r 7da5c02ece03592164e4e681ab7463de2a65cedb -r
5968d75acef96230be6fe6b8d0bd656e1628a731 doc/en/fixture.txt
--- a/doc/en/fixture.txt
+++ b/doc/en/fixture.txt
@@ -276,8 +276,8 @@
of fixture setup.
Note that pytest-2.4 introduced an experimental alternative
-:ref:`yield fixture mechanism <yieldctx>` for easier context manager
integration
-and more linear writing of teardown code.
+:ref:`yield fixture mechanism <yieldfixture>` for easier context manager
+integration and more linear writing of teardown code.
.. _`request-context`:
diff -r 7da5c02ece03592164e4e681ab7463de2a65cedb -r
5968d75acef96230be6fe6b8d0bd656e1628a731 doc/en/yieldfixture.txt
--- a/doc/en/yieldfixture.txt
+++ b/doc/en/yieldfixture.txt
@@ -1,5 +1,5 @@
-.. _yieldctx:
+.. _yieldfixture:
Fixture functions using "yield" / context manager integration
---------------------------------------------------------------
@@ -16,10 +16,9 @@
"yielding" fixture values is an experimental feature and its exact
declaration may change later but earliest in a 2.5 release. You can thus
- safely use this feature in the 2.4 series but may need to adapt your
- fixtures later. Test functions themselves will not need to change
- (they can be completely ignorant of the return/yield modes of
- fixture functions).
+ safely use this feature in the 2.4 series but may need to adapt later.
+ Test functions themselves will not need to change (as a general
+ feature, they are ignorant of how fixtures are setup).
Let's look at a simple standalone-example using the new ``yield`` syntax::
@@ -27,7 +26,7 @@
import pytest
- @pytest.fixture(yieldctx=True)
+ @pytest.yield_fixture
def passwd():
print ("\nsetup before yield")
f = open("/etc/passwd")
@@ -62,7 +61,7 @@
import pytest
- @pytest.fixture(yieldctx=True)
+ @pytest.yield_fixture
def passwd():
with open("/etc/passwd") as f:
yield f.readlines()
diff -r 7da5c02ece03592164e4e681ab7463de2a65cedb -r
5968d75acef96230be6fe6b8d0bd656e1628a731 testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -1980,7 +1980,7 @@
def test_simple(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(yieldctx=True)
+ @pytest.yield_fixture
def arg1():
print ("setup")
yield 1
@@ -2004,7 +2004,7 @@
def test_scoped(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(scope="module", yieldctx=True)
+ @pytest.yield_fixture(scope="module")
def arg1():
print ("setup")
yield 1
@@ -2025,7 +2025,7 @@
def test_setup_exception(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(scope="module", yieldctx=True)
+ @pytest.yield_fixture(scope="module")
def arg1():
pytest.fail("setup")
yield 1
@@ -2041,7 +2041,7 @@
def test_teardown_exception(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(scope="module", yieldctx=True)
+ @pytest.yield_fixture(scope="module")
def arg1():
yield 1
pytest.fail("teardown")
@@ -2057,7 +2057,7 @@
def test_yields_more_than_one(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(scope="module", yieldctx=True)
+ @pytest.yield_fixture(scope="module")
def arg1():
yield 1
yield 2
@@ -2074,7 +2074,7 @@
def test_no_yield(self, testdir):
testdir.makepyfile("""
import pytest
- @pytest.fixture(scope="module", yieldctx=True)
+ @pytest.yield_fixture(scope="module")
def arg1():
return 1
def test_1(arg1):
@@ -2082,9 +2082,8 @@
""")
result = testdir.runpytest("-s")
result.stdout.fnmatch_lines("""
- *yieldctx*requires*yield*
- *yieldctx=True*
+ *yield_fixture*requires*yield*
+ *yield_fixture*
*def arg1*
""")
-
https://bitbucket.org/hpk42/pytest/commits/6a3d8793bf5f/
Changeset: 6a3d8793bf5f
User: hpk42
Date: 2013-09-30 13:56:54
Summary: disallow yield in non-yield-fixtures for now. This is an
incompataibility but we want to prepare for possibly merging fixture and
yield_fixture some day.
Affected #: 3 files
diff -r 5968d75acef96230be6fe6b8d0bd656e1628a731 -r
6a3d8793bf5fe8f9be829bddb8bf1e95ee183323 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,12 +14,18 @@
- the pytest_plugin_unregister hook wasn't ever properly called
and there is no known implementation of the hook - so it got removed.
+- pytest.fixture-decorated functions cannot be generators (i.e. use yield)
anymore.
+ This change might be reversed in 2.4.1 if it causes unforeseen real-life
issues.
+ However, you can always write and return an inner function/generator
+ and change the fixture consumer to iterate over the returned generator.
+ This change was done in lieu of the new ``pytest.yield_fixture`` decorator,
see below.
+
new features:
-- experimentally introduce a new pytest.yield_fixture decorator which
- has exactly the same parameters as pytest.fixture but expects
+- experimentally introduce a new ``pytest.yield_fixture`` decorator which
+ accepts exactly the same parameters as pytest.fixture but mandates
a ``yield`` statement instead of a ``return statement`` from fixture
functions.
- This allows direct integration with with-context managers
+ This allows direct integration with "with-style" context managers
in fixture functions and generally avoids registering of finalization
callbacks
in favour of treating the "after-yield" as teardown code.
Thanks Andreas Pelme, Vladimir Keleshev, Floris Bruynooghe, Ronny
Pfannschmidt
diff -r 5968d75acef96230be6fe6b8d0bd656e1628a731 -r
6a3d8793bf5fe8f9be829bddb8bf1e95ee183323 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1705,6 +1705,11 @@
"yield_fixture function has more than one 'yield'")
request.addfinalizer(teardown)
else:
+ if is_generator(fixturefunc):
+ fail_fixturefunc(fixturefunc,
+ msg="pytest.fixture functions cannot use ``yield``. "
+ "Instead write and return an inner function/generator "
+ "and let the consumer call and iterate over it.")
res = fixturefunc(**kwargs)
return res
diff -r 5968d75acef96230be6fe6b8d0bd656e1628a731 -r
6a3d8793bf5fe8f9be829bddb8bf1e95ee183323 testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -2087,3 +2087,18 @@
*def arg1*
""")
+ def test_yield_not_allowed_in_non_yield(self, testdir):
+ testdir.makepyfile("""
+ import pytest
+ @pytest.fixture(scope="module")
+ def arg1():
+ yield 1
+ def test_1(arg1):
+ pass
+ """)
+ result = testdir.runpytest("-s")
+ result.stdout.fnmatch_lines("""
+ *fixture*cannot use*yield*
+ *def arg1*
+ """)
+
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.
_______________________________________________
pytest-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit