Explorar o código

SCDContext should be done

Andrei Bondarenko %!s(int64=4) %!d(string=hai) anos
pai
achega
2e3576a1a8
Modificáronse 4 ficheiros con 157 adicións e 50 borrados
  1. 58 44
      bootstrap/simple_class_diagrams.py
  2. 3 2
      core/context/generic.py
  3. 93 4
      core/context/simple_class_diagrams.py
  4. 3 0
      main.py

+ 58 - 44
bootstrap/simple_class_diagrams.py

@@ -68,18 +68,18 @@ def bootstrap_scd(state: State) -> Element:
                         Element(value="Element"))
 
     # AttributeLinks --> elements that will be typed by AttributeLink
-    ctx.bottom.add_edge(Element(value="Class_attr01"), Element(value="Class"),
+    ctx.bottom.add_edge(Element(value="Class_lower_cardinality_link"), Element(value="Class"),
                         Element(value="Class_lower_cardinality"))
-    ctx.bottom.add_edge(Element(value="Class_attr02"), Element(value="Class"),
+    ctx.bottom.add_edge(Element(value="Class_upper_cardinality_link"), Element(value="Class"),
                         Element(value="Class_upper_cardinality"))
 
-    ctx.bottom.add_edge(Element(value="Association_attr01"), Element(value="Association"),
+    ctx.bottom.add_edge(Element(value="Association_source_lower_cardinality_link"), Element(value="Association"),
                         Element(value="Association_source_lower_cardinality"))
-    ctx.bottom.add_edge(Element(value="Association_attr02"), Element(value="Association"),
+    ctx.bottom.add_edge(Element(value="Association_source_upper_cardinality_link"), Element(value="Association"),
                         Element(value="Association_source_upper_cardinality"))
-    ctx.bottom.add_edge(Element(value="Association_attr03"), Element(value="Association"),
+    ctx.bottom.add_edge(Element(value="Association_target_lower_cardinality_link"), Element(value="Association"),
                         Element(value="Association_target_lower_cardinality"))
-    ctx.bottom.add_edge(Element(value="Association_attr04"), Element(value="Association"),
+    ctx.bottom.add_edge(Element(value="Association_target_upper_cardinality_link"), Element(value="Association"),
                         Element(value="Association_target_upper_cardinality"))
 
     ctx.bottom.add_edge(Element(value="Attribute_name_link"), Element(value="Attribute"),
@@ -88,43 +88,49 @@ def bootstrap_scd(state: State) -> Element:
                         Element(value="Attribute_optional"))
 
     # AttributeLink instances --> elements that will be typed by one of the AttributeLink defined above
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_01"), Element(value="Attribute_name"),
+    ctx.bottom.add_edge(Element(value="Attribute_name.name_link"), Element(value="Attribute_name"),
                         Element(value="Attribute_name.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_01"), Element(value="Attribute_name"),
+    ctx.bottom.add_edge(Element(value="Attribute_name.optional_link"), Element(value="Attribute_name"),
                         Element(value="Attribute_name.optional"))
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_02"), Element(value="Attribute_optional"),
+    ctx.bottom.add_edge(Element(value="Attribute_optional.name_link"), Element(value="Attribute_optional"),
                         Element(value="Attribute_optional.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_02"), Element(value="Attribute_optional"),
+    ctx.bottom.add_edge(Element(value="Attribute_optional.optional_link"), Element(value="Attribute_optional"),
                         Element(value="Attribute_optional.optional"))
 
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_03"), Element(value="Class_lower_cardinality"),
+    ctx.bottom.add_edge(Element(value="Class_lower_cardinality.name_link"), Element(value="Class_lower_cardinality"),
                         Element(value="Class_lower_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_03"), Element(value="Class_lower_cardinality"),
+    ctx.bottom.add_edge(Element(value="Class_lower_cardinality.optional_link"),
+                        Element(value="Class_lower_cardinality"),
                         Element(value="Class_lower_cardinality.optional"))
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_04"), Element(value="Class_upper_cardinality"),
+    ctx.bottom.add_edge(Element(value="Class_upper_cardinality.name_link"), Element(value="Class_upper_cardinality"),
                         Element(value="Class_upper_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_04"), Element(value="Class_upper_cardinality"),
+    ctx.bottom.add_edge(Element(value="Class_upper_cardinality.optional_link"),
+                        Element(value="Class_upper_cardinality"),
                         Element(value="Class_upper_cardinality.optional"))
 
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_05"), Element(value="Association_source_lower_cardinality"),
+    ctx.bottom.add_edge(Element(value="Association_source_lower_cardinality.name_link"),
+                        Element(value="Association_source_lower_cardinality"),
                         Element(value="Association_source_lower_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_05"),
+    ctx.bottom.add_edge(Element(value="Association_source_lower_cardinality.optional_link"),
                         Element(value="Association_source_lower_cardinality"),
                         Element(value="Association_source_lower_cardinality.optional"))
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_06"), Element(value="Association_source_upper_cardinality"),
+    ctx.bottom.add_edge(Element(value="Association_source_upper_cardinality.name_link"),
+                        Element(value="Association_source_upper_cardinality"),
                         Element(value="Association_source_upper_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_06"),
+    ctx.bottom.add_edge(Element(value="Association_source_upper_cardinality.optional_link"),
                         Element(value="Association_source_upper_cardinality"),
                         Element(value="Association_source_upper_cardinality.optional"))
 
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_07"), Element(value="Association_target_lower_cardinality"),
+    ctx.bottom.add_edge(Element(value="Association_target_lower_cardinality.name_link"),
+                        Element(value="Association_target_lower_cardinality"),
                         Element(value="Association_target_lower_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_07"),
+    ctx.bottom.add_edge(Element(value="Association_target_lower_cardinality.optional_link"),
                         Element(value="Association_target_lower_cardinality"),
                         Element(value="Association_target_lower_cardinality.optional"))
-    ctx.bottom.add_edge(Element(value="Attribute_name_link_08"), Element(value="Association_target_upper_cardinality"),
+    ctx.bottom.add_edge(Element(value="Association_target_upper_cardinality.name_link"),
+                        Element(value="Association_target_upper_cardinality"),
                         Element(value="Association_target_upper_cardinality.name"))
-    ctx.bottom.add_edge(Element(value="Attribute_optional_link_08"),
+    ctx.bottom.add_edge(Element(value="Association_target_upper_cardinality.optional_link"),
                         Element(value="Association_target_upper_cardinality"),
                         Element(value="Association_target_upper_cardinality.optional"))
 
@@ -149,12 +155,12 @@ def bootstrap_scd(state: State) -> Element:
     ctx.retype_element(Element(value="Attribute_name"), Element(value="Attribute"))
     ctx.retype_element(Element(value="Attribute_optional"), Element(value="Attribute"))
 
-    ctx.retype_element(Element(value="Class_attr01"), Element(value="AttributeLink"))
-    ctx.retype_element(Element(value="Class_attr02"), Element(value="AttributeLink"))
-    ctx.retype_element(Element(value="Association_attr01"), Element(value="AttributeLink"))
-    ctx.retype_element(Element(value="Association_attr02"), Element(value="AttributeLink"))
-    ctx.retype_element(Element(value="Association_attr03"), Element(value="AttributeLink"))
-    ctx.retype_element(Element(value="Association_attr04"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Class_lower_cardinality_link"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Class_upper_cardinality_link"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Association_source_lower_cardinality_link"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Association_source_upper_cardinality_link"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Association_target_lower_cardinality_link"), Element(value="AttributeLink"))
+    ctx.retype_element(Element(value="Association_target_upper_cardinality_link"), Element(value="AttributeLink"))
     ctx.retype_element(Element(value="Attribute_name_link"), Element(value="AttributeLink"))
     ctx.retype_element(Element(value="Attribute_optional_link"), Element(value="AttributeLink"))
 
@@ -184,21 +190,29 @@ def bootstrap_scd(state: State) -> Element:
     ctx.retype_element(Element(value="Association_target_upper_cardinality.optional"),
                        Element(value="Attribute_optional"))
 
-    ctx.retype_element(Element(value="Attribute_name_link_01"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_01"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_02"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_02"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_03"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_03"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_04"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_04"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_05"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_05"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_06"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_06"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_07"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_07"), Element(value="Attribute_optional_link"))
-    ctx.retype_element(Element(value="Attribute_name_link_08"), Element(value="Attribute_name_link"))
-    ctx.retype_element(Element(value="Attribute_optional_link_08"), Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Attribute_name.name_link"), Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Attribute_name.optional_link"), Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Attribute_optional.name_link"), Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Attribute_optional.optional_link"), Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Class_lower_cardinality.name_link"), Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Class_lower_cardinality.optional_link"), Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Class_upper_cardinality.name_link"), Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Class_upper_cardinality.optional_link"), Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Association_source_lower_cardinality.name_link"),
+                       Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Association_source_lower_cardinality.optional_link"),
+                       Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Association_source_upper_cardinality.name_link"),
+                       Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Association_source_upper_cardinality.optional_link"),
+                       Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Association_target_lower_cardinality.name_link"),
+                       Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Association_target_lower_cardinality.optional_link"),
+                       Element(value="Attribute_optional_link"))
+    ctx.retype_element(Element(value="Association_target_upper_cardinality.name_link"),
+                       Element(value="Attribute_name_link"))
+    ctx.retype_element(Element(value="Association_target_upper_cardinality.optional_link"),
+                       Element(value="Attribute_optional_link"))
 
     return Element(id=scd)

+ 3 - 2
core/context/generic.py

@@ -22,8 +22,9 @@ class GenericContext(Context):
             self.instantiate_value,
             self.instantiate_link,
             self.retype_element,
-            self.list_elements,
             self.delete_element,
+            self.list_elements,
+            self.list_types,
             self.verify,
         ]
 
@@ -47,7 +48,7 @@ class GenericContext(Context):
         if not self._type_exists(type_name, instantiate_link=False):
             print(f"Attempting to instantiate element with invalid type: {type_name.value}")
         else:
-            self.bottom.add_value(name, value.value)
+            self.bottom.add_value(name, value)
             self.retype_element(name, type_name)
 
     def instantiate_link(self, type_name: String, name: String, source: String, target: String):

+ 93 - 4
core/context/simple_class_diagrams.py

@@ -17,16 +17,105 @@ class SCDContext(GenericContext):
         ]
 
     def create_class(self, name: String, lower_cardinality: Integer = Element(), upper_cardinality: Integer = Element()):
-        pass
+        self.instantiate(Element(value="Class"), name)
+        if lower_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Class_lower_cardinality"),
+                Element(value=name.value + ".lower_cardinality"),
+                lower_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Class_lower_cardinality_link"),
+                Element(value=name.value + ".lower_cardinality_link"),
+                name,
+                Element(value=name.value + ".lower_cardinality")
+            )
+        if upper_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Class_upper_cardinality"),
+                Element(value=name.value + ".upper_cardinality"),
+                upper_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Class_upper_cardinality_link"),
+                Element(value=name.value + ".upper_cardinality_link"),
+                name,
+                Element(value=name.value + ".upper_cardinality")
+            )
 
     def create_class_attribute(self, class_name: String, name: String, optional: Boolean = Element(value=False)):
-        pass
+        # create attribute
+        element_name = Element(value=f"{class_name.value}_{name.value}")
+        element_link_name = Element(value=f"{class_name.value}_{name.value}_link")
+        self.instantiate(Element(value="Attribute"), element_name)
+        self.instantiate_link(Element(value="AttributeLink"), element_link_name, class_name, element_name)
+        # set attribute's attributes
+        attr_name_name = Element(value=f"{class_name.value}_{name.value}.name")
+        attr_optional_name = Element(value=f"{class_name.value}_{name.value}.optional")
+        attr_name_link_name = Element(value=f"{class_name.value}_{name.value}.name_link")
+        attr_optional_link_name = Element(value=f"{class_name.value}_{name.value}.optional_link")
+        self.instantiate_value(Element(value="Attribute_name"), attr_name_name, name)
+        self.instantiate_value(Element(value="Attribute_optional"), attr_optional_name, optional)
+        self.instantiate_link(Element(value="Attribute_name_link"), attr_name_link_name, element_name, attr_name_name)
+        self.instantiate_link(Element(value="Attribute_optional_link"), attr_optional_link_name, element_name, attr_optional_name)
 
     def create_association(self, source_class_name: String, target_class_name: String, name: String,
                            source_lower_cardinality: Integer = Element(), target_lower_cardinality: Integer = Element(),
                            source_upper_cardinality: Integer = Element(), target_upper_cardinality: Integer = Element()
                            ):
-        pass
+        self.instantiate_link(Element(value="Association"), name, source_class_name, target_class_name)
+        if source_lower_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Association_source_lower_cardinality"),
+                Element(value=name.value + ".source_lower_cardinality"),
+                source_lower_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Association_source_lower_cardinality_link"),
+                Element(value=name.value + ".source_lower_cardinality_link"),
+                name,
+                Element(value=name.value + ".source_lower_cardinality")
+            )
+        if source_upper_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Association_source_upper_cardinality"),
+                Element(value=name.value + ".source_upper_cardinality"),
+                source_upper_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Association_source_upper_cardinality_link"),
+                Element(value=name.value + ".source_upper_cardinality_link"),
+                name,
+                Element(value=name.value + ".source_upper_cardinality")
+            )
+        if target_lower_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Association_target_lower_cardinality"),
+                Element(value=name.value + ".target_lower_cardinality"),
+                target_lower_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Association_target_lower_cardinality_link"),
+                Element(value=name.value + ".target_lower_cardinality_link"),
+                name,
+                Element(value=name.value + ".target_lower_cardinality")
+            )
+        if target_upper_cardinality.value is not None:
+            self.instantiate_value(
+                Element(value="Association_target_upper_cardinality"),
+                Element(value=name.value + ".target_upper_cardinality"),
+                target_upper_cardinality
+            )
+            self.instantiate_link(
+                Element(value="Association_target_upper_cardinality_link"),
+                Element(value=name.value + ".target_upper_cardinality_link"),
+                name,
+                Element(value=name.value + ".target_upper_cardinality")
+            )
 
     def create_inheritance(self, parent_class_name: String, child_class_name: String):
-        pass
+        self.instantiate_link(
+            Element(value="Inheritance"),
+            Element(value=f"{child_class_name.value}_inherits_from_{parent_class_name.value}"),
+            child_class_name,
+            parent_class_name)

+ 3 - 0
main.py

@@ -37,6 +37,9 @@ def input_args(method):
             arg = input(f"{param_type} {param_name} (default = {param_default.value})? ")
             if arg == '':
                 arg = param_default.value
+                arg = Element(value=arg)
+                args.append(arg)
+                continue
         else:
             param_name, param_type = param_tuple
             while True: