| Index: third_party/twisted_8_1/twisted/spread/util.py
|
| diff --git a/third_party/twisted_8_1/twisted/spread/util.py b/third_party/twisted_8_1/twisted/spread/util.py
|
| deleted file mode 100644
|
| index d4f44d51d239667ce58e84a8ba8fe82f55d8e161..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/spread/util.py
|
| +++ /dev/null
|
| @@ -1,215 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_pb -*-
|
| -
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -"""
|
| -Utility classes for spread.
|
| -"""
|
| -
|
| -from twisted.internet import defer
|
| -from twisted.python.failure import Failure
|
| -from twisted.spread import pb
|
| -from twisted.protocols import basic
|
| -from twisted.internet import interfaces
|
| -
|
| -from zope.interface import implements
|
| -
|
| -
|
| -class LocalMethod:
|
| - def __init__(self, local, name):
|
| - self.local = local
|
| - self.name = name
|
| -
|
| - def __call__(self, *args, **kw):
|
| - return self.local.callRemote(self.name, *args, **kw)
|
| -
|
| -
|
| -class LocalAsRemote:
|
| - """
|
| - A class useful for emulating the effects of remote behavior locally.
|
| - """
|
| - reportAllTracebacks = 1
|
| -
|
| - def callRemote(self, name, *args, **kw):
|
| - """
|
| - Call a specially-designated local method.
|
| -
|
| - self.callRemote('x') will first try to invoke a method named
|
| - sync_x and return its result (which should probably be a
|
| - Deferred). Second, it will look for a method called async_x,
|
| - which will be called and then have its result (or Failure)
|
| - automatically wrapped in a Deferred.
|
| - """
|
| - if hasattr(self, 'sync_'+name):
|
| - return getattr(self, 'sync_'+name)(*args, **kw)
|
| - try:
|
| - method = getattr(self, "async_" + name)
|
| - return defer.succeed(method(*args, **kw))
|
| - except:
|
| - f = Failure()
|
| - if self.reportAllTracebacks:
|
| - f.printTraceback()
|
| - return defer.fail(f)
|
| -
|
| - def remoteMethod(self, name):
|
| - return LocalMethod(self, name)
|
| -
|
| -
|
| -class LocalAsyncForwarder:
|
| - """
|
| - A class useful for forwarding a locally-defined interface.
|
| - """
|
| -
|
| - def __init__(self, forwarded, interfaceClass, failWhenNotImplemented=0):
|
| - assert interfaceClass.providedBy(forwarded)
|
| - self.forwarded = forwarded
|
| - self.interfaceClass = interfaceClass
|
| - self.failWhenNotImplemented = failWhenNotImplemented
|
| -
|
| - def _callMethod(self, method, *args, **kw):
|
| - return getattr(self.forwarded, method)(*args, **kw)
|
| -
|
| - def callRemote(self, method, *args, **kw):
|
| - if self.interfaceClass.queryDescriptionFor(method):
|
| - result = defer.maybeDeferred(self._callMethod, method, *args, **kw)
|
| - return result
|
| - elif self.failWhenNotImplemented:
|
| - return defer.fail(
|
| - Failure(NotImplementedError,
|
| - "No Such Method in Interface: %s" % method))
|
| - else:
|
| - return defer.succeed(None)
|
| -
|
| -
|
| -class Pager:
|
| - """
|
| - I am an object which pages out information.
|
| - """
|
| - def __init__(self, collector, callback=None, *args, **kw):
|
| - """
|
| - Create a pager with a Reference to a remote collector and
|
| - an optional callable to invoke upon completion.
|
| - """
|
| - if callable(callback):
|
| - self.callback = callback
|
| - self.callbackArgs = args
|
| - self.callbackKeyword = kw
|
| - else:
|
| - self.callback = None
|
| - self._stillPaging = 1
|
| - self.collector = collector
|
| - collector.broker.registerPageProducer(self)
|
| -
|
| - def stillPaging(self):
|
| - """
|
| - (internal) Method called by Broker.
|
| - """
|
| - if not self._stillPaging:
|
| - self.collector.callRemote("endedPaging")
|
| - if self.callback is not None:
|
| - self.callback(*self.callbackArgs, **self.callbackKeyword)
|
| - return self._stillPaging
|
| -
|
| - def sendNextPage(self):
|
| - """
|
| - (internal) Method called by Broker.
|
| - """
|
| - self.collector.callRemote("gotPage", self.nextPage())
|
| -
|
| - def nextPage(self):
|
| - """
|
| - Override this to return an object to be sent to my collector.
|
| - """
|
| - raise NotImplementedError()
|
| -
|
| - def stopPaging(self):
|
| - """
|
| - Call this when you're done paging.
|
| - """
|
| - self._stillPaging = 0
|
| -
|
| -
|
| -class StringPager(Pager):
|
| - """
|
| - A simple pager that splits a string into chunks.
|
| - """
|
| - def __init__(self, collector, st, chunkSize=8192, callback=None, *args, **kw):
|
| - self.string = st
|
| - self.pointer = 0
|
| - self.chunkSize = chunkSize
|
| - Pager.__init__(self, collector, callback, *args, **kw)
|
| -
|
| - def nextPage(self):
|
| - val = self.string[self.pointer:self.pointer+self.chunkSize]
|
| - self.pointer += self.chunkSize
|
| - if self.pointer >= len(self.string):
|
| - self.stopPaging()
|
| - return val
|
| -
|
| -
|
| -class FilePager(Pager):
|
| - """
|
| - Reads a file in chunks and sends the chunks as they come.
|
| - """
|
| - implements(interfaces.IConsumer)
|
| -
|
| - def __init__(self, collector, fd, callback=None, *args, **kw):
|
| - self.chunks = []
|
| - Pager.__init__(self, collector, callback, *args, **kw)
|
| - self.startProducing(fd)
|
| -
|
| - def startProducing(self, fd):
|
| - self.deferred = basic.FileSender().beginFileTransfer(fd, self)
|
| - self.deferred.addBoth(lambda x : self.stopPaging())
|
| -
|
| - def registerProducer(self, producer, streaming):
|
| - self.producer = producer
|
| - if not streaming:
|
| - self.producer.resumeProducing()
|
| -
|
| - def unregisterProducer(self):
|
| - self.producer = None
|
| -
|
| - def write(self, chunk):
|
| - self.chunks.append(chunk)
|
| -
|
| - def sendNextPage(self):
|
| - """
|
| - Get the first chunk read and send it to collector.
|
| - """
|
| - if not self.chunks:
|
| - return
|
| - val = self.chunks.pop(0)
|
| - self.producer.resumeProducing()
|
| - self.collector.callRemote("gotPage", val)
|
| -
|
| -
|
| -# Utility paging stuff.
|
| -class CallbackPageCollector(pb.Referenceable):
|
| - """
|
| - I receive pages from the peer. You may instantiate a Pager with a
|
| - remote reference to me. I will call the callback with a list of pages
|
| - once they are all received.
|
| - """
|
| - def __init__(self, callback):
|
| - self.pages = []
|
| - self.callback = callback
|
| -
|
| - def remote_gotPage(self, page):
|
| - self.pages.append(page)
|
| -
|
| - def remote_endedPaging(self):
|
| - self.callback(self.pages)
|
| -
|
| -
|
| -def getAllPages(referenceable, methodName, *args, **kw):
|
| - """
|
| - A utility method that will call a remote method which expects a
|
| - PageCollector as the first argument.
|
| - """
|
| - d = defer.Deferred()
|
| - referenceable.callRemote(methodName, CallbackPageCollector(d.callback), *args, **kw)
|
| - return d
|
| -
|
|
|