PEP8: fix E305: expected 2 blank lines after class or function definition, found 1
[garming/samba-autobuild/.git] / lib / ldb / _ldb_text.py
1 # Text wrapper for ldb bindings
2 #
3 # Copyright (C) 2015 Petr Viktorin <pviktori@redhat.com>
4 # Published under the GNU LGPLv3 or later
5
6 import sys
7 import functools
8
9 import ldb
10
11
12 def _recursive_encode(obj):
13     if isinstance(obj, bytes):
14         return obj
15     elif isinstance(obj, str):
16         return obj.encode('utf-8')
17     else:
18         return [_recursive_encode(o) for o in obj]
19
20
21 class _WrapBase(object):
22
23     @classmethod
24     def _wrap(cls, wrapped):
25         self = cls.__new__(cls)
26         self._wrapped = wrapped
27         return self
28
29     def __len__(self):
30         return len(self._wrapped)
31
32     def __eq__(self, other):
33         if hasattr(other, '_wrapped'):
34             return self._wrapped == other._wrapped
35         else:
36             return self._wrapped == other
37
38     def __ne__(self, other):
39         if hasattr(other, '_wrapped'):
40             return self._wrapped != other._wrapped
41         else:
42             return self._wrapped != other
43
44     def __lt__(self, other):
45         if hasattr(other, '_wrapped'):
46             return self._wrapped < other._wrapped
47         else:
48             return self._wrapped < other
49
50     def __le__(self, other):
51         if hasattr(other, '_wrapped'):
52             return self._wrapped >= other._wrapped
53         else:
54             return self._wrapped >= other
55
56     def __gt__(self, other):
57         if hasattr(other, '_wrapped'):
58             return self._wrapped > other._wrapped
59         else:
60             return self._wrapped > other
61
62     def __ge__(self, other):
63         if hasattr(other, '_wrapped'):
64             return self._wrapped >= other._wrapped
65         else:
66             return self._wrapped >= other
67
68     def __repr__(self):
69         return '%s.text' % repr(self._wrapped)
70
71
72 class MessageElementTextWrapper(_WrapBase):
73
74     """Text interface for a LDB message element"""
75
76     def __iter__(self):
77         for item in self._wrapped:
78             yield item.decode('utf-8')
79
80     def __getitem__(self, key):
81         result = self._wrapped[key]
82         if result is None:
83             return None
84         else:
85             return result.decode('utf-8')
86
87     @property
88     def flags(self):
89         return self._wrapped.flags
90
91     @property
92     def set_flags(self):
93         return self._wrapped.set_flags
94
95
96 _wrap_element = MessageElementTextWrapper._wrap
97
98
99 class MessageTextWrapper(_WrapBase):
100
101     """Text interface for a LDB message"""
102
103     def __getitem__(self, key):
104         result = self._wrapped[key]
105         if result is None:
106             return None
107         else:
108             return _wrap_element(result)
109
110     def get(self, *args, **kwargs):
111         result = self._wrapped.get(*args, **kwargs)
112         if isinstance(result, ldb.MessageElement):
113             return _wrap_element(result)
114         elif isinstance(result, bytes):
115             return result.decode('utf-8')
116         else:
117             return result
118
119     def __setitem__(self, key, item):
120         self._wrapped[key] = _recursive_encode(item)
121
122     def __delitem__(self, key):
123         del self._wrapped[key]
124
125     def elements(self):
126         return [_wrap_element(el) for el in self._wrapped.elements()]
127
128     def items(self):
129         return [(attr, _wrap_element(el)) for attr, el in self._wrapped.items()]
130
131     @property
132     def keys(self):
133         return self._wrapped.keys
134
135     @property
136     def remove(self):
137         return self._wrapped.remove
138
139     @property
140     def add(self):
141         return self._wrapped.add
142
143     @property
144     def dn(self):
145         return self._wrapped.dn
146
147     @dn.setter
148     def dn(self, new_value):
149         self._wrapped.dn = new_value