Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/attr/__init__.py: 54%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
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 ._compat import Protocol
13from ._config import get_run_validators, set_run_validators
14from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types
15from ._make import (
16 NOTHING,
17 Attribute,
18 Factory,
19 attrib,
20 attrs,
21 fields,
22 fields_dict,
23 make_class,
24 validate,
25)
26from ._next_gen import define, field, frozen, mutable
27from ._version_info import VersionInfo
30s = attributes = attrs
31ib = attr = attrib
32dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
35class AttrsInstance(Protocol):
36 pass
39__all__ = [
40 "Attribute",
41 "AttrsInstance",
42 "Factory",
43 "NOTHING",
44 "asdict",
45 "assoc",
46 "astuple",
47 "attr",
48 "attrib",
49 "attributes",
50 "attrs",
51 "cmp_using",
52 "converters",
53 "define",
54 "evolve",
55 "exceptions",
56 "field",
57 "fields",
58 "fields_dict",
59 "filters",
60 "frozen",
61 "get_run_validators",
62 "has",
63 "ib",
64 "make_class",
65 "mutable",
66 "resolve_types",
67 "s",
68 "set_run_validators",
69 "setters",
70 "validate",
71 "validators",
72]
75def _make_getattr(mod_name: str) -> Callable:
76 """
77 Create a metadata proxy for packaging information that uses *mod_name* in
78 its warnings and errors.
79 """
81 def __getattr__(name: str) -> str:
82 dunder_to_metadata = {
83 "__title__": "Name",
84 "__copyright__": "",
85 "__version__": "version",
86 "__version_info__": "version",
87 "__description__": "summary",
88 "__uri__": "",
89 "__url__": "",
90 "__author__": "",
91 "__email__": "",
92 "__license__": "license",
93 }
94 if name not in dunder_to_metadata:
95 msg = f"module {mod_name} has no attribute {name}"
96 raise AttributeError(msg)
98 import sys
99 import warnings
101 if sys.version_info < (3, 8):
102 from importlib_metadata import metadata
103 else:
104 from importlib.metadata import metadata
106 if name not in ("__version__", "__version_info__"):
107 warnings.warn(
108 f"Accessing {mod_name}.{name} is deprecated and will be "
109 "removed in a future release. Use importlib.metadata directly "
110 "to query for attrs's packaging metadata.",
111 DeprecationWarning,
112 stacklevel=2,
113 )
115 meta = metadata("attrs")
116 if name == "__license__":
117 return "MIT"
118 if name == "__copyright__":
119 return "Copyright (c) 2015 Hynek Schlawack"
120 if name in ("__uri__", "__url__"):
121 return meta["Project-URL"].split(" ", 1)[-1]
122 if name == "__version_info__":
123 return VersionInfo._from_version_string(meta["version"])
124 if name == "__author__":
125 return meta["Author-email"].rsplit(" ", 1)[0]
126 if name == "__email__":
127 return meta["Author-email"].rsplit("<", 1)[1][:-1]
129 return meta[dunder_to_metadata[name]]
131 return __getattr__
134__getattr__ = _make_getattr(__name__)