comparison mercurial/thirdparty/attr/_compat.py @ 34397:765eb17a7eb8

thirdparty: vendor attrs The attrs package allows defining namedtuple-like classes with no weird behavior and no runtime performance cost. This patch vendors in attrs 17.2.0. # no-check-commit Differential Revision: https://phab.mercurial-scm.org/D867
author Siddharth Agarwal <sid0@fb.com>
date Sun, 01 Oct 2017 04:14:16 -0700
parents
children e1c586b9a43c
comparison
equal deleted inserted replaced
34396:9fb9f8440b71 34397:765eb17a7eb8
1 from __future__ import absolute_import, division, print_function
2
3 import sys
4 import types
5
6
7 PY2 = sys.version_info[0] == 2
8
9
10 if PY2:
11 from UserDict import IterableUserDict
12
13 # We 'bundle' isclass instead of using inspect as importing inspect is
14 # fairly expensive (order of 10-15 ms for a modern machine in 2016)
15 def isclass(klass):
16 return isinstance(klass, (type, types.ClassType))
17
18 # TYPE is used in exceptions, repr(int) is different on Python 2 and 3.
19 TYPE = "type"
20
21 def iteritems(d):
22 return d.iteritems()
23
24 def iterkeys(d):
25 return d.iterkeys()
26
27 # Python 2 is bereft of a read-only dict proxy, so we make one!
28 class ReadOnlyDict(IterableUserDict):
29 """
30 Best-effort read-only dict wrapper.
31 """
32
33 def __setitem__(self, key, val):
34 # We gently pretend we're a Python 3 mappingproxy.
35 raise TypeError("'mappingproxy' object does not support item "
36 "assignment")
37
38 def update(self, _):
39 # We gently pretend we're a Python 3 mappingproxy.
40 raise AttributeError("'mappingproxy' object has no attribute "
41 "'update'")
42
43 def __delitem__(self, _):
44 # We gently pretend we're a Python 3 mappingproxy.
45 raise TypeError("'mappingproxy' object does not support item "
46 "deletion")
47
48 def clear(self):
49 # We gently pretend we're a Python 3 mappingproxy.
50 raise AttributeError("'mappingproxy' object has no attribute "
51 "'clear'")
52
53 def pop(self, key, default=None):
54 # We gently pretend we're a Python 3 mappingproxy.
55 raise AttributeError("'mappingproxy' object has no attribute "
56 "'pop'")
57
58 def popitem(self):
59 # We gently pretend we're a Python 3 mappingproxy.
60 raise AttributeError("'mappingproxy' object has no attribute "
61 "'popitem'")
62
63 def setdefault(self, key, default=None):
64 # We gently pretend we're a Python 3 mappingproxy.
65 raise AttributeError("'mappingproxy' object has no attribute "
66 "'setdefault'")
67
68 def __repr__(self):
69 # Override to be identical to the Python 3 version.
70 return "mappingproxy(" + repr(self.data) + ")"
71
72 def metadata_proxy(d):
73 res = ReadOnlyDict()
74 res.data.update(d) # We blocked update, so we have to do it like this.
75 return res
76
77 else:
78 def isclass(klass):
79 return isinstance(klass, type)
80
81 TYPE = "class"
82
83 def iteritems(d):
84 return d.items()
85
86 def iterkeys(d):
87 return d.keys()
88
89 def metadata_proxy(d):
90 return types.MappingProxyType(dict(d))