$ tox -e py310
GLOB sdist-make: /tmp/csv23/setup.py
py310 inst-nodeps: /tmp/csv23/.tox/.tmp/package/1/csv23-0.3.3.dev0.zip
py310 installed: attrs==21.2.0,coverage==5.5,csv23 @ file:///tmp/csv23/.tox/.tmp/package/1/csv23-0.3.3.dev0.zip,iniconfig==1.1.1,mock==4.0.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pyparsing==2.4.7,pytest==6.2.4,pytest-cov==2.12.0,pytest-mock==3.6.1,toml==0.10.2
py310 run-test-pre: PYTHONHASHSEED='3528200982'
py310 run-test: commands[0] | ./run-tests.py
============================================================== test session starts ===============================================================
platform linux -- Python 3.10.0b1, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
cachedir: .tox/py310/.pytest_cache
rootdir: /tmp/csv23, configfile: setup.cfg, testpaths: csv23, tests
plugins: cov-2.12.0, mock-3.6.1
collected 339 items
csv23/__init__.py s. [ 0%]
csv23/_common.py . [ 0%]
csv23/extras.py . [ 1%]
csv23/openers.py ss [ 1%]
csv23/readers.py . [ 2%]
csv23/shortcuts.py .. [ 2%]
csv23/writers.py . [ 2%]
tests/test_common.py ........ssss. [ 6%]
tests/test_dialect.py .............. [ 10%]
tests/test_encoding.py ...... [ 12%]
tests/test_extras.py ............ [ 16%]
tests/test_init.py ......... [ 18%]
tests/test_openers.py ... [ 19%]
tests/test_readers.py .......x.......x.......x.....s.x.......x.......x.....s.x [ 36%]
tests/test_rowtype.py .......... [ 39%]
tests/test_shortcuts.py ss........................................ [ 51%]
tests/test_stdlib_csv.py ..................................................................................FF............ [ 79%]
tests/test_stdlib_truncate.py s. [ 80%]
tests/test_workarounds.py .. [ 81%]
tests/test_writers.py .....F.......F.......F......sF...............F.......F......sF.. [100%]
==================================================================== FAILURES ====================================================================
___________________________________________________ test_csv_roundtrip[spam\\eggs-0-"-\\-True] ___________________________________________________
py2 = False, quoting = 0, quotechar = '"', escapechar = '\\', doublequote = True, value = 'spam\\eggs'
@pytest.mark.parametrize(', '.join(FORMATS[0]), FORMATS[1:])
@pytest.mark.parametrize('value', VALUES)
def test_csv_roundtrip(py2, quoting, quotechar, escapechar, doublequote, value):
csv_kwargs = {'quoting': quoting, 'quotechar': quotechar,
'escapechar': escapechar, 'doublequote': doublequote}
row = expected = [value]
with io.BytesIO() if py2 else io.StringIO(newline='') as f:
if quoting != csv.QUOTE_NONE and quotechar is None:
with pytest.raises(TypeError, match=r'quotechar must be set'):
csv.writer(f, **csv_kwargs)
return
writer = csv.writer(f, **csv_kwargs)
if escapechar is None and (quoting == csv.QUOTE_NONE or not doublequote):
need_escape = [',', '\r', '\n'] if quoting == csv.QUOTE_NONE else []
if quotechar is not None:
need_escape.append(quotechar)
if any(n in value for n in need_escape):
with pytest.raises(Exception, match=r'need to escape'):
writer.writerow(row)
return
writer.writerow(row)
f.seek(0)
row = next(csv.reader(f, **csv_kwargs))
if quoting != csv.QUOTE_NONE and escapechar is not None and escapechar in value:
# writer fails to escape escapechar
> assert row != expected
E AssertionError: assert ['spam\\eggs'] != ['spam\\eggs']
tests/test_stdlib_csv.py:67: AssertionError
__________________________________________________ test_csv_roundtrip[spam\\eggs-0-"-\\-False] ___________________________________________________
py2 = False, quoting = 0, quotechar = '"', escapechar = '\\', doublequote = False, value = 'spam\\eggs'
@pytest.mark.parametrize(', '.join(FORMATS[0]), FORMATS[1:])
@pytest.mark.parametrize('value', VALUES)
def test_csv_roundtrip(py2, quoting, quotechar, escapechar, doublequote, value):
csv_kwargs = {'quoting': quoting, 'quotechar': quotechar,
'escapechar': escapechar, 'doublequote': doublequote}
row = expected = [value]
with io.BytesIO() if py2 else io.StringIO(newline='') as f:
if quoting != csv.QUOTE_NONE and quotechar is None:
with pytest.raises(TypeError, match=r'quotechar must be set'):
csv.writer(f, **csv_kwargs)
return
writer = csv.writer(f, **csv_kwargs)
if escapechar is None and (quoting == csv.QUOTE_NONE or not doublequote):
need_escape = [',', '\r', '\n'] if quoting == csv.QUOTE_NONE else []
if quotechar is not None:
need_escape.append(quotechar)
if any(n in value for n in need_escape):
with pytest.raises(Exception, match=r'need to escape'):
writer.writerow(row)
return
writer.writerow(row)
f.seek(0)
row = next(csv.reader(f, **csv_kwargs))
if quoting != csv.QUOTE_NONE and escapechar is not None and escapechar in value:
# writer fails to escape escapechar
> assert row != expected
E AssertionError: assert ['spam\\eggs'] != ['spam\\eggs']
tests/test_stdlib_csv.py:67: AssertionError
___________________________________________ test_open_writer[utf-8-row5-fmtparams5-"spam\\\\eggs"\r\n] ___________________________________________
py2 = False, filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_open_writer_utf_8_row5_fm0/spam.csv'), encoding = 'utf-8'
row = ['spam\\eggs'], fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_open_writer(py2, filepath, encoding, row, fmtparams, expected, n=12):
try:
expected.encode(encoding)
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
write_n = len(expected.encode(encoding) if py2 and is_8bit_clean(encoding) else expected)
filename = str(filepath)
with open_writer(filename, encoding=encoding, **fmtparams) as w:
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:55: AssertionError
__________________________________________ test_open_writer[utf-16-row5-fmtparams5-"spam\\\\eggs"\r\n] ___________________________________________
py2 = False, filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_open_writer_utf_16_row5_f0/spam.csv'), encoding = 'utf-16'
row = ['spam\\eggs'], fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_open_writer(py2, filepath, encoding, row, fmtparams, expected, n=12):
try:
expected.encode(encoding)
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
write_n = len(expected.encode(encoding) if py2 and is_8bit_clean(encoding) else expected)
filename = str(filepath)
with open_writer(filename, encoding=encoding, **fmtparams) as w:
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:55: AssertionError
_________________________________________ test_open_writer[utf-8-sig-row5-fmtparams5-"spam\\\\eggs"\r\n] _________________________________________
py2 = False, filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_open_writer_utf_8_sig_row5/spam.csv'), encoding = 'utf-8-sig'
row = ['spam\\eggs'], fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_open_writer(py2, filepath, encoding, row, fmtparams, expected, n=12):
try:
expected.encode(encoding)
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
write_n = len(expected.encode(encoding) if py2 and is_8bit_clean(encoding) else expected)
filename = str(filepath)
with open_writer(filename, encoding=encoding, **fmtparams) as w:
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:55: AssertionError
__________________________________________ test_open_writer[latin9-row5-fmtparams5-"spam\\\\eggs"\r\n] ___________________________________________
py2 = False, filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_open_writer_latin9_row5_f0/spam.csv'), encoding = 'latin9'
row = ['spam\\eggs'], fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_open_writer(py2, filepath, encoding, row, fmtparams, expected, n=12):
try:
expected.encode(encoding)
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
write_n = len(expected.encode(encoding) if py2 and is_8bit_clean(encoding) else expected)
filename = str(filepath)
with open_writer(filename, encoding=encoding, **fmtparams) as w:
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:55: AssertionError
_____________________________________________ test_writer[False-row5-fmtparams5-"spam\\\\eggs"\r\n] ______________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7ff8b28362c0>, py2 = False
filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_writer_False_row5_fmtpara0/spam.csv'), inner_encoding = False, row = ['spam\\eggs']
fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_writer(mocker, py2, filepath, inner_encoding,
row, fmtparams, expected, n=12):
encoding = inner_encoding
if encoding is False:
if py2:
expected_type = UnicodeTextWriter
elif (fmtparams.get('escapechar')
and fmtparams.get('quoting', csv.QUOTE_MINIMAL) != csv.QUOTE_NONE):
expected_type = _UnicodeTextWriter
else:
expected_type = type(csv.writer(mocker.mock_open()()))
write_n = len(expected)
file_encoding = 'utf-8'
open_kwargs = {'mode': 'w', 'encoding': file_encoding, 'newline': ''}
else:
expected_type = UnicodeBytesWriter
try:
write_n = len(expected.encode(encoding))
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
file_encoding = encoding
open_kwargs = {'mode': 'wb'}
filename = str(filepath)
with io.open(filename, **open_kwargs) as f:
w = writer(f, encoding=encoding, **fmtparams)
> assert isinstance(w, expected_type)
E AssertionError: assert False
E + where False = isinstance(<_csv.writer object at 0x7ff8b2697b20>, <class 'csv23.writers._UnicodeTextWriter'>)
tests/test_writers.py:99: AssertionError
_____________________________________________ test_writer[utf-8-row5-fmtparams5-"spam\\\\eggs"\r\n] ______________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7ff8b23e1a20>, py2 = False
filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_writer_utf_8_row5_fmtpara0/spam.csv'), inner_encoding = 'utf-8', row = ['spam\\eggs']
fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_writer(mocker, py2, filepath, inner_encoding,
row, fmtparams, expected, n=12):
encoding = inner_encoding
if encoding is False:
if py2:
expected_type = UnicodeTextWriter
elif (fmtparams.get('escapechar')
and fmtparams.get('quoting', csv.QUOTE_MINIMAL) != csv.QUOTE_NONE):
expected_type = _UnicodeTextWriter
else:
expected_type = type(csv.writer(mocker.mock_open()()))
write_n = len(expected)
file_encoding = 'utf-8'
open_kwargs = {'mode': 'w', 'encoding': file_encoding, 'newline': ''}
else:
expected_type = UnicodeBytesWriter
try:
write_n = len(expected.encode(encoding))
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
file_encoding = encoding
open_kwargs = {'mode': 'wb'}
filename = str(filepath)
with io.open(filename, **open_kwargs) as f:
w = writer(f, encoding=encoding, **fmtparams)
assert isinstance(w, expected_type)
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=file_encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:106: AssertionError
_____________________________________________ test_writer[latin9-row5-fmtparams5-"spam\\\\eggs"\r\n] _____________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7ff8b23e22f0>, py2 = False
filepath = PosixPath('/tmp/pytest-of-mgorny/pytest-8/test_writer_latin9_row5_fmtpar0/spam.csv'), inner_encoding = 'latin9', row = ['spam\\eggs']
fmtparams = {'escapechar': '\\', 'quoting': 0}, expected = '"spam\\\\eggs"\r\n', n = 12
@pytest.mark.parametrize('row, fmtparams, expected', ROW_FORMAT_LINE)
def test_writer(mocker, py2, filepath, inner_encoding,
row, fmtparams, expected, n=12):
encoding = inner_encoding
if encoding is False:
if py2:
expected_type = UnicodeTextWriter
elif (fmtparams.get('escapechar')
and fmtparams.get('quoting', csv.QUOTE_MINIMAL) != csv.QUOTE_NONE):
expected_type = _UnicodeTextWriter
else:
expected_type = type(csv.writer(mocker.mock_open()()))
write_n = len(expected)
file_encoding = 'utf-8'
open_kwargs = {'mode': 'w', 'encoding': file_encoding, 'newline': ''}
else:
expected_type = UnicodeBytesWriter
try:
write_n = len(expected.encode(encoding))
except UnicodeEncodeError:
pytest.skip('impossible combination of row and encoding')
file_encoding = encoding
open_kwargs = {'mode': 'wb'}
filename = str(filepath)
with io.open(filename, **open_kwargs) as f:
w = writer(f, encoding=encoding, **fmtparams)
assert isinstance(w, expected_type)
written = w.writerow(row)
w.writerows([row] * (n - 1))
with io.open(filename, encoding=file_encoding, newline='') as f:
line = f.read()
> assert line == expected * n
E assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg...\\\\eggs"\r\n'
E - "spam\\eggs"
E ? - -
E + spam\\eggs
E - "spam\\eggs"
E ? - -
E + spam\\eggs
... - "spam\\eggs"
E
E ...Full output truncated (30 lines hidden), use '-vv' to show
tests/test_writers.py:106: AssertionError
----------- coverage: platform linux, python 3.10.0-beta-1 -----------
Name Stmts Miss Cover
-------------------------------------------
csv23/__init__.py 28 0 100%
csv23/_common.py 33 6 82%
csv23/_dispatch.py 29 0 100%
csv23/_workarounds.py 22 1 95%
csv23/dialects.py 28 8 71%
csv23/extras.py 59 2 97%
csv23/openers.py 35 6 83%
csv23/readers.py 59 16 73%
csv23/shortcuts.py 107 8 93%
csv23/writers.py 90 33 63%
-------------------------------------------
TOTAL 490 80 84%
Coverage HTML written to dir htmlcov
============================================================ short test summary info =============================================================
FAILED tests/test_stdlib_csv.py::test_csv_roundtrip[spam\\eggs-0-"-\\-True] - AssertionError: assert ['spam\\eggs'] != ['spam\\eggs']
FAILED tests/test_stdlib_csv.py::test_csv_roundtrip[spam\\eggs-0-"-\\-False] - AssertionError: assert ['spam\\eggs'] != ['spam\\eggs']
FAILED tests/test_writers.py::test_open_writer[utf-8-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\e...
FAILED tests/test_writers.py::test_open_writer[utf-16-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\...
FAILED tests/test_writers.py::test_open_writer[utf-8-sig-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\...
FAILED tests/test_writers.py::test_open_writer[latin9-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\...
FAILED tests/test_writers.py::test_writer[False-row5-fmtparams5-"spam\\\\eggs"\r\n] - AssertionError: assert False
FAILED tests/test_writers.py::test_writer[utf-8-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg......
FAILED tests/test_writers.py::test_writer[latin9-row5-fmtparams5-"spam\\\\eggs"\r\n] - assert 'spam\\\\eggs...m\\\\eggs\r\n' == '"spam\\\\egg.....
============================================== 9 failed, 309 passed, 14 skipped, 7 xfailed in 1.47s ==============================================
ERROR: InvocationError for command /tmp/csv23/run-tests.py (exited with code 1)
____________________________________________________________________ summary _____________________________________________________________________
ERROR: py310: commands failed