* Old style tracebacks with no encoding info are now treated as UTF8 rather
[third_party/subunit] / python / subunit / details.py
index c54a220ce4c7739918d96b21d0e3fc2936e1ed14..a37b2acb932dd958baa29ec5be7e5d92cba8c3e1 100644 (file)
@@ -18,7 +18,9 @@
 
 from cStringIO import StringIO
 
-import chunked, content, content_type
+from testtools import content, content_type
+
+import chunked
 
 
 class DetailsParser(object):
@@ -42,11 +44,24 @@ class SimpleDetailsParser(DetailsParser):
         else:
             self._message += line
 
-    def get_details(self):
+    def get_details(self, style=None):
         result = {}
-        result['traceback'] = content.Content(
-            content_type.ContentType("text", "x-traceback"),
-            lambda:[self._message])
+        if not style:
+            # We know that subunit/testtools serialise [] formatted
+            # tracebacks as utf8, but perhaps we need a ReplacingContent
+            # or something like that.
+            result['traceback'] = content.Content(
+                content_type.ContentType("text", "x-traceback",
+                {"charset": "utf8"}),
+                lambda:[self._message])
+        else:
+            if style == 'skip':
+                name = 'reason'
+            else:
+                name = 'message'
+            result[name] = content.Content(
+                content_type.ContentType("text", "plain"),
+                lambda:[self._message])
         return result
 
     def get_message(self):
@@ -81,14 +96,14 @@ class MultipartDetailsParser(DetailsParser):
         residue = self._chunk_parser.write(line)
         if residue is not None:
             # Line based use always ends on no residue.
-            assert residue == ''
+            assert residue == '', 'residue: %r' % (residue,)
             body = self._body
             self._details[self._name] = content.Content(
                 self._content_type, lambda:[body.getvalue()])
             self._chunk_parser.close()
             self._parse_state = self._look_for_content
 
-    def get_details(self):
+    def get_details(self, for_skip=False):
         return self._details
 
     def get_message(self):