diff --git a/tenet/febTransduction/net/net.py b/tenet/febTransduction/net/net.py index 6356bcad210f536832570d6780f5d124cd8996d4..e3ad67f5ce37ad6a08ec831cc205b4c37856cbe7 100644 --- a/tenet/febTransduction/net/net.py +++ b/tenet/febTransduction/net/net.py @@ -10,8 +10,10 @@ import rdflib from rdflib import URIRef from rdflib.namespace import NamespaceManager +from rdflib.term import _is_valid_uri from febTransduction.net import SemanticNetReferenceHandle +from febTransduction.uriref_computer import produce_uriref from febTransduction.query_builder import generate_select_query @@ -39,12 +41,7 @@ class Net: self.type_uri = f'net:{self.type_id}' # -- Net URI - self._uri = uri - if isinstance(uri, rdflib.term.URIRef): - self._uri = uri.n3(self.support_graph.namespace_manager) - elif isinstance(uri, str): - self._uri = URIRef(uri).n3(self.support_graph.namespace_manager) - + self._uri = produce_uriref(self.support_graph, uri) # -- Net Attributes self.attr_list = ['node', 'base_node', 'structure', 'naming'] @@ -118,17 +115,9 @@ class Net: def uri(self): return self._uri - @uri.setter def uri(self, new_value): - control = (isinstance(new_value, rdflib.term.URIRef) or isinstance(new_value, str)) - assert control, f'new_value does not a string or URIRef ({type(new_value)})' - - if isinstance(new_value, rdflib.term.URIRef): - self._uri = new_value.n3(self.support_graph.namespace_manager) - else: - self._uri = URIRef(new_value).n3(self.support_graph.namespace_manager) - + self._uri = produce_uriref(self.support_graph, new_value) #-------------------------------------------------------------------------- diff --git a/tenet/febTransduction/uriref_computer.py b/tenet/febTransduction/uriref_computer.py index f508fd3eec689e73a9985ef108ebc5e0d2055ee5..9eb1f0b0b0055c23c324a4366bc8b6c7c441f7b5 100644 --- a/tenet/febTransduction/uriref_computer.py +++ b/tenet/febTransduction/uriref_computer.py @@ -8,27 +8,42 @@ # attributes) #============================================================================== -from urllib.parse import quote_plus - -from rdflib import URIRef, Graph, RDF, SDO +import rdflib +from rdflib import URIRef, Graph from rdflib.term import _is_valid_uri -#============================================================================== -# Checking Method(s) -#============================================================================== - -class InvalidURIRef(Exception): - """Raise when URIs are invalid.""" - pass - - #============================================================================== # Main Method(s) #============================================================================== -def create_uriref(uri): +def __create_uriref(uri): + assert isinstance(uri, str), f'Houston, we have a problem: uri is not a string' + + if (uri.startswith("<") & uri.endswith(">")): + uri = uri[1:-1] + + if not isinstance(uri, rdflib.term.URIRef): + uri = rdflib.URIRef(uri) + + assert isinstance(uri, rdflib.term.URIRef), f'Houston, we have a problem: result uri is not an URIRef' + + return uri + + +def __update_uri_with_prefix(graph, uri): + assert isinstance(uri, str), f'Houston, we have a problem: uri is not a string' + + if uri.startswith("http"): + uri = rdflib.URIRef(uri.n3(graph.namespace_manager)) + + assert _is_valid_uri(uri), f'Houston, we have a problem: unknown url in uri' + + return uri + + +def produce_uriref(graph, uri): """Create a URIRef with the same validation func used by URIRef Except here an InvalidURIRef exception is raised. @@ -36,7 +51,12 @@ def create_uriref(uri): The RDFLib _is_valid_uri only checks for invalid characters. You can also add your own validation checks. """ - if _is_valid_uri(uri): - return URIRef(uri) - raise InvalidURIRef(f'"{uri}" is not a valid URI.') + + if uri is not None: + uri = __create_uriref(uri) + uri = __update_uri_with_prefix(graph, uri) + uri = __create_uriref(uri) + assert _is_valid_uri(uri), f'Houston, we have a problem: URI is not a valid uri' + + return uri \ No newline at end of file diff --git a/tests/test_semantic_net_1.py b/tests/test_semantic_net_1.py index 4f08b18926a35cc07b29620cf1b1407fd20e8360..257fea7740c313dccd17f15a9d3bec159141a002 100644 --- a/tests/test_semantic_net_1.py +++ b/tests/test_semantic_net_1.py @@ -178,24 +178,24 @@ if __name__ == '__main__': print('\n \n') print('\n *** Unit Test ***') - # unittest_get_attribute_net(graph, 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2') + unittest_get_attribute_net(graph, 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2') - # unittest_get_attribute_class_net(graph, 'net:atomClass_sun_s2') - # unittest_get_attribute_atom_class_net(graph, 'net:atomClass_sun_s2') - # unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_orbit-hasManner-conjunction-OR_o2') - # unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_system-hasPart-sun-and-object_s') + unittest_get_attribute_class_net(graph, 'net:atomClass_sun_s2') + unittest_get_attribute_atom_class_net(graph, 'net:atomClass_sun_s2') + unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_orbit-hasManner-conjunction-OR_o2') + unittest_get_attribute_composite_class_net(graph, 'net:compositeClass_system-hasPart-sun-and-object_s') - # unittest_get_attribute_property_net(graph, 'net:atomProperty_orbit_o2') - # unittest_get_attribute_atom_property_net(graph, 'net:atomProperty_orbit_o2') - # unittest_get_attribute_composite_property_net(graph, 'net:compositeProperty_not-direct_d2') + unittest_get_attribute_property_net(graph, 'net:atomProperty_orbit_o2') + unittest_get_attribute_atom_property_net(graph, 'net:atomProperty_orbit_o2') + unittest_get_attribute_composite_property_net(graph, 'net:compositeProperty_not-direct_d2') - # unittest_get_attribute_individual_net(graph, 'net:individual_system_SolarSystem') + unittest_get_attribute_individual_net(graph, 'net:individual_system_SolarSystem') - # unittest_get_attribute_value_net(graph, 'net:value_SolarSystem_blankNode') + unittest_get_attribute_value_net(graph, 'net:value_SolarSystem_blankNode') - # unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-AND_a') - # unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-OR_o3') + unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-AND_a') + unittest_get_attribute_phenomena_net(graph, 'net:phenomena_conjunction-OR_o3') - # unittest_get_attribute_restriction_net(graph, 'net:restriction_hasPart_sun') + unittest_get_attribute_restriction_net(graph, 'net:restriction_hasPart_sun') print('\n \n') \ No newline at end of file diff --git a/tests/test_transduction_uriref_computer.py b/tests/test_transduction_uriref_computer.py index fea2b124570822b183ae0fe11dc4d8892e02e636..f376b1ee14310bd6a4f2d9ab734d3124113541a0 100644 --- a/tests/test_transduction_uriref_computer.py +++ b/tests/test_transduction_uriref_computer.py @@ -8,7 +8,8 @@ #============================================================================== import subprocess, os -from rdflib import Graph, Namespace +import rdflib +from rdflib import Graph, Namespace, URIRef from rdflib.namespace import NamespaceManager from rdflib.term import _is_valid_uri @@ -18,6 +19,8 @@ OUTPUT_DIR_PATH = f'{FILE_PATH}/output/' TEST_GRAPH = f'{INPUT_DIR_PATH}testGraph1.ttl' from context import tenet +import utility + from tenet.febTransduction import uriref_computer @@ -26,7 +29,15 @@ from tenet.febTransduction import uriref_computer # Useful Methods #============================================================================== -# None +def load_test_graph(): + print(f'\n -- Test Graph Loading') + graph = Graph() + graph.bind('amr', Namespace('https://amr.tetras-libre.fr/rdf/schema#')) + graph.bind('net', Namespace('https://tenet.tetras-libre.fr/semantic-net#')) + graph.bind('base-out', Namespace('https://tenet.tetras-libre.fr/base-ontology#')) + graph.parse(TEST_GRAPH) + print(f" ----- Graph Loaded ({len(graph)})") + return graph #============================================================================== @@ -36,17 +47,78 @@ from tenet.febTransduction import uriref_computer def devtest_check_uri(uri): print(f'\n -- Test URI checking') print(f' ----- uri: {uri}') - print(f' ----- check 1: {_is_valid_uri(uri)}') + print(f' ----- check 1 (valid uri): {_is_valid_uri(uri)}') + print(f' ----- check 2 (URIRef instance): {isinstance(uri, rdflib.term.URIRef)}') + print(f' ----- check 3 (str instance): {isinstance(uri, str)}') + print(f' ----- check 4 (not http uri): {uri.startswith("http")}') + print(f' ----- check 5 (not single quote uri): {uri.startswith("<") & uri.endswith(">")}') + + +def devtest_create_uriref(graph, uri): + print(f'\n -- Creation of URI Reference') + assert isinstance(uri, str), f'URI is not a string' + + origin_uri = uri + new_uri = None + + if (uri.startswith("<") & uri.endswith(">")): + uri = uri[1:-1] + + if not isinstance(uri, rdflib.term.URIRef): + uri = rdflib.URIRef(uri) + assert isinstance(uri, rdflib.term.URIRef), f'Houston, we have a problem (1)' + if uri.startswith("http"): + new_uri = rdflib.URIRef(uri.n3(graph.namespace_manager)) + assert isinstance(new_uri, rdflib.term.URIRef), f'Houston, we have a problem (2)' + else: + new_uri = uri + assert isinstance(new_uri, rdflib.term.URIRef), f'Houston, we have a problem (3)' + + assert _is_valid_uri(uri), f'Houston, we have a problem: URI is not a valid uri' + print(f' ----- origin uri: {origin_uri}') + print(f' ----- new uri: {new_uri}') + print(f' ----- new uri checking as URIRef instance: {isinstance(new_uri, rdflib.term.URIRef)}') + + #============================================================================== # Unit Test #============================================================================== -# TODO - +def unittest_produce_uriref(graph, uri): + print(f'\n -- Produce valid URI Reference') + try: + uriref = uriref_computer.produce_uriref(graph, uri) + if uriref is None: + print(f' ----- None') + else: # uriref is not None + print(f' ----- origin uri: {uri}') + print(f' ----- result uri: {uriref}') + c_1 = _is_valid_uri(uriref) + c_2 = isinstance(uriref, rdflib.term.URIRef) + c_3 = isinstance(uriref, str) + c_4 = not(uriref.startswith("http")) + c_5 = not(uriref.startswith("<") & uriref.endswith(">")) + assert c_1 & c_2 & c_3 & c_4 & c_5 + print(f' ----- result uri check: ok') + except: + print(f' ----- check 1 (valid uri): {c_1}') + print(f' ----- check 2 (URIRef instance): {c_2}') + print(f' ----- check 3 (str instance): {c_3}') + print(f' ----- check 4 (not http uri): {c_4}') + print(f' ----- check 5 (not single quote uri): {c_5}') +def unittest_failure_produce_uriref(graph, uri): + print(f'\n -- * Failure to produce URI Reference *') + try: + uriref = uriref_computer.produce_uriref(graph, uri) + print(f'Houston, we have a problem: production is successful') + except: + print(f' ----- OK FAILURE!') + print(f' ----- origin uri: {uri}') + #============================================================================== # Test Script @@ -55,16 +127,35 @@ def devtest_check_uri(uri): if __name__ == '__main__': print('\n *** Test Preparation ***') - pass + graph = load_test_graph() + uri_1 = 'net:compositeClass_orbit_hasManner_conjunction-OR' + uri_2 = '<net:compositeClass_orbit_hasManner_conjunction-OR>' + uri_3 = 'https://tenet.tetras-libre.fr/semantic-net#atomClass_sun_s2' + uri_4 = 'https://unknow-url#atomClass_sun_s2' + uri_5 = URIRef('net:compositeClass_orbit_hasManner_conjunction-OR') print('\n \n') print('\n *** Development Test ***') - devtest_check_uri('<net:compositeClass_orbit_hasManner_conjunction-OR>') - devtest_check_uri('net:compositeClass_orbit_hasManner_conjunction-OR') + devtest_check_uri(uri_1) + devtest_check_uri(uri_2) + devtest_check_uri(uri_3) + devtest_check_uri(uri_4) + devtest_check_uri(uri_5) + devtest_create_uriref(graph, uri_1) + devtest_create_uriref(graph, uri_1) + devtest_create_uriref(graph, uri_2) + devtest_create_uriref(graph, uri_3) + devtest_create_uriref(graph, uri_4) + devtest_create_uriref(graph, uri_5) print('\n \n') print('\n *** Unit Test ***') - pass + unittest_produce_uriref(graph, uri_1) + unittest_produce_uriref(graph, uri_2) + unittest_produce_uriref(graph, uri_3) + unittest_failure_produce_uriref(graph, uri_4) + unittest_produce_uriref(graph, uri_5) + unittest_produce_uriref(graph, None) print('\n \n') print('\n *** - ***') \ No newline at end of file