interactive_prompt.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from framework.manager import Manager
  2. from state.devstate import DevState
  3. from PyInquirer import prompt, Separator
  4. from pprint import pprint
  5. import prompt_questions as questions
  6. from inspect import signature
  7. from uuid import UUID
  8. from ast import literal_eval
  9. def generate_context_question(ctx_type, services):
  10. choices = [
  11. s.__name__.replace('_', ' ') for s in services
  12. ]
  13. choices = sorted(choices)
  14. choices.append(Separator())
  15. choices.append("close context")
  16. ctx_question = [
  17. {
  18. 'type': 'list',
  19. 'name': 'op',
  20. 'message': f'Currently in context {ctx_type.__name__}, which operation would you like to perform?',
  21. 'choices': choices,
  22. 'filter': lambda x: x.replace(' ', '_')
  23. }
  24. ]
  25. return ctx_question
  26. def main():
  27. state = DevState()
  28. man = Manager(state)
  29. while True:
  30. if man.current_model is not None and man.current_context is None:
  31. answer = prompt(questions.MODEL_SELECTED)
  32. ctx = man
  33. elif man.current_model is not None and man.current_context is not None:
  34. qs = generate_context_question(type(man.current_context), man.get_services())
  35. answer = prompt(qs)
  36. if answer['op'] == 'close_context':
  37. man.close_context()
  38. continue
  39. else:
  40. ctx = man.current_context
  41. else:
  42. answer = prompt(questions.MODEL_MGMT)
  43. ctx = man
  44. if answer['op'] == 'exit':
  45. break
  46. else:
  47. method = getattr(ctx, answer['op'])
  48. args_questions = []
  49. types = {}
  50. for p in signature(method).parameters.values():
  51. types[p.name] = p.annotation if p.annotation else literal_eval # can't use filter in question dict, doesn't work for some reason...
  52. if p.annotation == UUID:
  53. args_questions.append({
  54. 'type': 'list',
  55. 'name': p.name,
  56. 'message': f'{p.name.replace("_", " ")}?',
  57. 'choices': list(man.get_models()),
  58. 'filter': lambda x: state.read_value(state.read_dict(state.read_root(), x))
  59. })
  60. else:
  61. args_questions.append({
  62. 'type': 'input',
  63. 'name': p.name,
  64. 'message': f'{p.name.replace("_", " ")}?',
  65. 'filter': lambda x: '' if x.lower() == 'false' else x
  66. })
  67. args = prompt(args_questions)
  68. args = {k: types[k](v) if len(v) > 0 else None for k, v in args.items()}
  69. try:
  70. output = method(**args)
  71. if output is not None:
  72. try:
  73. if isinstance(output, str):
  74. raise TypeError
  75. output = list(output)
  76. if len(output) > 0:
  77. for o in sorted(output):
  78. print(f"\u2022 {o}")
  79. except TypeError:
  80. print(f"\u2022 {output}")
  81. except RuntimeError as e:
  82. print(e)
  83. if __name__ == '__main__':
  84. print("""Welcome to...
  85. __ ____ _____
  86. | \/ \ \ / /__ \
  87. | \ / |\ \ / / ) |
  88. | |\/| | \ \/ / / /
  89. | | | | \ / / /_
  90. |_| |_| \/ |____|
  91. """)
  92. main()