def get_input_single(param_desc): in_class = param_desc['class'] typespec = param_desc.get('type', None) print('\nInput: ' + fill(UNDERLINE() + param_desc.get('label', param_desc['name']) + ENDC() + ' (' + param_desc['name'] + ')')) print('Class: ' + param_desc['class']) if 'type' in param_desc: print('Type(s): ' + parse_typespec(param_desc['type'])) if 'suggestions' in param_desc: print( format_choices_or_suggestions('Suggestions:', param_desc['suggestions'], param_desc['class'], initial_indent='', subsequent_indent=' ')) if 'choices' in param_desc: print( format_choices_or_suggestions('Choices:', param_desc['choices'], param_desc['class'], initial_indent='', subsequent_indent=' ')) print() prompt = "Enter {_class} {value} ({hint}'" + WHITE() + BOLD() + '?' + ENDC( ) + "' for more options)" hint = '' if in_class in dx_data_classes: hint = '<TAB> twice for compatible ' + in_class + 's in current directory, ' elif 'suggestions' in param_desc: hint = '<TAB> twice for suggestions, ' elif 'choices' in param_desc: hint = '<TAB> twice for choices, ' prompt = prompt.format( _class=in_class, value='ID or path' if in_class in dx_data_classes else 'value', hint=hint) print(fill(prompt)) try: import readline if in_class in dx_data_classes: from dxpy.utils.completer import DXPathCompleter readline.set_completer( DXPathCompleter(classes=[in_class], typespec=typespec).complete) elif in_class == 'boolean': from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter(completions=['true', 'false']).complete) elif 'suggestions' in param_desc: from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter( completions=map(str, param_desc['suggestions'])).complete) elif 'choices' in param_desc: from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter( completions=map(str, param_desc['choices'])).complete) else: from dxpy.utils.completer import NoneCompleter readline.set_completer(NoneCompleter().complete) except: pass try: while True: prompt = param_desc['name'] + ': ' user_input = input(prompt) if in_class == 'string': if user_input == '': user_input = [] else: user_input = [user_input] else: user_input = shlex.split(user_input) while user_input == ["?"]: user_input = interactive_help(in_class, param_desc, prompt) if len(user_input) > 1: print( fill( 'Error: more than one argument given. Please quote your entire input or escape your whitespace with a backslash \'\\\'.' )) continue elif len(user_input) == 0: user_input = [''] try: value = parse_input_or_jbor(in_class, user_input[0]) except ValueError as details: print( fill('Error occurred when parsing for class ' + in_class + ': ' + str(details))) continue except TypeError as details: print( fill('Error occurred when parsing for class ' + in_class + ': ' + str(details))) continue if 'choices' in param_desc and value not in param_desc['choices']: print( fill(RED() + BOLD() + 'Warning:' + ENDC() + ' value "' + str(value) + '" for input ' + WHITE() + BOLD() + param_desc['name'] + ENDC() + ' is not in the list of choices for that input')) return value except EOFError: raise DXCLIError('Unexpected end of input')
def get_input_array(param_desc): in_class = param_desc['class'] if in_class.startswith("array:"): in_class = in_class[6:] typespec = param_desc.get('type', None) input_array = [] print('\nInput: ' + fill(UNDERLINE() + param_desc.get('label', param_desc['name']) + ENDC() + ' (' + param_desc['name'] + ')')) print('Class: ' + param_desc['class']) if 'type' in param_desc: print('Type(s): ' + parse_typespec(param_desc['type'])) print() prompt = "Enter {_class} values, one at a time (^D or <ENTER> to finish, {hint}'" + WHITE( ) + BOLD() + '?' + ENDC() + "' for more options)" hint = '' if in_class in dx_data_classes: hint = '<TAB> twice for compatible ' + in_class + 's in current directory, ' elif 'suggestions' in param_desc: hint = '<TAB> twice for suggestions, ' elif 'choices' in param_desc: hint = '<TAB> twice for choices, ' prompt = prompt.format(_class=in_class, hint=hint) print(fill(prompt)) try: import readline if in_class in dx_data_classes: from dxpy.utils.completer import DXPathCompleter readline.set_completer( DXPathCompleter(classes=[in_class], typespec=typespec).complete) elif in_class == 'boolean': from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter(completions=['true', 'false']).complete) elif 'suggestions' in param_desc: from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter( completions=map(str, param_desc['suggestions'])).complete) elif 'choices' in param_desc: from dxpy.utils.completer import ListCompleter readline.set_completer( ListCompleter( completions=map(str, param_desc['choices'])).complete) else: from dxpy.utils.completer import NoneCompleter readline.set_completer(NoneCompleter().complete) except: pass try: while True: prompt = param_desc['name'] + '[' + str(len(input_array)) + "]: " user_input = input(prompt) if in_class == 'string': if user_input == '': user_input = [] else: user_input = [user_input] else: user_input = shlex.split(user_input) while user_input == ['?']: user_input = interactive_help(in_class, param_desc, prompt) if len(user_input) > 1: print( fill( 'Error: more than one argument given. Please quote your entire input or escape your whitespace with a backslash \'\\\'.' )) continue elif len(user_input) == 0: return input_array try: input_array.append(parse_input_or_jbor(in_class, user_input[0])) except ValueError as details: print( fill('Error occurred when parsing for class ' + in_class + ': ' + str(details))) continue except TypeError as details: print( fill('Error occurred when parsing for class ' + in_class + ': ' + str(details))) continue except EOFError: return input_array