Browse Source

User-defined data:

* Add `user_data` and `user_types` Ldpr properties.
* Include user-defined types in `Ldpr.types`.
Stefano Cossu 4 years ago
parent
commit
a3b8fce77f
2 changed files with 81 additions and 2 deletions
  1. 26 2
      lakesuperior/model/ldp/ldpr.py
  2. 55 0
      tests/2_api/test_2_0_resource_api.py

+ 26 - 2
lakesuperior/model/ldp/ldpr.py

@@ -265,6 +265,17 @@ class Ldpr(metaclass=ABCMeta):
         return self._metadata
 
 
+    @property
+    def user_data(self):
+        """
+        User-defined triples.
+        """
+        if not hasattr(self, '_user_data'):
+            self._user_data = rdfly.get_user_data(self.uid)
+
+        return self._user_data
+
+
     @metadata.setter
     def metadata(self, rsrc):
         """
@@ -340,7 +351,8 @@ class Ldpr(metaclass=ABCMeta):
 
     @property
     def types(self):
-        """All RDF types.
+        """
+        All RDF types, both server-managed and user-defined.
 
         :rtype: set(rdflib.term.URIRef)
         """
@@ -353,7 +365,7 @@ class Ldpr(metaclass=ABCMeta):
             else:
                 return set()
 
-            self._types = set(metadata[self.uri: RDF.type])
+            self._types = set(metadata[self.uri: RDF.type]) | self.user_types
 
         return self._types
 
@@ -370,6 +382,18 @@ class Ldpr(metaclass=ABCMeta):
         return self._ldp_types
 
 
+    @property
+    def user_types(self):
+        """User-defined types.
+
+        :rtype: set(rdflib.term.URIRef)
+        """
+        if not hasattr(self, '_ud_types'):
+            self._ud_types = self.user_data[self.uri: RDF.type]
+
+        return self._ud_types
+
+
     ## LDP METHODS ##
 
     def head(self):

+ 55 - 0
tests/2_api/test_2_0_resource_api.py

@@ -568,6 +568,61 @@ class TestResourceCRUD:
     #                top_cont_rsrc.uri: nsc['dcterms'].relation:
     #                nsc['fcres'][target_uid]]
 
+    def test_user_data(self):
+        '''
+        Verify that only user-defined data are in user_data.
+        '''
+        import pdb; pdb.set_trace()
+        data = b'''
+        <> a <urn:t:1> ;
+            <urn:p:1> "Property 1" ;
+            <urn:p:2> <urn:o:2> .
+        '''
+        uid = f'/{uuid4()}'
+        uri = nsc['fcres'][uid]
+
+        rsrc_api.create_or_replace(uid, rdf_data=data, rdf_fmt='ttl')
+        rsrc = rsrc_api.get(uid)
+
+        with env.app_globals.rdf_store.txn_ctx():
+            ud_data = rsrc.user_data
+
+            assert ud_data[uri: nsc['rdf'].type: URIRef('urn:t:1')]
+            assert ud_data[uri: URIRef('urn:p:1'): Literal('Property 1')]
+            assert ud_data[uri: URIRef('urn:p:2'): URIRef('urn:o:2')]
+            assert not ud_data[uri: nsc['rdf'].type: nsc['ldp'].Resource]
+
+
+    def test_types(self):
+        '''
+        Test server-managed and user-defined RDF types.
+        '''
+        data = b'''
+        <> a <urn:t:1> , <urn:t:2> .
+        '''
+        uid = f'/{uuid4()}'
+        uri = nsc['fcres'][uid]
+
+        rsrc_api.create_or_replace(uid, rdf_data=data, rdf_fmt='ttl')
+        rsrc = rsrc_api.get(uid)
+
+        with env.app_globals.rdf_store.txn_ctx():
+            assert URIRef('urn:t:1') in rsrc.types
+            assert URIRef('urn:t:1') in rsrc.user_types
+            assert URIRef('urn:t:1') not in rsrc.ldp_types
+
+            assert URIRef('urn:t:2') in rsrc.types
+            assert URIRef('urn:t:2') in rsrc.user_types
+            assert URIRef('urn:t:2') not in rsrc.ldp_types
+
+            assert nsc['ldp'].Resource in rsrc.types
+            assert nsc['ldp'].Resource not in rsrc.user_types
+            assert nsc['ldp'].Resource in rsrc.ldp_types
+
+            assert nsc['ldp'].Container in rsrc.types
+            assert nsc['ldp'].Container not in rsrc.user_types
+            assert nsc['ldp'].Container in rsrc.ldp_types
+
 
 
 @pytest.mark.usefixtures('db')