晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/cloudlinux/venv/lib64/python3.11/site-packages/testfixtures/ |
| Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/testfixtures/django.py |
from functools import partial
from typing import Dict, Any, Sequence, Callable, Optional
from django.db.models import Model
from . import compare as base_compare
from .comparison import _compare_mapping, register, CompareContext, unspecified, Registry
def instance_fields(instance):
opts = instance._meta
for name in (
'concrete_fields',
'virtual_fields',
'private_fields',
):
fields = getattr(opts, name, None)
if fields:
for field in fields:
yield field
def model_to_dict(
instance: Any,
exclude: Sequence[str],
include_not_editable: bool,
) -> Dict[str, Any]:
data = {}
for f in instance_fields(instance):
if f.name in exclude:
continue
if not getattr(f, 'editable', False) and not include_not_editable:
continue
data[f.name] = f.value_from_object(instance)
return data
def compare_model(x, y, context: CompareContext):
"""
Returns an informative string describing the differences between the two
supplied Django model instances. The way in which this comparison is
performed can be controlled using the following parameters:
:param ignore_fields:
A sequence of fields to ignore during comparison, most commonly
set to ``['id']``. By default, no fields are ignored.
:param non_editable_fields:
If `True`, then fields with ``editable=False`` will be included in the
comparison. By default, these fields are ignored.
"""
ignore_fields = context.get_option('ignore_fields', set())
non_editable_fields= context.get_option('non_editable_fields', False)
args = []
for obj in x, y:
args.append(model_to_dict(obj, ignore_fields, non_editable_fields))
args.append(context)
args.append(x)
return _compare_mapping(*args)
register(Model, compare_model)
def compare(
*args,
x: Any = unspecified,
y: Any = unspecified,
expected: Any = unspecified,
actual: Any = unspecified,
prefix: str = None,
suffix: str = None,
x_label: str = None,
y_label: str = None,
raises: bool = True,
recursive: bool = True,
strict: bool = False,
ignore_eq: bool = True,
comparers: Registry = None,
**options: Any
) -> Optional[str]:
"""
This is identical to :func:`~testfixtures.compare`, but with ``ignore=True``
automatically set to make comparing django :class:`~django.db.models.Model`
instances easier.
"""
return base_compare(
*args,
x=x,
y=y,
expected=expected,
actual=actual,
prefix=prefix,
suffix=suffix,
x_label=x_label,
y_label=y_label,
raises=raises,
recursive=recursive,
strict=strict,
ignore_eq=ignore_eq,
comparers=comparers,
**options
)
|