Hello community,

here is the log from the commit of package python-unittest-xml-reporting for 
openSUSE:Factory checked in at 2017-09-05 15:15:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-unittest-xml-reporting (Old)
 and      /work/SRC/openSUSE:Factory/.python-unittest-xml-reporting.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-unittest-xml-reporting"

Tue Sep  5 15:15:40 2017 rev:13 rq:520192 version:2.1.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-unittest-xml-reporting/python-unittest-xml-reporting.changes
      2015-05-19 23:42:51.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-unittest-xml-reporting.new/python-unittest-xml-reporting.changes
 2017-09-05 15:15:43.213020033 +0200
@@ -1,0 +2,11 @@
+Thu Aug 31 21:26:38 UTC 2017 - [email protected]
+
+- Update to version 2.1.0:
+  * no changelog available
+
+-------------------------------------------------------------------
+Thu Aug 24 13:56:41 UTC 2017 - [email protected]
+
+- singlespec auto-conversion
+
+-------------------------------------------------------------------
@@ -50,0 +62 @@
+

Old:
----
  unittest-xml-reporting-1.12.0.tar.gz

New:
----
  unittest-xml-reporting-2.1.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-unittest-xml-reporting.spec ++++++
--- /var/tmp/diff_new_pack.fDSdix/_old  2017-09-05 15:15:44.152887922 +0200
+++ /var/tmp/diff_new_pack.fDSdix/_new  2017-09-05 15:15:44.152887922 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-unittest-xml-reporting
 #
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -16,26 +16,23 @@
 #
 
 
+%{?!python_module:%define python_module() python-%{**} python3-%{**}}
+%bcond_with     test
 Name:           python-unittest-xml-reporting
-Version:        1.12.0
+Version:        2.1.0
 Release:        0
-Url:            http://github.com/danielfm/unittest-xml-reporting/tree/master/
 Summary:        PyUnit-based test runner with JUnit like XML reporting
 License:        LGPL-3.0+
 Group:          Development/Languages/Python
-Source:         
http://pypi.python.org/packages/source/u/unittest-xml-reporting/unittest-xml-reporting-%{version}.tar.gz
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-BuildRequires:  python-devel
-BuildRequires:  python-setuptools
-BuildRequires:  python-six >= 1.4.0
+Url:            http://github.com/danielfm/unittest-xml-reporting/tree/master/
+Source:         
https://files.pythonhosted.org/packages/source/u/unittest-xml-reporting/unittest-xml-reporting-%{version}.tar.gz
+BuildRequires:  %{python_module devel}
+BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module six >= 1.4.0}
+BuildRequires:  python-rpm-macros
 Requires:       python-six >= 1.4.0
