From 2e3576a1a87993c5915e945f3bbb22ef3a2ae12b Mon Sep 17 00:00:00 2001 From: Andrei Bondarenko Date: Mon, 19 Jul 2021 09:08:10 +0200 Subject: [PATCH] SCDContext should be done --- bootstrap/simple_class_diagrams.py | 102 +++++++++++++++----------- core/context/generic.py | 5 +- core/context/simple_class_diagrams.py | 97 +++++++++++++++++++++++- main.py | 3 + 4 files changed, 157 insertions(+), 50 deletions(-) diff --git a/bootstrap/simple_class_diagrams.py b/bootstrap/simple_class_diagrams.py index bfe9289..a2278cd 100644 --- a/bootstrap/simple_class_diagrams.py +++ b/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) diff --git a/core/context/generic.py b/core/context/generic.py index bc97ce2..717c8f9 100644 --- a/core/context/generic.py +++ b/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): diff --git a/core/context/simple_class_diagrams.py b/core/context/simple_class_diagrams.py index 97c826d..753c97e 100644 --- a/core/context/simple_class_diagrams.py +++ b/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) diff --git a/main.py b/main.py index 918f51d..32cce95 100644 --- a/main.py +++ b/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: