[Checkins] SVN: zc.twist/trunk/ add ability to specify an alternate reactor. change bootstrap to be an external. Prepare for 1.0 release.

Gary Poster gary at zope.com
Thu Mar 13 11:11:39 EDT 2008


Log message for revision 84636:
  add ability to specify an alternate reactor.  change bootstrap to be an external.  Prepare for 1.0 release.

Changed:
  _U  zc.twist/trunk/
  U   zc.twist/trunk/setup.py
  U   zc.twist/trunk/src/zc/twist/README.txt
  U   zc.twist/trunk/src/zc/twist/__init__.py

-=-

Property changes on: zc.twist/trunk
___________________________________________________________________
Name: svn:externals
   + bootstrap svn://svn.zope.org/repos/main/zc.buildout/trunk/bootstrap


Modified: zc.twist/trunk/setup.py
===================================================================
--- zc.twist/trunk/setup.py	2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/setup.py	2008-03-13 15:11:39 UTC (rev 84636)
@@ -4,17 +4,18 @@
 
 setup(
     name='zc.twist',
-    version='0.1',
+    version='1.0',
     packages=find_packages('src'),
     package_dir={'':'src'},
-    url='http://svn.zope.org/zc.twist',
     zip_safe=False,
     author='Gary Poster',
     description='Mixing Twisted and ZODB',
     license='ZPL',
     install_requires=[
         'ZODB3',
-        'zc.twisted',
+        'zc.twisted', # setup-friendly Twisted distro.  Someday soon we can
+        # discard zc.twisted, hopefully.  See
+        # http://twistedmatrix.com/trac/ticket/1286
         'zope.component',
         'setuptools',
         'zope.testing',

Modified: zc.twist/trunk/src/zc/twist/README.txt
===================================================================
--- zc.twist/trunk/src/zc/twist/README.txt	2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/src/zc/twist/README.txt	2008-03-13 15:11:39 UTC (rev 84636)
@@ -248,6 +248,10 @@
 [#teardown_monkeypatch]_.  Also, it relies on an undocumented, protected
 attribute on the ZODB.DB, so is fragile across ZODB versions.
 
+You can also specify a reactor for the partial using ``setReactor``, if
+you don't want to use the standard one installed by twisted in
+``twisted.internet.reactor``. [#setReactor]_
+
 Gotchas
 -------
 
@@ -430,3 +434,59 @@
 .. [#teardown_monkeypatch]
 
     >>> twisted.internet.reactor.callLater = oldCallLater
+
+.. [#setReactor]
+
+    >>> db.setPoolSize(1)
+    >>> db.getPoolSize()
+    1
+    >>> demo.count = 0
+    >>> transaction.commit()
+    >>> call = Partial(demo).setReactor(faux)
+    >>> res = None
+    >>> deferred = call()
+    >>> d = deferred.addCallback(get_result)
+    >>> call.attempt_count
+    0
+    >>> time_flies(.1) >= 1 # returns number of connection attempts
+    True
+    >>> call.attempt_count
+    0
+    >>> res # None
+    >>> db.setPoolSize(2)
+    >>> db.getPoolSize()
+    2
+    >>> time_flies(.2) >= 1
+    True
+    >>> call.attempt_count > 0
+    True
+    >>> res
+    1
+    >>> t = transaction.begin()
+    >>> demo.count
+    1
+
+If it takes more than a second or two, it will eventually just decide to grab
+one.  This behavior may change.
+
+    >>> db.setPoolSize(1)
+    >>> db.getPoolSize()
+    1
+    >>> call = Partial(demo).setReactor(faux)
+    >>> res = None
+    >>> deferred = call()
+    >>> d = deferred.addCallback(get_result)
+    >>> call.attempt_count
+    0
+    >>> time_flies(.1) >= 1
+    True
+    >>> call.attempt_count
+    0
+    >>> res # None
+    >>> time_flies(1.9) >= 2 # for a total of at least 3
+    True
+    >>> res
+    2
+    >>> t = transaction.begin()
+    >>> demo.count
+    2

Modified: zc.twist/trunk/src/zc/twist/__init__.py
===================================================================
--- zc.twist/trunk/src/zc/twist/__init__.py	2008-03-13 14:17:23 UTC (rev 84635)
+++ zc.twist/trunk/src/zc/twist/__init__.py	2008-03-13 15:11:39 UTC (rev 84636)
@@ -78,7 +78,7 @@
 
 missing = object()
 
-def get_connection(db, deferred=None, backoff=None):
+def get_connection(db, deferred=None, backoff=None, reactor=None):
     if deferred is None:
         deferred = twisted.internet.defer.Deferred()
     if backoff is None:
@@ -91,8 +91,10 @@
     # long and we don't have a connection within our limit, try again
     # later.
     if backoff < .5 and not availableConnectionCount(db):
-        twisted.internet.reactor.callLater(
-            backoff, get_connection, db, deferred, backoff)
+        if reactor is None:
+            reactor = twisted.internet.reactor
+        reactor.callLater(
+            backoff, get_connection, db, deferred, backoff, reactor)
         return deferred
     deferred.callback(db.open(
         transaction_manager=transaction.TransactionManager()))
@@ -108,6 +110,7 @@
 class Partial(object):
 
     attempt_count = 0
+    _reactor = None
 
     def __init__(self, call, *args, **kwargs):
         self.call = Reference(call)
@@ -126,14 +129,24 @@
             else:
                 continue
             break
-        else:
+        else: # no persistent bits
             call, args, kwargs = self._resolve(None)
             return call(*args, **kwargs)
         self.attempt_count = 0
         d = twisted.internet.defer.Deferred()
-        get_connection(db).addCallback(self._call, d)
+        get_connection(db, reactor=self.getReactor()).addCallback(
+            self._call, d)
         return d
 
+    def setReactor(self, value):
+        self._reactor = value
+        return self
+
+    def getReactor(self):
+        if self._reactor is None:
+            return twisted.internet.reactor
+        return self._reactor
+
     def _resolve(self, conn):
         if IDeferredReference.providedBy(self.call):
             call = self.call(conn)
@@ -167,7 +180,8 @@
                 res = sanitize(twisted.python.failure.Failure())
                 d.errback(res)
             else:
-                get_connection(db).addCallback(self._call, d)
+                get_connection(db, reactor=self.getReactor()).addCallback(
+                    self._call, d)
         except EXPLOSIVE_ERRORS:
             tm.abort()
             conn.close()



More information about the Checkins mailing list