-%if 0%{?suse_version} && 0%{?suse_version} <= 1110
-BuildRequires:  python-unittest2
-Requires:       python-unittest2
-%{!?python_sitelib: %global python_sitelib %(python -c "from 
distutils.sysconfig import get_python_lib; print get_python_lib()")}
-%else
 BuildArch:      noarch
-%endif
+%python_subpackages
 
 %description
 unittest-xml-reporting is a unittest test runner that can save test results
@@ -46,15 +43,17 @@
 %setup -q -n unittest-xml-reporting-%{version}
 
 %build
-python setup.py build
+%python_build
 
 %install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+%python_install
 
+%if %{with test}
 %check
-python setup.py -q test
+%python_exec setup.py test
+%endif
 
-%files
+%files %{python_files}
 %defattr(-,root,root,-)
 %{python_sitelib}/*
 

++++++ unittest-xml-reporting-1.12.0.tar.gz -> 
unittest-xml-reporting-2.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/PKG-INFO 
new/unittest-xml-reporting-2.1.0/PKG-INFO
--- old/unittest-xml-reporting-1.12.0/PKG-INFO  2015-04-14 23:48:16.000000000 
+0200
+++ new/unittest-xml-reporting-2.1.0/PKG-INFO   2016-04-10 07:18:56.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: unittest-xml-reporting
-Version: 1.12.0
+Version: 2.1.0
 Summary: unittest-based test runner with Ant/JUnit like XML reporting.
 Home-page: http://github.com/xmlrunner/unittest-xml-reporting/tree/master/
 Author: Daniel Fernandes Martins
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/setup.py 
new/unittest-xml-reporting-2.1.0/setup.py
--- old/unittest-xml-reporting-1.12.0/setup.py  2015-04-14 23:43:46.000000000 
+0200
+++ new/unittest-xml-reporting-2.1.0/setup.py   2016-04-10 07:18:19.000000000 
+0200
@@ -15,7 +15,8 @@
 # this is for sdist to work.
 import sys
 if sys.version_info < (2, 7):
-    install_requires += ['unittest2']
+    # python 2.6 no longer supported, use last 1.x release instead.
+    raise RuntimeError('This version requires Python 2.7+')  # pragma: no cover
 
 setup(
     name = 'unittest-xml-reporting',
@@ -45,9 +46,5 @@
     zip_safe = False,
     include_package_data = True,
     install_requires = install_requires,
-    extras_require={
-        # this is for wheels to work
-        ':python_version=="2.6"': ['unittest2'],
-    },
     test_suite = 'tests'
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/tests/builder_test.py 
new/unittest-xml-reporting-2.1.0/tests/builder_test.py
--- old/unittest-xml-reporting-1.12.0/tests/builder_test.py     2015-02-13 
09:04:27.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/tests/builder_test.py      1970-01-01 
01:00:00.000000000 +0100
@@ -1,251 +0,0 @@
-# -*- coding: utf-8
-
-from xmlrunner.unittest import unittest
-
-import xml.etree.ElementTree as ET
-from xml.dom.minidom import Document
-
-from xmlrunner import builder
-import six
-
-
-class TestXMLContextTest(unittest.TestCase):
-    """TestXMLContext test cases.
-    """
-
-    def setUp(self):
-        self.doc = Document()
-        self.root = builder.TestXMLContext(self.doc)
-
-    def test_current_element_tag_name(self):
-        self.root.begin('tag', 'context-name')
-        self.assertEqual(self.root.element_tag(), 'tag')
-
-    def test_current_context_name(self):
-        self.root.begin('tag', 'context-name')
-        name = self.root.element.getAttribute('name')
-        self.assertEqual(name, 'context-name')
-
-    def test_current_context_invalid_unicode_name(self):
-        self.root.begin('tag', six.u('context-name\x01\x0B'))
-        name = self.root.element.getAttribute('name')
-        self.assertEqual(name, six.u('context-name\uFFFD\uFFFD'))
-
-    def test_increment_valid_testsuites_counters(self):
-        self.root.begin('testsuites', 'name')
-
-        for c in ('tests', 'failures', 'errors', 'skipped'):
-            self.root.increment_counter(c)
-
-        element = self.root.end()
-
-        with self.assertRaises(KeyError):
-            element.attributes['skipped']
-
-        for c in ('tests', 'failures', 'errors'):
-            value = element.attributes[c].value
-            self.assertEqual(value, '1')
-
-    def test_increment_valid_testsuite_counters(self):
-        self.root.begin('testsuite', 'name')
-
-        for c in ('tests', 'failures', 'errors', 'skipped'):
-            self.root.increment_counter(c)
-
-        element = self.root.end()
-
-        for c in ('tests', 'failures', 'errors', 'skipped'):
-            value = element.attributes[c].value
-            self.assertEqual(value, '1')
-
-    def test_increment_counters_for_unknown_context(self):
-        self.root.begin('unknown', 'name')
-
-        for c in ('tests', 'failures', 'errors', 'skipped', 'invalid'):
-            self.root.increment_counter(c)
-
-        element = self.root.end()
-
-        for c in ('tests', 'failures', 'errors', 'skipped', 'invalid'):
-            with self.assertRaises(KeyError):
-                element.attributes[c]
-
-    def test_empty_counters_on_end_context(self):
-        self.root.begin('testsuite', 'name')
-        element = self.root.end()
-
-        for c in ('tests', 'failures', 'errors', 'skipped'):
-            self.assertEqual(element.attributes[c].value, '0')
-
-    def test_add_time_attribute_on_end_context(self):
-        self.root.begin('testsuite', 'name')
-        element = self.root.end()
-
-        element.attributes['time'].value
-
-
-class TestXMLBuilderTest(unittest.TestCase):
-    """TestXMLBuilder test cases.
-    """
-
-    def setUp(self):
-        self.builder = builder.TestXMLBuilder()
-        self.doc = self.builder._xml_doc
-        self.builder.begin_context('testsuites', 'name')
-
-        self.valid_chars = six.u('выбор')
-
-        self.invalid_chars = '\x01'
-        self.invalid_chars_replace = six.u('\ufffd')
-
-    def test_root_has_no_parent(self):
-        self.assertIsNone(self.builder.current_context().parent)
-
-    def test_current_context_tag(self):
-        self.assertEqual(self.builder.context_tag(), 'testsuites')
-
-    def test_begin_nested_context(self):
-        root = self.builder.current_context()
-
-        self.builder.begin_context('testsuite', 'name')
-
-        self.assertEqual(self.builder.context_tag(), 'testsuite')
-        self.assertIs(self.builder.current_context().parent, root)
-
-    def test_end_inexistent_context(self):
-        self.builder = builder.TestXMLBuilder()
-
-        self.assertFalse(self.builder.end_context())
-        self.assertEqual(len(self.doc.childNodes), 0)
-
-    def test_end_root_context(self):
-        root = self.builder.current_context()
-
-        self.assertTrue(self.builder.end_context())
-        self.assertIsNone(self.builder.current_context())
-
-        # No contexts left
-        self.assertFalse(self.builder.end_context())
-
-        doc_children = self.doc.childNodes
-
-        self.assertEqual(len(doc_children), 1)
-        self.assertEqual(len(doc_children[0].childNodes), 0)
-        self.assertEqual(doc_children[0].tagName, root.element_tag())
-
-    def test_end_nested_context(self):
-        self.builder.begin_context('testsuite', 'name')
-        nested = self.builder.current_context()
-
-        self.assertTrue(self.builder.end_context())
-
-        # Only updates the document when all contexts end
-        self.assertEqual(len(self.doc.childNodes), 0)
-
-    def test_end_all_context_stack(self):
-        root = self.builder.current_context()
-
-        self.builder.begin_context('testsuite', 'name')
-        nested = self.builder.current_context()
-
-        self.assertTrue(self.builder.end_context())
-        self.assertTrue(self.builder.end_context())
-
-        # No contexts left
-        self.assertFalse(self.builder.end_context())
-
-        root_child = self.doc.childNodes
-
-        self.assertEqual(len(root_child), 1)
-        self.assertEqual(root_child[0].tagName, root.element_tag())
-
-        nested_child = root_child[0].childNodes
-
-        self.assertEqual(len(nested_child), 1)
-        self.assertEqual(nested_child[0].tagName, nested.element_tag())
-
-    def test_append_valid_unicode_cdata_section(self):
-        self.builder.append_cdata_section('tag', self.valid_chars)
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-
-        cdata_container = root_child.childNodes[0]
-        self.assertEqual(cdata_container.tagName, 'tag')
-
-        cdata = cdata_container.childNodes[0]
-        self.assertEqual(cdata.data, self.valid_chars)
-
-    def test_append_invalid_unicode_cdata_section(self):
-        self.builder.append_cdata_section('tag', self.invalid_chars)
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-        cdata_container = root_child.childNodes[0]
-
-        cdata = cdata_container.childNodes[0]
-        self.assertEqual(cdata.data, self.invalid_chars_replace)
-
-    def test_append_cdata_closing_tags_into_cdata_section(self):
-        self.builder.append_cdata_section('tag',']]>')
-        self.builder.end_context()
-        root_child = self.doc.childNodes[0]
-        cdata_container = root_child.childNodes[0]
-        self.assertEqual(len(cdata_container.childNodes), 2)
-        self.assertEqual(cdata_container.childNodes[0].data, ']]')
-        self.assertEqual(cdata_container.childNodes[1].data, '>')
-
-    def test_append_tag_with_valid_unicode_values(self):
-        self.builder.append('tag', self.valid_chars, attr=self.valid_chars)
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-        tag = root_child.childNodes[0]
-
-        self.assertEqual(tag.tagName, 'tag')
-        self.assertEqual(tag.getAttribute('attr'), self.valid_chars)
-        self.assertEqual(tag.childNodes[0].data, self.valid_chars)
-
-    def test_append_tag_with_invalid_unicode_values(self):
-        self.builder.append('tag', self.invalid_chars, attr=self.invalid_chars)
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-        tag = root_child.childNodes[0]
-
-        self.assertEqual(tag.tagName, 'tag')
-        self.assertEqual(tag.getAttribute('attr'), self.invalid_chars_replace)
-        self.assertEqual(tag.childNodes[0].data, self.invalid_chars_replace)
-
-    def test_increment_root_context_counter(self):
-        self.builder.increment_counter('tests')
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-
-        self.assertEqual(root_child.tagName, 'testsuites')
-        self.assertEqual(root_child.getAttribute('tests'), '1')
-
-    def test_increment_nested_context_counter(self):
-        self.builder.increment_counter('tests')
-
-        self.builder.begin_context('testsuite', 'name')
-        self.builder.increment_counter('tests')
-
-        self.builder.end_context()
-        self.builder.end_context()
-
-        root_child = self.doc.childNodes[0]
-        nested_child = root_child.childNodes[0]
-
-        self.assertEqual(root_child.tagName, 'testsuites')
-        self.assertEqual(nested_child.getAttribute('tests'), '1')
-        self.assertEqual(root_child.getAttribute('tests'), '2')
-
-    def test_finish_nested_context(self):
-        self.builder.begin_context('testsuite', 'name')
-
-        tree = ET.fromstring(self.builder.finish())
-
-        self.assertEqual(tree.tag, 'testsuites')
-        self.assertEqual(len(tree.findall("./testsuite")), 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/tests/testsuite.py 
new/unittest-xml-reporting-2.1.0/tests/testsuite.py
--- old/unittest-xml-reporting-1.12.0/tests/testsuite.py        2015-04-14 
23:43:46.000000000 +0200
+++ new/unittest-xml-reporting-2.1.0/tests/testsuite.py 1970-01-01 
01:00:00.000000000 +0100
@@ -1,280 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""Executable module to test unittest-xml-reporting.
-"""
-import sys
-
-from xmlrunner.unittest import unittest
-import xmlrunner
-from six import StringIO, BytesIO
-from tempfile import mkdtemp
-from shutil import rmtree
-from glob import glob
-from xml.dom import minidom
-import os.path
-
-
-class XMLTestRunnerTestCase(unittest.TestCase):
-    """
-    XMLTestRunner test case.
-    """
-    class DummyTest(unittest.TestCase):
-        @unittest.skip("demonstrating skipping")
-        def test_skip(self):
-            pass   # pragma: no cover
-        @unittest.skip(u"demonstrating non-ascii skipping: éçà")
-        def test_non_ascii_skip(self):
-            pass   # pragma: no cover
-        def test_pass(self):
-            pass
-        def test_fail(self):
-            self.assertTrue(False)
-        @unittest.expectedFailure
-        def test_expected_failure(self):
-            self.assertTrue(False)
-        @unittest.expectedFailure
-        def test_unexpected_success(self):
-            pass
-        def test_error(self):
-            1 / 0
-        def test_cdata_section(self):
-            print('<![CDATA[content]]>')
-        def test_non_ascii_error(self):
-            self.assertEqual(u"éçà", 42)
-        def test_unsafe_unicode(self):
-            print(u"A\x00B\x08C\x0BD\x0C")
-        def test_runner_buffer_output_pass(self):
-            print('should not be printed')
-        def test_runner_buffer_output_fail(self):
-            print('should be printed')
-            self.fail('expected to fail')
-
-    def setUp(self):
-        self.stream = StringIO()
-        self.outdir = mkdtemp()
-        self.verbosity = 0
-        self.runner_kwargs = {}
-        self.addCleanup(rmtree, self.outdir)
-
-    def _test_xmlrunner(self, suite, runner=None):
-        outdir = self.outdir
-        stream = self.stream
-        verbosity = self.verbosity
-        runner_kwargs = self.runner_kwargs
-        if runner is None:
-            runner = xmlrunner.XMLTestRunner(
-                stream=stream, output=outdir, verbosity=verbosity,
-                **self.runner_kwargs)
-        self.assertEqual(0, len(glob(os.path.join(outdir, '*xml'))))
-        runner.run(suite)
-        self.assertEqual(1, len(glob(os.path.join(outdir, '*xml'))))
-        return runner
-
-    def test_basic_unittest_constructs(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        suite.addTest(self.DummyTest('test_skip'))
-        suite.addTest(self.DummyTest('test_fail'))
-        suite.addTest(self.DummyTest('test_expected_failure'))
-        suite.addTest(self.DummyTest('test_unexpected_success'))
-        suite.addTest(self.DummyTest('test_error'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_non_ascii(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_non_ascii_skip'))
-        suite.addTest(self.DummyTest('test_non_ascii_error'))
-        outdir = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=self.stream, output=outdir, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        runner.run(suite)
-        outdir.seek(0)
-        output = outdir.read()
-        self.assertIn(
-            u'<skipped message="demonstrating non-ascii skipping: éçà" 
type="skip"/>'.encode('utf8'),
-            output)
-
-    def test_xmlrunner_safe_xml_encoding_name(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        outdir = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=self.stream, output=outdir, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        runner.run(suite)
-        outdir.seek(0)
-        output = outdir.read()
-        firstline = output.splitlines()[0]
-        # test for issue #74
-        self.assertIn('encoding="UTF-8"'.encode('utf8'), firstline)
-        
-    def test_xmlrunner_check_for_valid_xml_streamout(self):
-        """
-        This test checks if the xml document is valid if there are more than
-        one testsuite and the output of the report is a single stream.
-        """
-        class DummyTestA(unittest.TestCase):
-            def test_pass(self):
-                pass
-        class DummyTestB(unittest.TestCase):
-            def test_pass(self):
-                pass
-        suite = unittest.TestSuite()
-        suite.addTest( unittest.TestLoader().loadTestsFromTestCase(DummyTestA) 
);
-        suite.addTest( unittest.TestLoader().loadTestsFromTestCase(DummyTestB) 
);
-        outdir = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=self.stream, output=outdir, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        runner.run(suite)
-        outdir.seek(0)
-        output = outdir.read()
-        # Finally check if we have a valid XML document or not.        
-        try:
-            minidom.parseString(output)
-        except Exception as e:
-            self.fail(e)
-
-    def test_xmlrunner_unsafe_unicode(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_unsafe_unicode'))
-        outdir = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=self.stream, output=outdir, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        runner.run(suite)
-        outdir.seek(0)
-        output = outdir.read()
-        self.assertIn(u"<![CDATA[ABCD\n]]>".encode('utf8'), output)
-
-    @unittest.expectedFailure
-    def test_xmlrunner_buffer_output_pass(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_runner_buffer_output_pass'))
-        self._test_xmlrunner(suite)
-        testsuite_output = self.stream.getvalue()
-        # Since we are always buffering stdout/stderr
-        # it is currently troublesome to print anything at all
-        # and be consistent with --buffer option (issue #59)
-        self.assertIn('should not be printed', testsuite_output)
-        # this will be fixed when using the composite approach
-        # that was under development in the rewrite branch.
-
-    def test_xmlrunner_buffer_output_fail(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_runner_buffer_output_fail'))
-        self._test_xmlrunner(suite)
-        testsuite_output = self.stream.getvalue()
-        self.assertIn('should be printed', testsuite_output)
-
-    @unittest.skipIf(not hasattr(unittest.TestCase,'subTest'),
-        'unittest.TestCase.subTest not present.')
-    def test_unittest_subTest(self):
-        # test for issue #77
-        class DummySubTest(unittest.TestCase):
-            def test_subTest(self):
-                for i in range(2):
-                    with self.subTest(i=i):
-                        self.fail('this is a subtest.')
-        outdir = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=self.stream, output=outdir, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        suite = unittest.TestSuite()
-        suite.addTest(DummySubTest('test_subTest'))
-        runner.run(suite)
-        outdir.seek(0)
-        output = outdir.read()
-        self.assertIn(
-            b'<testcase classname="tests.testsuite.DummySubTest" '
-            b'name="test_subTest (i=0)"',
-            output)
-        self.assertIn(
-            b'<testcase classname="tests.testsuite.DummySubTest" '
-            b'name="test_subTest (i=1)"',
-            output)
-
-    def test_xmlrunner_pass(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_verbose(self):
-        self.verbosity = 1
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_showall(self):
-        self.verbosity = 2
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_cdata_section(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_cdata_section'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_outsuffix(self):
-        self.runner_kwargs['outsuffix'] = '.somesuffix'
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-        xmlfile = glob(os.path.join(self.outdir, '*xml'))[0]
-        assert xmlfile.endswith('.somesuffix.xml')
-
-    def test_xmlrunner_nosuffix(self):
-        self.runner_kwargs['outsuffix'] = ''
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-        xmlfile = glob(os.path.join(self.outdir, '*xml'))[0]
-        xmlfile = os.path.basename(xmlfile)
-        assert xmlfile.endswith('DummyTest.xml')
-
-    def test_junitxml_properties(self):
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        suite.properties = dict(key='value')
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_elapsed_times(self):
-        self.runner_kwargs['elapsed_times'] = False
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        self._test_xmlrunner(suite)
-
-    def test_xmlrunner_stream(self):
-        stream = self.stream
-        output = BytesIO()
-        runner = xmlrunner.XMLTestRunner(
-            stream=stream, output=output, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        runner.run(suite)
-
-    def test_xmlrunner_output_subdir(self):
-        stream = self.stream
-        output = os.path.join(self.outdir, 'subdir')
-        runner = xmlrunner.XMLTestRunner(
-            stream=stream, output=output, verbosity=self.verbosity,
-            **self.runner_kwargs)
-        suite = unittest.TestSuite()
-        suite.addTest(self.DummyTest('test_pass'))
-        runner.run(suite)
-
-    def test_xmlrunner_patched_stdout(self):
-        old_stdout, old_stderr = sys.stdout, sys.stderr
-        try:
-            sys.stdout, sys.stderr = StringIO(), StringIO()
-            suite = unittest.TestSuite()
-            suite.addTest(self.DummyTest('test_pass'))
-            suite.properties = dict(key='value')
-            self._test_xmlrunner(suite)
-        finally:
-            sys.stdout, sys.stderr = old_stdout, old_stderr
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/PKG-INFO 
new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/PKG-INFO
--- old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/PKG-INFO  
2015-04-14 23:48:13.000000000 +0200
+++ new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/PKG-INFO   
2016-04-10 07:18:56.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: unittest-xml-reporting
-Version: 1.12.0
+Version: 2.1.0
 Summary: unittest-based test runner with Ant/JUnit like XML reporting.
 Home-page: http://github.com/xmlrunner/unittest-xml-reporting/tree/master/
 Author: Daniel Fernandes Martins
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/SOURCES.txt 
new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/SOURCES.txt
--- 
old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/SOURCES.txt   
    2015-04-14 23:48:16.000000000 +0200
+++ 
new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/SOURCES.txt    
    2016-04-10 07:18:56.000000000 +0200
@@ -1,8 +1,5 @@
 setup.cfg
 setup.py
-tests/__init__.py
-tests/builder_test.py
-tests/testsuite.py
 unittest_xml_reporting.egg-info/PKG-INFO
 unittest_xml_reporting.egg-info/SOURCES.txt
 unittest_xml_reporting.egg-info/dependency_links.txt
@@ -12,7 +9,6 @@
 xmlrunner/__init__.py
 xmlrunner/__main__.py
 xmlrunner/builder.py
-xmlrunner/dirtyxml.py
 xmlrunner/result.py
 xmlrunner/runner.py
 xmlrunner/unittest.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/requires.txt 
new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/requires.txt
--- 
old/unittest-xml-reporting-1.12.0/unittest_xml_reporting.egg-info/requires.txt  
    2015-04-14 23:48:13.000000000 +0200
+++ 
new/unittest-xml-reporting-2.1.0/unittest_xml_reporting.egg-info/requires.txt   
    2016-04-10 07:18:56.000000000 +0200
@@ -1,4 +1 @@
 six>=1.4.0
-
-[:python_version=="2.6"]
-unittest2
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/builder.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/builder.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/builder.py      2015-02-13 
09:04:26.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/builder.py       2016-04-10 
07:18:19.000000000 +0200
@@ -2,7 +2,6 @@
 import sys
 import time
 import six
-from six import unichr
 
 from xml.dom.minidom import Document
 
@@ -21,8 +20,8 @@
 
 if sys.maxunicode > 0x10000:
     _char_tail = six.u('%s-%s') % (
-        unichr(0x10000),
-        unichr(min(sys.maxunicode, 0x10FFFF))
+        six.unichr(0x10000),
+        six.unichr(min(sys.maxunicode, 0x10FFFF))
     )
 
 _nontext_sub = re.compile(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/dirtyxml.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/dirtyxml.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/dirtyxml.py     2015-03-17 
16:52:52.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/dirtyxml.py      1970-01-01 
01:00:00.000000000 +0100
@@ -1,38 +0,0 @@
-# 
-# Matches invalid XML1.0 unicode characters, like control characters:
-# http://www.w3.org/TR/2006/REC-xml-20060816/#charsets
-# For Jython users, see http://bugs.jython.org/issue1836
-#
-
-#     INVALID_XML_1_0_UNICODE_RE = re.compile(
-#         u'[\u0000-\u0008\u000B\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE\uFFFF]',
-#         re.UNICODE
-#     )
-
-import sys
-import re
-from six import unichr
-
-_illegal_unichrs = [
-    (0x00, 0x08), (0x0B, 0x0C), (0x0E, 0x1F), 
-    (0x7F, 0x84), (0x86, 0x9F), 
-    (0xFDD0, 0xFDDF), (0xFFFE, 0xFFFF),
-] 
-if sys.maxunicode >= 0x10000:  # not narrow build 
-    _illegal_unichrs.extend([
-        (0x1FFFE, 0x1FFFF), (0x2FFFE, 0x2FFFF), 
-        (0x3FFFE, 0x3FFFF), (0x4FFFE, 0x4FFFF), 
-        (0x5FFFE, 0x5FFFF), (0x6FFFE, 0x6FFFF), 
-        (0x7FFFE, 0x7FFFF), (0x8FFFE, 0x8FFFF), 
-        (0x9FFFE, 0x9FFFF), (0xAFFFE, 0xAFFFF), 
-        (0xBFFFE, 0xBFFFF), (0xCFFFE, 0xCFFFF), 
-        (0xDFFFE, 0xDFFFF), (0xEFFFE, 0xEFFFF), 
-        (0xFFFFE, 0xFFFFF), (0x10FFFE, 0x10FFFF),
-    ]) 
-
-_illegal_ranges = [
-    "%s-%s" % (unichr(low), unichr(high))
-    for (low, high) in _illegal_unichrs
-]
-
-INVALID_XML_1_0_UNICODE_RE = re.compile(u'[%s]' % u''.join(_illegal_ranges)) 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/unittest-xml-reporting-1.12.0/xmlrunner/extra/djangotestrunner.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/extra/djangotestrunner.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/extra/djangotestrunner.py       
2015-02-13 08:47:20.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/extra/djangotestrunner.py        
2016-04-10 07:18:19.000000000 +0200
@@ -10,29 +10,31 @@
 """
 
 import xmlrunner
-import django
+import os.path
 from django.conf import settings
+from django.test.runner import DiscoverRunner
 
-# future compatibilty with django
-# in django 1.6 DiscoverRunner bacame default and
-# DjangoTestSuiteRunner became depecated, will be removed in 1.8
-if django.VERSION < (1, 6):
-    from django.test.simple import DjangoTestSuiteRunner
-    _DjangoRunner = DjangoTestSuiteRunner
-else:
-    from django.test.runner import DiscoverRunner
-    _DjangoRunner = DiscoverRunner
 
-
-class XMLTestRunner(_DjangoRunner):
+class XMLTestRunner(DiscoverRunner):
 
     def run_suite(self, suite, **kwargs):
+        dummy = kwargs  # unused
         verbosity = getattr(settings, 'TEST_OUTPUT_VERBOSE', 1)
         # XXX: verbosity = self.verbosity
         if isinstance(verbosity, bool):
             verbosity = (1, 2)[verbosity]
         descriptions = getattr(settings, 'TEST_OUTPUT_DESCRIPTIONS', False)
-        output = getattr(settings, 'TEST_OUTPUT_DIR', '.')
-        return xmlrunner.XMLTestRunner(
+        output_dir = getattr(settings, 'TEST_OUTPUT_DIR', '.')
+        single_file = getattr(settings, 'TEST_OUTPUT_FILE_NAME', None)
+
+        kwargs = dict(
             verbosity=verbosity, descriptions=descriptions,
-            output=output, failfast=self.failfast).run(suite)
+            failfast=self.failfast)
+        if single_file is not None:
+            file_path = os.path.join(output_dir, single_file)
+            with open(file_path, 'wb') as xml:
+                return xmlrunner.XMLTestRunner(
+                    output=xml, **kwargs).run(suite)
+        else:
+            return xmlrunner.XMLTestRunner(
+                output=output_dir, **kwargs).run(suite)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/result.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/result.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/result.py       2015-04-14 
23:43:46.000000000 +0200
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/result.py        2016-04-10 
07:18:19.000000000 +0200
@@ -2,13 +2,13 @@
 import os
 import sys
 import time
+import traceback
 import six
 import re
 from os import path
-from six import unichr
 from six.moves import StringIO
 
-from .unittest import TestResult, _TextTestResult
+from .unittest import TestResult, _TextTestResult, failfast
 
 
 # Matches invalid XML1.0 unicode characters, like control characters:
@@ -33,13 +33,16 @@
     ]) 
 
 _illegal_ranges = [
-    "%s-%s" % (unichr(low), unichr(high))
+    "%s-%s" % (six.unichr(low), six.unichr(high))
     for (low, high) in _illegal_unichrs
 ]
 
 INVALID_XML_1_0_UNICODE_RE = re.compile(u'[%s]' % u''.join(_illegal_ranges)) 
 
 
+STDOUT_LINE = '\nStdout:\n%s'
+STDERR_LINE = '\nStderr:\n%s'
+
 
 def xml_safe_unicode(base, encoding='utf-8'):
     """Return a unicode string containing only valid XML characters.
@@ -137,7 +140,7 @@
     Used by XMLTestRunner.
     """
     def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1,
-                 elapsed_times=True, properties=None):
+                 elapsed_times=True, properties=None, infoclass=None):
         _TextTestResult.__init__(self, stream, descriptions, verbosity)
         self.buffer = True  # we are capturing test output
         self._stdout_data = None
@@ -145,12 +148,16 @@
         self.successes = []
         self.callback = None
         self.elapsed_times = elapsed_times
-        self.properties = None  # junit testsuite properties
+        self.properties = properties  # junit testsuite properties
+        if infoclass is None:
+            self.infoclass = _TestInfo
+        else:
+            self.infoclass = infoclass
 
     def _prepare_callback(self, test_info, target_list, verbose_str,
                           short_str):
         """
-        Appends a _TestInfo to the given target list and sets a callback
+        Appends a `infoclass` to the given target list and sets a callback
         method to be called by stopTest method.
         """
         target_list.append(test_info)
@@ -186,8 +193,13 @@
             self.stream.write(" ... ")
 
     def _save_output_data(self):
-        self._stdout_data = sys.stdout.getvalue()
-        self._stderr_data = sys.stderr.getvalue()
+        # Only try to get sys.stdout and sys.sterr as they not be
+        # StringIO yet, e.g. when test fails during __call__
+        try:
+            self._stdout_data = sys.stdout.getvalue()
+            self._stderr_data = sys.stderr.getvalue()
+        except AttributeError:
+            pass
 
     def stopTest(self, test):
         """
@@ -210,27 +222,31 @@
         """
         self._save_output_data()
         self._prepare_callback(
-            _TestInfo(self, test), self.successes, 'OK', '.'
+            self.infoclass(self, test), self.successes, 'OK', '.'
         )
 
+    @failfast
     def addFailure(self, test, err):
         """
         Called when a test method fails.
         """
         self._save_output_data()
-        testinfo = _TestInfo(self, test, _TestInfo.FAILURE, err)
+        testinfo = self.infoclass(
+            self, test, self.infoclass.FAILURE, err)
         self.failures.append((
             testinfo,
             self._exc_info_to_string(err, test)
         ))
         self._prepare_callback(testinfo, [], 'FAIL', 'F')
 
+    @failfast
     def addError(self, test, err):
         """
         Called when a test method raises an error.
         """
         self._save_output_data()
-        testinfo = _TestInfo(self, test, _TestInfo.ERROR, err)
+        testinfo = self.infoclass(
+            self, test, self.infoclass.ERROR, err)
         self.errors.append((
             testinfo,
             self._exc_info_to_string(err, test)
@@ -241,20 +257,23 @@
         """
         Called when a subTest method raises an error.
         """
-        self._save_output_data()
-        testinfo = _TestInfo(self, testcase, _TestInfo.ERROR, err, 
subTest=test)
-        self.errors.append((
-            testinfo,
-            self._exc_info_to_string(err, testcase)
-        ))
-        self._prepare_callback(testinfo, [], 'ERROR', 'E')
+        if err is not None:
+            self._save_output_data()
+            testinfo = self.infoclass(
+                self, testcase, self.infoclass.ERROR, err, subTest=test)
+            self.errors.append((
+                testinfo,
+                self._exc_info_to_string(err, testcase)
+            ))
+            self._prepare_callback(testinfo, [], 'ERROR', 'E')
 
     def addSkip(self, test, reason):
         """
         Called when a test method was skipped.
         """
         self._save_output_data()
-        testinfo = _TestInfo(self, test, _TestInfo.SKIP, reason)
+        testinfo = self.infoclass(
+            self, test, self.infoclass.SKIP, reason)
         self.skipped.append((testinfo, reason))
         self._prepare_callback(testinfo, [], 'SKIP', 'S')
 
@@ -262,7 +281,7 @@
         """
         Writes information about the FAIL or ERROR to the stream.
         """
-        for test_info, error in errors:
+        for test_info, dummy in errors:
             self.stream.writeln(self.separator1)
             self.stream.writeln(
                 '%s [%.3fs]: %s' % (flavour, test_info.elapsed_time,
@@ -293,15 +312,14 @@
         return tests_by_testcase
 
     def _report_testsuite_properties(xml_testsuite, xml_document, properties):
-        xml_properties = xml_document.createElement('properties')
-        xml_testsuite.appendChild(xml_properties)
         if properties:
+            xml_properties = xml_document.createElement('properties')
+            xml_testsuite.appendChild(xml_properties)
             for key, value in properties.items():
                 prop = xml_document.createElement('property')
                 prop.setAttribute('name', str(key))
                 prop.setAttribute('value', str(value))
                 xml_properties.appendChild(prop)
-        return xml_properties
 
     _report_testsuite_properties = staticmethod(_report_testsuite_properties)
 
@@ -319,22 +337,29 @@
         testsuite.setAttribute(
             'time', '%.3f' % sum(map(lambda e: e.elapsed_time, tests))
         )
-        failures = filter(lambda e: e.outcome == _TestInfo.FAILURE, tests)
+        failures = filter(lambda e: e.outcome == e.FAILURE, tests)
         testsuite.setAttribute('failures', str(len(list(failures))))
 
-        errors = filter(lambda e: e.outcome == _TestInfo.ERROR, tests)
+        errors = filter(lambda e: e.outcome == e.ERROR, tests)
         testsuite.setAttribute('errors', str(len(list(errors))))
 
+        skips = filter(lambda e: e.outcome == _TestInfo.SKIP, tests)
+        testsuite.setAttribute('skipped', str(len(list(skips))))
+ 
         _XMLTestResult._report_testsuite_properties(
             testsuite, xml_document, properties)
 
+        for test in tests:
+            _XMLTestResult._report_testcase(test, testsuite, xml_document)
+
         systemout = xml_document.createElement('system-out')
         testsuite.appendChild(systemout)
 
         stdout = StringIO()
         for test in tests:
             # Merge the stdout from the tests in a class
-            stdout.write(test.stdout)
+            if test.stdout is not None:
+                stdout.write(test.stdout)
         _XMLTestResult._createCDATAsections(
             xml_document, systemout, stdout.getvalue())
 
@@ -344,7 +369,8 @@
         stderr = StringIO()
         for test in tests:
             # Merge the stderr from the tests in a class
-            stderr.write(test.stderr)
+            if test.stderr is not None:
+                stderr.write(test.stderr)
         _XMLTestResult._createCDATAsections(
             xml_document, systemerr, stderr.getvalue())
 
@@ -374,24 +400,26 @@
 
     _createCDATAsections = staticmethod(_createCDATAsections)
 
-    def _report_testcase(suite_name, test_result, xml_testsuite, xml_document):
+    def _report_testcase(test_result, xml_testsuite, xml_document):
         """
         Appends a testcase section to the XML document.
         """
         testcase = xml_document.createElement('testcase')
         xml_testsuite.appendChild(testcase)
 
-        testcase.setAttribute('classname', suite_name)
+        class_name = re.sub(r'^__main__.', '', test_result.id())
+        class_name = class_name.rpartition('.')[0]
+        testcase.setAttribute('classname', class_name)
         testcase.setAttribute(
             'name', _XMLTestResult._test_method_name(test_result.test_id)
         )
         testcase.setAttribute('time', '%.3f' % test_result.elapsed_time)
 
-        if (test_result.outcome != _TestInfo.SUCCESS):
+        if (test_result.outcome != test_result.SUCCESS):
             elem_name = ('failure', 'error', 'skipped')[test_result.outcome-1]
             failure = xml_document.createElement(elem_name)
             testcase.appendChild(failure)
-            if test_result.outcome != _TestInfo.SKIP:
+            if test_result.outcome != test_result.SKIP:
                 failure.setAttribute(
                     'type',
                     safe_unicode(test_result.err[0].__name__)
@@ -442,8 +470,6 @@
             testsuite = _XMLTestResult._report_testsuite(
                 suite_name, tests, doc, parentElement, self.properties
             )
-            for test in tests:
-                _XMLTestResult._report_testcase(suite, test, testsuite, doc)
             xml_content = doc.toprettyxml(
                 indent='\t',
                 encoding=test_runner.encoding
@@ -459,3 +485,57 @@
         if not outputHandledAsString:
             # Assume that test_runner.output is a stream
             test_runner.output.write(xml_content)
+
+    def _exc_info_to_string(self, err, test):
+        """Converts a sys.exc_info()-style tuple of values into a string."""
+        if six.PY3:
+            # It works fine in python 3
+            try:
+                return super(_XMLTestResult, self)._exc_info_to_string(
+                    err, test)
+            except AttributeError:
+                # We keep going using the legacy python <= 2 way
+                pass
+
+        # This comes directly from python2 unittest
+        exctype, value, tb = err
+        # Skip test runner traceback levels
+        while tb and self._is_relevant_tb_level(tb):
+            tb = tb.tb_next
+
+        if exctype is test.failureException:
+            # Skip assert*() traceback levels
+            length = self._count_relevant_tb_levels(tb)
+            msgLines = traceback.format_exception(exctype, value, tb, length)
+        else:
+            msgLines = traceback.format_exception(exctype, value, tb)
+
+        if self.buffer:
+            # Only try to get sys.stdout and sys.sterr as they not be
+            # StringIO yet, e.g. when test fails during __call__
+            try:
+                output = sys.stdout.getvalue()
+            except AttributeError:
+                output = None
+            try:
+                error = sys.stderr.getvalue()
+            except AttributeError:
+                error = None
+            if output:
+                if not output.endswith('\n'):
+                    output += '\n'
+                msgLines.append(STDOUT_LINE % output)
+            if error:
+                if not error.endswith('\n'):
+                    error += '\n'
+                msgLines.append(STDERR_LINE % error)
+        # This is the extra magic to make sure all lines are str
+        encoding = getattr(sys.stdout, 'encoding', 'utf-8')
+        lines = []
+        for line in msgLines:
+            if not isinstance(line, str):
+                # utf8 shouldnt be hard-coded, but not sure f
+                line = line.encode(encoding)
+            lines.append(line)
+
+        return ''.join(lines)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/runner.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/runner.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/runner.py       2015-02-13 
08:47:45.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/runner.py        2016-04-10 
07:18:19.000000000 +0200
@@ -16,7 +16,8 @@
     """
     def __init__(self, output='.', outsuffix=None, stream=sys.stderr,
                  descriptions=True, verbosity=1, elapsed_times=True,
-                 failfast=False, buffer=False, encoding=UTF8):
+                 failfast=False, buffer=False, encoding=UTF8,
+                 resultclass=None):
         TextTestRunner.__init__(self, stream, descriptions, verbosity,
                                 failfast=failfast, buffer=buffer)
         self.verbosity = verbosity
@@ -28,13 +29,18 @@
             outsuffix = time.strftime("%Y%m%d%H%M%S")
         self.outsuffix = outsuffix
         self.elapsed_times = elapsed_times
+        if resultclass is None:
+            self.resultclass = _XMLTestResult
+        else:
+            self.resultclass = resultclass
 
     def _make_result(self):
         """
         Creates a TestResult object which will be used to store
         information about the executed tests.
         """
-        return _XMLTestResult(
+        # override in subclasses if necessary.
+        return self.resultclass(
             self.stream, self.descriptions, self.verbosity, self.elapsed_times
         )
 
@@ -45,6 +51,7 @@
         try:
             # Prepare the test execution
             result = self._make_result()
+            result.failfast = self.failfast
             if hasattr(test, 'properties'):
                 # junit testsuite properties
                 result.properties = test.properties
@@ -69,15 +76,10 @@
             )
             self.stream.writeln()
 
-            expectedFails = unexpectedSuccesses = skipped = 0
-            try:
-                results = map(len, (result.expectedFailures,
-                                    result.unexpectedSuccesses,
-                                    result.skipped))
-            except AttributeError:
-                pass
-            else:
-                expectedFails, unexpectedSuccesses, skipped = results
+            # other metrics
+            expectedFails = len(result.expectedFailures)
+            unexpectedSuccesses = len(result.unexpectedSuccesses)
+            skipped = len(result.skipped)
 
             # Error traces
             infos = []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/unittest.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/unittest.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/unittest.py     2015-02-13 
08:46:07.000000000 +0100
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/unittest.py      2016-04-10 
07:18:19.000000000 +0200
@@ -2,25 +2,18 @@
 from __future__ import absolute_import
 
 import sys
-if sys.version_info < (2, 7):
-    # pylint: disable-msg=W0611
-    import unittest2 as unittest
-    from unittest2.runner import TextTestRunner
-    from unittest2.runner import TextTestResult as _TextTestResult
-    from unittest2.result import TestResult
-    from unittest2.main import TestProgram
-else:
-    # pylint: disable-msg=W0611
-    import unittest
-    from unittest import TextTestRunner
-    from unittest import TestResult, _TextTestResult
-    from unittest.main import TestProgram
-    try:
-        from unittest.main import USAGE_AS_MAIN
-        TestProgram.USAGE = USAGE_AS_MAIN
-    except ImportError:
-        pass
+# pylint: disable-msg=W0611
+import unittest
+from unittest import TextTestRunner
+from unittest import TestResult, _TextTestResult
+from unittest.result import failfast
+from unittest.main import TestProgram
+try:
+    from unittest.main import USAGE_AS_MAIN
+    TestProgram.USAGE = USAGE_AS_MAIN
+except ImportError:
+    pass
 
 __all__ = (
     'unittest', 'TextTestRunner', 'TestResult', '_TextTestResult',
-    'TestProgram')
+    'TestProgram', 'failfast')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/unittest-xml-reporting-1.12.0/xmlrunner/version.py 
new/unittest-xml-reporting-2.1.0/xmlrunner/version.py
--- old/unittest-xml-reporting-1.12.0/xmlrunner/version.py      2015-04-14 
23:45:24.000000000 +0200
+++ new/unittest-xml-reporting-2.1.0/xmlrunner/version.py       2016-04-10 
07:18:19.000000000 +0200
@@ -1,2 +1,2 @@
 
-__version__ = '1.12.0'
+__version__ = '2.1.0'


Reply via email to