diff --git a/doc/Translate_ttl_to_spec.md b/doc/Translate_ttl_to_spec.md index 0e1c86b..4512cd1 100644 --- a/doc/Translate_ttl_to_spec.md +++ b/doc/Translate_ttl_to_spec.md @@ -1,6 +1,18 @@ +- [receipts to transform ttl to spec](#receipts-to-transform-ttl-to-spec) + - [**a**](#a) + - [**rdfs:range**](#rdfsrange) + - [**rdfs:domain**](#rdfsdomain) + - [owner is **a** type](#owner-is-a-type) + - [owner is a **owl:unionOf** types](#owner-is-a-owlunionof-types) +- [Further infos](#further-infos) + - [RDF/S](#rdfs) + - [range (https://www.w3.org/TR/rdf12-schema/#ch\_range)](#range-httpswwww3orgtrrdf12-schemach_range) + - [type (https://www.w3.org/TR/rdf12-schema/#ch\_type)](#type-httpswwww3orgtrrdf12-schemach_type) + + # receipts to transform ttl to spec -## *it* **a** *something* +## **a** *it* is **a** *something* @@ -28,6 +40,66 @@ Der token `a` in einer ttl Definition entspricht dem RDF-Prädikat `rdf:type`. S Das bedeutet für das Tripel: `(R, rdf:type, C) => C instanceof rdfs:Class & R instanceof C` + +## **rdfs:range** + +*its* value is defined in a **rdfs:range** *the range* + +If range links to an other definition we map range same as **a**. + +Example: +```ttl +as:id rdfs:range xsd:anyURI ; +``` + +Maps to +```clojure +(s/def ::anyURI p/uri-string?) + +(s/def ::id + (s/and + ... + ::anyURI)) +``` + +## **rdfs:domain** + +*it* belong to a **rdfs:domain** *owner* + +### owner is **a** type + +It is added to the owner. That's the way to model properties. If the owner is membe of an other namespace, we create a subclass with same name in the namespce in scope and enhance the subclass. + +Example in namespace activitypub2 +```ttl +as:id rdfs:domain [a owl:Class;] +``` + +Maps to +```clojure +(s/def + ::Class + (s/merge ::owl/Class + (s/keys :opt-un [::id]))) +``` + +### owner is a **owl:unionOf** types + +It is added to the owner. That's the way to model properties. If the owner is membe of an other namespace, we create a subclass with same name in the namespce in scope and enhance the subclass. + +Example in namespace activitypub2 +```ttl +as:id rdfs:domain [owl:unionOf (as:Link as:Object)] +``` + +Maps to +```clojure +(s/def ::Object (s/keys :opt-un [::id ...])) + + +(s/def ::Link (s/keys :opt-un [::id])) +``` + # Further infos ## RDF/S diff --git a/project.clj b/project.clj index 093ce80..4084f5e 100644 --- a/project.clj +++ b/project.clj @@ -25,6 +25,7 @@ [org.clojars.quoll/raphael "0.1.6"] [instaparse "1.4.12"]] :main ^:skip-aot org.domaindrivenarchitecture.activity-pub-poc.core - :profiles {:test {:test-paths ["src/test/clj"] + :profiles {:test {:test-paths ["src/test/cljc" + "src/test/clj"] :resource-paths ["src/test/resources"] :dependencies [[dda/data-test "0.1.1"]]}}) diff --git a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc index 71b718a..31674d0 100644 --- a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc @@ -1,12 +1,58 @@ (ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 (:require [clojure.spec.alpha :as s] + [orchestra.core :refer [defn-spec]] [org.domaindrivenarchitecture.activity-pub-poc.owl :as owl] - [org.domaindrivenarchitecture.activity-pub-poc.rdf :as rdf] - [org.domaindrivenarchitecture.activity-pub-poc.core :as core])) + [org.domaindrivenarchitecture.activity-pub-poc.xsd :as xsd])) + +(defn-spec + is-functional-property? boolean? + "Checks whether spec is a FunctionalProperty." + [spec keyword?] + (some #(clojure.string/includes? % "FunctionalProperty") (s/describe spec))) ;http://www.w3.org/ns/activitystreams#id -;TODO: how do we translate this? rdfs:domain [a owl:Class ; owl:unionOf (as:Link as:Object)] -(s/def ::id (s/and ::owl/FunctionalProperty - ::owl/DatatypeProperty - ::owl/DeprecatedProperty - core/uri-string?)) +(s/def + ::id (s/and ::owl/DatatypeProperty + ::owl/FunctionalProperty + ::owl/DeprecatedProperty + ::xsd/anyURI)) + +;http://www.w3.org/ns/activitystreams#attachment +(s/def ::attachment + (s/and + ::owl/ObjectProperty + ::Class + ::Link + ::Object)) + +;http://www.w3.org/ns/activitystreams#result +(s/def ::result + (s/and + ::owl/ObjectProperty + ::Class + ::Object + ::Link)) + +;http://www.w3.org/ns/activitystreams#Activity +;TODO: definition in progress +(s/def ::Activity + (s/and ::Object + (s/keys :opt-un [::result]))) + +;http://www.w3.org/ns/activitystreams#Object +;TODO: definition in progress +(s/def ::Object (s/keys :opt-un [::id ::attachment])) + + +;http://www.w3.org/ns/activitystreams#Link +;TODO: definition in progress +(s/def ::Link (s/keys :opt-un [::id])) + +(s/def + ::Class + (s/merge ::owl/Class + (s/keys :opt-un [::id]))) + + +;http://www.w3.org/ns/activitystreams#Like +(s/def ::Like ::Activity) \ No newline at end of file diff --git a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc index 20cd38a..7e0ccf6 100644 --- a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc @@ -1,12 +1,18 @@ (ns org.domaindrivenarchitecture.activity-pub-poc.owl "A swallow spec translation implementation of owl. Inheritance of FunctionalProperty is realized in deep implemented." - (:require [clojure.spec.alpha :as s])) + (:require + [clojure.spec.alpha :as s] + [orchestra.core :refer [defn-spec]])) ; Properties:https://www.w3.org/TR/owl-ref/#Property ; * Datatype properties link individuals to data values. ; * Object properties link individuals to individuals. +;http://www.w3.org/2002/07/owl#Class +;https://www.w3.org/TR/owl-ref/#Class-def +(s/def ::Class any?) + ;http://www.w3.org/2002/07/owl#DatatypeProperty (s/def ::DatatypeProperty any?) @@ -15,8 +21,22 @@ ;http://www.w3.org/2002/07/owl#FunctionalProperty ;https://www.w3.org/TR/owl-ref/#FunctionalProperty-def -(s/def ::FunctionalProperty any?) +(defn-spec + functional? boolean? + [elem any?] + (and + (some? elem) + (or + (not (coll? elem)) + (and (vector? elem) (= 1 (count elem))) + (and (list? elem) (= 1 (count elem)))))) +(s/def ::FunctionalProperty functional?) ;http://www.w3.org/2002/07/owl#DeprecatedProperty ;https://www.w3.org/TR/owl-ref/#Deprecation (s/def ::DeprecatedProperty any?) + + +;http://www.w3.org/2002/07/owl#ObjectProperty +;https://www.w3.org/TR/owl-ref/#ObjectProperty +(s/def ::ObjectProperty any?) \ No newline at end of file diff --git a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/xsd.cljc b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/xsd.cljc index 2fecabf..578afab 100644 --- a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/xsd.cljc +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/xsd.cljc @@ -1,6 +1,5 @@ (ns org.domaindrivenarchitecture.activity-pub-poc.xsd - "A swallow spec translation implementation of xsd Inheritance of FunctionalProperty - is realized in deep implemented." + "A spec translation implementation of xsd. Predicates are implemented fully functional." (:require [clojure.spec.alpha :as s] [org.domaindrivenarchitecture.activity-pub-poc.predicates :as p])) diff --git a/src/test/clj/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_legacy_test.clj b/src/test/clj/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_legacy_test.clj new file mode 100644 index 0000000..f79b52e --- /dev/null +++ b/src/test/clj/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_legacy_test.clj @@ -0,0 +1,28 @@ +(ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2-legacy-test + (:require + [clojure.test :refer [deftest is are testing run-tests]] + [clojure.spec.test.alpha :as st] + [clojure.spec.alpha :as s] + [org.domaindrivenarchitecture.activity-pub-poc.activitystreams2-legacy :as sut])) + +;(deftest id-test +; (is (s/valid? ::sut/id "https://social.bla/alyssa/status/RANDOMHASH"))) + +;(deftest type-test +; (is (s/valid? ::sut/type "Note")) +; (is (s/valid? ::sut/type "Link")) +; (is (not(s/valid? ::sut/type "non existing")))) + +;(deftest object-test +; (is (s/valid? ::sut/Object "https://social.bla/alyssa/status/RANDOMHASH") +; (is (s/valid? ::sut/Object {:id "https://social.bla/alyssa/status/RANDOMHASH" :type "Page"})))) +; +;(deftest link-test +; (is (s/valid? ::sut/Link {:type "Link"}))) + +;(deftest Note-test +; (is (s/valid? +; ::sut/Note +; {:id "https://social.bla/alyssa/status/RANDOMHASH" +; :type "Note" +; :content "text"}))) diff --git a/src/test/clj/org/domaindrivenarchitecture/activitystreams2_test.clj b/src/test/clj/org/domaindrivenarchitecture/activitystreams2_test.clj deleted file mode 100644 index 59b6738..0000000 --- a/src/test/clj/org/domaindrivenarchitecture/activitystreams2_test.clj +++ /dev/null @@ -1,28 +0,0 @@ -(ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2-test - (:require - [clojure.test :refer [deftest is are testing run-tests]] - [clojure.spec.test.alpha :as st] - [clojure.spec.alpha :as s] - [org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 :as sut])) - -(deftest id-test - (is (s/valid? ::sut/id "https://social.bla/alyssa/status/RANDOMHASH"))) - -(deftest type-test - (is (s/valid? ::sut/type "Note")) - (is (s/valid? ::sut/type "Link")) - (is (not(s/valid? ::sut/type "non existing")))) - -(deftest object-test - (is (s/valid? ::sut/Object "https://social.bla/alyssa/status/RANDOMHASH") - (is (s/valid? ::sut/Object {:id "https://social.bla/alyssa/status/RANDOMHASH" :type "Page"})))) - -(deftest link-test - (is (s/valid? ::sut/Link {:type "Link"}))) - -;(deftest Note-test -; (is (s/valid? -; ::sut/Note -; {:id "https://social.bla/alyssa/status/RANDOMHASH" -; :type "Note" -; :content "text"}))) diff --git a/src/test/cljc/org/activitystreams2_test.clj b/src/test/cljc/org/activitystreams2_test.clj deleted file mode 100644 index 5944812..0000000 --- a/src/test/cljc/org/activitystreams2_test.clj +++ /dev/null @@ -1,9 +0,0 @@ -(ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2-test - (:require - [clojure.test :refer [deftest is are testing run-tests]] - [clojure.spec.test.alpha :as st] - [clojure.spec.alpha :as s] - [org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 :as sut])) - -(deftest id-test - (is true)) \ No newline at end of file diff --git a/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_test.clj b/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_test.clj new file mode 100644 index 0000000..1ef4f0b --- /dev/null +++ b/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_test.clj @@ -0,0 +1,17 @@ +(ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2-test + (:require + [clojure.test :refer [deftest is are testing run-tests]] + [clojure.spec.test.alpha :as st] + [clojure.spec.alpha :as s] + [org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 :as sut])) + +(deftest shoult-test-spec-for-having-functional-property + (is (sut/is-functional-property? ::sut/id)) + (is (not (sut/is-functional-property? ::sut/Like)))) + +(deftest id-test + (is (s/valid? ::sut/id "https://social.bla/alyssa/status/RANDOMHASH")) + (is (not (s/valid? ::sut/id nil))) + (is (not (s/valid? ::sut/id 2))) + (is (not (s/valid? ::sut/id "no-uri"))) + ) \ No newline at end of file diff --git a/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl_test.cljc b/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl_test.cljc new file mode 100644 index 0000000..427751f --- /dev/null +++ b/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl_test.cljc @@ -0,0 +1,14 @@ +(ns org.domaindrivenarchitecture.activity-pub-poc.owl-test + (:require + [clojure.test :refer [deftest is are testing run-tests]] + [clojure.spec.test.alpha :as st] + [clojure.spec.alpha :as s] + [org.domaindrivenarchitecture.activity-pub-poc.owl :as sut])) + +(deftest functional-predicate + (is (sut/functional? "str")) + (is (sut/functional? 2)) + (is (sut/functional? ["str"])) + (is (not (sut/functional? []))) + (is (not (sut/functional? nil))) + (is (not (sut/functional? [1 2])))) \ No newline at end of file diff --git a/src/test/resources/like.json b/src/test/resources/like.json index 5566c6b..ffd8244 100644 --- a/src/test/resources/like.json +++ b/src/test/resources/like.json @@ -1 +1,11 @@ -{"@context":"https://www.w3.org/ns/activitystreams","id":"https://social.bla/alyssa#likes/RANDOMHASH","type":"Like","to":["https://chatty.bla/ben","https://chatty.bla/gen"],"actor":"https://social.bla/alyssa","object":"https://chatty.bla/ben/posts/234s23-2g34234-2hhj536"} \ No newline at end of file +{ + "@context": "https://www.w3.org/ns/activitystreams", + "id": "https://social.bla/alyssa#likes/RANDOMHASH", + "type": "Like", + "to": [ + "https://chatty.bla/ben", + "https://chatty.bla/gen" + ], + "actor": "https://social.bla/alyssa", + "object": "https://chatty.bla/ben/posts/234s23-2g34234-2hhj536" +} \ No newline at end of file