bottom.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from state.base import INTEGER, FLOAT, BOOLEAN, STRING, TYPE, State
  2. from core.element import Element, String
  3. class BottomContext:
  4. def __init__(self, state: State, model: Element):
  5. self.state = state
  6. self.model = model
  7. def __enter__(self):
  8. return self
  9. def __exit__(self):
  10. pass
  11. def add_node(self, name: String):
  12. model_root = self.state.read_dict(self.model.id, "Model")
  13. # create model element
  14. element = self.state.create_node()
  15. # connect to model root
  16. self.state.create_dict(model_root, name.value, element)
  17. # confirm that element has been added to the model
  18. element_found = self.state.read_dict(model_root, name.value)
  19. if element_found is None:
  20. self.state.delete_node(element)
  21. print(f"Warning: Invalid name {name.value}, element not created.")
  22. return
  23. def add_value(self, name: String, value: Element):
  24. model_root = self.state.read_dict(self.model.id, "Model")
  25. # create model element
  26. element = self.state.create_nodevalue(value.value)
  27. if element is None:
  28. print("Warning: Invalid value, value node not created.")
  29. return
  30. # connect to model root
  31. self.state.create_dict(model_root, name.value, element)
  32. # confirm that element has been added to the model
  33. element_found = self.state.read_dict(model_root, name.value)
  34. if element_found is None:
  35. self.state.delete_node(element)
  36. print(f"Warning: Invalid name {name.value}, element not created.")
  37. return
  38. def add_edge(self, name: String, source: String, target: String):
  39. model_root = self.state.read_dict(self.model.id, "Model")
  40. source_element = self.state.read_dict(model_root, source.value)
  41. if source_element is None:
  42. print(f"Warning: Unknown source element {source.value}, edge not created.")
  43. return
  44. target_element = self.state.read_dict(model_root, target.value)
  45. if target_element is None:
  46. print(f"Warning: Unknown target element {target.value}, edge not created.")
  47. return
  48. # create model element
  49. element = self.state.create_edge(source_element, target_element)
  50. # connect to model root
  51. self.state.create_dict(model_root, name.value, element)
  52. # confirm that element has been added to the model
  53. element_found = self.state.read_dict(model_root, name.value)
  54. if element_found is None:
  55. self.state.delete_edge(element)
  56. print(f"Warning: Invalid name {name.value}, element not created.")
  57. def delete_element(self, name: String):
  58. model_root = self.state.read_dict(self.model.id, "Model")
  59. element = self.state.read_dict(model_root, name.value)
  60. # could be both a node or an edge
  61. self.state.delete_node(element)
  62. self.state.delete_edge(element)
  63. def list_elements(self):
  64. def is_edge(element: str) -> bool:
  65. edge = self.state.read_edge(element)
  66. return edge is not None
  67. def value_type(value) -> str:
  68. mapping = {
  69. int: INTEGER,
  70. float: FLOAT,
  71. str: STRING,
  72. bool: BOOLEAN,
  73. tuple: TYPE
  74. }
  75. return mapping[type(value)][0]
  76. unsorted = []
  77. model_root = self.state.read_dict(self.model.id, "Model")
  78. for elem_edge in self.state.read_outgoing(model_root):
  79. # get element name
  80. label_edge, = self.state.read_outgoing(elem_edge)
  81. _, label_node = self.state.read_edge(label_edge)
  82. label = self.state.read_value(label_node)
  83. # find element bottom type
  84. _, elem = self.state.read_edge(elem_edge)
  85. if is_edge(elem):
  86. bottom_type = "Edge"
  87. else:
  88. # is_node
  89. elem_value = self.state.read_value(elem)
  90. if elem_value is None:
  91. bottom_type = "Node"
  92. else:
  93. bottom_type = value_type
  94. unsorted.append(f"{label} : {bottom_type}")
  95. for i in sorted(unsorted):
  96. print(i)