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

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 ._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 

27 

28 

29s = attributes = attrs 

30ib = attr = attrib 

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

32 

33 

34class AttrsInstance: 

35 pass 

36 

37 

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] 

72 

73 

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

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__)