Mercurial > kallithea
comparison rhodecode/lib/compat.py @ 2729:e9e7c40b4f1a beta
added deque with maxlen for py2.5 compat
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 22 Aug 2012 12:09:49 +0200 |
parents | e8650fbc4d4e |
children | 7949bc80b3b1 |
comparison
equal
deleted
inserted
replaced
2728:6341084b7a2f | 2729:e9e7c40b4f1a |
---|---|
23 # | 23 # |
24 # You should have received a copy of the GNU General Public License | 24 # You should have received a copy of the GNU General Public License |
25 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 25 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
26 | 26 |
27 import os | 27 import os |
28 from rhodecode import __platform__, PLATFORM_WIN | 28 from rhodecode import __platform__, PLATFORM_WIN, __py_version__ |
29 | 29 |
30 #============================================================================== | 30 #============================================================================== |
31 # json | 31 # json |
32 #============================================================================== | 32 #============================================================================== |
33 from rhodecode.lib.ext_json import json | 33 from rhodecode.lib.ext_json import json |
402 | 402 |
403 try: | 403 try: |
404 from io import BytesIO | 404 from io import BytesIO |
405 except ImportError: | 405 except ImportError: |
406 from cStringIO import StringIO as BytesIO | 406 from cStringIO import StringIO as BytesIO |
407 | |
408 | |
409 #============================================================================== | |
410 # deque | |
411 #============================================================================== | |
412 | |
413 if __py_version__ >= (2, 6): | |
414 from collections import deque | |
415 else: | |
416 #need to implement our own deque with maxlen | |
417 class deque(object): | |
418 | |
419 def __init__(self, iterable=(), maxlen=-1): | |
420 if not hasattr(self, 'data'): | |
421 self.left = self.right = 0 | |
422 self.data = {} | |
423 self.maxlen = maxlen | |
424 self.extend(iterable) | |
425 | |
426 def append(self, x): | |
427 self.data[self.right] = x | |
428 self.right += 1 | |
429 if self.maxlen != -1 and len(self) > self.maxlen: | |
430 self.popleft() | |
431 | |
432 def appendleft(self, x): | |
433 self.left -= 1 | |
434 self.data[self.left] = x | |
435 if self.maxlen != -1 and len(self) > self.maxlen: | |
436 self.pop() | |
437 | |
438 def pop(self): | |
439 if self.left == self.right: | |
440 raise IndexError('cannot pop from empty deque') | |
441 self.right -= 1 | |
442 elem = self.data[self.right] | |
443 del self.data[self.right] | |
444 return elem | |
445 | |
446 def popleft(self): | |
447 if self.left == self.right: | |
448 raise IndexError('cannot pop from empty deque') | |
449 elem = self.data[self.left] | |
450 del self.data[self.left] | |
451 self.left += 1 | |
452 return elem | |
453 | |
454 def clear(self): | |
455 self.data.clear() | |
456 self.left = self.right = 0 | |
457 | |
458 def extend(self, iterable): | |
459 for elem in iterable: | |
460 self.append(elem) | |
461 | |
462 def extendleft(self, iterable): | |
463 for elem in iterable: | |
464 self.appendleft(elem) | |
465 | |
466 def rotate(self, n=1): | |
467 if self: | |
468 n %= len(self) | |
469 for i in xrange(n): | |
470 self.appendleft(self.pop()) | |
471 | |
472 def __getitem__(self, i): | |
473 if i < 0: | |
474 i += len(self) | |
475 try: | |
476 return self.data[i + self.left] | |
477 except KeyError: | |
478 raise IndexError | |
479 | |
480 def __setitem__(self, i, value): | |
481 if i < 0: | |
482 i += len(self) | |
483 try: | |
484 self.data[i + self.left] = value | |
485 except KeyError: | |
486 raise IndexError | |
487 | |
488 def __delitem__(self, i): | |
489 size = len(self) | |
490 if not (-size <= i < size): | |
491 raise IndexError | |
492 data = self.data | |
493 if i < 0: | |
494 i += size | |
495 for j in xrange(self.left + i, self.right - 1): | |
496 data[j] = data[j + 1] | |
497 self.pop() | |
498 | |
499 def __len__(self): | |
500 return self.right - self.left | |
501 | |
502 def __cmp__(self, other): | |
503 if type(self) != type(other): | |
504 return cmp(type(self), type(other)) | |
505 return cmp(list(self), list(other)) | |
506 | |
507 def __repr__(self, _track=[]): | |
508 if id(self) in _track: | |
509 return '...' | |
510 _track.append(id(self)) | |
511 r = 'deque(%r, maxlen=%s)' % (list(self), self.maxlen) | |
512 _track.remove(id(self)) | |
513 return r | |
514 | |
515 def __getstate__(self): | |
516 return (tuple(self),) | |
517 | |
518 def __setstate__(self, s): | |
519 self.__init__(s[0]) | |
520 | |
521 def __hash__(self): | |
522 raise TypeError | |
523 | |
524 def __copy__(self): | |
525 return self.__class__(self) | |
526 | |
527 def __deepcopy__(self, memo={}): | |
528 from copy import deepcopy | |
529 result = self.__class__() | |
530 memo[id(self)] = result | |
531 result.__init__(deepcopy(tuple(self), memo)) | |
532 return result |