Update to latest unittest-xml-reporting. Fix missing .fileno method.

This commit is contained in:
Pedro Algarvio 2019-11-26 18:19:05 +00:00 committed by Gareth J. Greenaway
parent d0150d8369
commit 6878111344
No known key found for this signature in database
GPG key ID: 10B62F8A7CAD7A41
2 changed files with 40 additions and 33 deletions

View file

@ -475,7 +475,7 @@ def _runtests(session, coverage, cmd_args):
@nox.parametrize('crypto', [None, 'm2crypto', 'pycryptodomex'])
def runtests_parametrized(session, coverage, transport, crypto):
# Install requirements
_install_requirements(session, transport, 'unittest-xml-reporting==2.2.1')
_install_requirements(session, transport, 'unittest-xml-reporting==2.5.2')
if crypto:
if crypto == 'm2crypto':

View file

@ -15,12 +15,8 @@
# Import python libs
from __future__ import absolute_import
import io
import sys
import logging
# Import 3rd-party libs
from salt.ext import six
log = logging.getLogger(__name__)
@ -29,46 +25,57 @@ try:
import xmlrunner.result
HAS_XMLRUNNER = True
class _DelegateIO(object):
'''
This class defines an object that captures whatever is written to
a stream or file.
'''
class _DuplicateWriter(io.TextIOBase):
"""
Duplicate output from the first handle to the second handle
The second handle is expected to be a StringIO and not to block.
"""
def __init__(self, delegate):
self._captured = six.StringIO()
self.delegate = delegate
def __init__(self, first, second):
super(_DuplicateWriter, self).__init__()
self._first = first
self._second = second
def write(self, text):
if six.PY2 and isinstance(text, six.text_type):
text = text.encode(__salt_system_encoding__)
self._captured.write(text)
self.delegate.write(text)
def flush(self):
self._first.flush()
self._second.flush()
def writable(self):
return True
def writelines(self, lines):
self._first.writelines(lines)
self._second.writelines(lines)
def write(self, b):
if isinstance(self._first, io.TextIOBase):
wrote = self._first.write(b)
if wrote is not None:
# expected to always succeed to write
self._second.write(b[:wrote])
return wrote
else:
# file-like object in Python2
# It doesn't return wrote bytes.
self._first.write(b)
self._second.write(b)
return len(b)
def fileno(self):
return self.delegate.fileno()
return self._first.fileno()
def __getattr__(self, attr):
try:
return getattr(self._captured, attr)
except (AttributeError, io.UnsupportedOperation):
return getattr(self.delegate, attr)
xmlrunner.result._DuplicateWriter = _DuplicateWriter
class _XMLTestResult(xmlrunner.result._XMLTestResult):
def startTest(self, test):
log.debug('>>>>> START >>>>> {0}'.format(test.id()))
log.debug('>>>>> START >>>>> %s', test.id())
# xmlrunner classes are NOT new-style classes
xmlrunner.result._XMLTestResult.startTest(self, test)
if self.buffer:
# Let's override the values of self._stdXXX_buffer
# We want a similar sys.stdXXX file like behaviour
self._stderr_buffer = _DelegateIO(sys.__stderr__)
self._stdout_buffer = _DelegateIO(sys.__stdout__)
sys.stderr = self._stderr_buffer
sys.stdout = self._stdout_buffer
def stopTest(self, test):
log.debug('<<<<< END <<<<<<< {0}'.format(test.id()))
log.debug('<<<<< END <<<<<<< %s', test.id())
# xmlrunner classes are NOT new-style classes
return xmlrunner.result._XMLTestResult.stopTest(self, test)