|
|
- # coding: utf-8
- #
- # Copyright © 2010—2014 Andrey Mikhaylenko and contributors
- #
- # This file is part of Argh.
- #
- # Argh is free software under terms of the GNU Lesser
- # General Public License version 3 (LGPLv3) as published by the Free
- # Software Foundation. See the file README.rst for copying conditions.
- #
- """
- Interaction
- ~~~~~~~~~~~
- """
- from argh.compat import text_type
- from argh.io import safe_input
-
-
- __all__ = ['confirm', 'safe_input']
-
-
- def confirm(action, default=None, skip=False):
- """
- A shortcut for typical confirmation prompt.
-
- :param action:
-
- a string describing the action, e.g. "Apply changes". A question mark
- will be appended.
-
- :param default:
-
- `bool` or `None`. Determines what happens when user hits :kbd:`Enter`
- without typing in a choice. If `True`, default choice is "yes". If
- `False`, it is "no". If `None` the prompt keeps reappearing until user
- types in a choice (not necessarily acceptable) or until the number of
- iteration reaches the limit. Default is `None`.
-
- :param skip:
-
- `bool`; if `True`, no interactive prompt is used and default choice is
- returned (useful for batch mode). Default is `False`.
-
- Usage::
-
- def delete(key, silent=False):
- item = db.get(Item, args.key)
- if confirm('Delete '+item.title, default=True, skip=silent):
- item.delete()
- print('Item deleted.')
- else:
- print('Operation cancelled.')
-
- Returns `None` on `KeyboardInterrupt` event.
- """
- MAX_ITERATIONS = 3
- if skip:
- return default
- else:
- defaults = {
- None: ('y','n'),
- True: ('Y','n'),
- False: ('y','N'),
- }
- y, n = defaults[default]
- prompt = text_type('{action}? ({y}/{n})').format(**locals())
- choice = None
- try:
- if default is None:
- cnt = 1
- while not choice and cnt < MAX_ITERATIONS:
- choice = safe_input(prompt)
- cnt += 1
- else:
- choice = safe_input(prompt)
- except KeyboardInterrupt:
- return None
- if choice in ('yes', 'y', 'Y'):
- return True
- if choice in ('no', 'n', 'N'):
- return False
- if default is not None:
- return default
- return None
|