def xxtestRelativeSpeedOfAll(self): from time import time class A(Observable): def f(self): raise StopIteration(None) yield root = Observable() connector = Transparent() root.addObserver(connector) connector.addObserver(A()) connector.addObserver(A()) connector.addObserver(A()) connector.addObserver(A()) connector.addObserver(A()) connector.addObserver(A()) connector.addObserver(A()) t = 0.0 for _ in xrange(10000): g = compose(root.all.f()) t0 = time() for _ in g: g.next() t1 = time() t += t1 - t0 print t def f(): for _ in xrange(10000): g = compose(root.all.f()) for _ in g: g.next()
def testUnknownDispatchingNoImplementation(self): observable = Observable() class A(object): pass observable.addObserver(A()) retval = observable.all.unknown('non_existing_method', 'one') self.assertEquals([], list(compose(retval)))
def testDirectedMessagesCanAlsoBeAcceptedByObjects(self): observable = Observable() called = [] class Y(object): def method(this): called.append("Y") return yield def observable_name(this): return 'name' class Z(object): def method(this): called.append("Z") return yield observable.addObserver(Y()) observable.addObserver(Z()) list(compose(observable.all["name"].method())) self.assertEquals(['Y'], called) del called[:] list(compose(observable.all.method())) self.assertEquals(['Y', "Z"], called) del called[:] list(compose(observable.all["other"].method())) self.assertEquals([], called)
def testDeferredObjectsAreCached(self): observable = Observable() class A(Observable): pass observable.addObserver(A("name")) d1 = observable.all["name"] d2 = observable.all["name"] self.assertEquals(d1, d2)
def testUnknownDispatching(self): observable = Observable() class Listener(object): def method(inner, one): return one + " another" observable.addObserver(Listener()) retval = observable.call.unknown('method', 'one') self.assertEquals('one another', retval)
def testUnknownDispatchingBackToUnknown(self): observable = Observable() class A(object): def call_unknown(self, message, one): return "via unknown " + one observable.addObserver(A()) retval = observable.call.unknown('non_existing_method', 'one') self.assertEquals("via unknown one", retval)
def testNoLeakingGeneratorsInCycle(self): class Responder(Observable): def message(self): yield 'response' obs = Observable() obs.addObserver(Responder()) result = compose(obs.all.message()).next() self.assertEquals('response',result) del obs
def testDeferredObjectsAreCached(self): class A(object): def a(self): pass observable = Observable() observable.addObserver(A()) f1 = observable.all.f f2 = observable.all.f self.assertEquals(f1, f2)
def testNoLeakingGeneratorsInCycle(self): class Responder(Observable): def message(self): yield 'response' obs = Observable() obs.addObserver(Responder()) result = compose(obs.all.message()).next() self.assertEquals('response', result) del obs
def testProperErrorMessageWhenArgsDoNotMatch(self): observable = Observable() class YesObserver: def yes(self, oneArg): pass observable.addObserver(YesObserver()) try: answer = observable.call.yes() self.fail('should raise TypeError') except TypeError, e: self.assertEquals('yes() takes exactly 2 arguments (1 given)', str(e))
def testUnknownIsEquivalentToNormalCall(self): observable = Observable() class A(object): def normal(self): return 'normal' def call_unknown(self, message, *args, **kwargs): return 'normal' observable.addObserver(A()) result1 = observable.call.unknown('normal') result2 = observable.call.unknown('other') self.assertEquals(result1, result2)
def testFixUpExceptionTraceBack(self): class A: def a(self): raise Exception('A.a') def any_unknown(self, msg, *args, **kwargs): yield self.a() observable = Observable() observable.addObserver(A()) try: list(compose(observable.any.a())) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list(compose(observable.all.a())) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: observable.do.a() except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: observable.call.a() except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list(compose(observable.any.unknown('a'))) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list( compose( observable.any.somethingNotThereButHandledByUnknown('a'))) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "any_unknown", "a") else: self.fail('Should not happen.')
def testNoLeakingGeneratorsInMultiTransparents(self): class Responder(Observable): def message(self): return 'response' obs = Observable() t1 = Transparent() t2 = Transparent() obs.addObserver(t1) t1.addObserver(t2) t2.addObserver(Responder()) result = obs.call.message() self.assertEquals('response', result) del obs, t1, t2, result
def testUndirectedObserverMessagingIsUnaffectedByObserverName(self): observable = Observable() called = [] class A(Observable): def method(this): called.append(("A", this.observable_name())) return yield class B(Observable): def method(this): called.append(("B", this.observable_name())) return yield observable.addObserver(A("name")) observable.addObserver(A().observable_setName("anothername")) observable.addObserver(B("anothername")) observable.addObserver(B()) list(compose(observable.all.method())) self.assertEquals([("A", "name"), ("A", "anothername"), ("B", "anothername"), ("B", None)], called) del called[:] list(compose(observable.all["name"].method())) self.assertEquals([("A", "name")], called)
def testDirectedObserverMessagingDoesNotBreakUndirectedCall(self): observable = Observable() called = [] class A(Observable): def method(this): called.append("A") return yield observable.addObserver(A("name")) list(compose(observable.all["name"].method())) list(compose(observable.all["name"].method())) self.assertEquals(["A", "A"], called)
def testFixUpExceptionTraceBack(self): class A: def a(self): raise Exception('A.a') def any_unknown(self, msg, *args, **kwargs): yield self.a() observable = Observable() observable.addObserver(A()) try: list(compose(observable.any.a())) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list(compose(observable.all.a())) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: observable.do.a() except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: observable.call.a() except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list(compose(observable.any.unknown('a'))) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "a") else: self.fail('Should not happen.') try: list(compose(observable.any.somethingNotThereButHandledByUnknown('a'))) except Exception: self.assertFunctionsOnTraceback("testFixUpExceptionTraceBack", "any_unknown", "a") else: self.fail('Should not happen.')
def testDirectedObserverMessagingIgnoresNonObservableObservers(self): observable = Observable() called = [] class Z(object): def method(this): called.append("Z") return yield observable.addObserver(Z()) list(compose(observable.all["name"].method())) self.assertEquals([], called) list(compose(observable.all.method())) self.assertEquals(["Z"], called)
def testThrow(self): class A(Observable): def f1(self): yield "A:f1-1" yield "A:f1-2" yield "A:f1-3" class B(Observable): def f1(self): yield "B:f1-1" yield "B:f1-2" yield "B:f1-3" root = Observable() root.addObserver(A()) root.addObserver(B()) g = compose(root.all.f1()) g.next() r = g.throw(DeclineMessage) self.assertEquals("B:f1-1", r)
def testRebuildDefersAfterAddObserver(self): observable = Observable() called = [] class A(Observable): def method(this): called.append("A") return yield class B(Observable): def method(this): called.append("B") return yield observable.addObserver(A()) list(compose(observable.all.method())) self.assertEquals(['A'], called) del called[:] observable.addObserver(B()) list(compose(observable.all.method())) self.assertEquals(['A', 'B'], called)