diff --git a/framework/interactive_prompt.py b/framework/interactive_prompt.py index 81db73e..a9b5e16 100644 --- a/framework/interactive_prompt.py +++ b/framework/interactive_prompt.py @@ -5,6 +5,7 @@ from pprint import pprint import prompt_questions as questions from inspect import signature from uuid import UUID +from ast import literal_eval def generate_context_question(ctx_type, services): @@ -53,7 +54,7 @@ def main(): args_questions = [] types = {} for p in signature(method).parameters.values(): - types[p.name] = p.annotation # can't use filter in question dict, doesn't work for some reason... + types[p.name] = p.annotation if p.annotation else literal_eval # can't use filter in question dict, doesn't work for some reason... if p.annotation == UUID: args_questions.append({ 'type': 'list', diff --git a/requirements.txt b/requirements.txt index b49798e..9b9d2f6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ pytest==6.2.4 neo4j==4.3.4 rdflib==6.0.0 +PyInquirer==1.0.3 diff --git a/services/__init__.py b/services/__init__.py index e36ebb5..a82215b 100644 --- a/services/__init__.py +++ b/services/__init__.py @@ -1,9 +1,11 @@ from services.scd import SCD from services.point.cartesian import PointCartesian from services.point.polar import PointPolar +from services.bottom.V1 import Bottom implemented = { "SCD": SCD, "PointCartesian": PointCartesian, "PointPolar": PointPolar, + "Bottom": Bottom } diff --git a/services/bottom/V1.py b/services/bottom/V1.py new file mode 100644 index 0000000..0d9a774 --- /dev/null +++ b/services/bottom/V1.py @@ -0,0 +1,76 @@ +from uuid import UUID +from state.base import State +from services.bottom.V0 import Bottom as BottomV0 + + +class Bottom: + def __init__(self, model: UUID, state: State): + type_model_id = state.read_dict(state.read_root(), "Bottom") + self.type_model = UUID(state.read_value(type_model_id)) + self.model = model + self.bottom = BottomV0(state) + + def create_node(self, name: str, value=None): + + if value is None: + n = self.bottom.create_node() + else: + n = self.bottom.create_node(value) + self.bottom.create_edge(self.model, n, label=name) + + def create_edge(self, name: str, source: str, target: str): + try: + src, = self.bottom.read_outgoing_elements(self.model, source) + except ValueError: + raise RuntimeError(f"No element named {source}") + try: + tgt, = self.bottom.read_outgoing_elements(self.model, source) + except ValueError: + raise RuntimeError(f"No element named {target}") + e = self.bottom.create_edge(src, tgt) + self.bottom.create_edge(self.model, e, label=name) + + def read_value(self, name: str): + try: + element, = self.bottom.read_outgoing_elements(self.model, name) + return self.bottom.read_value(element) + except ValueError: + raise RuntimeError(f"No element named {name}") + + def read_edge_source(self, name: str): + try: + element, = self.bottom.read_outgoing_elements(self.model, name) + return self.bottom.read_value(element) + except ValueError: + raise RuntimeError(f"No element named {name}") + + def read_edge_target(self, name: str): + pass + + def delete_element(self, name: str): + try: + element, = self.bottom.read_outgoing_elements(self.model, name) + self.bottom.delete_element(element) + except ValueError: + raise RuntimeError(f"No element named {name}") + + def list_elements(self): + tm_names = {} + for key in self.bottom.read_keys(self.type_model): + element, = self.bottom.read_outgoing_elements(self.type_model, key) + tm_names[element] = key + unsorted = [] + for key in self.bottom.read_keys(self.model): + element, = self.bottom.read_outgoing_elements(self.model, key) + element_types = self.bottom.read_outgoing_elements(element, "Morphism") + type_model_elements = self.bottom.read_outgoing_elements(self.type_model) + element_type_node, = [e for e in element_types if e in type_model_elements] + unsorted.append(f"{key} : {tm_names[element_type_node]}") + return sorted(unsorted) + + def to_bottom(self): + pass # already encoded as bottom + + def from_bottom(self): + pass # already encoded as bottom + diff --git a/state.p b/state.p index a7d4337..d0e03d5 100644 Binary files a/state.p and b/state.p differ diff --git a/state/test/fixtures/state.py b/state/test/fixtures/state.py index 86177a2..4f6e65e 100644 --- a/state/test/fixtures/state.py +++ b/state/test/fixtures/state.py @@ -7,7 +7,7 @@ from state.neo4jstate import Neo4jState @pytest.fixture(params=[ (PyState,), (RDFState, "http://example.org/#"), - (Neo4jState,) +# (Neo4jState,) ]) def state(request): if len(request.param) > 1: