1# conftest.py - pytest configuration and shared fixtures 2 3from __future__ import unicode_literals 4 5import sys 6import locale 7import argparse 8 9import pytest 10 11PY2 = (sys.version_info.major == 2) 12 13ENCODING = ['utf-8', 'utf-16', 'utf-8-sig', 'latin9'] 14 15CLEAN = {'utf-8', 'latin9'} 16 17 18def pytest_configure(config): 19 py2only = pytest.mark.skipif(not PY2, reason='Python 2 only') 20 py3only = pytest.mark.skipif(PY2, reason='Python 3 only') 21 pytest.csv23 = argparse.Namespace(PY2=PY2, py2only=py2only, py3only=py3only) 22 23 24@pytest.fixture(scope='session') 25def py2(): 26 return PY2 27 28 29@pytest.fixture(params=ENCODING) 30def encoding(request): 31 return request.param 32 33 34@pytest.fixture(params=[False] + [e for e in ENCODING if e in CLEAN]) 35def inner_encoding(request): 36 return request.param 37 38 39@pytest.fixture(scope='session') 40def none_encoding(): 41 return locale.getpreferredencoding() 42 43 44@pytest.fixture(scope='session') 45def nonclean_encoding(): 46 return next(e for e in ENCODING if e not in CLEAN) 47 48 49@pytest.fixture 50def nonclean_none_encoding(mocker, nonclean_encoding): 51 mocker.patch('locale.getpreferredencoding', autospec=True, 52 return_value=nonclean_encoding) 53 yield nonclean_encoding 54 55 56@pytest.fixture 57def mock_open(mocker): 58 yield mocker.patch('io.open', mocker.mock_open()) 59 60 61@pytest.fixture 62def filepath(tmp_path): 63 return tmp_path / 'spam.csv' 64