Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/attr/__init__.py: 52%
44 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:40 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:40 +0000
1# SPDX-License-Identifier: MIT
3"""
4Classes Without Boilerplate
5"""
7from functools import partial
8from typing import Callable
10from . import converters, exceptions, filters, setters, validators
11from ._cmp import cmp_using
12from ._config import get_run_validators, set_run_validators
13from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types
14from ._make import (
15 NOTHING,
16 Attribute,
17 Factory,
18 attrib,
19 attrs,
20 fields,
21 fields_dict,
22 make_class,
23 validate,
24)
25from ._next_gen import define, field, frozen, mutable
26from ._version_info import VersionInfo
29s = attributes = attrs
30ib = attr = attrib
31dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
34class AttrsInstance:
35 pass
38__all__ = [
39 "Attribute",
40 "AttrsInstance",
41 "Factory",
42 "NOTHING",
43 "asdict",
44 "assoc",
45 "astuple",
46 "attr",
47 "attrib",
48 "attributes",
49 "attrs",
50 "cmp_using",
51 "converters",
52 "define",
53 "evolve",
54 "exceptions",
55 "field",
56 "fields",
57 "fields_dict",
58 "filters",
59 "frozen",
60 "get_run_validators",
61 "has",
62 "ib",
63 "make_class",
64 "mutable",
65 "resolve_types",
66 "s",
67 "set_run_validators",
68 "setters",
69 "validate",
70 "validators",
71]
74def _make_getattr(mod_name: str) -> Callable:
75 """
76 Create a metadata proxy for packaging information that uses *mod_name* in
77 its warnings and errors.
78 """
80 def __getattr__(name: str) -> str:
81 dunder_to_metadata = {
82 "__title__": "Name",
83 "__copyright__": "",
84 "__version__": "version",
85 "__version_info__": "version",
86 "__description__": "summary",
87 "__uri__": "",
88 "__url__": "",
89 "__author__": "",
90 "__email__": "",
91 "__license__": "license",
92 }
93 if name not in dunder_to_metadata.keys():
94 raise AttributeError(f"module {mod_name} has no attribute {name}")
96 import sys
97 import warnings
99 if sys.version_info < (3, 8):
100 from importlib_metadata import metadata
101 else:
102 from importlib.metadata import metadata
104 if name != "__version_info__":
105 warnings.warn(
106 f"Accessing {mod_name}.{name} is deprecated and will be "
107 "removed in a future release. Use importlib.metadata directly "
108 "to query for attrs's packaging metadata.",
109 DeprecationWarning,
110 stacklevel=2,
111 )
113 meta = metadata("attrs")
114 if name == "__license__":
115 return "MIT"
116 elif name == "__copyright__":
117 return "Copyright (c) 2015 Hynek Schlawack"
118 elif name in ("__uri__", "__url__"):
119 return meta["Project-URL"].split(" ", 1)[-1]
120 elif name == "__version_info__":
121 return VersionInfo._from_version_string(meta["version"])
122 elif name == "__author__":
123 return meta["Author-email"].rsplit(" ", 1)[0]
124 elif name == "__email__":
125 return meta["Author-email"].rsplit("<", 1)[1][:-1]
127 return meta[dunder_to_metadata[name]]
129 return __getattr__
132__getattr__ = _make_getattr(__name__)