aboutsummaryrefslogtreecommitdiff
path: root/lib/python/qmk/questions.py
diff options
context:
space:
mode:
authorJames Young <18669334+noroadsleft@users.noreply.github.com>2020-11-28 12:02:18 -0800
committerGitHub <noreply@github.com>2020-11-28 12:02:18 -0800
commitc66df1664497546f32662409778731143e45a552 (patch)
treeda73a2d532a27685a31d932b3a44a707d4a3af81 /lib/python/qmk/questions.py
parent15385d4113414d42bd062c60c9de5df797d3157f (diff)
downloadqmk_firmware-c66df1664497546f32662409778731143e45a552.tar.gz
qmk_firmware-c66df1664497546f32662409778731143e45a552.zip
2020 November 28 Breaking Changes Update (#11053)
* Branch point for 2020 November 28 Breaking Change * Remove matrix_col_t to allow MATRIX_ROWS > 32 (#10183) * Add support for soft serial to ATmega32U2 (#10204) * Change MIDI velocity implementation to allow direct control of velocity value (#9940) * Add ability to build a subset of all keyboards based on platform. * Actually use eeprom_driver_init(). * Make bootloader_jump weak for ChibiOS. (#10417) * Joystick 16-bit support (#10439) * Per-encoder resolutions (#10259) * Share button state from mousekey to pointing_device (#10179) * Add hotfix for chibios keyboards not wake (#10088) * Add advanced/efficient RGB Matrix Indicators (#8564) * Naming change. * Support for STM32 GPIOF,G,H,I,J,K (#10206) * Add milc as a dependency and remove the installed milc (#10563) * ChibiOS upgrade: early init conversions (#10214) * ChibiOS upgrade: configuration file migrator (#9952) * Haptic and solenoid cleanup (#9700) * XD75 cleanup (#10524) * OLED display update interval support (#10388) * Add definition based on currently-selected serial driver. (#10716) * New feature: Retro Tapping per key (#10622) * Allow for modification of output RGB values when using rgblight/rgb_matrix. (#10638) * Add housekeeping task callbacks so that keyboards/keymaps are capable of executing code for each main loop iteration. (#10530) * Rescale both ChibiOS and AVR backlighting. * Reduce Helix keyboard build variation (#8669) * Minor change to behavior allowing display updates to continue between task ticks (#10750) * Some GPIO manipulations in matrix.c change to atomic. (#10491) * qmk cformat (#10767) * [Keyboard] Update the Speedo firmware for v3.0 (#10657) * Maartenwut/Maarten namechange to evyd13/Evy (#10274) * [quantum] combine repeated lines of code (#10837) * Add step sequencer feature (#9703) * aeboards/ext65 refactor (#10820) * Refactor xelus/dawn60 for Rev2 later (#10584) * add DEBUG_MATRIX_SCAN_RATE_ENABLE to common_features.mk (#10824) * [Core] Added `add_oneshot_mods` & `del_oneshot_mods` (#10549) * update chibios os usb for the otg driver (#8893) * Remove HD44780 References, Part 4 (#10735) * [Keyboard] Add Valor FRL TKL (+refactor) (#10512) * Fix cursor position bug in oled_write_raw functions (#10800) * Fixup version.h writing when using SKIP_VERSION=yes (#10972) * Allow for certain code in the codebase assuming length of string. (#10974) * Add AT90USB support for serial.c (#10706) * Auto shift: support repeats and early registration (#9826) * Rename ledmatrix.h to match .c file (#7949) * Split RGB_MATRIX_ENABLE into _ENABLE and _DRIVER (#10231) * Split LED_MATRIX_ENABLE into _ENABLE and _DRIVER (#10840) * Merge point for 2020 Nov 28 Breaking Change
Diffstat (limited to 'lib/python/qmk/questions.py')
-rw-r--r--lib/python/qmk/questions.py183
1 files changed, 0 insertions, 183 deletions
diff --git a/lib/python/qmk/questions.py b/lib/python/qmk/questions.py
deleted file mode 100644
index 865c6bbdc..000000000
--- a/lib/python/qmk/questions.py
+++ /dev/null
@@ -1,183 +0,0 @@
1"""Functions to collect user input.
2"""
3
4from milc import cli
5
6try:
7 from milc import format_ansi
8except ImportError:
9 from milc.ansi import format_ansi
10
11
12def yesno(prompt, *args, default=None, **kwargs):
13 """Displays prompt to the user and gets a yes or no response.
14
15 Returns True for a yes and False for a no.
16
17 If you add `--yes` and `--no` arguments to your program the user can answer questions by passing command line flags.
18
19 @add_argument('-y', '--yes', action='store_true', arg_only=True, help='Answer yes to all questions.')
20 @add_argument('-n', '--no', action='store_true', arg_only=True, help='Answer no to all questions.')
21
22 Arguments:
23 prompt
24 The prompt to present to the user. Can include ANSI and format strings like milc's `cli.echo()`.
25
26 default
27 Whether to default to a Yes or No when the user presses enter.
28
29 None- force the user to enter Y or N
30
31 True- Default to yes
32
33 False- Default to no
34 """
35 if not args and kwargs:
36 args = kwargs
37
38 if 'no' in cli.args and cli.args.no:
39 return False
40
41 if 'yes' in cli.args and cli.args.yes:
42 return True
43
44 if default is not None:
45 if default:
46 prompt = prompt + ' [Y/n] '
47 else:
48 prompt = prompt + ' [y/N] '
49
50 while True:
51 cli.echo('')
52 answer = input(format_ansi(prompt % args))
53 cli.echo('')
54
55 if not answer and prompt is not None:
56 return default
57
58 elif answer.lower() in ['y', 'yes']:
59 return True
60
61 elif answer.lower() in ['n', 'no']:
62 return False
63
64
65def question(prompt, *args, default=None, confirm=False, answer_type=str, validate=None, **kwargs):
66 """Prompt the user to answer a question with a free-form input.
67
68 Arguments:
69 prompt
70 The prompt to present to the user. Can include ANSI and format strings like milc's `cli.echo()`.
71
72 default
73 The value to return when the user doesn't enter any value. Use None to prompt until they enter a value.
74
75 confirm
76 Present the user with a confirmation dialog before accepting their answer.
77
78 answer_type
79 Specify a type function for the answer. Will re-prompt the user if the function raises any errors. Common choices here include int, float, and decimal.Decimal.
80
81 validate
82 This is an optional function that can be used to validate the answer. It should return True or False and have the following signature:
83
84 def function_name(answer, *args, **kwargs):
85 """
86 if not args and kwargs:
87 args = kwargs
88
89 if default is not None:
90 prompt = '%s [%s] ' % (prompt, default)
91
92 while True:
93 cli.echo('')
94 answer = input(format_ansi(prompt % args))
95 cli.echo('')
96
97 if answer:
98 if validate is not None and not validate(answer, *args, **kwargs):
99 continue
100
101 elif confirm:
102 if yesno('Is the answer "%s" correct?', answer, default=True):
103 try:
104 return answer_type(answer)
105 except Exception as e:
106 cli.log.error('Could not convert answer (%s) to type %s: %s', answer, answer_type.__name__, str(e))
107
108 else:
109 try:
110 return answer_type(answer)
111 except Exception as e:
112 cli.log.error('Could not convert answer (%s) to type %s: %s', answer, answer_type.__name__, str(e))
113
114 elif default is not None:
115 return default
116
117
118def choice(heading, options, *args, default=None, confirm=False, prompt='Please enter your choice: ', **kwargs):
119 """Present the user with a list of options and let them pick one.
120
121 Users can enter either the number or the text of their choice.
122
123 This will return the value of the item they choose, not the numerical index.
124
125 Arguments:
126 heading
127 The text to place above the list of options.
128
129 options
130 A sequence of items to choose from.
131
132 default
133 The index of the item to return when the user doesn't enter any value. Use None to prompt until they enter a value.
134
135 confirm
136 Present the user with a confirmation dialog before accepting their answer.
137
138 prompt
139 The prompt to present to the user. Can include ANSI and format strings like milc's `cli.echo()`.
140 """
141 if not args and kwargs:
142 args = kwargs
143
144 if prompt and default:
145 prompt = prompt + ' [%s] ' % (default + 1,)
146
147 while True:
148 # Prompt for an answer.
149 cli.echo('')
150 cli.echo(heading % args)
151 cli.echo('')
152 for i, option in enumerate(options, 1):
153 cli.echo('\t{fg_cyan}%d.{fg_reset} %s', i, option)
154
155 cli.echo('')
156 answer = input(format_ansi(prompt))
157 cli.echo('')
158
159 # If the user types in one of the options exactly use that
160 if answer in options:
161 return answer
162
163 # Massage the answer into a valid integer
164 if answer == '' and default:
165 answer = default
166 else:
167 try:
168 answer = int(answer) - 1
169 except Exception:
170 # Normally we would log the exception here, but in the interest of clean UI we do not.
171 cli.log.error('Invalid choice: %s', answer + 1)
172 continue
173
174 # Validate the answer
175 if answer >= len(options) or answer < 0:
176 cli.log.error('Invalid choice: %s', answer + 1)
177 continue
178
179 if confirm and not yesno('Is the answer "%s" correct?', answer + 1, default=True):
180 continue
181
182 # Return the answer they chose.
183 return options[answer]