[Pytest-commit] commit/pytest: 4 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Wed Aug 27 22:16:44 CEST 2014


4 new commits in pytest:

https://bitbucket.org/hpk42/pytest/commits/a8cc1d22509d/
Changeset:   a8cc1d22509d
User:        flub
Date:        2014-08-18 20:07:38
Summary:     Escape newlines in repr for assertion rewriting

The assertion formatting mini-language depends on newlines being
escaped.  Unfortunately if the repr of an object contained
newlines the rewriting module did not escape those, which is now
fixed.

Fixes issue453.
Affected #:  3 files

diff -r f0d4a70ab98a3f1e82f25531ed7e1c9979c12b13 -r a8cc1d22509d432d8b9aa137d28263e4924f0fa8 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,9 @@
 
 - fixed issue561: adapt autouse fixture example for python3.
 
+- fixed issue453: assertion rewriting issue with __repr__ containing
+  "\n{", "\n}" and "\n~".
+
 2.6.1
 -----------------------------------
 

diff -r f0d4a70ab98a3f1e82f25531ed7e1c9979c12b13 -r a8cc1d22509d432d8b9aa137d28263e4924f0fa8 _pytest/assertion/rewrite.py
--- a/_pytest/assertion/rewrite.py
+++ b/_pytest/assertion/rewrite.py
@@ -326,7 +326,15 @@
     AssertionRewriter().run(mod)
 
 
-_saferepr = py.io.saferepr
+def _saferepr(obj):
+    repr = py.io.saferepr(obj)
+    if py.builtin._istext(repr):
+        t = py.builtin.text
+    else:
+        t = py.builtin.bytes
+    return repr.replace(t("\n"), t("\\n"))
+
+
 from _pytest.assertion.util import format_explanation as _format_explanation # noqa
 
 def _should_repr_global_name(obj):

diff -r f0d4a70ab98a3f1e82f25531ed7e1c9979c12b13 -r a8cc1d22509d432d8b9aa137d28263e4924f0fa8 testing/test_assertrewrite.py
--- a/testing/test_assertrewrite.py
+++ b/testing/test_assertrewrite.py
@@ -313,6 +313,17 @@
             assert "%test" == "test"
         assert getmsg(f).startswith("assert '%test' == 'test'")
 
+    def test_custom_repr(self):
+        def f():
+            class Foo(object):
+                a = 1
+
+                def __repr__(self):
+                    return "\n{ \n~ \n}"
+            f = Foo()
+            assert 0 == f.a
+        assert r"where 1 = \n{ \n~ \n}.a" in util._format_lines([getmsg(f)])[0]
+
 
 class TestRewriteOnImport:
 


https://bitbucket.org/hpk42/pytest/commits/dc8df0698bce/
Changeset:   dc8df0698bce
User:        flub
Date:        2014-08-19 20:50:25
Summary:     Explain why this is important
Affected #:  1 file

diff -r a8cc1d22509d432d8b9aa137d28263e4924f0fa8 -r dc8df0698bce865c33dbed2cf0351c7c963462c6 _pytest/assertion/rewrite.py
--- a/_pytest/assertion/rewrite.py
+++ b/_pytest/assertion/rewrite.py
@@ -327,6 +327,13 @@
 
 
 def _saferepr(obj):
+    """Get a safe repr of an object for assertion error messages
+
+    The assertion formatting (util.format_explanation()) requires
+    newlines to be escaped since they are a special character for it.
+    But py.io.saferepr allows newlines, so we need to escape them
+    here.
+    """
     repr = py.io.saferepr(obj)
     if py.builtin._istext(repr):
         t = py.builtin.text


https://bitbucket.org/hpk42/pytest/commits/18dc9d3ba496/
Changeset:   18dc9d3ba496
User:        flub
Date:        2014-08-23 12:10:16
Summary:     Improve the docstring further
Affected #:  1 file

diff -r dc8df0698bce865c33dbed2cf0351c7c963462c6 -r 18dc9d3ba496f75d636bf88fa8ca5ca175f179ce _pytest/assertion/rewrite.py
--- a/_pytest/assertion/rewrite.py
+++ b/_pytest/assertion/rewrite.py
@@ -327,12 +327,15 @@
 
 
 def _saferepr(obj):
-    """Get a safe repr of an object for assertion error messages
+    """Get a safe repr of an object for assertion error messages.
 
     The assertion formatting (util.format_explanation()) requires
     newlines to be escaped since they are a special character for it.
-    But py.io.saferepr allows newlines, so we need to escape them
-    here.
+    Normally assertion.util.format_explanation() does this but for a
+    custom repr it is possible to contain one of the special escape
+    sequences, especially '\n{' and '\n}' are likely to be present in
+    JSON reprs.
+
     """
     repr = py.io.saferepr(obj)
     if py.builtin._istext(repr):


https://bitbucket.org/hpk42/pytest/commits/aed87f841a76/
Changeset:   aed87f841a76
User:        flub
Date:        2014-08-27 22:00:24
Summary:     Merged in flub/pytest (pull request #196)
Affected #:  3 files

diff -r 5c5f7ef69bcd8586823b839d0abe88d1d72c1110 -r aed87f841a762133588d09f17f2ceb050d726569 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,9 @@
 
 - fixed issue561: adapt autouse fixture example for python3.
 
+- fixed issue453: assertion rewriting issue with __repr__ containing
+  "\n{", "\n}" and "\n~".
+
 - Fix example in monkeypatch documentation, thanks t-8ch.
 
 - Do not mark as universal wheel because Python 2.6 is different from

diff -r 5c5f7ef69bcd8586823b839d0abe88d1d72c1110 -r aed87f841a762133588d09f17f2ceb050d726569 _pytest/assertion/rewrite.py
--- a/_pytest/assertion/rewrite.py
+++ b/_pytest/assertion/rewrite.py
@@ -326,7 +326,25 @@
     AssertionRewriter().run(mod)
 
 
-_saferepr = py.io.saferepr
+def _saferepr(obj):
+    """Get a safe repr of an object for assertion error messages.
+
+    The assertion formatting (util.format_explanation()) requires
+    newlines to be escaped since they are a special character for it.
+    Normally assertion.util.format_explanation() does this but for a
+    custom repr it is possible to contain one of the special escape
+    sequences, especially '\n{' and '\n}' are likely to be present in
+    JSON reprs.
+
+    """
+    repr = py.io.saferepr(obj)
+    if py.builtin._istext(repr):
+        t = py.builtin.text
+    else:
+        t = py.builtin.bytes
+    return repr.replace(t("\n"), t("\\n"))
+
+
 from _pytest.assertion.util import format_explanation as _format_explanation # noqa
 
 def _should_repr_global_name(obj):

diff -r 5c5f7ef69bcd8586823b839d0abe88d1d72c1110 -r aed87f841a762133588d09f17f2ceb050d726569 testing/test_assertrewrite.py
--- a/testing/test_assertrewrite.py
+++ b/testing/test_assertrewrite.py
@@ -313,6 +313,17 @@
             assert "%test" == "test"
         assert getmsg(f).startswith("assert '%test' == 'test'")
 
+    def test_custom_repr(self):
+        def f():
+            class Foo(object):
+                a = 1
+
+                def __repr__(self):
+                    return "\n{ \n~ \n}"
+            f = Foo()
+            assert 0 == f.a
+        assert r"where 1 = \n{ \n~ \n}.a" in util._format_lines([getmsg(f)])[0]
+
 
 class TestRewriteOnImport:

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