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

46 statements  

1# SPDX-License-Identifier: MIT 

2 

3""" 

4Classes Without Boilerplate 

5""" 

6 

7from functools import partial 

8from typing import Callable 

9 

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 

28 

29 

30s = attributes = attrs 

31ib = attr = attrib 

32dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) 

33 

34 

35class AttrsInstance(Protocol): 

36 pass 

37 

38 

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] 

73 

74 

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 """ 

80 

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) 

97 

98 import sys 

99 import warnings 

100 

101 if sys.version_info < (3, 8): 

102 from importlib_metadata import metadata 

103 else: 

104 from importlib.metadata import metadata 

105 

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 ) 

114 

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] 

128 

129 return meta[dunder_to_metadata[name]] 

130 

131 return __getattr__ 

132 

133 

134__getattr__ = _make_getattr(__name__)