~amanica/bzr/320119-log_exclusive_lower_bound

« back to all changes in this revision

Viewing changes to bzrlib/ui/__init__.py

  • Committer: Marius Kruger
  • Date: 2009-08-01 23:31:52 UTC
  • mfrom: (4511.1.69 +trunk)
  • Revision ID: amanic@gmail.com-20090801233152-m2l31ll5qbcr4xz6
merge with bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
"""UI abstraction.
18
 
 
19
 
This tells the library how to display things to the user.  Through this
20
 
layer different applications can choose the style of UI.
21
 
 
22
 
At the moment this layer is almost trivial: the application can just
23
 
choose the style of progress bar.
24
 
 
25
 
Set the ui_factory member to define the behaviour.  The default
26
 
displays no output.
 
17
"""Abstraction for interacting with the user.
 
18
 
 
19
Applications can choose different types of UI, and they deal with displaying
 
20
messages or progress to the user, and with gathering different types of input.
 
21
 
 
22
Several levels are supported, and you can also register new factories such as
 
23
for a GUI.
 
24
 
 
25
UIFactory
 
26
    Semi-abstract base class
 
27
 
 
28
SilentUIFactory
 
29
    Produces no output and cannot take any input; useful for programs using
 
30
    bzrlib in batch mode or for programs such as loggerhead.
 
31
 
 
32
CannedInputUIFactory
 
33
    For use in testing; the input values to be returned are provided 
 
34
    at construction.
 
35
 
 
36
TextUIFactory
 
37
    Standard text command-line interface, with stdin, stdout, stderr.
 
38
    May make more or less advanced use of them, eg in drawing progress bars,
 
39
    depending on the detected capabilities of the terminal.
 
40
    GUIs may choose to subclass this so that unimplemented methods fall
 
41
    back to working through the terminal.
27
42
"""
28
43
 
 
44
 
29
45
import os
30
46
import sys
31
47
import warnings
41
57
    trace,
42
58
    )
43
59
""")
 
60
from bzrlib.symbol_versioning import (
 
61
    deprecated_function,
 
62
    deprecated_in,
 
63
    deprecated_method,
 
64
    )
44
65
 
45
66
 
46
67
_valid_boolean_strings = dict(yes=True, no=False,
158
179
        """
159
180
        raise NotImplementedError(self.get_boolean)
160
181
 
 
182
    def make_progress_view(self):
 
183
        """Construct a new ProgressView object for this UI.
 
184
 
 
185
        Application code should normally not call this but instead
 
186
        nested_progress_bar().
 
187
        """
 
188
        return NullProgressView()
 
189
 
161
190
    def recommend_upgrade(self,
162
191
        current_format_name,
163
192
        basedir):
182
211
 
183
212
 
184
213
class CLIUIFactory(UIFactory):
185
 
    """Common behaviour for command line UI factories.
186
 
 
187
 
    This is suitable for dumb terminals that can't repaint existing text."""
188
 
 
 
214
    """Deprecated in favor of TextUIFactory."""
 
215
 
 
216
    @deprecated_method(deprecated_in((1, 18, 0)))
189
217
    def __init__(self, stdin=None, stdout=None, stderr=None):
190
218
        UIFactory.__init__(self)
191
219
        self.stdin = stdin or sys.stdin
271
299
        self.stdout.write(msg + '\n')
272
300
 
273
301
 
274
 
class SilentUIFactory(CLIUIFactory):
 
302
class SilentUIFactory(UIFactory):
275
303
    """A UI Factory which never prints anything.
276
304
 
277
 
    This is the default UI, if another one is never registered.
 
305
    This is the default UI, if another one is never registered by a program
 
306
    using bzrlib, and it's also active for example inside 'bzr serve'.
 
307
 
 
308
    Methods that try to read from the user raise an error; methods that do
 
309
    output do nothing.
278
310
    """
279
311
 
280
312
    def __init__(self):
281
 
        CLIUIFactory.__init__(self)
 
313
        UIFactory.__init__(self)
 
314
 
 
315
    def note(self, msg):
 
316
        pass
 
317
 
 
318
    def get_username(self, prompt, **kwargs):
 
319
        return None
 
320
 
 
321
 
 
322
class CannedInputUIFactory(SilentUIFactory):
 
323
    """A silent UI that return canned input."""
 
324
 
 
325
    def __init__(self, responses):
 
326
        self.responses = responses
 
327
 
 
328
    def __repr__(self):
 
329
        return "%s(%r)" % (self.__class__.__name__, self.responses)
 
330
 
 
331
    def get_boolean(self, prompt):
 
332
        return self.responses.pop(0)
282
333
 
283
334
    def get_password(self, prompt='', **kwargs):
284
 
        return None
285
 
 
286
 
    def get_username(self, prompt='', **kwargs):
287
 
        return None
288
 
 
289
 
    def prompt(self, prompt, **kwargs):
290
 
        pass
291
 
 
292
 
    def note(self, msg):
293
 
        pass
294
 
 
295
 
 
 
335
        return self.responses.pop(0)
 
336
 
 
337
    def get_username(self, prompt, **kwargs):
 
338
        return self.responses.pop(0)
 
339
    
 
340
    def assert_all_input_consumed(self):
 
341
        if self.responses:
 
342
            raise AssertionError("expected all input in %r to be consumed"
 
343
                % (self,))
 
344
 
 
345
 
 
346
@deprecated_function(deprecated_in((1, 18, 0)))
296
347
def clear_decorator(func, *args, **kwargs):
297
348
    """Decorator that clears the term"""
298
349
    ui_factory.clear_term()
300
351
 
301
352
 
302
353
ui_factory = SilentUIFactory()
303
 
"""IMPORTANT: never import this symbol directly. ONLY ever access it as
304
 
ui.ui_factory."""
 
354
# IMPORTANT: never import this symbol directly. ONLY ever access it as
 
355
# ui.ui_factory, so that you refer to the current value.
305
356
 
306
357
 
307
358
def make_ui_for_terminal(stdin, stdout, stderr):
308
359
    """Construct and return a suitable UIFactory for a text mode program.
309
 
 
310
 
    If stdout is a smart terminal, this gets a smart UIFactory with
311
 
    progress indicators, etc.  If it's a dumb terminal, just plain text output.
312
360
    """
313
 
    cls = None
314
 
    isatty = getattr(stdin, 'isatty', None)
315
 
    if isatty is None:
316
 
        cls = CLIUIFactory
317
 
    elif not isatty():
318
 
        cls = CLIUIFactory
319
 
    elif os.environ.get('TERM') in ('dumb', ''):
320
 
        # e.g. emacs compile window
321
 
        cls = CLIUIFactory
322
 
    # User may know better, otherwise default to TextUIFactory
323
 
    if (   os.environ.get('BZR_USE_TEXT_UI', None) is not None
324
 
        or cls is None):
325
 
        from bzrlib.ui.text import TextUIFactory
326
 
        cls = TextUIFactory
327
 
    return cls(stdin=stdin, stdout=stdout, stderr=stderr)
 
361
    # this is now always TextUIFactory, which in turn decides whether it
 
362
    # should display progress bars etc
 
363
    from bzrlib.ui.text import TextUIFactory
 
364
    return TextUIFactory(stdin, stdout, stderr)
 
365
 
 
366
 
 
367
class NullProgressView(object):
 
368
    """Soak up and ignore progress information."""
 
369
 
 
370
    def clear(self):
 
371
        pass
 
372
 
 
373
    def show_progress(self, task):
 
374
        pass
 
375
 
 
376
    def show_transport_activity(self, transport, direction, byte_count):
 
377
        pass