123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # SPDX-License-Identifier: MIT
- """
- 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) # happy Easter ;)
- 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__)
|