[py-svn] commit/pytest: 3 new changesets

Bitbucket commits-noreply at bitbucket.org
Wed Oct 31 17:06:16 CET 2012


3 new commits in pytest:


https://bitbucket.org/hpk42/pytest/changeset/c52af7d3cfb5/
changeset:   c52af7d3cfb5
user:        hpk42
date:        2012-10-28 17:40:30
summary:     remove issue that doesn't make sense anymore
affected #:  1 file

diff -r 678655781ea359b14d96829c205322db47018239 -r c52af7d3cfb50cd43f7907bd39fe3227960c64fe ISSUES.txt
--- a/ISSUES.txt
+++ b/ISSUES.txt
@@ -48,59 +48,6 @@
 not sufficient to always allow non-matches?
 
 
-unify item/request classes, generalize items
----------------------------------------------------------------
-tags: 2.4 wish
-
-in lieu of extended parametrization and the new way to specify resource
-factories in terms of the parametrize decorator, consider unification
-of the item and request class.  This also is connected with allowing
-funcargs in setup functions.  Example of new item API:
-
-    item.getresource("db")  # alias for request.getfuncargvalue
-    item.addfinalizer(...)
-    item.cached_setup(...)
-    item.applymarker(...)
-
-test classes/modules could then use this api via::
-
-    def pytest_runtest_setup(item):
-        use item API ...
-
-introduction of this new method needs to be _fully_ backward compatible -
-and the documentation needs to change along to mention this new way of
-doing things. 
-
-impl note: probably Request._fillfixtures would be called from the
-python plugins own pytest_runtest_setup(item) and would call
-item.getresource(X) for all X in the funcargs of a function.
-
-XXX is it possible to even put the above item API to Nodes, i.e. also
-to Directorty/module/file/class collectors?  Problem is that current
-funcarg factories presume they are called with a per-function (even
-per-funcarg-per-function) scope.  Could there be small tweaks to the new
-API that lift this restriction?
-
-consider::
-
-    def setup_class(cls, tmpdir):
-        # would get a per-class tmpdir because tmpdir parametrization
-        # would know that it is called with a class scope
-        #
-        #
-        #
-this looks very difficult because those setup functions are also used
-by nose etc. Rather consider introduction of a new setup hook:
-
-    def setup_test(self, item):
-        self.db = item.cached_setup(..., scope='class')
-        self.tmpdir = item.getresource("tmpdir")
-
-this should be compatible to unittest/nose and provide much of what
-"testresources" provide.  XXX This would not allow full parametrization
-such that test function could be run multiple times with different
-values. See "parametrized attributes" issue.
-
 allow parametrized attributes on classes
 -------------------------------------------------- 
 



https://bitbucket.org/hpk42/pytest/changeset/9a0bff73c95e/
changeset:   9a0bff73c95e
user:        hpk42
date:        2012-10-31 17:01:24
summary:     merge
affected #:  3 files

diff -r c52af7d3cfb50cd43f7907bd39fe3227960c64fe -r 9a0bff73c95e37a9752936e9eed791e6770acbae CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 Changes between 2.3.2 and 2.3.3.dev
 -----------------------------------
 
+- fix issue 214: gracefully handle proxy objects that
+  look like fixtures but raise exceptions on introspection
 - fix issue213 - allow to parametrize with values like numpy arrays that
   do not support an __eq__ operator 
 


diff -r c52af7d3cfb50cd43f7907bd39fe3227960c64fe -r 9a0bff73c95e37a9752936e9eed791e6770acbae _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1551,7 +1551,15 @@
                 continue
             # fixture functions have a pytest_funcarg__ prefix (pre-2.3 style)
             # or are "@pytest.fixture" marked
-            marker = getattr(obj, "_pytestfixturefunction", None)
+            try:
+                marker = getattr(obj, "_pytestfixturefunction", None)
+            except RuntimeError:
+                # some proxy objects raise RuntimeError
+                # flasks request globals are one example
+                # those aren't fixture functions, so we can ignore
+                # XXX: maybe trace it when it happens?
+                marker = None
+
             if marker is None:
                 if not name.startswith(self._argprefix):
                     continue


diff -r c52af7d3cfb50cd43f7907bd39fe3227960c64fe -r 9a0bff73c95e37a9752936e9eed791e6770acbae testing/test_python.py
--- a/testing/test_python.py
+++ b/testing/test_python.py
@@ -1611,6 +1611,34 @@
     ])
     assert "INTERNAL" not in result.stdout.str()
 
