xflr6 / csv23 Goto Github PK
View Code? Open in Web Editor NEWPython 2/3 unicode CSV compatibility layer
Home Page: https://csv23.readthedocs.io
License: MIT License
Python 2/3 unicode CSV compatibility layer
Home Page: https://csv23.readthedocs.io
License: MIT License
We use pre-built PyPy3 binaries on Ubuntu VM images and test that PyPy3 via some custom test definitions mostly based on some old version of https://github.com/pypa/pip/tree/master/tests
Unfortunately, tests started to fail with the 0.3 update(rollback to 0.2 resolves the issue) with the following errors:
___________ ERROR collecting tests/functional/test_install_wheel.py ____________
ImportError while importing test module '/home/vsts/work/1/s/src/python/pip-repository/tests/functional/test_install_wheel.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/functional/test_install_wheel.py:10: in <module>
from tests.lib.wheel import make_wheel
tests/lib/wheel.py:14: in <module>
import csv23
.tox/py/site-packages/csv23/__init__.py:20: in <module>
from .shortcuts import read_csv, write_csv
.tox/py/site-packages/csv23/shortcuts.py:58: in <module>
import builtins, bz2, gzip, lzma
/opt/hostedtoolcache/PyPy/3.6.9/x64/lib-python/3/lzma.py:27: in <module>
from _lzma import *
/opt/hostedtoolcache/PyPy/3.6.9/x64/lib_pypy/_lzma.py:15: in <module>
from _lzma_cffi import ffi, lib as m
E ImportError: /opt/hostedtoolcache/PyPy/3.6.9/x64/lib_pypy/_lzma_cffi.pypy36-pp73-x86_64-linux-gnu.so: undefined symbol: lzma_index_stream_padding
___________________ ERROR collecting tests/lib/test_wheel.py ___________________
ImportError while importing test module '/home/vsts/work/1/s/src/python/pip-repository/tests/lib/test_wheel.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/lib/test_wheel.py:8: in <module>
from tests.lib.wheel import (
tests/lib/wheel.py:14: in <module>
import csv23
.tox/py/site-packages/csv23/__init__.py:20: in <module>
from .shortcuts import read_csv, write_csv
.tox/py/site-packages/csv23/shortcuts.py:58: in <module>
import builtins, bz2, gzip, lzma
/opt/hostedtoolcache/PyPy/3.6.9/x64/lib-python/3/lzma.py:27: in <module>
from _lzma import *
/opt/hostedtoolcache/PyPy/3.6.9/x64/lib_pypy/_lzma.py:15: in <module>
from _lzma_cffi import ffi, lib as m
E ImportError: /opt/hostedtoolcache/PyPy/3.6.9/x64/lib_pypy/_lzma_cffi.pypy36-pp73-x86_64-linux-gnu.so: undefined symbol: lzma_index_stream_padding
Could you please help us understanding the root cause?
The tests are failing with Python 3.10.0b1. Tested with git master (1677f82 and 7f10b99), get the same results, so I'm wondering if the py3.10 fix works.
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.....
Full output:
$ 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
This is a great looking library. Do you have any interest in providing type stubs for it? (Via https://www.python.org/dev/peps/pep-0561/)
csv23/writers.py
imports mock
, but pip install csv23
on Python 2 does not pull in the mock
package, resulting in an ImportError
on import csv23
.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.