diff --git a/saref_patterns/__init__.py b/saref_patterns/__init__.py index d3abcab35d0007c1c7b50d85c8a01e52d63349b2..45a78ac60b3f73f5e2bd4a063f186b77bfc37db3 100644 --- a/saref_patterns/__init__.py +++ b/saref_patterns/__init__.py @@ -4,4 +4,4 @@ BASE = saref_project.BASE SAREFProject = saref_project.SAREFProject SAREFCore = saref_project.SAREFCore SAREF = saref_project.SAREF -check_patterns = saref_project.run +check_patterns = saref_project.check_pattern diff --git a/saref_patterns/check.py b/saref_patterns/check.py deleted file mode 100644 index f40d5eeecd80cd9391451a742128a3b7faf700fe..0000000000000000000000000000000000000000 --- a/saref_patterns/check.py +++ /dev/null @@ -1,3 +0,0 @@ - -from saref_project import SAREFProject, SAREFCore, SAREF - diff --git a/saref_patterns/saref_project.py b/saref_patterns/saref_project.py index 160d49925956a1a88eee30e1cbd9a7d64b934013..f2c5d0bb08f118bd4199027412e4d6027c03a55e 100644 --- a/saref_patterns/saref_project.py +++ b/saref_patterns/saref_project.py @@ -4,13 +4,13 @@ import re from pathlib import Path import yaml from jsonschema import validate +import importlib from rdflib import Namespace from rdflib import Graph from rdflib.namespace import NamespaceManager from rdflib.compare import to_isomorphic, graph_diff - BASE = "https://saref.etsi.org/" class SAREFProject: @@ -39,58 +39,106 @@ class SAREFProject: SAREFCore = SAREFProject("saref-core") SAREF = SAREFCore.namespace -def run(specialize, schema=None): +class SAREFPattern: + def __init__(self, specialize, schema): + self.specialize = specialize + self.schema = schema + +def run_one(project, pattern, executions): + g = Graph() + g += pattern.ontology + for execution in executions: + # check the format + if pattern.schema: + validate(execution, pattern.schema) + # execute the pattern specialization function + g += pattern.specialize(project.namespace, execution) + + # check if some triples are not in the ontology + g = to_isomorphic(g) + in_both, in_first, in_second = graph_diff(project.ontology, g) + if in_second: + sys.stderr.write("Error: the following triples should be in the ontology:\n") + in_second.namespace_manager = project.namespace_manager + in_second.print(out=sys.stderr) + +def get_project(patterns_config_yml:Path): + projectRepository = patterns_config_yml.parents[1] + project = SAREFProject(projectRepository) + + project.namespace_manager = NamespaceManager(Graph()) + project.namespace_manager.bind(SAREFCore.prefix, SAREF) + project.namespace_manager.bind(project.prefix, project.namespace) + + with open(projectRepository / "ontology" / (project.ontologyFileName + ".ttl"), 'r') as ontology_file: + project.ontology = Graph() + project.ontology.parse(ontology_file) + project.ontology = to_isomorphic(project.ontology) + + project.namespace_manager = NamespaceManager(Graph()) + project.namespace_manager.bind(SAREFCore.prefix, SAREF) + project.namespace_manager.bind(project.prefix, project.namespace) + return project + +def check_pattern(specialize, schema=None): if len(sys.argv) != 2: print() sys.stderr.write("Expecting one argument: the location of a pattern specialization specification document. See ETSI TS 103 673") sys.exit(1) scriptname = Path(sys.argv[0]).resolve() - pattern = os.path.basename(os.path.dirname(scriptname)) + reference_pattern = os.path.basename(os.path.dirname(scriptname)) + project_with_reference_patterns = os.path.basename(scriptname.parents[2]) + pattern = SAREFPattern(specialize, schema) + pattern.ontology = Graph() + try: + with open((scriptname/".."/"pattern.ttl").resolve(), "r") as pattern_ontology_file: + pattern.ontology.parse(pattern_ontology_file) + except Exception as e: + print(e) + pass patterns_config_yml = Path(sys.argv[1]).resolve() - projectRepository = patterns_config_yml.parents[1] - project = SAREFProject(projectRepository) + project = get_project(patterns_config_yml) - namespace_manager = NamespaceManager(Graph()) - namespace_manager.bind(SAREFCore.prefix, SAREF) - namespace_manager.bind(project.prefix, project.namespace) + with open(patterns_config_yml, 'r') as patterns_config_file: + patterns_config = yaml.safe_load(patterns_config_file) + + if project_with_reference_patterns not in patterns_config: + sys.stderr.write(f"Warning: Patterns specialization specification document does not contain a section for {project_with_reference_patterns}\n") + sys.exit() + if reference_pattern not in patterns_config[project_with_reference_patterns]: + sys.stderr.write(f"Warning: Patterns specialization specification document does not contain a section for {project_with_reference_patterns}.{reference_pattern}\n") + sys.exit() + executions = patterns_config[project_with_reference_patterns][reference_pattern] + run_one(project, pattern, executions) - sys.stderr.write(f"# Specialization for pattern {pattern} of project {project.name}\n") +if __name__ == "__main__": + if len(sys.argv) != 2: + print() + sys.stderr.write("Expecting one argument: the location of a pattern specialization specification document. See ETSI TS 103 673") + sys.exit(1) - try: - with open(patterns_config_yml, 'r') as patterns_config_file, open(projectRepository / "ontology" / (project.ontologyFileName + ".ttl"), 'r') as ontology_file: - patterns_config = yaml.safe_load(patterns_config_file) - if project.ontologyFileName not in patterns_config: - sys.stderr.write(f"Warning: Patterns specialization specification document does not contain a section for {project.ontologyFileName}\n") - sys.exit() - if pattern not in patterns_config[project.ontologyFileName]: - sys.stderr.write(f"Warning: Patterns specialization specification document does not contain a section for {project.ontologyFileName}.{pattern}\n") - sys.exit() - - ontology = Graph() - ontology.parse(ontology_file) - ontology_iso = to_isomorphic(ontology) - - # specialize patterns - for execution in patterns_config[project.ontologyFileName][pattern]: - # check the format - if schema: - validate(execution, schema) - - # run the specialization script - specialization = specialize(project.namespace, execution) + patterns_config_yml = Path(sys.argv[1]).resolve() + project = get_project(patterns_config_yml) - # check if some triples are not in the ontology - specialize_iso = to_isomorphic(specialization) - in_both, in_first, in_second = graph_diff(ontology_iso, specialize_iso) - # print("Success: the following triples are in the ontology:") - # in_both.namespace_manager = namespace_manager - # in_both.print() - if in_second: - sys.stderr.write("Error: the following triples should be in the ontology:\n") - in_second.namespace_manager = namespace_manager - in_second.print(out=sys.stderr) - except Exception as exc: - sys.stderr.write(f"{type(exc).__name__} {exc}") - sys.exit(1) - \ No newline at end of file + with open(patterns_config_yml, 'r') as patterns_config_file: + patterns_config = yaml.safe_load(patterns_config_file) + for project_with_reference_patterns in patterns_config: + for reference_pattern in patterns_config[project_with_reference_patterns]: + print(f"executing pattern {reference_pattern} in project {project_with_reference_patterns}") + + pattern_name = f"{project_with_reference_patterns}.{reference_pattern}" + pattern_path = Path("..")/project_with_reference_patterns/"patterns"/reference_pattern + spec = importlib.util.spec_from_file_location(pattern_name, pattern_path/"specialization.py") + pattern = importlib.util.module_from_spec(spec) + # sys.modules[module_name] = module + spec.loader.exec_module(pattern) + # initialize pattern.ontology + pattern.ontology = Graph() + try: + with open(pattern_path/"pattern.ttl", "r") as pattern_ontology_file: + pattern.ontology.parse(pattern_ontology_file) + except: + pass + executions = patterns_config[project_with_reference_patterns][reference_pattern] + run_one(project, pattern, executions)