Merge lp:~gesha/linaro-license-protection/add-ordereddict-class into lp:~linaro-automation/linaro-license-protection/trunk

Proposed by Georgy Redkozubov
Status: Merged
Approved by: Данило Шеган
Approved revision: 143
Merged at revision: 143
Proposed branch: lp:~gesha/linaro-license-protection/add-ordereddict-class
Merge into: lp:~linaro-automation/linaro-license-protection/trunk
Diff against target: 296 lines (+272/-2)
2 files modified
license_protected_downloads/OrderedDict.py (+270/-0)
license_protected_downloads/render_text_files.py (+2/-2)
To merge this branch: bzr merge lp:~gesha/linaro-license-protection/add-ordereddict-class
Reviewer Review Type Date Requested Status
Данило Шеган (community) Approve
Review via email: mp+131071@code.launchpad.net

Description of the change

This branch adds backported from python 2.7 OrderedDict class since it's not available in 2.6 which is on mombin.

To post a comment you must log in.
Revision history for this message
Данило Шеган (danilo) wrote :

Please add a reference to where the code was taken from (i.e. http://code.activestate.com/recipes/576693/)

We should definitely upgrade mombin to 12.04 asap.

Revision history for this message
Данило Шеган (danilo) :
review: Approve
144. By Georgy Redkozubov

Added reference to the original site

145. By Georgy Redkozubov

Fixed pep8 errors in OrderedDict class

146. By Georgy Redkozubov

Fixed pyflakes 'redefenition of unused import' error in OrderedDict class

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'license_protected_downloads/OrderedDict.py'
--- license_protected_downloads/OrderedDict.py 1970-01-01 00:00:00 +0000
+++ license_protected_downloads/OrderedDict.py 2012-10-23 19:38:23 +0000
@@ -0,0 +1,270 @@
1# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7
2# and pypy.
3# Passes Python2.7's test suite and incorporates all the latest updates.
4#
5# This code was taken from http://code.activestate.com/recipes/576693/
6
7try:
8 import thread
9 _get_ident = thread.get_ident
10except ImportError:
11 from dummy_thread import get_ident as _get_ident
12
13try:
14 from _abcoll import KeysView, ValuesView, ItemsView
15except ImportError:
16 pass
17
18
19class OrderedDict(dict):
20 'Dictionary that remembers insertion order'
21 # An inherited dict maps keys to values.
22 # The inherited dict provides __getitem__, __len__, __contains__, and get.
23 # The remaining methods are order-aware.
24 # Big-O running times for all methods are the same as for regular
25 # dictionaries.
26
27 # The internal self.__map dictionary maps keys to links in a doubly linked
28 # list.
29 # The circular doubly linked list starts and ends with a sentinel element.
30 # The sentinel element never gets deleted (this simplifies the algorithm).
31 # Each link is stored as a list of length three: [PREV, NEXT, KEY].
32
33 def __init__(self, *args, **kwds):
34 '''Initialize an ordered dictionary. Signature is the same as for
35 regular dictionaries, but keyword arguments are not recommended
36 because their insertion order is arbitrary.
37
38 '''
39 if len(args) > 1:
40 raise TypeError('expected at most 1 arguments, got %d' % len(args))
41 try:
42 self.__root
43 except AttributeError:
44 self.__root = root = [] # sentinel node
45 root[:] = [root, root, None]
46 self.__map = {}
47 self.__update(*args, **kwds)
48
49 def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
50 'od.__setitem__(i, y) <==> od[i]=y'
51 # Setting a new item creates a new link which goes at the end of the
52 # linked list, and the inherited dictionary is updated with the new
53 # key/value pair.
54 if key not in self:
55 root = self.__root
56 last = root[0]
57 last[1] = root[0] = self.__map[key] = [last, root, key]
58 dict_setitem(self, key, value)
59
60 def __delitem__(self, key, dict_delitem=dict.__delitem__):
61 'od.__delitem__(y) <==> del od[y]'
62 # Deleting an existing item uses self.__map to find the link which is
63 # then removed by updating the links in the predecessor and successor
64 # nodes.
65 dict_delitem(self, key)
66 link_prev, link_next, key = self.__map.pop(key)
67 link_prev[1] = link_next
68 link_next[0] = link_prev
69
70 def __iter__(self):
71 'od.__iter__() <==> iter(od)'
72 root = self.__root
73 curr = root[1]
74 while curr is not root:
75 yield curr[2]
76 curr = curr[1]
77
78 def __reversed__(self):
79 'od.__reversed__() <==> reversed(od)'
80 root = self.__root
81 curr = root[0]
82 while curr is not root:
83 yield curr[2]
84 curr = curr[0]
85
86 def clear(self):
87 'od.clear() -> None. Remove all items from od.'
88 try:
89 for node in self.__map.itervalues():
90 del node[:]
91 root = self.__root
92 root[:] = [root, root, None]
93 self.__map.clear()
94 except AttributeError:
95 pass
96 dict.clear(self)
97
98 def popitem(self, last=True):
99 '''od.popitem() -> (k, v), return and remove a (key, value) pair.
100 Pairs are returned in LIFO order if last is true or FIFO order if
101 false.
102
103 '''
104 if not self:
105 raise KeyError('dictionary is empty')
106 root = self.__root
107 if last:
108 link = root[0]
109 link_prev = link[0]
110 link_prev[1] = root
111 root[0] = link_prev
112 else:
113 link = root[1]
114 link_next = link[1]
115 root[1] = link_next
116 link_next[0] = root
117 key = link[2]
118 del self.__map[key]
119 value = dict.pop(self, key)
120 return key, value
121
122 # -- the following methods do not depend on the internal structure --
123
124 def keys(self):
125 'od.keys() -> list of keys in od'
126 return list(self)
127
128 def values(self):
129 'od.values() -> list of values in od'
130 return [self[key] for key in self]
131
132 def items(self):
133 'od.items() -> list of (key, value) pairs in od'
134 return [(key, self[key]) for key in self]
135
136 def iterkeys(self):
137 'od.iterkeys() -> an iterator over the keys in od'
138 return iter(self)
139
140 def itervalues(self):
141 'od.itervalues -> an iterator over the values in od'
142 for k in self:
143 yield self[k]
144
145 def iteritems(self):
146 'od.iteritems -> an iterator over the (key, value) items in od'
147 for k in self:
148 yield (k, self[k])
149
150 def update(*args, **kwds):
151 '''od.update(E, **F) -> None. Update od from dict/iterable E and F.
152
153 If E is a dict instance, does: for k in E: od[k] = E[k]
154 If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
155 Or if E is an iterable of items, does: for k, v in E: od[k] = v
156 In either case, this is followed by: for k, v in F.items(): od[k] = v
157 '''
158 if len(args) > 2:
159 raise TypeError('update() takes at most 2 positional '
160 'arguments (%d given)' % (len(args),))
161 elif not args:
162 raise TypeError('update() takes at least 1 argument (0 given)')
163 self = args[0]
164 # Make progressively weaker assumptions about "other"
165 other = ()
166 if len(args) == 2:
167 other = args[1]
168 if isinstance(other, dict):
169 for key in other:
170 self[key] = other[key]
171 elif hasattr(other, 'keys'):
172 for key in other.keys():
173 self[key] = other[key]
174 else:
175 for key, value in other:
176 self[key] = value
177 for key, value in kwds.items():
178 self[key] = value
179
180 # let subclasses override update without breaking __init__
181 __update = update
182
183 __marker = object()
184
185 def pop(self, key, default=__marker):
186 '''od.pop(k[,d]) -> v, remove specified key and return the
187 corresponding value.
188 If key is not found, d is returned if given, otherwise KeyError is
189 raised.
190
191 '''
192 if key in self:
193 result = self[key]
194 del self[key]
195 return result
196 if default is self.__marker:
197 raise KeyError(key)
198 return default
199
200 def setdefault(self, key, default=None):
201 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
202 if key in self:
203 return self[key]
204 self[key] = default
205 return default
206
207 def __repr__(self, _repr_running={}):
208 'od.__repr__() <==> repr(od)'
209 call_key = id(self), _get_ident()
210 if call_key in _repr_running:
211 return '...'
212 _repr_running[call_key] = 1
213 try:
214 if not self:
215 return '%s()' % (self.__class__.__name__,)
216 return '%s(%r)' % (self.__class__.__name__, self.items())
217 finally:
218 del _repr_running[call_key]
219
220 def __reduce__(self):
221 'Return state information for pickling'
222 items = [[k, self[k]] for k in self]
223 inst_dict = vars(self).copy()
224 for k in vars(OrderedDict()):
225 inst_dict.pop(k, None)
226 if inst_dict:
227 return (self.__class__, (items,), inst_dict)
228 return self.__class__, (items,)
229
230 def copy(self):
231 'od.copy() -> a shallow copy of od'
232 return self.__class__(self)
233
234 @classmethod
235 def fromkeys(cls, iterable, value=None):
236 '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
237 and values equal to v (which defaults to None).
238
239 '''
240 d = cls()
241 for key in iterable:
242 d[key] = value
243 return d
244
245 def __eq__(self, other):
246 '''od.__eq__(y) <==> od==y. Comparison to another OD is
247 order-sensitive while comparison to a regular mapping is
248 order-insensitive.
249
250 '''
251 if isinstance(other, OrderedDict):
252 return len(self) == len(other) and self.items() == other.items()
253 return dict.__eq__(self, other)
254
255 def __ne__(self, other):
256 return not self == other
257
258 # -- the following methods are only used in Python 2.7 --
259
260 def viewkeys(self):
261 "od.viewkeys() -> a set-like object providing a view on od's keys"
262 return KeysView(self)
263
264 def viewvalues(self):
265 "od.viewvalues() -> an object providing a view on od's values"
266 return ValuesView(self)
267
268 def viewitems(self):
269 "od.viewitems() -> a set-like object providing a view on od's items"
270 return ItemsView(self)
0271
=== modified file 'license_protected_downloads/render_text_files.py'
--- license_protected_downloads/render_text_files.py 2012-10-23 12:37:11 +0000
+++ license_protected_downloads/render_text_files.py 2012-10-23 19:38:23 +0000
@@ -1,7 +1,7 @@
1import os1import os
2import re2import re
3import textile3import textile
4from collections import OrderedDict4import OrderedDict
5from django.conf import settings5from django.conf import settings
66
77
@@ -48,7 +48,7 @@
48 return None48 return None
4949
50 result_items = sorted(result.items(), cmp=cls.sort_tabs_by_priority)50 result_items = sorted(result.items(), cmp=cls.sort_tabs_by_priority)
51 result = OrderedDict()51 result = OrderedDict.OrderedDict()
52 for v, k in result_items:52 for v, k in result_items:
53 result[v] = k53 result[v] = k
54 return result54 return result

Subscribers

People subscribed via source and target branches