Exemplo n.º 1
0
 def default_tasks_called_when_no_tasks_specified(self):
     # NOTE: when no tasks AND no default, Program will print global
     # help. We just won't do anything at all, which is fine for now.
     task = Task(Mock("default-task"))
     coll = Collection()
     coll.add_task(task, name="mytask", default=True)
     executor = Executor(collection=coll)
     executor.execute()
     args = task.body.call_args[0]
     assert isinstance(args[0], Context)
     assert len(args) == 1
Exemplo n.º 2
0
 def calls_default_to_empty_args_always(self):
     pre_body, post_body = Mock(), Mock()
     t1 = Task(pre_body)
     t2 = Task(post_body)
     t3 = Task(Mock(), pre=[t1], post=[t2])
     e = Executor(collection=Collection(t1=t1, t2=t2, t3=t3))
     e.execute(("t3", {"something": "meh"}))
     for body in (pre_body, post_body):
         args = body.call_args[0]
         assert len(args) == 1
         assert isinstance(args[0], Context)
Exemplo n.º 3
0
 def deduping_treats_different_calls_to_same_task_differently(self):
     body = Mock()
     t1 = Task(body)
     pre = [call(t1, 5), call(t1, 7), call(t1, 5)]
     t2 = Task(Mock(), pre=pre)
     c = Collection(t1=t1, t2=t2)
     e = Executor(collection=c)
     e.execute("t2")
     # Does not call the second t1(5)
     param_list = []
     for body_call in body.call_args_list:
         assert isinstance(body_call[0][0], Context)
         param_list.append(body_call[0][1])
     assert set(param_list) == {5, 7}
Exemplo n.º 4
0
        def hands_task_specific_configuration_to_context(self):
            @task
            def mytask(c):
                assert c.my_key == "value"

            @task
            def othertask(c):
                assert c.my_key == "othervalue"

            inner1 = Collection("inner1", mytask)
            inner1.configure({"my_key": "value"})
            inner2 = Collection("inner2", othertask)
            inner2.configure({"my_key": "othervalue"})
            c = Collection(inner1, inner2)
            e = Executor(collection=c)
            e.execute("inner1.mytask", "inner2.othertask")
Exemplo n.º 5
0
 def can_grant_access_to_core_arg_parse_result(self):
     c = ParseResult([ParserContext(name="mytask")])
     e = Executor(collection=Collection(), core=c)
     assert e.core is c
     # Sanity test of real-world access/usage
     assert len(e.core) == 1
     assert e.core[0].name == "mytask"
     assert len(e.core[0].args) == 0
Exemplo n.º 6
0
        def hands_collection_configuration_to_context(self):
            @task
            def mytask(c):
                assert c.my_key == "value"

            c = Collection(mytask)
            c.configure({"my_key": "value"})
            Executor(collection=c).execute("mytask")
Exemplo n.º 7
0
        def subcollection_config_works_with_default_tasks(self):
            @task(default=True)
            def mytask(c):
                assert c.my_key == "value"

            # Sets up a task "known as" sub.mytask which may be called as
            # just 'sub' due to being default.
            sub = Collection("sub", mytask=mytask)
            sub.configure({"my_key": "value"})
            main = Collection(sub=sub)
            # Execute via collection default 'task' name.
            Executor(collection=main).execute("sub")
Exemplo n.º 8
0
 def setup(self):
     self.task1 = Task(Mock(return_value=7))
     self.task2 = Task(Mock(return_value=10), pre=[self.task1])
     self.task3 = Task(Mock(), pre=[self.task1])
     self.task4 = Task(Mock(return_value=15), post=[self.task1])
     self.contextualized = Task(Mock())
     coll = Collection()
     coll.add_task(self.task1, name="task1")
     coll.add_task(self.task2, name="task2")
     coll.add_task(self.task3, name="task3")
     coll.add_task(self.task4, name="task4")
     coll.add_task(self.contextualized, name="contextualized")
     self.executor = Executor(collection=coll)
Exemplo n.º 9
0
 def _call_objs(self):
     # Setup
     pre_body, post_body = Mock(), Mock()
     t1 = Task(pre_body)
     t2 = Task(post_body)
     t3 = Task(
         Mock(),
         pre=[call(t1, 5, foo="bar")],
         post=[call(t2, 7, biz="baz")],
     )
     c = Collection(t1=t1, t2=t2, t3=t3)
     e = Executor(collection=c)
     e.execute("t3")
     # Pre-task asserts
     args, kwargs = pre_body.call_args
     assert kwargs == {"foo": "bar"}
     assert isinstance(args[0], Context)
     assert args[1] == 5
     # Post-task asserts
     args, kwargs = post_body.call_args
     assert kwargs == {"biz": "baz"}
     assert isinstance(args[0], Context)
     assert args[1] == 7
Exemplo n.º 10
0
        def config_deletion_is_preserved_between_tasks(self):
            @task
            def task1(c):
                del c.config.run.echo
                # NOTE: returned for test inspection, not as mechanism of
                # sharing data!
                return c

            @task
            def task2(c):
                return c

            coll = Collection(task1, task2)
            ret = Executor(collection=coll).execute("task1", "task2")
            c2 = ret[task2]
            assert "echo" not in c2.config.run
Exemplo n.º 11
0
        def new_config_data_is_preserved_between_tasks(self):
            @task
            def task1(c):
                c.foo = "bar"
                # NOTE: returned for test inspection, not as mechanism of
                # sharing data!
                return c

            @task
            def task2(c):
                return c

            coll = Collection(task1, task2)
            ret = Executor(collection=coll).execute("task1", "task2")
            c2 = ret[task2]
            assert "foo" in c2.config
            assert c2.foo == "bar"
Exemplo n.º 12
0
        def context_is_new_but_config_is_same(self):
            @task
            def task1(c):
                return c

            @task
            def task2(c):
                return c

            coll = Collection(task1, task2)
            ret = Executor(collection=coll).execute("task1", "task2")
            c1 = ret[task1]
            c2 = ret[task2]
            assert c1 is not c2
            # TODO: eventually we may want to change this again, as long as the
            # effective values within the config are still matching...? Ehh
            assert c1.config is c2.config
Exemplo n.º 13
0
 def core_arg_parse_result_defaults_to_None(self):
     assert Executor(collection=Collection()).core is None
Exemplo n.º 14
0
 def uses_blank_config_by_default(self):
     e = Executor(collection=Collection())
     assert isinstance(e.config, Config)
Exemplo n.º 15
0
 def allows_collection_and_config(self):
     coll = Collection()
     conf = Config()
     e = Executor(collection=coll, config=conf)
     assert e.collection is coll
     assert e.config is conf