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

Bitbucket commits-noreply at bitbucket.org
Sun Apr 17 12:21:07 CEST 2011


2 new changesets in pytest:

http://bitbucket.org/hpk42/pytest/changeset/f27dab0f3a45/
changeset:   r2196:f27dab0f3a45
user:        hpk42
date:        2011-04-17 12:20:11
summary:     fix issue38 - nicer tracebacks on sessionstart/configure (and other internal/custom hook failures)
affected #:  4 files (1.0 KB)

--- a/CHANGELOG	Sat Apr 16 00:47:16 2011 +0100
+++ b/CHANGELOG	Sun Apr 17 12:20:11 2011 +0200
@@ -1,6 +1,9 @@
 Changes between 2.0.2 and 2.0.3.dev
 ----------------------------------------------
 
+- 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
 


--- a/_pytest/core.py	Sat Apr 16 00:47:16 2011 +0100
+++ b/_pytest/core.py	Sun Apr 17 12:20:11 2011 +0200
@@ -265,8 +265,15 @@
         config.hook.pytest_unconfigure(config=config)
         config.pluginmanager.unregister(self)
 
-    def notify_exception(self, excinfo):
-        excrepr = excinfo.getrepr(funcargs=True, showlocals=True)
+    def notify_exception(self, excinfo, option=None):
+        if option and option.fulltrace:
+            style = "long"
+        else:
+            style = "native"
+        excrepr = excinfo.getrepr(funcargs=True,
+            showlocals=getattr(option, 'showlocals', False),
+            style=style,
+        )
         res = self.hook.pytest_internalerror(excrepr=excrepr)
         if not py.builtin.any(res):
             for line in str(excrepr).split("\n"):


--- a/_pytest/main.py	Sat Apr 16 00:47:16 2011 +0100
+++ b/_pytest/main.py	Sun Apr 17 12:20:11 2011 +0200
@@ -71,7 +71,7 @@
         session.exitstatus = EXIT_INTERRUPTED
     except:
         excinfo = py.code.ExceptionInfo()
-        config.pluginmanager.notify_exception(excinfo)
+        config.pluginmanager.notify_exception(excinfo, config.option)
         session.exitstatus = EXIT_INTERNALERROR
         if excinfo.errisinstance(SystemExit):
             sys.stderr.write("mainloop: caught Spurious SystemExit!\n")


--- a/testing/acceptance_test.py	Sat Apr 16 00:47:16 2011 +0100
+++ b/testing/acceptance_test.py	Sun Apr 17 12:20:11 2011 +0200
@@ -13,6 +13,26 @@
             '*ERROR: hello'
         ])
 
+    def test_early_hook_error_issue38_1(self, testdir):
+        testdir.makeconftest("""
+            def pytest_sessionstart():
+                0 / 0
+        """)
+        result = testdir.runpytest(testdir.tmpdir)
+        assert result.ret != 0
+        # tracestyle is native by default for hook failures
+        result.stdout.fnmatch_lines([
+            '*INTERNALERROR*File*conftest.py*line 2*',
+            '*0 / 0*',
+        ])
+        result = testdir.runpytest(testdir.tmpdir, "--fulltrace")
+        assert result.ret != 0
+        # tracestyle is native by default for hook failures
+        result.stdout.fnmatch_lines([
+            '*INTERNALERROR*def pytest_sessionstart():*',
+            '*INTERNALERROR*0 / 0*',
+        ])
+
     def test_file_not_found(self, testdir):
         result = testdir.runpytest("asd")
         assert result.ret != 0


http://bitbucket.org/hpk42/pytest/changeset/c8f97fe2247b/
changeset:   r2197:c8f97fe2247b
user:        hpk42
date:        2011-04-17 12:20:13
summary:     tentatively use internal list for cleanups at unconfigure time - this helps reporting with partially executed pytest_configure() hooks
affected #:  7 files (678 bytes)

--- a/_pytest/__init__.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/_pytest/__init__.py	Sun Apr 17 12:20:13 2011 +0200
@@ -1,2 +1,2 @@
 #
-__version__ = '2.0.3.dev3'
+__version__ = '2.0.3.dev4'


