|
|
|
|
|
""" |
|
Classes Without Boilerplate |
|
""" |
|
|
|
from functools import partial |
|
from typing import Callable |
|
|
|
from . import converters, exceptions, filters, setters, validators |
|
from ._cmp import cmp_using |
|
from ._compat import Protocol |
|
from ._config import get_run_validators, set_run_validators |
|
from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types |
|
from ._make import ( |
|
NOTHING, |
|
Attribute, |
|
Factory, |
|
attrib, |
|
attrs, |
|
fields, |
|
fields_dict, |
|
make_class, |
|
validate, |
|
) |
|
from ._next_gen import define, field, frozen, mutable |
|
from ._version_info import VersionInfo |
|
|
|
|
|
s = attributes = attrs |
|
ib = attr = attrib |
|
dataclass = partial(attrs, auto_attribs=True) |
|
|
|
|
|
class AttrsInstance(Protocol): |
|
pass |
|
|
|
|
|
__all__ = [ |
|
"Attribute", |
|
"AttrsInstance", |
|
"Factory", |
|
"NOTHING", |
|
"asdict", |
|
"assoc", |
|
"astuple", |
|
"attr", |
|
"attrib", |
|
"attributes", |
|
"attrs", |
|
"cmp_using", |
|
"converters", |
|
"define", |
|
"evolve", |
|
"exceptions", |
|
"field", |
|
"fields", |
|
"fields_dict", |
|
"filters", |
|
"frozen", |
|
"get_run_validators", |
|
"has", |
|
"ib", |
|
"make_class", |
|
"mutable", |
|
"resolve_types", |
|
"s", |
|
"set_run_validators", |
|
"setters", |
|
"validate", |
|
"validators", |
|
] |
|
|
|
|
|
def _make_getattr(mod_name: str) -> Callable: |
|
""" |
|
Create a metadata proxy for packaging information that uses *mod_name* in |
|
its warnings and errors. |
|
""" |
|
|
|
def __getattr__(name: str) -> str: |
|
dunder_to_metadata = { |
|
"__title__": "Name", |
|
"__copyright__": "", |
|
"__version__": "version", |
|
"__version_info__": "version", |
|
"__description__": "summary", |
|
"__uri__": "", |
|
"__url__": "", |
|
"__author__": "", |
|
"__email__": "", |
|
"__license__": "license", |
|
} |
|
if name not in dunder_to_metadata: |
|
msg = f"module {mod_name} has no attribute {name}" |
|
raise AttributeError(msg) |
|
|
|
import sys |
|
import warnings |
|
|
|
if sys.version_info < (3, 8): |
|
from importlib_metadata import metadata |
|
else: |
|
from importlib.metadata import metadata |
|
|
|
if name not in ("__version__", "__version_info__"): |
|
warnings.warn( |
|
f"Accessing {mod_name}.{name} is deprecated and will be " |
|
"removed in a future release. Use importlib.metadata directly " |
|
"to query for attrs's packaging metadata.", |
|
DeprecationWarning, |
|
stacklevel=2, |
|
) |
|
|
|
meta = metadata("attrs") |
|
if name == "__license__": |
|
return "MIT" |
|
if name == "__copyright__": |
|
return "Copyright (c) 2015 Hynek Schlawack" |
|
if name in ("__uri__", "__url__"): |
|
return meta["Project-URL"].split(" ", 1)[-1] |
|
if name == "__version_info__": |
|
return VersionInfo._from_version_string(meta["version"]) |
|
if name == "__author__": |
|
return meta["Author-email"].rsplit(" ", 1)[0] |
|
if name == "__email__": |
|
return meta["Author-email"].rsplit("<", 1)[1][:-1] |
|
|
|
return meta[dunder_to_metadata[name]] |
|
|
|
return __getattr__ |
|
|
|
|
|
__getattr__ = _make_getattr(__name__) |
|
|