1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
from __future__ import print_function
from functools import partial
import re
import pytest
from sybil import Region, Sybil
from sybil.parsers.rest import PythonCodeBlockParser
@pytest.fixture(scope="function")
def function_fixture():
print('function_fixture setup')
yield 'f'
print(' function_fixture teardown')
@pytest.fixture(scope="class")
def class_fixture():
print('class_fixture setup')
yield 'c'
print('class_fixture teardown')
@pytest.fixture(scope="module")
def module_fixture():
print('module_fixture setup')
yield 'm'
print('module_fixture teardown')
@pytest.fixture(scope="session")
def session_fixture():
print('session_fixture setup')
yield 's'
print('session_fixture teardown')
def check(letter, example):
namespace = example.namespace
for name in (
'x', 'session_fixture', 'module_fixture',
'class_fixture', 'function_fixture'
):
print(namespace[name], end='')
print(end=' ')
namespace['x'] += 1
text, expected = example.parsed
actual = text.count(letter)
if actual != expected:
message = '{} count was {} instead of {}'.format(
letter, actual, expected
)
if letter=='X':
raise ValueError(message)
return message
def parse_for(letter, document):
for m in re.finditer(r'(%s+) (\d+) check' % letter, document.text):
yield Region(m.start(), m.end(),
(m.group(1), int(m.group(2))),
partial(check, letter))
def sybil_setup(namespace):
print('sybil setup', end=' ')
namespace['x'] = 0
def sybil_teardown(namespace):
print('sybil teardown', namespace['x'])
pytest_collect_file = Sybil(
parsers=[
partial(parse_for, 'X'),
partial(parse_for, 'Y'),
PythonCodeBlockParser(['print_function'])
],
pattern='*.rst',
setup=sybil_setup, teardown=sybil_teardown,
fixtures=['function_fixture', 'class_fixture',
'module_fixture', 'session_fixture']
).pytest()
|