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