PKnLbbpytest_markdown/__init__.py''' A py.test plugin that runs tests its found in your Markdown files. ''' __version__ = '0.0.4' PK(Lh̡ pytest_markdown/plugin.pyimport imp import CommonMark import pytest from _pytest.python import Module class MarkdownItem(Module): def __init__(self, name, file, code, nodeid=None): self._code_obj = imp.new_module(name) exec(code, self._code_obj.__dict__) super().__init__(name, file, nodeid=nodeid) def _getobj(self): return self._code_obj def collect_literals_from_children(token): literals = [] stack = [token.first_child] while stack: cur = stack.pop() if cur.literal: literals.append(cur.literal) if cur.nxt: stack.append(cur.nxt) if cur.first_child: stack.append(cur.first_child) return ''.join(literals) class MarkdownCollector(object): def __init__(self, item): super().__init__() self.item = item self.ast = CommonMark.Parser().parse(self.item.fspath.open().read()) self.stack = [(0, self.item, self.item.name,)] self.collected = [] def collect(self): self.stack = [(0, self.item, self.item.name,)] self.collected = [] walker = self.ast.walker() event = walker.nxt() while event is not None: if not event['entering']: event = walker.nxt() continue type_ = event['node'].t if hasattr(self, type_): getattr(self, type_)(event['node']) event = walker.nxt() return self.collected def heading(self, token): while self.stack[-1][0] >= token.level: self.stack.pop() name = collect_literals_from_children(token).lower().replace(' ', '-') nodeid = '::'.join(s[2] for s in self.stack) + '::' + name self.stack.append(( token.level, pytest.Item(name, self.stack[-1][1], nodeid=nodeid), name )) def code_block(self, token): if token.info != 'python': return output = token.literal if output.startswith('\n'): return '' name = f'line_{token.sourcepos[0][0]}' if output.lower().strip().startswith('# conftest.py\n'): nodeid = self.stack[-1][1].nodeid else: nodeid = self.stack[-1][1].nodeid + '::' + name mi = MarkdownItem( name, self.stack[-1][1], output, nodeid=nodeid ) self.collected.append(mi) return '' class MarkdownFile(pytest.File): def collect(self): for item in MarkdownCollector(self).collect(): yield item def pytest_collect_file(parent, path): if path.ext == '.md': return MarkdownFile(path, parent) PK!H-1B#,0pytest_markdown-0.0.4.dist-info/entry_points.txt.,I-.14M,N/ϳz9y\\PK!HNO%pytest_markdown-0.0.4.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,zd&Y)r$[)T&UrPK!H {(pytest_markdown-0.0.4.dist-info/METADATA]S]o@|XW| d4)I&x{c ٹٹdwt^)LfRc /-ݺɎl5F 2E!?+.vLR-z}!5OmB j%myG5wDY6!W-5ҹQKqQ2)G1`E\g'*>]^ )x|L& <1s[Z)`KV3A(rbOj'V;i'^ 3pKnهzoEo`d V{de izr|AV|d 25Q>3K _Ǥ5tϗCA˲WS OףZI9#@})nlI, tI {oU PBMT9bٶXbJ-k/ 1Ν{ |=yoX)O>INYPK!HIvT1&pytest_markdown-0.0.4.dist-info/RECORDͶB@}ς pCEIl?C0i:6뤫vhqL#$`;T(IU+ˢq]y>z6ugƨʌ|֗Sa ]ZEq@c0@O9?(vSLZGG̋#\B j} NXw]_ zF6i۶ 1L׍ؒ{ EHpC"/կc