[Zope-Checkins] SVN: Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/ don't be over zealous removing things. just deprecating stuff should be enough

Philipp von Weitershausen philikon at philikon.de
Sat May 20 09:42:32 EDT 2006


Log message for revision 68200:
  don't be over zealous removing things. just deprecating stuff should be enough
  

Changed:
  U   Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/Iterator.py
  U   Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/__init__.py
  U   Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/tests/testIterator.py

-=-
Modified: Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/Iterator.py
===================================================================
--- Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/Iterator.py	2006-05-20 13:32:39 UTC (rev 68199)
+++ Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/Iterator.py	2006-05-20 13:42:31 UTC (rev 68200)
@@ -16,10 +16,161 @@
 
 $Id$
 """
-import zope.deferredimport
-zope.deferredimport.deprecated(
-    "It has been renamed to ZopeIterator and moved to the "
-    "Products.PageTemplates.Expressions module.  This reference will be "
-    "gone in Zope 2.12.",
-    Iterator = "Products.PageTemplates.Expressions:ZopeIterator"
+import zope.deprecation
+zope.deprecation.deprecated(
+    'Iterator',
+    'Iterator has been deprecated and will be removed in Zope 2.12.  '
+    'PageTemplates now use the Zope 3 implementation.  Use ZopeIterator '
+    'from Products.PageTemplates.Expressions instead.'
     )
+
+class Iterator:
+    '''Simple Iterator class'''
+
+    __allow_access_to_unprotected_subobjects__ = 1
+
+    nextIndex = 0
+    def __init__(self, seq):
+        self.seq = seq
+        if iterInner._supports(seq, self):
+            self._inner = iterInner
+            self._prep_next = iterInner.prep_next
+            return
+        raise TypeError, "Iterator does not support %s" % `seq`
+
+    def __getattr__(self, name):
+        try:
+            inner = getattr(self._inner, 'it_' + name)
+        except AttributeError:
+            raise AttributeError, name
+        return inner(self)
+
+    def next(self):
+        if not (hasattr(self, '_next') or self._prep_next(self)):
+            return 0
+        self.index = i = self.nextIndex
+        self.nextIndex = i+1
+        self._advance(self)
+        return 1
+
+    def _advance(self, it):
+        self.item = self._next
+        del self._next
+        del self.end
+        self._advance = self._inner.advance
+        self.start = 1
+
+    def number(self): return self.nextIndex
+
+    def even(self): return not self.index % 2
+
+    def odd(self): return self.index % 2
+
+    def parity(self):
+        if self.index % 2:
+            return 'odd'
+        return 'even'
+
+    def letter(self, base=ord('a'), radix=26):
+        index = self.index
+        s = ''
+        while 1:
+            index, off = divmod(index, radix)
+            s = chr(base + off) + s
+            if not index: return s
+
+    def Letter(self):
+        return self.letter(base=ord('A'))
+
+    def Roman(self, rnvalues=(
+                    (1000,'M'),(900,'CM'),(500,'D'),(400,'CD'),
+                    (100,'C'),(90,'XC'),(50,'L'),(40,'XL'),
+                    (10,'X'),(9,'IX'),(5,'V'),(4,'IV'),(1,'I')) ):
+        n = self.index + 1
+        s = ''
+        for v, r in rnvalues:
+            rct, n = divmod(n, v)
+            s = s + r * rct
+        return s
+
+    def roman(self):
+        return self.Roman().lower()
+
+    def first(self, name=None):
+        if self.start: return 1
+        return not self.same_part(name, self._last, self.item)
+
+    def last(self, name=None):
+        if self.end: return 1
+        return not self.same_part(name, self.item, self._next)
+
+    def length(self):
+        return len(self.seq)
+
+    def same_part(self, name, ob1, ob2):
+        if name is None:
+            return ob1 == ob2
+        no = []
+        return getattr(ob1, name, no) == getattr(ob2, name, no) is not no
+
+    def __iter__(self):
+        return IterIter(self)
+
+class InnerBase:
+    '''Base Inner class for Iterators'''
+    # Prep sets up ._next and .end
+    def prep_next(self, it):
+        it.next = self.no_next
+        it.end = 1
+        return 0
+
+    # Advance knocks them down
+    def advance(self, it):
+        it._last = it.item
+        it.item = it._next
+        del it._next
+        del it.end
+        it.start = 0
+
+    def no_next(self, it):
+        return 0
+
+    def it_end(self, it):
+        if hasattr(it, '_next'):
+            return 0
+        return not self.prep_next(it)
+
+class IterInner(InnerBase):
+    '''Iterator inner class for objects with Python iterators'''
+
+    def _supports(self, ob, it):
+        try:
+            it.iter = iter(ob)
+            return 1
+        except:
+            return 0
+
+    def prep_next(self, it):
+        try:
+            it._next = it.iter.next()
+        except StopIteration:
+            it._prep_next = self.no_next
+            it.end = 1
+            return 0
+        it.end = 0
+        return 1
+
+class IterIter:
+    def __init__(self, it):
+        self.it = it
+        self.skip = it.nextIndex > 0 and not it.end
+    def next(self):
+        it = self.it
+        if self.skip:
+            self.skip = 0
+            return it.item
+        if it.next():
+            return it.item
+        raise StopIteration
+
+iterInner = IterInner()

Modified: Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/__init__.py
===================================================================
--- Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/__init__.py	2006-05-20 13:32:39 UTC (rev 68199)
+++ Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/__init__.py	2006-05-20 13:42:31 UTC (rev 68200)
@@ -14,8 +14,12 @@
 
 $Id$
 """
+# BBB 2005/05/01 -- to be removed after 12 months
+import zope.deferredimport
+zope.deferredimport.define(
+    Iterator = 'ZTUtils.Iterator:Iterator'
+    )
 
-from Iterator import Iterator
 from Tree import encodeExpansion, decodeExpansion, a2b, b2a
 from SimpleTree import SimpleTreeMaker
 

Modified: Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/tests/testIterator.py
===================================================================
--- Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/tests/testIterator.py	2006-05-20 13:32:39 UTC (rev 68199)
+++ Zope/branches/ajung-zpt-end-game/lib/python/ZTUtils/tests/testIterator.py	2006-05-20 13:42:31 UTC (rev 68200)
@@ -1,7 +1,10 @@
 from __future__ import generators
 import os, sys, unittest
 
+import zope.deprecation
+zope.deprecation.__show__.off()
 from ZTUtils import Iterator
+zope.deprecation.__show__.on()
 
 try:
     iter



More information about the Zope-Checkins mailing list