103
class ConfirmationUserInterfacePolicy(object):
104
"""Wrapper for a UIFactory that allows or denies all confirmed actions."""
106
def __init__(self, wrapped_ui, default_answer, specific_answers):
107
"""Generate a proxy UI that does no confirmations.
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
113
:param specific_answers: Map from confirmation_id to bool answer.
115
self.wrapped_ui = wrapped_ui
116
self.default_answer = default_answer
117
self.specific_answers = specific_answers
119
def __getattr__(self, name):
120
return getattr(self.wrapped_ui, name)
123
return '%s(%r, %r, %r)' % (
124
self.__class__.__name__,
127
self.specific_answers)
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
135
return self.wrapped_ui.confirm_action(
136
prompt, confirmation_id, prompt_kwargs)
139
103
class UIFactory(object):
140
104
"""UI abstraction.
142
106
This tells the library how to display things to the user. Through this
143
107
layer different applications can choose the style of UI.
145
UI Factories are also context managers, for some syntactic sugar some users
148
109
:ivar suppressed_warnings: Identifiers for user warnings that should
162
123
self.suppressed_warnings = set()
163
124
self._quiet = False
166
"""Context manager entry support.
168
Override in a concrete factory class if initialisation before use is
171
return self # This is bound to the 'as' clause in a with statement.
173
def __exit__(self, exc_type, exc_val, exc_tb):
174
"""Context manager exit support.
176
Override in a concrete factory class if more cleanup than a simple
177
self.clear_term() is needed when the UIFactory is finished with.
180
return False # propogate exceptions.
182
126
def be_quiet(self, state):
183
127
"""Tell the UI to be more quiet, or not.
188
132
self._quiet = state
190
def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
191
"""Seek user confirmation for an action.
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
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.
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.
206
return self.get_boolean(prompt % prompt_kwargs)
208
134
def get_password(self, prompt='', **kwargs):
209
135
"""Prompt the user for a password.
232
158
version of stdout, but in a GUI it might be appropriate to send it to a
233
159
window displaying the text.
235
:param encoding: Unicode encoding for output; if not specified
236
uses the configured 'output_encoding' if any; otherwise the
161
:param encoding: Unicode encoding for output; default is the
162
terminal encoding, which may be different from the user encoding.
238
163
(See get_terminal_encoding.)
240
165
:param encoding_type: How to handle encoding errors:
243
168
# XXX: is the caller supposed to close the resulting object?
244
169
if encoding is None:
245
from bzrlib import config
246
encoding = config.GlobalConfig().get_user_option(
249
encoding = osutils.get_terminal_encoding(trace=True)
170
encoding = osutils.get_terminal_encoding()
250
171
if encoding_type is None:
251
172
encoding_type = 'replace'
252
173
out_stream = self._make_output_stream_explicit(encoding, encoding_type)
431
352
"without an upgrade path.\n" % (inter.target._format,))
434
class NoninteractiveUIFactory(UIFactory):
435
"""Base class for UIs with no user."""
437
def confirm_action(self, prompt, confirmation_id, prompt_kwargs):
441
return '%s()' % (self.__class__.__name__, )
444
class SilentUIFactory(NoninteractiveUIFactory):
356
class SilentUIFactory(UIFactory):
445
357
"""A UI Factory which never prints anything.
447
359
This is the default UI, if another one is never registered by a program
482
394
def __repr__(self):
483
395
return "%s(%r)" % (self.__class__.__name__, self.responses)
485
def confirm_action(self, prompt, confirmation_id, args):
486
return self.get_boolean(prompt % args)
488
397
def get_boolean(self, prompt):
489
398
return self.responses.pop(0)