--- a/_pytest/assertion.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/_pytest/assertion.py	Sun Apr 17 12:20:13 2011 +0200
@@ -16,7 +16,8 @@
     # py._code._assertionnew to detect this plugin was loaded and in
     # turn call the hooks defined here as part of the
     # DebugInterpreter.
-    config._monkeypatch = m = monkeypatch()
+    m = monkeypatch()
+    config._cleanup.append(m.undo)
     warn_about_missing_assertion()
     if not config.getvalue("noassert") and not config.getvalue("nomagic"):
         def callbinrepr(op, left, right):
@@ -29,9 +30,6 @@
                   'AssertionError', py.code._AssertionError)
         m.setattr(py.code, '_reprcompare', callbinrepr)
 
-def pytest_unconfigure(config):
-    config._monkeypatch.undo()
-
 def warn_about_missing_assertion():
     try:
         assert False


--- a/_pytest/config.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/_pytest/config.py	Sun Apr 17 12:20:13 2011 +0200
@@ -12,6 +12,10 @@
         config.trace.root.setwriter(sys.stderr.write)
     return config
 
+def pytest_unconfigure(config):
+    for func in config._cleanup:
+        func()
+
 class Parser:
     """ Parser for command line arguments. """
 
@@ -251,7 +255,8 @@
         self._conftest = Conftest(onimport=self._onimportconftest)
         self.hook = self.pluginmanager.hook
         self._inicache = {}
-
+        self._cleanup = []
+    
     @classmethod
     def fromdictargs(cls, option_dict, args):
         """ constructor useable for subprocesses. """


--- a/_pytest/tmpdir.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/_pytest/tmpdir.py	Sun Apr 17 12:20:13 2011 +0200
@@ -48,15 +48,12 @@
         self.trace("finish")
         
 def pytest_configure(config):
-    config._mp = mp = monkeypatch()
+    mp = monkeypatch()
     t = TempdirHandler(config)
+    config._cleanup.extend([mp.undo, t.finish])
     mp.setattr(config, '_tmpdirhandler', t, raising=False)
     mp.setattr(pytest, 'ensuretemp', t.ensuretemp, raising=False)
 
-def pytest_unconfigure(config):
-    config._tmpdirhandler.finish()
-    config._mp.undo()
-
 def pytest_funcarg__tmpdir(request):
     """return a temporary directory path object
     which is unique to each test function invocation,


--- a/setup.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/setup.py	Sun Apr 17 12:20:13 2011 +0200
@@ -22,7 +22,7 @@
         name='pytest',
         description='py.test: simple powerful testing with Python',
         long_description = long_description,
-        version='2.0.3.dev3',
+        version='2.0.3.dev4',
         url='http://pytest.org',
         license='MIT license',
         platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],


--- a/testing/acceptance_test.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/testing/acceptance_test.py	Sun Apr 17 12:20:13 2011 +0200
@@ -33,6 +33,19 @@
             '*INTERNALERROR*0 / 0*',
         ])
 
+    def test_early_hook_configure_error_issue38(self, testdir):
+        testdir.makeconftest("""
+            def pytest_configure():
+                0 / 0
+        """)
+        result = testdir.runpytest(testdir.tmpdir)
+        assert result.ret != 0
+        # here we get it on stderr
+        result.stderr.fnmatch_lines([
+            '*INTERNALERROR*File*conftest.py*line 2*',
+            '*0 / 0*',
+        ])
+
     def test_file_not_found(self, testdir):
         result = testdir.runpytest("asd")
         assert result.ret != 0


--- a/testing/test_assertion.py	Sun Apr 17 12:20:11 2011 +0200
+++ b/testing/test_assertion.py	Sun Apr 17 12:20:13 2011 +0200
@@ -44,7 +44,8 @@
         config = testdir.parseconfig()
         plugin.pytest_configure(config)
         assert hook != py.code._reprcompare
-        plugin.pytest_unconfigure(config)
+        from _pytest.config import pytest_unconfigure
+        pytest_unconfigure(config)
         assert hook == py.code._reprcompare
 
 def callequal(left, right):

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