Index: third_party/twisted_8_1/twisted/flow/base.py |
diff --git a/third_party/twisted_8_1/twisted/flow/base.py b/third_party/twisted_8_1/twisted/flow/base.py |
deleted file mode 100644 |
index aa8cc4cdec3659b6235cd5b391117e7511678db1..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/flow/base.py |
+++ /dev/null |
@@ -1,213 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
-# Author: Clark Evans (cce@clarkevans.com) |
-# |
-""" |
-flow.base |
- |
-This module contains the core exceptions and base classes in the flow module. |
-See flow.flow for more detailed information |
-""" |
- |
-import twisted.python.compat |
-from twisted.internet import reactor |
-import time |
- |
-# |
-# Exceptions used within flow |
-# |
-class Unsupported(NotImplementedError): |
- """ Indicates that the given stage does not know what to do |
- with the flow instruction that was returned. |
- """ |
- def __init__(self, inst): |
- msg = "Unsupported flow instruction: %s " % repr(inst) |
- TypeError.__init__(self,msg) |
- |
-class NotReadyError(RuntimeError): |
- """ Raised when a stage has not been subject to a yield """ |
- pass |
- |
-# |
-# Abstract/Base Classes |
-# |
- |
-class Instruction: |
- """ Has special meaning when yielded in a flow """ |
- pass |
- |
-class Controller: |
- """ |
- Flow controller |
- |
- At the base of every flow, is a controller class which interprets the |
- instructions, especially the CallLater instructions. This is primarly just |
- a marker class to denote which classes consume Instruction events. If a |
- controller cannot handle a particular instruction, it raises the |
- Unsupported exception. |
- """ |
- pass |
- |
-class CallLater(Instruction): |
- """ |
- Instruction to support callbacks |
- |
- This is the instruction which is returned during the yield of the _Deferred |
- and Callback stage. The underlying flow driver should call the 'callLater' |
- function with the callable to be executed after each callback. |
- """ |
- def callLater(self, callable): |
- pass |
- |
-class Cooperate(CallLater): |
- """ |
- Requests that processing be paused so other tasks can resume |
- |
- Yield this object when the current chain would block or periodically during |
- an intensive processing task. The flow mechanism uses these objects to |
- signal that the current processing chain should be paused and resumed |
- later. This allows other delayed operations to be processed, etc. Usage |
- is quite simple:: |
- |
- # within some generator wrapped by a Controller |
- yield Cooperate(1) # yield for a second or more |
- |
- """ |
- def __init__(self, timeout = 0): |
- self.timeout = timeout |
- def callLater(self, callable): |
- reactor.callLater(self.timeout, callable) |
- |
-class Stage(Instruction): |
- """ |
- Abstract base defining protocol for iterator/generators in a flow |
- |
- This is the primary component in the flow system, it is an iterable object |
- which must be passed to a yield statement before each call to next(). |
- Usage:: |
- |
- iterable = DerivedStage( ... , SpamError, EggsError)) |
- yield iterable |
- for result in iterable: |
- # handle good result, or SpamError or EggsError |
- yield iterable |
- |
- Alternatively, when inside a generator, the next() method can be used |
- directly. In this case, if no results are available, StopIteration is |
- raised, and if left uncaught, will nicely end the generator. Of course, |
- unexpected failures are raised. This technique is especially useful when |
- pulling from more than one stage at a time. For example:: |
- |
- def someGenerator(): |
- iterable = SomeStage( ... , SpamError, EggsError) |
- while True: |
- yield iterable |
- result = iterable.next() |
- # handle good result or SpamError or EggsError |
- |
- For many generators, the results become available in chunks of rows. While |
- the default value is to get one row at a time, there is a 'chunked' |
- property which allows them to be returned via the next() method as many |
- rows rather than row by row. For example:: |
- |
- iterable = DerivedStage(...) |
- iterable.chunked = True |
- for results in iterable: |
- for result in results: |
- # handle good result |
- yield iterable |
- |
- For those wishing more control at the cost of a painful experience, the |
- following member variables can be used to great effect:: |
- |
- - results: This is a list of results produced by the generator, they |
- can be fetched one by one using next() or in a group |
- together. If no results were produced, then this is an |
- empty list. These results should be removed from the list |
- after they are read; or, after reading all of the results |
- set to an empty list |
- |
- - stop: This is true if the underlying generator has finished execution |
- (raised a StopIteration or returned). Note that several |
- results may exist, and stop may be true. |
- |
- - failure: If the generator produced an exception, then it is wrapped |
- as a Failure object and put here. Note that several results |
- may have been produced before the failure. To ensure that |
- the failure isn't accidently reported twice, it is |
- adviseable to set stop to True. |
- |
- The order in which these member variables is used is *critical* for |
- proper adherance to the flow protocol. First, all successful |
- results should be handled. Second, the iterable should be checked |
- to see if it is finished. Third, a failure should be checked; |
- while handling a failure, either the loop should be exited, or |
- the iterable's stop member should be set. For example:: |
- |
- iterable = SomeStage(...) |
- while True: |
- yield iterable |
- if iterable.results: |
- for result in iterable.results: |
- # handle good result |
- iterable.results = [] |
- if iterable.stop: |
- break |
- if iterable.failure: |
- iterable.stop = True |
- # handle iterable.failure |
- break |
- """ |
- def __init__(self, *trap): |
- self._trap = trap |
- self.stop = False |
- self.failure = None |
- self.results = [] |
- self.chunked = False |
- |
- def __iter__(self): |
- return self |
- |
- def next(self): |
- """ |
- return current result |
- |
- This is the primary function to be called to retrieve the current |
- result. It complies with the iterator protocol by raising |
- StopIteration when the stage is complete. It also raises an exception |
- if it is called before the stage is yielded. |
- """ |
- if self.results: |
- if self.chunked: |
- ret = self.results |
- self.results = [] |
- return ret |
- else: |
- return self.results.pop(0) |
- if self.stop: |
- raise StopIteration() |
- |
- if self.failure: |
- self.stop = True |
- |
- cr = self.failure.check(*self._trap) |
- |
- if cr: |
- return cr |
- |
- self.failure.raiseException() |
- |
- raise NotReadyError("Must 'yield' this object before calling next()") |
- |
- def _yield(self): |
- """ |
- executed during a yield statement by previous stage |
- |
- This method is private within the scope of the flow module, it is used |
- by one stage in the flow to ask a subsequent stage to produce its |
- value. The result of the yield is then stored in self.result and is an |
- instance of Failure if a problem occurred. |
- """ |
- raise NotImplementedError |