Compare commits

..

No commits in common. "077a50e733d0ba1ccd144f7243c733eec8f473c8" and "5588bcd5b834ae53a39f2158e3f8b5e19099adf0" have entirely different histories.

5 changed files with 58 additions and 44 deletions

View file

@ -1,7 +1,6 @@
(ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 (ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2
(:require [clojure.spec.alpha :as s] (:require [clojure.spec.alpha :as s]
[orchestra.core :refer [defn-spec]] [orchestra.core :refer [defn-spec]]
[org.domaindrivenarchitecture.activity-pub-poc.spec-helper :as sh]
[org.domaindrivenarchitecture.activity-pub-poc.owl :as owl] [org.domaindrivenarchitecture.activity-pub-poc.owl :as owl]
[org.domaindrivenarchitecture.activity-pub-poc.xsd :as xsd])) [org.domaindrivenarchitecture.activity-pub-poc.xsd :as xsd]))
@ -11,51 +10,70 @@
[spec keyword?] [spec keyword?]
(some #(clojure.string/includes? % "FunctionalProperty") (s/describe spec))) (some #(clojure.string/includes? % "FunctionalProperty") (s/describe spec)))
(defn-spec map-class-spec s/spec?
"Spec which checks whether a value is a ::Class
and if it is a map, if it validates the given map-spec."
[map-spec s/spec?]
(s/and
::Class
(s/or
:no-map #(not (map? %))
:map map-spec)))
;=======================
;TODO: There is no as:Class! Why do we need this?
;Answer jem: I do not want to enhance owl/Class inline from here.
(s/def
::Class
(s/and ::owl/Class))
;======================= ;=======================
;http://www.w3.org/ns/activitystreams#object ;http://www.w3.org/ns/activitystreams#object
(s/def ::Object (s/def ::Object
(s/and (s/and
::owl/Class ::Class
(sh/map-spec (s/keys :opt-un [::id ::type ::attachment])))) (s/keys :opt-un [::id ::type ::attachment])))
;http://www.w3.org/ns/activitystreams#Link ;http://www.w3.org/ns/activitystreams#Link
(s/def ::Link (s/def ::Link
(s/and (s/and
::owl/Class ::Class
(sh/map-spec (s/keys :opt-un [::id ::type])))) (s/keys :opt-un [::id ::type])))
;http://www.w3.org/ns/activitystreams#Activity ;http://www.w3.org/ns/activitystreams#Activity
;TODO: Define more properties necessary for Like ;TODO: Define more properties necessary for Like
(s/def ::Activity (s/def ::Activity
(s/and (s/and
::owl/Class ::Class
::Object ::Object
(sh/map-spec (s/keys :opt-un [::result ::object])))) (s/keys :opt-un [::result ::object])))
;http://www.w3.org/ns/activitystreams#Relationship ;http://www.w3.org/ns/activitystreams#Relationship
;We only have this class, since the property "object" is in the domain "Activity" and "Relationship" ;We only have this class, since the property "object" is in the domain "Activity" and "Relationship"
; TODO: What means: "as:Relationship a rdf:Statement". Relevant for spec? ; TODO: What means: "as:Relationship a rdf:Statement". Relevant for spec?
(s/def ::Relationship (s/def ::Relationship
(s/and (s/and
::owl/Class ::Class
::Object ::Object
(sh/map-spec (s/keys :opt-un [::object])))) (s/keys :opt-un [::object])))
;http://www.w3.org/ns/activitystreams#Like ;http://www.w3.org/ns/activitystreams#Like
(s/def ::Like (s/def ::Like
(s/and (s/and
::owl/Class ::Class
::Activity)) ::Activity))
;http://www.w3.org/ns/activitystreams#attachment ;http://www.w3.org/ns/activitystreams#attachment
; TODO: Why do we need to model this? Is this necessary for a Like-Activity? ; TODO: Why do we need to model this? Is this necessary for a Like-Activity?
(s/def ::attachment (s/def ::attachment
(s/and (s/and
::owl/Class
::owl/ObjectProperty ::owl/ObjectProperty
::Object (map-class-spec
::Link)) (s/or
:object ::Object
:link ::Link))))
;http://www.w3.org/ns/activitystreams#id ;http://www.w3.org/ns/activitystreams#id
(s/def ::id (s/def ::id
@ -74,29 +92,38 @@
;http://www.w3.org/ns/activitystreams#result ;http://www.w3.org/ns/activitystreams#result
(s/def ::result (s/def ::result
(s/and (s/and
::owl/Class
::owl/ObjectProperty ::owl/ObjectProperty
::Object (map-class-spec
::Link)) (s/or :object ::Object
:link ::Link))))
;http://www.w3.org/ns/activitystreams#object ;http://www.w3.org/ns/activitystreams#object
(s/def ::object (s/def ::object
(s/and (s/and
::owl/Class
::owl/ObjectProperty ::owl/ObjectProperty
::Object (map-class-spec
::Link)) (s/or
:object ::Object
:link ::Link))))
;http://www.w3.org/ns/activitystreams#object ;http://www.w3.org/ns/activitystreams#object
(s/def ::Object (defmulti object-type map?)
(s/and ::owl/Class (defmethod object-type true [_]
(sh/map-spec (s/keys :opt-un [::id])))) (s/and ::Class
(s/keys :opt-un [::id])))
(defmethod object-type false [_]
(s/and ::Class))
(s/def ::Object object-type)
;http://www.w3.org/ns/activitystreams#Link ;http://www.w3.org/ns/activitystreams#Link
;TODO: definition in progress ;TODO: definition in progress
(s/def ::Link (defmulti link-type map?)
(s/and ::owl/Class (defmethod link-type true [_]
(sh/map-spec (s/keys :opt-un [::id])))) (s/and ::Class
(s/keys :opt-un [::id])))
(defmethod link-type false [_]
(s/and ::Class))
(s/def ::Link link-type)

View file

@ -15,7 +15,8 @@
(defn-spec owl-class? boolean? (defn-spec owl-class? boolean?
[elem any?] [elem any?]
(or (p/uri-string? elem) (or (p/uri-string? elem)
(coll? elem))) (map? elem)
(vector? elem)))
(s/def ::Class owl-class?) (s/def ::Class owl-class?)
;http://www.w3.org/2002/07/owl#DatatypeProperty ;http://www.w3.org/2002/07/owl#DatatypeProperty

View file

@ -1,14 +0,0 @@
(ns org.domaindrivenarchitecture.activity-pub-poc.spec-helper
"A swallow spec translation implementation of owl. Inheritance of FunctionalProperty
is realized in deep implemented."
(:require
[clojure.spec.alpha :as s]
[orchestra.core :refer [defn-spec]]))
(defn-spec map-spec s/spec?
"Spec that applies only for map values."
[spec s/spec?]
(s/and
(s/or
:no-map #(not (map? %))
:map spec)))

View file

@ -16,6 +16,7 @@
(is (not (s/valid? ::sut/id "no-uri"))) (is (not (s/valid? ::sut/id "no-uri")))
(is (not (s/valid? ::sut/id ["https://social.bla/alyssa/status/RANDOMHASH", "https://social.bla/alyssa/status/RANDOMHASH2"])))) (is (not (s/valid? ::sut/id ["https://social.bla/alyssa/status/RANDOMHASH", "https://social.bla/alyssa/status/RANDOMHASH2"]))))
;TODO: where does the ability for a link reference come from ?
(deftest object-test (deftest object-test
(is (s/valid? ::sut/object "http://example.org/posts/1")) (is (s/valid? ::sut/object "http://example.org/posts/1"))
(is (s/valid? ::sut/object {:type "Note", (is (s/valid? ::sut/object {:type "Note",
@ -25,6 +26,9 @@
:summary "A simple note", :summary "A simple note",
:content "That is a tree."}]))) :content "That is a tree."}])))
(deftest class-test
(is (s/valid? ::sut/Class "https://social.bla/alyssa/status/RANDOMHASH")))
(deftest result-test (deftest result-test
(is (s/valid? ::sut/result "https://social.bla/alyssa/result/RANDOMHASH")) (is (s/valid? ::sut/result "https://social.bla/alyssa/result/RANDOMHASH"))
(is (s/valid? ::sut/result {:type "http://www.types.example/flightstatus", :name "On Time"})) (is (s/valid? ::sut/result {:type "http://www.types.example/flightstatus", :name "On Time"}))

View file

@ -19,7 +19,3 @@
(is (sut/owl-class? [])) (is (sut/owl-class? []))
(is (not (sut/owl-class? "str"))) (is (not (sut/owl-class? "str")))
(is (not (sut/owl-class? nil)))) (is (not (sut/owl-class? nil))))
(deftest class-test
(is (s/valid? ::sut/Class "https://social.bla/alyssa/status/RANDOMHASH"))
(is (s/valid? ::sut/Class {})))