|
16 | 16 | 'LDAPUrlExtension','LDAPUrlExtensions','LDAPUrl'
|
17 | 17 | ]
|
18 | 18 |
|
19 |
| -from ldap.compat import UserDict, quote, unquote |
| 19 | +from ldap.compat import quote, unquote, MutableMapping |
20 | 20 |
|
21 | 21 | LDAP_SCOPE_BASE = 0
|
22 | 22 | LDAP_SCOPE_ONELEVEL = 1
|
@@ -130,58 +130,71 @@ def __ne__(self,other):
|
130 | 130 | return not self.__eq__(other)
|
131 | 131 |
|
132 | 132 |
|
133 |
| -class LDAPUrlExtensions(UserDict): |
134 |
| - """ |
135 |
| - Models a collection of LDAP URL extensions as |
136 |
| - dictionary type |
137 |
| - """ |
138 |
| - |
139 |
| - def __init__(self,default=None): |
140 |
| - UserDict.__init__(self) |
141 |
| - for k,v in (default or {}).items(): |
142 |
| - self[k]=v |
143 |
| - |
144 |
| - def __setitem__(self,name,value): |
| 133 | +class LDAPUrlExtensions(MutableMapping): |
145 | 134 | """
|
146 |
| - value |
147 |
| - Either LDAPUrlExtension instance, (critical,exvalue) |
148 |
| - or string'ed exvalue |
| 135 | + Models a collection of LDAP URL extensions as |
| 136 | + a mapping type |
149 | 137 | """
|
150 |
| - assert isinstance(value,LDAPUrlExtension) |
151 |
| - assert name==value.extype |
152 |
| - self.data[name] = value |
153 |
| - |
154 |
| - def values(self): |
155 |
| - return [ |
156 |
| - self[k] |
157 |
| - for k in self.keys() |
158 |
| - ] |
159 |
| - |
160 |
| - def __str__(self): |
161 |
| - return ','.join(str(v) for v in self.values()) |
162 |
| - |
163 |
| - def __repr__(self): |
164 |
| - return '<%s.%s instance at %s: %s>' % ( |
165 |
| - self.__class__.__module__, |
166 |
| - self.__class__.__name__, |
167 |
| - hex(id(self)), |
168 |
| - self.data |
169 |
| - ) |
| 138 | + __slots__ = ('_data', ) |
| 139 | + |
| 140 | + def __init__(self, default=None): |
| 141 | + self._data = {} |
| 142 | + if default is not None: |
| 143 | + self.update(default) |
| 144 | + |
| 145 | + def __setitem__(self, name, value): |
| 146 | + """Store an extension |
| 147 | +
|
| 148 | + name |
| 149 | + string |
| 150 | + value |
| 151 | + LDAPUrlExtension instance, whose extype nust match `name` |
| 152 | + """ |
| 153 | + if not isinstance(value, LDAPUrlExtension): |
| 154 | + raise TypeError("value must be LDAPUrlExtension, not " |
| 155 | + + type(value).__name__) |
| 156 | + if name != value.extype: |
| 157 | + raise ValueError( |
| 158 | + "key {!r} does not match extension type {!r}".format( |
| 159 | + name, value.extype)) |
| 160 | + self._data[name] = value |
| 161 | + |
| 162 | + def __getitem__(self, name): |
| 163 | + return self._data[name] |
| 164 | + |
| 165 | + def __delitem__(self, name): |
| 166 | + del self._data[name] |
| 167 | + |
| 168 | + def __iter__(self): |
| 169 | + return iter(self._data) |
| 170 | + |
| 171 | + def __len__(self): |
| 172 | + return len(self._data) |
| 173 | + |
| 174 | + def __str__(self): |
| 175 | + return ','.join(str(v) for v in self.values()) |
| 176 | + |
| 177 | + def __repr__(self): |
| 178 | + return '<%s.%s instance at %s: %s>' % ( |
| 179 | + self.__class__.__module__, |
| 180 | + self.__class__.__name__, |
| 181 | + hex(id(self)), |
| 182 | + self._data |
| 183 | + ) |
170 | 184 |
|
171 |
| - def __eq__(self,other): |
172 |
| - assert isinstance(other,self.__class__),TypeError( |
173 |
| - "other has to be instance of %s" % (self.__class__) |
174 |
| - ) |
175 |
| - return self.data==other.data |
| 185 | + def __eq__(self,other): |
| 186 | + if not isinstance(other, self.__class__): |
| 187 | + return NotImplemented |
| 188 | + return self._data == other._data |
176 | 189 |
|
177 |
| - def parse(self,extListStr): |
178 |
| - for extension_str in extListStr.strip().split(','): |
179 |
| - if extension_str: |
180 |
| - e = LDAPUrlExtension(extension_str) |
181 |
| - self[e.extype] = e |
| 190 | + def parse(self,extListStr): |
| 191 | + for extension_str in extListStr.strip().split(','): |
| 192 | + if extension_str: |
| 193 | + e = LDAPUrlExtension(extension_str) |
| 194 | + self[e.extype] = e |
182 | 195 |
|
183 |
| - def unparse(self): |
184 |
| - return ','.join([ v.unparse() for v in self.values() ]) |
| 196 | + def unparse(self): |
| 197 | + return ','.join(v.unparse() for v in self.values()) |
185 | 198 |
|
186 | 199 |
|
187 | 200 | class LDAPUrl(object):
|
@@ -366,17 +379,23 @@ def htmlHREF(self,urlPrefix='',hrefText=None,hrefTarget=None):
|
366 | 379 | hrefTarget
|
367 | 380 | string added as link target attribute
|
368 | 381 | """
|
369 |
| - assert type(urlPrefix)==StringType, "urlPrefix must be StringType" |
| 382 | + if not isinstance(urlPrefix, str): |
| 383 | + raise TypeError("urlPrefix must be str, not " |
| 384 | + + type(urlPrefix).__name__) |
370 | 385 | if hrefText is None:
|
371 |
| - hrefText = self.unparse() |
372 |
| - assert type(hrefText)==StringType, "hrefText must be StringType" |
| 386 | + hrefText = self.unparse() |
| 387 | + if not isinstance(hrefText, str): |
| 388 | + raise TypeError("hrefText must be str, not " |
| 389 | + + type(hrefText).__name__) |
373 | 390 | if hrefTarget is None:
|
374 |
| - target = '' |
| 391 | + target = '' |
375 | 392 | else:
|
376 |
| - assert type(hrefTarget)==StringType, "hrefTarget must be StringType" |
377 |
| - target = ' target="%s"' % hrefTarget |
| 393 | + if not isinstance(hrefTarget, str): |
| 394 | + raise TypeError("hrefTarget must be str, not " |
| 395 | + + type(hrefTarget).__name__) |
| 396 | + target = ' target="%s"' % hrefTarget |
378 | 397 | return '<a%s href="%s%s">%s</a>' % (
|
379 |
| - target,urlPrefix,self.unparse(),hrefText |
| 398 | + target, urlPrefix, self.unparse(), hrefText |
380 | 399 | )
|
381 | 400 |
|
382 | 401 | def __str__(self):
|
|
0 commit comments