1import re
2
3import six
4
5from mock import patch
6
7import invoke
8import invoke.collection
9import invoke.exceptions
10import invoke.tasks
11import invoke.program
12
13
14class Init:
15    "__init__"
16
17    def dunder_version_info(self):
18        assert hasattr(invoke, "__version_info__")
19        ver = invoke.__version_info__
20        assert isinstance(ver, tuple)
21        assert all(isinstance(x, int) for x in ver)
22
23    def dunder_version(self):
24        assert hasattr(invoke, "__version__")
25        ver = invoke.__version__
26        assert isinstance(ver, six.string_types)
27        assert re.match(r"\d+\.\d+\.\d+", ver)
28
29    def dunder_version_looks_generated_from_dunder_version_info(self):
30        # Meh.
31        ver_part = invoke.__version__.split(".")[0]
32        ver_info_part = invoke.__version_info__[0]
33        assert ver_part == str(ver_info_part)
34
35    class exposes_bindings:
36        def task_decorator(self):
37            assert invoke.task is invoke.tasks.task
38
39        def task_class(self):
40            assert invoke.Task is invoke.tasks.Task
41
42        def collection_class(self):
43            assert invoke.Collection is invoke.collection.Collection
44
45        def context_class(self):
46            assert invoke.Context is invoke.context.Context
47
48        def mock_context_class(self):
49            assert invoke.MockContext is invoke.context.MockContext
50
51        def config_class(self):
52            assert invoke.Config is invoke.config.Config
53
54        def pty_size_function(self):
55            assert invoke.pty_size is invoke.terminals.pty_size
56
57        def local_class(self):
58            assert invoke.Local is invoke.runners.Local
59
60        def runner_class(self):
61            assert invoke.Runner is invoke.runners.Runner
62
63        def promise_class(self):
64            assert invoke.Promise is invoke.runners.Promise
65
66        def failure_class(self):
67            assert invoke.Failure is invoke.runners.Failure
68
69        def exceptions(self):
70            # Meh
71            for obj in vars(invoke.exceptions).values():
72                if isinstance(obj, type) and issubclass(obj, BaseException):
73                    top_level = getattr(invoke, obj.__name__)
74                    real = getattr(invoke.exceptions, obj.__name__)
75                    assert top_level is real
76
77        def runner_result(self):
78            assert invoke.Result is invoke.runners.Result
79
80        def watchers(self):
81            assert invoke.StreamWatcher is invoke.watchers.StreamWatcher
82            assert invoke.Responder is invoke.watchers.Responder
83            assert invoke.FailingResponder is invoke.watchers.FailingResponder
84
85        def program(self):
86            assert invoke.Program is invoke.program.Program
87
88        def filesystemloader(self):
89            assert invoke.FilesystemLoader is invoke.loader.FilesystemLoader
90
91        def argument(self):
92            assert invoke.Argument is invoke.parser.Argument
93
94        def parsercontext(self):
95            assert invoke.ParserContext is invoke.parser.ParserContext
96
97        def parser(self):
98            assert invoke.Parser is invoke.parser.Parser
99
100        def parseresult(self):
101            assert invoke.ParseResult is invoke.parser.ParseResult
102
103        def executor(self):
104            assert invoke.Executor is invoke.executor.Executor
105
106        def call(self):
107            assert invoke.call is invoke.tasks.call
108
109        def Call(self):
110            # Starting to think we shouldn't bother with lowercase-c call...
111            assert invoke.Call is invoke.tasks.Call
112
113    class offers_singletons:
114        @patch("invoke.Context")
115        def run(self, Context):
116            result = invoke.run("foo", bar="biz")
117            ctx = Context.return_value
118            ctx.run.assert_called_once_with("foo", bar="biz")
119            assert result is ctx.run.return_value
120
121        @patch("invoke.Context")
122        def sudo(self, Context):
123            result = invoke.sudo("foo", bar="biz")
124            ctx = Context.return_value
125            ctx.sudo.assert_called_once_with("foo", bar="biz")
126            assert result is ctx.sudo.return_value
127