|
1 | 1 | # SPDX-License-Identifier: MIT
|
2 | 2 |
|
3 |
| - |
4 |
| -import sys |
| 3 | +""" |
| 4 | +Classes Without Boilerplate |
| 5 | +""" |
5 | 6 |
|
6 | 7 | from functools import partial
|
| 8 | +from typing import Callable |
7 | 9 |
|
8 | 10 | from . import converters, exceptions, filters, setters, validators
|
9 | 11 | from ._cmp import cmp_using
|
|
20 | 22 | make_class,
|
21 | 23 | validate,
|
22 | 24 | )
|
| 25 | +from ._next_gen import define, field, frozen, mutable |
23 | 26 | from ._version_info import VersionInfo
|
24 | 27 |
|
25 | 28 |
|
26 |
| -__version__ = "22.1.0" |
27 |
| -__version_info__ = VersionInfo._from_version_string(__version__) |
28 |
| - |
29 |
| -__title__ = "attrs" |
30 |
| -__description__ = "Classes Without Boilerplate" |
31 |
| -__url__ = "https://www.attrs.org/" |
32 |
| -__uri__ = __url__ |
33 |
| -__doc__ = __description__ + " <" + __uri__ + ">" |
34 |
| - |
35 |
| -__author__ = "Hynek Schlawack" |
36 |
| -__email__ = "hs@ox.cx" |
37 |
| - |
38 |
| -__license__ = "MIT" |
39 |
| -__copyright__ = "Copyright (c) 2015 Hynek Schlawack" |
40 |
| - |
41 |
| - |
42 | 29 | s = attributes = attrs
|
43 | 30 | ib = attr = attrib
|
44 | 31 | dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
|
45 | 32 |
|
| 33 | + |
| 34 | +class AttrsInstance: |
| 35 | + pass |
| 36 | + |
| 37 | + |
46 | 38 | __all__ = [
|
47 | 39 | "Attribute",
|
| 40 | + "AttrsInstance", |
48 | 41 | "Factory",
|
49 | 42 | "NOTHING",
|
50 | 43 | "asdict",
|
|
56 | 49 | "attrs",
|
57 | 50 | "cmp_using",
|
58 | 51 | "converters",
|
| 52 | + "define", |
59 | 53 | "evolve",
|
60 | 54 | "exceptions",
|
| 55 | + "field", |
61 | 56 | "fields",
|
62 | 57 | "fields_dict",
|
63 | 58 | "filters",
|
| 59 | + "frozen", |
64 | 60 | "get_run_validators",
|
65 | 61 | "has",
|
66 | 62 | "ib",
|
67 | 63 | "make_class",
|
| 64 | + "mutable", |
68 | 65 | "resolve_types",
|
69 | 66 | "s",
|
70 | 67 | "set_run_validators",
|
|
73 | 70 | "validators",
|
74 | 71 | ]
|
75 | 72 |
|
76 |
| -if sys.version_info[:2] >= (3, 6): |
77 |
| - from ._next_gen import define, field, frozen, mutable # noqa: F401 |
78 | 73 |
|
79 |
| - __all__.extend(("define", "field", "frozen", "mutable")) |
| 74 | +def _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 | + """ |
| 79 | + |
| 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}") |
| 95 | + |
| 96 | + import sys |
| 97 | + import warnings |
| 98 | + |
| 99 | + if sys.version_info < (3, 8): |
| 100 | + from importlib_metadata import metadata |
| 101 | + else: |
| 102 | + from importlib.metadata import metadata |
| 103 | + |
| 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 | + ) |
| 112 | + |
| 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] |
| 126 | + |
| 127 | + return meta[dunder_to_metadata[name]] |
| 128 | + |
| 129 | + return __getattr__ |
| 130 | + |
| 131 | + |
| 132 | +__getattr__ = _make_getattr(__name__) |
0 commit comments