晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/cloudlinux/venv/lib64/python3.11/site-packages/testfixtures/ |
| Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/testfixtures/sybil.py |
import os
import re
import textwrap
from sybil import Region, Example, Document
from testfixtures import diff
FILEBLOCK_START = re.compile(r'^\.\.\s*topic::?\s*(.+)\b', re.MULTILINE)
FILEBLOCK_END = re.compile(r'(\n\Z|\n(?=\S))')
CLASS = re.compile(r'\s+:class:\s*(read|write)-file')
class FileBlock(object):
def __init__(self, path, content, action):
self.path, self.content, self.action = path, content, action
class FileParser(object):
"""
A `Sybil <http://sybil.readthedocs.io>`__ parser that
parses certain ReST sections to read and write files in the
configured :class:`~testfixtures.TempDirectory`.
:param name: This is the name of the :class:`~testfixtures.TempDirectory` to use
in the Sybil test namespace.
"""
def __init__(self, name: str):
self.name = name
def __call__(self, document: Document):
for start_match, end_match, source in document.find_region_sources(
FILEBLOCK_START, FILEBLOCK_END
):
lines = source.splitlines()
class_ = CLASS.match(lines[1])
if not class_:
continue
index = 3
if lines[index].strip() == '::':
index += 1
source = textwrap.dedent('\n'.join(lines[index:])).lstrip()
if source[-1] != '\n':
source += '\n'
parsed = FileBlock(
path=start_match.group(1),
content=source,
action=class_.group(1)
)
yield Region(
start_match.start(),
end_match.end(),
parsed,
self.evaluate
)
def evaluate(self, example: Example):
block: FileBlock = example.parsed
dir = example.namespace[self.name]
if block.action == 'read':
actual = dir.read(block.path, 'ascii').replace(os.linesep, '\n')
if actual != block.content:
return diff(
block.content,
actual,
'File %r, line %i:' % (example.path, example.line),
'Reading from "%s":' % dir.as_string(block.path)
)
if block.action == 'write':
dir.write(block.path, block.content, 'ascii')
|