~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ui/__init__.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-15 12:02:35 UTC
  • mfrom: (5416.1.13 ui-factory)
  • Revision ID: pqm@pqm.ubuntu.com-20100915120235-gjrl0gmv0vxbu7b0
(mbp) add structured confirmations to the ui_factory (Martin Pool)

Show diffs side-by-side

added added

removed removed

Lines of Context:
100
100
    return val
101
101
 
102
102
 
 
103
class ConfirmationUserInterfacePolicy(object):
 
104
    """Wrapper for a UIFactory that allows or denies all confirmed actions."""
 
105
 
 
106
    def __init__(self, wrapped_ui, default_answer, specific_answers):
 
107
        """Generate a proxy UI that does no confirmations.
 
108
 
 
109
        :param wrapped_ui: Underlying UIFactory.
 
110
        :param default_answer: Bool for whether requests for
 
111
            confirmation from the user should be noninteractively accepted or
 
112
            denied.
 
113
        :param specific_answers: Map from confirmation_id to bool answer.
 
114
        """
 
115
        self.wrapped_ui = wrapped_ui
 
116
        self.default_answer = default_answer
 
117
        self.specific_answers = specific_answers
 
118
 
 
119
    def __getattr__(self, name):
 
120
        return getattr(self.wrapped_ui, name)
 
121
 
 
122
    def __repr__(self):
 
123
        return '%s(%r, %r, %r)' % (
 
124
            self.__class__.__name__,
 
125
            self.wrapped_ui,
 
126
            self.default_answer, 
 
127
            self.specific_answers)
 
128
 
 
129
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
 
130
        if confirmation_id in self.specific_answers:
 
131
            return self.specific_answers[confirmation_id]
 
132
        elif self.default_answer is not None:
 
133
            return self.default_answer
 
134
        else:
 
135
            return self.wrapped_ui.confirm_action(
 
136
                prompt, confirmation_id, prompt_kwargs)
 
137
 
 
138
 
103
139
class UIFactory(object):
104
140
    """UI abstraction.
105
141
 
151
187
        """
152
188
        self._quiet = state
153
189
 
 
190
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
 
191
        """Seek user confirmation for an action.
 
192
 
 
193
        If the UI is noninteractive, or the user does not want to be asked
 
194
        about this action, True is returned, indicating bzr should just
 
195
        proceed.
 
196
 
 
197
        The confirmation id allows the user to configure certain actions to
 
198
        always be confirmed or always denied, and for UIs to specialize the
 
199
        display of particular confirmations.
 
200
 
 
201
        :param prompt: Suggested text to display to the user.
 
202
        :param prompt_kwargs: A dictionary of arguments that can be
 
203
            string-interpolated into the prompt.
 
204
        :param confirmation_id: Unique string identifier for the confirmation.
 
205
        """
 
206
        return self.get_boolean(prompt % prompt_kwargs)
 
207
 
154
208
    def get_password(self, prompt='', **kwargs):
155
209
        """Prompt the user for a password.
156
210
 
377
431
                "without an upgrade path.\n" % (inter.target._format,))
378
432
 
379
433
 
380
 
class SilentUIFactory(UIFactory):
 
434
class NoninteractiveUIFactory(UIFactory):
 
435
    """Base class for UIs with no user."""
 
436
 
 
437
    def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
 
438
        return True
 
439
 
 
440
    def __repr__(self):
 
441
        return '%s()' % (self.__class__.__name__, )
 
442
 
 
443
 
 
444
class SilentUIFactory(NoninteractiveUIFactory):
381
445
    """A UI Factory which never prints anything.
382
446
 
383
447
    This is the default UI, if another one is never registered by a program
418
482
    def __repr__(self):
419
483
        return "%s(%r)" % (self.__class__.__name__, self.responses)
420
484
 
 
485
    def confirm_action(self, prompt, confirmation_id, args):
 
486
        return self.get_boolean(prompt % args)
 
487
 
421
488
    def get_boolean(self, prompt):
422
489
        return self.responses.pop(0)
423
490