1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """Command-line back-end glue."""
20
21 import sys
22 from pybaz import compat
23
24
25
27 msg_format = ("'expected' param must be a sequence of positive"
28 " integers but was: %r")
29 try:
30 iterator = iter(expected)
31 except TypeError:
32 raise TypeError, msg_format % expected
33 for status in iterator:
34 if not isinstance(status, int):
35 raise TypeError, msg_format % expected
36 if status < 0:
37 raise ValueError, msg_format % expected
38
39
40
41
55
56
58
59 """Facade for command-line back-end options."""
60
61 - def __init__(self, command, module, spawning, logger):
62 self._command = command
63 self._module = module
64 self._spawning = spawning
65 self._logger = logger
66 self._spawner = None
67 self._version = None
68
71
73 assert command
74 self._command = command
75 self._spawner = None
76 self._version = None
77
78 command = property(
79 _get_command, _set_command, None,
80 """Name of the command line program.
81
82 :type: str""")
83
86
88 assert spawning
89 self._spawning = spawning
90 self._spawner = None
91
92 spawning_strategy = property(
93 _get_spawning, _set_spawning, None,
94 """`SpawningStrategy` factory used to create the spawner.
95
96 :type: factory of `SpawningStrategy`""")
97
100
102 assert logger
103 self._logger = logger
104 self._spawner = None
105
106 logger = property(
107 _get_logger, _set_logger, None,
108 """Command line logger.
109
110 :type: `logger.Logger`""")
111
113 if self._spawner is None:
114 assert self._spawning
115 assert self._command
116 assert self._logger
117 self._spawner = self._spawning(self._command, self._logger)
118 return self._spawner
119
123
124 - def one_cmd(self, args, chdir=None):
128
129 - def sequence_cmd(self, args, expected=(0,), chdir=None, stderr_too=False):
130
131
132
133 _check_expected_param(expected)
134 sequence_cmd = self._get_spawner().sequence_cmd
135 if stderr_too:
136 return sequence_cmd(args, chdir, expected, stderr_too=stderr_too)
137 else:
138 return sequence_cmd(args, chdir, expected)
139
140 - def text_cmd(self, args, chdir=None):
141 status, text = self._get_spawner().status_text_cmd(args, chdir, (0,))
142 assert status == 0
143 return text
144
145 - def status_cmd(self, args, expected, chdir=None):
146 _check_expected_param(expected)
147 return self._get_spawner().status_cmd(args, chdir, expected)
148
150 _check_expected_param(expected)
151 seq = self.sequence_cmd(args, expected, chdir)
152 try:
153 out = seq.next()
154 except StopIteration:
155 return seq.status, None
156 tail = list(seq)
157 if not tail:
158 return seq.status, out
159 raise AssertionError, (
160 'one liner actually produced multiline output:\n%s'
161 % '\n'.join([out] + tail))
162
163 - def status_text_cmd(self, args, expected):
164 _check_expected_param(expected)
165 return self._get_spawner().status_text_cmd(args, None, expected)
166
172
173 version = property(_get_version, doc="""
174 The current command version.
175
176 Instance of pybaz.compat.BazaarCommandVersion.""")
177
178 __pybaz_version = compat.BazaarCommandVersion(
179 'baz Bazaar version 1.4~200504281027')
180
183
184 compatibility = property(_get_compat)
185
186
188
189 """Abstract class for process spawning strategies."""
190
192 raise NotImplementedError
193
194 - def status_text_cmd(self, args, chdir, expected):
195 raise NotImplementedError
196
198 raise NotImplementedError
199
200
202 """SpawningStrategy that uses Twisted if it is present in ``sys.modules``.
203
204 This SpawningStrategy tries to do the right thing my looking at
205 the contents of ``sys.modules``: if "twisted" or a module of that
206 package is loaded when the first spawning method is run, it will
207 use the Twisted spawning strategy. Otherwise, it will use a simple
208 fork/exec spawning strategy which does not depend on Twisted.
209 """
210
211 __pychecker__ = 'no-override'
212
214 self._init_args = args
215 self._init_kwargs = kwargs
216 self._cached_guess = None
217
232
235
237 return self._guess().status_cmd(*args, **kwargs)
238
239 - def status_text_cmd(self, *args, **kwargs):
240 return self._guess().status_text_cmd(*args, **kwargs)
241