+
+def test_funcarg_fixture_discovery_failure_issue214(testdir):
+    # some proxy objects raise RuntimeError on getattr
+    # for example flask.request
+    p = testdir.makepyfile("""
+
+        class EvilObject(object):
+            def __call__(self): 
+                #needed to trick discovery
+                pass
+            def __getattr__(self, arg):
+                raise RuntimeError('uhm ' + arg)
+
+
+        fixture = EvilObject()
+        
+        def test_1():
+            pass
+    """)
+    result = testdir.runpytest('--fulltrace')
+    result.stdout.fnmatch_lines([
+        '*1 passed*'
+    ])
+    assert "INTERNAL" not in result.stdout.str()
+    assert "ERROR" not in result.stdout.str()
+        
+
+
 class TestReportInfo:
     def test_itemreport_reportinfo(self, testdir, linecomp):
         testdir.makeconftest("""



https://bitbucket.org/hpk42/pytest/changeset/a751a14ccfb3/
changeset:   a751a14ccfb3
user:        hpk42
date:        2012-10-31 17:00:55
summary:     extended - fix issue214 - ignore attribute-access errors with objects in test modules that can blow up (for example flask's request object)
affected #:  6 files

diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,12 @@
 Changes between 2.3.2 and 2.3.3.dev
 -----------------------------------
 
-- fix issue 214: gracefully handle proxy objects that
-  look like fixtures but raise exceptions on introspection
+- fix issue214 - parse modules that contain special objects like e. g.
+  flask's request object which blows up on getattr access if no request
+  is active.
 - fix issue213 - allow to parametrize with values like numpy arrays that
-  do not support an __eq__ operator 
+  do not support an __eq__ operator
+
 
 Changes between 2.3.1 and 2.3.2
 -----------------------------------


diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 _pytest/__init__.py
--- a/_pytest/__init__.py
+++ b/_pytest/__init__.py
@@ -1,2 +1,2 @@
 #
-__version__ = '2.3.2'
+__version__ = '2.3.3.dev1'


diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1552,12 +1552,12 @@
             # fixture functions have a pytest_funcarg__ prefix (pre-2.3 style)
             # or are "@pytest.fixture" marked
             try:
-                marker = getattr(obj, "_pytestfixturefunction", None)
-            except RuntimeError:
-                # some proxy objects raise RuntimeError
-                # flasks request globals are one example
-                # those aren't fixture functions, so we can ignore
-                # XXX: maybe trace it when it happens?
+                marker = obj._pytestfixturefunction
+            except KeyboardInterrupt:
+                raise
+            except Exception:
+                # some objects raise errors like request (from flask import request)
+                # we don't expect them to be fixture functions
                 marker = None
 
             if marker is None:


diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 doc/en/example/nonpython/conftest.py
--- a/doc/en/example/nonpython/conftest.py
+++ b/doc/en/example/nonpython/conftest.py
@@ -2,10 +2,10 @@
 
 import pytest
 
-def pytest_collect_file(path, parent):
+def pytest_collect_file(parent, path):
     if path.ext == ".yml" and path.basename.startswith("test"):
         return YamlFile(path, parent)
-            
+
 class YamlFile(pytest.File):
     def collect(self):
         import yaml # we need a yaml parser, e.g. PyYAML
@@ -17,7 +17,7 @@
     def __init__(self, name, parent, spec):
         super(YamlItem, self).__init__(name, parent)
         self.spec = spec
-    
+
     def runtest(self):
         for name, value in self.spec.items():
             # some custom test execution (dumb example follows)


diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 setup.py
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@
         name='pytest',
         description='py.test: simple powerful testing with Python',
         long_description = long_description,
-        version='2.3.2',
+        version='2.3.3.dev1',
         url='http://pytest.org',
         license='MIT license',
         platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],


diff -r 9a0bff73c95e37a9752936e9eed791e6770acbae -r a751a14ccfb360f4f72ab138d5a9647e89213a82 testing/test_python.py
--- a/testing/test_python.py
+++ b/testing/test_python.py
@@ -1612,33 +1612,6 @@
     assert "INTERNAL" not in result.stdout.str()
 
 
-def test_funcarg_fixture_discovery_failure_issue214(testdir):
-    # some proxy objects raise RuntimeError on getattr
-    # for example flask.request
-    p = testdir.makepyfile("""
-
-        class EvilObject(object):
-            def __call__(self): 
-                #needed to trick discovery
-                pass
-            def __getattr__(self, arg):
-                raise RuntimeError('uhm ' + arg)
-
-
-        fixture = EvilObject()
-        
-        def test_1():
-            pass
-    """)
-    result = testdir.runpytest('--fulltrace')
-    result.stdout.fnmatch_lines([
-        '*1 passed*'
-    ])
-    assert "INTERNAL" not in result.stdout.str()
-    assert "ERROR" not in result.stdout.str()
-        
-
-
 class TestReportInfo:
     def test_itemreport_reportinfo(self, testdir, linecomp):
         testdir.makeconftest("""
@@ -2145,6 +2118,20 @@
         """)
         return testdir
 
+    def test_parsefactories_evil_objects_issue214(self, testdir):
+        testdir.makepyfile("""
+            class A:
+                def __call__(self):
+                    pass
+                def __getattr__(self, name):
+                    raise RuntimeError()
+            a = A()
+            def test_hello():
+                pass
+        """)
+        reprec = testdir.inline_run()
+        reprec.assertoutcome(passed=1, failed=0)
+
     def test_parsefactories_conftest(self, testdir):
         testdir.makepyfile("""
             def test_hello(item, fm):

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.



More information about the pytest-commit mailing list