main.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from core.element import Element
  2. from core.manager import Manager
  3. from core.context.bottom import BottomContext
  4. from core.context.generic import GenericContext
  5. from core.context import custom_contexts
  6. from state.devstate import DevState
  7. from bootstrap.simple_class_diagrams import bootstrap_scd
  8. import inspect
  9. from ast import literal_eval
  10. import sys
  11. import signal
  12. signal.signal(signal.SIGINT, signal.default_int_handler)
  13. def params(method):
  14. annotations = {
  15. "core.element.Element[str]": "String",
  16. "core.element.Element[int]": "Integer",
  17. "core.element.Element[float]": "Float",
  18. "core.element.Element[bool]": "Boolean"
  19. }
  20. sign = inspect.signature(method)
  21. for param in sign.parameters.values():
  22. param_type = annotations.get(str(param.annotation), "Element")
  23. if param.default is param.empty:
  24. yield param.name, param_type
  25. else:
  26. yield param.name, param_type, param.default
  27. def input_args(method):
  28. args = []
  29. for param_tuple in params(method):
  30. if len(param_tuple) == 3:
  31. param_name, param_type, param_default = param_tuple
  32. arg = input(f"{param_type} {param_name} (default = {param_default.value})? ")
  33. if arg == '':
  34. arg = param_default.value
  35. arg = Element(value=arg)
  36. args.append(arg)
  37. continue
  38. else:
  39. param_name, param_type = param_tuple
  40. while True:
  41. arg = input(f"{param_type} {param_name}? ")
  42. if arg == '':
  43. print("This arguments is non-optional, please provide a value.")
  44. else:
  45. break
  46. if arg is None:
  47. arg = Element()
  48. elif param_type in {"Boolean", "Integer", "Float"}:
  49. arg = Element(value=literal_eval(arg))
  50. else:
  51. arg = Element(value=arg)
  52. args.append(arg)
  53. return args
  54. def model_management_loop(manager: Manager):
  55. try:
  56. print("\nCurrently no model is loaded. Following model management operations are available:")
  57. for m in manager.exposed_methods():
  58. print(f"\t* {m.__name__}")
  59. while True:
  60. command = input("\nPlease enter a command: ")
  61. try:
  62. method = next(m for m in manager.exposed_methods() if m.__name__ == command)
  63. user_args = input_args(method)
  64. model = method(*user_args)
  65. if model is not None and not model.is_none():
  66. metamodel = Element(id=manager.state.read_dict(model.id, "Metamodel"))
  67. modelling_loop(manager, model, metamodel)
  68. break
  69. except StopIteration:
  70. print("Invalid command, please try again.")
  71. except KeyboardInterrupt:
  72. print("\nBye!")
  73. sys.exit()
  74. def modelling_loop(manager: Manager, model: Element, metamodel: Element):
  75. model_name = manager.state.read_value(model.id)
  76. metamodel_name = manager.state.read_value(metamodel.id)
  77. if metamodel.is_none():
  78. context = BottomContext(manager.state, model)
  79. print(f"No metamodel found. Model {model_name} has been loaded in context Bottom.")
  80. else:
  81. context = custom_contexts.get(metamodel_name, GenericContext)(manager.state, model, metamodel)
  82. print(type(context))
  83. print(f"Model {model_name} has been loaded in context {metamodel_name}.")
  84. print(f"To return to the model management interface press CTRL + C.")
  85. print(f"The following operations are available in this context:")
  86. for m in context.exposed_methods():
  87. print(f"\t* {m.__name__}")
  88. try:
  89. while True:
  90. command = input("\nPlease enter a command: ")
  91. try:
  92. method = next(m for m in context.exposed_methods() if m.__name__ == command)
  93. user_args = input_args(method)
  94. model = method(*user_args)
  95. if model is not None and not model.is_none():
  96. metamodel = Element(id=manager.state.read_dict(model.id, "Metamodel"))
  97. modelling_loop(manager, model, metamodel)
  98. break
  99. except StopIteration:
  100. print("Invalid command, please try again.")
  101. except KeyboardInterrupt:
  102. pass
  103. if __name__ == '__main__':
  104. state = DevState()
  105. bootstrap_scd(state)
  106. man = Manager(state)
  107. print("Welcome to MV2!")
  108. while True:
  109. model_management_loop(man)