return True def some_database_request(): # let's pretend we were getting that from a database return defer.succeed(["arthur", "trillian", "barkeeper"]) fixed_value_args = {"heart_of_gold": ["arthur", "ford", "zaphod", "trillian"]} dynamic_args = { "get_ape_descendants": some_database_request, "meaning_of_life": never_executed } # create an objected loaded with dynamic arguments (that will only be evaluated when needed) txeval = Evaluator(dynamic_args=dynamic_args, fixed_value_args=fixed_value_args) def eval_result_cb(result, who): if result: print who # evaluate eval_arthur_d = txeval.evaluate(will_survive("arthur")) eval_barkeeper_d = txeval.evaluate(will_survive("barkeeper")) eval_arthur_d.addCallback(eval_result_cb, "arthur") eval_barkeeper_d.addCallback(eval_result_cb, "barkeeper")
class OperatorTest(unittest.TestCase): def setUp(self): self.evaluator = Evaluator(dynamic_args=dynamic_args, fixed_value_args=fixed_value_args) def run_test(self, expression, expected_result): expression_d = self.evaluator.evaluate(expression) expression_d.addCallback(self.assertEquals, expected_result) return expression_d def test_false(self): return self.run_test(FALSE(), False) def test_true(self): return self.run_test(TRUE(), True) def test_and_arg_count(self): self.failureResultOf(self.run_test(AND(), False), ValueError) self.failureResultOf(self.run_test(AND(TRUE()), False), ValueError) self.run_test(AND(TRUE(), TRUE()), True) self.run_test(AND(TRUE(), TRUE(), TRUE(), TRUE()), True) def test_or_arg_count(self): self.failureResultOf(self.run_test(OR(), False), ValueError) self.failureResultOf(self.run_test(OR(TRUE()), False), ValueError) self.run_test(OR(TRUE(), TRUE()), True) self.run_test(OR(TRUE(), TRUE(), TRUE(), TRUE()), True) def test_or(self): return defer.DeferredList([ self.run_test(OR(FALSE(), TRUE(), AND(TRUE(), TRUE())), True), self.run_test(AND(TRUE(), TRUE(), OR(TRUE(), FALSE())), True), self.run_test(OR(FALSE(), FALSE(), FALSE(), FALSE()), False) ]) def test_or(self): return defer.DeferredList([ self.run_test(OR(FALSE(), TRUE(), AND(TRUE(), TRUE())), True), self.run_test(AND(TRUE(), TRUE(), OR(TRUE(), FALSE())), True), self.run_test(OR(FALSE(), FALSE(), FALSE(), FALSE(), TRUE()), True), self.run_test(OR(TRUE(), FALSE(), FALSE(), FALSE(), FALSE()), True) ]) def test_and(self): return defer.DeferredList([ self.run_test(AND(TRUE(), TRUE(), AND(TRUE(), TRUE())), True), self.run_test(AND(TRUE(), TRUE(), AND(TRUE(), FALSE())), False), self.run_test(AND(FALSE(), TRUE(), TRUE(), TRUE(), TRUE()), False), self.run_test(AND(TRUE(), TRUE(), TRUE(), TRUE(), FALSE()), False) ]) def test_not_arg_count(self): with self.assertRaises(TypeError): self.run_test(NOT(), False) with self.assertRaises(TypeError): self.run_test(NOT(TRUE(), TRUE()), False) def test_not(self): return defer.DeferredList([ self.run_test(NOT(FALSE()), True), self.run_test(NOT(TRUE()), False), self.run_test(NOT(OR(TRUE(), FALSE())), False), self.run_test(NOT(AND(TRUE(), TRUE(), AND(TRUE(), FALSE()))), True), ]) def test_equal(self): return defer.DeferredList([ self.run_test(EQUAL("value", "value"), True), self.run_test(EQUAL("value", "othervalue"), False) ]) def test_elementof(self): return defer.DeferredList([ self.run_test(ELEMENT_OF("value", ["value", "othervalue"]), True), self.run_test( ELEMENT_OF("value", ["othervalue", "yetanothervalue"]), False) ]) def test_elementof_sync_dynamic_arg(self): return defer.DeferredList([ self.run_test(ELEMENT_OF("el1", "sync_dynamic_arg_list"), True), self.run_test( ELEMENT_OF("sync_dynamic_arg_str", "sync_dynamic_arg_list"), True), ]) def test_elementof_async_dynamic_arg(self): return defer.DeferredList([ self.run_test(ELEMENT_OF("el1", "async_dynamic_arg_list"), True), self.run_test( ELEMENT_OF("async_dynamic_arg_str", "async_dynamic_arg_list"), True), ]) def test_equal_dynamic_arg(self): return defer.DeferredList([ self.run_test( EQUAL("sync_dynamic_arg_str", "async_dynamic_arg_str"), True), self.run_test( ELEMENT_OF("fixed_arg_str", "async_dynamic_arg_list"), True), ]) def test_all_bool(self): return defer.DeferredList([ self.run_test( AND("sync_dynamic_arg_true", "async_dynamic_arg_true", 'fixed_arg_true', NOT("sync_dynamic_arg_false"), NOT("async_dynamic_arg_false"), NOT("fixed_arg_false"), TRUE(), NOT(FALSE()), True), True), self.run_test( OR(NOT("sync_dynamic_arg_true"), NOT("async_dynamic_arg_true"), NOT('fixed_arg_true'), "sync_dynamic_arg_false", "async_dynamic_arg_false", "fixed_arg_false", FALSE(), NOT(TRUE()), False), False), ]) def test_fixed_values(self): return defer.DeferredList([ self.run_test(AND("fixed_arg_true", TRUE()), True), self.run_test(AND("fixed_arg_false", TRUE()), False), self.run_test(ELEMENT_OF("doesntexist", "fixed_arg_list"), False), self.run_test(ELEMENT_OF("test", "fixed_arg_list"), True), ])
class OperatorTest(unittest.TestCase): def setUp(self): self.evaluator = Evaluator( dynamic_args=dynamic_args, fixed_value_args=fixed_value_args ) def run_test(self, expression, expected_result): expression_d = self.evaluator.evaluate(expression) expression_d.addCallback(self.assertEquals, expected_result) return expression_d def test_false(self): return self.run_test(FALSE(), False) def test_true(self): return self.run_test(TRUE(), True) def test_and_arg_count(self): self.failureResultOf( self.run_test(AND(), False), ValueError ) self.failureResultOf( self.run_test(AND(TRUE()), False), ValueError ) self.run_test( AND(TRUE(),TRUE()), True ) self.run_test( AND(TRUE(),TRUE(),TRUE(),TRUE()), True ) def test_or_arg_count(self): self.failureResultOf( self.run_test(OR(), False), ValueError ) self.failureResultOf( self.run_test(OR(TRUE()), False), ValueError ) self.run_test( OR(TRUE(),TRUE()), True ) self.run_test( OR(TRUE(),TRUE(),TRUE(),TRUE()), True ) def test_or(self): return defer.DeferredList([ self.run_test( OR(FALSE(),TRUE(),AND(TRUE(),TRUE())), True ), self.run_test( AND(TRUE(),TRUE(),OR(TRUE(),FALSE())), True ), self.run_test(OR(FALSE(), FALSE(), FALSE(), FALSE()), False ) ]) def test_or(self): return defer.DeferredList([ self.run_test( OR(FALSE(),TRUE(),AND(TRUE(),TRUE())), True ), self.run_test( AND(TRUE(),TRUE(),OR(TRUE(),FALSE())), True ), self.run_test(OR(FALSE(), FALSE(), FALSE(), FALSE(), TRUE()), True ), self.run_test(OR(TRUE(), FALSE(), FALSE(), FALSE(), FALSE()), True ) ]) def test_and(self): return defer.DeferredList([ self.run_test( AND(TRUE(),TRUE(),AND(TRUE(),TRUE())), True ), self.run_test( AND(TRUE(),TRUE(),AND(TRUE(),FALSE())), False ), self.run_test(AND(FALSE(), TRUE(), TRUE(), TRUE(), TRUE()), False ), self.run_test(AND(TRUE(), TRUE(), TRUE(), TRUE(), FALSE()), False ) ]) def test_not_arg_count(self): with self.assertRaises(TypeError): self.run_test(NOT(), False) with self.assertRaises(TypeError): self.run_test(NOT(TRUE(), TRUE()), False) def test_not(self): return defer.DeferredList([ self.run_test( NOT(FALSE()), True ), self.run_test( NOT(TRUE()), False ), self.run_test( NOT(OR(TRUE(), FALSE())), False ), self.run_test( NOT(AND(TRUE(),TRUE(),AND(TRUE(),FALSE()))), True ), ]) def test_equal(self): return defer.DeferredList([ self.run_test( EQUAL("value", "value"), True ), self.run_test( EQUAL("value", "othervalue"), False ) ]) def test_elementof(self): return defer.DeferredList([ self.run_test( ELEMENT_OF("value", ["value", "othervalue"]), True ), self.run_test( ELEMENT_OF("value", ["othervalue", "yetanothervalue"]), False ) ]) def test_elementof_sync_dynamic_arg(self): return defer.DeferredList([ self.run_test( ELEMENT_OF("el1", "sync_dynamic_arg_list"), True ), self.run_test( ELEMENT_OF("sync_dynamic_arg_str", "sync_dynamic_arg_list"), True ), ]) def test_elementof_async_dynamic_arg(self): return defer.DeferredList([ self.run_test( ELEMENT_OF("el1", "async_dynamic_arg_list"), True ), self.run_test( ELEMENT_OF("async_dynamic_arg_str", "async_dynamic_arg_list"), True ), ]) def test_equal_dynamic_arg(self): return defer.DeferredList([ self.run_test( EQUAL("sync_dynamic_arg_str", "async_dynamic_arg_str"), True ), self.run_test( ELEMENT_OF("fixed_arg_str", "async_dynamic_arg_list"), True ), ]) def test_all_bool(self): return defer.DeferredList([ self.run_test( AND("sync_dynamic_arg_true", "async_dynamic_arg_true", 'fixed_arg_true', NOT("sync_dynamic_arg_false"), NOT("async_dynamic_arg_false"), NOT("fixed_arg_false"), TRUE(), NOT(FALSE()), True), True ), self.run_test( OR(NOT("sync_dynamic_arg_true"), NOT("async_dynamic_arg_true"), NOT('fixed_arg_true'), "sync_dynamic_arg_false", "async_dynamic_arg_false", "fixed_arg_false", FALSE(), NOT(TRUE()), False), False ), ]) def test_fixed_values(self): return defer.DeferredList([ self.run_test( AND("fixed_arg_true", TRUE()), True ), self.run_test( AND("fixed_arg_false", TRUE()), False ), self.run_test( ELEMENT_OF("doesntexist", "fixed_arg_list"), False ), self.run_test( ELEMENT_OF("test", "fixed_arg_list"), True ), ])
def never_executed(): print "Execution may stop before this is printed" return True def some_database_request(): # let's pretend we were getting that from a database return defer.succeed(["arthur", "trillian", "barkeeper"]) fixed_value_args = { "heart_of_gold": ["arthur", "ford", "zaphod", "trillian"] } dynamic_args = { "get_ape_descendants" : some_database_request, "meaning_of_life" : never_executed } # create an objected loaded with dynamic arguments (that will only be evaluated when needed) txeval = Evaluator(dynamic_args=dynamic_args, fixed_value_args=fixed_value_args) def eval_result_cb(result, who): if result: print who # evaluate eval_arthur_d = txeval.evaluate(will_survive("arthur")) eval_barkeeper_d = txeval.evaluate(will_survive("barkeeper")) eval_arthur_d.addCallback(eval_result_cb, "arthur") eval_barkeeper_d.addCallback(eval_result_cb,"barkeeper")