From d572a8c05e90d1a7f0d91d0afdc72b6269bda702 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Fri, 28 Jul 2023 16:55:41 +0200 Subject: [PATCH] catch up the idea of map-class-spec --- .../activity_pub_poc/activitystreams2.cljc | 69 +++++++------------ .../activity_pub_poc/owl.cljc | 3 +- .../activity_pub_poc/spec_helper.cljc | 14 ++++ .../activitystreams2_test.clj | 1 - 4 files changed, 40 insertions(+), 47 deletions(-) create mode 100644 src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/spec_helper.cljc 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 985d113..1ec80a9 100644 --- a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2.cljc @@ -1,6 +1,7 @@ (ns org.domaindrivenarchitecture.activity-pub-poc.activitystreams2 (:require [clojure.spec.alpha :as s] [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.xsd :as xsd])) @@ -10,16 +11,6 @@ [spec keyword?] (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? @@ -33,47 +24,46 @@ ;http://www.w3.org/ns/activitystreams#object (s/def ::Object (s/and - ::Class - (s/keys :opt-un [::id ::type ::attachment]))) + ::owl/Class + (sh/map-spec (s/keys :opt-un [::id ::type ::attachment])))) ;http://www.w3.org/ns/activitystreams#Link (s/def ::Link (s/and - ::Class - (s/keys :opt-un [::id ::type]))) + ::owl/Class + (sh/map-spec (s/keys :opt-un [::id ::type])))) ;http://www.w3.org/ns/activitystreams#Activity ;TODO: Define more properties necessary for Like (s/def ::Activity (s/and - ::Class + ::owl/Class ::Object - (s/keys :opt-un [::result ::object]))) + (sh/map-spec (s/keys :opt-un [::result ::object])))) ;http://www.w3.org/ns/activitystreams#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? (s/def ::Relationship (s/and - ::Class + ::owl/Class ::Object - (s/keys :opt-un [::object]))) + (sh/map-spec (s/keys :opt-un [::object])))) ;http://www.w3.org/ns/activitystreams#Like (s/def ::Like (s/and - ::Class + ::owl/Class ::Activity)) ;http://www.w3.org/ns/activitystreams#attachment ; TODO: Why do we need to model this? Is this necessary for a Like-Activity? (s/def ::attachment (s/and + ::owl/Class ::owl/ObjectProperty - (map-class-spec - (s/or - :object ::Object - :link ::Link)))) + ::Object + ::Link)) ;http://www.w3.org/ns/activitystreams#id (s/def ::id @@ -92,38 +82,29 @@ ;http://www.w3.org/ns/activitystreams#result (s/def ::result (s/and + ::owl/Class ::owl/ObjectProperty - (map-class-spec - (s/or :object ::Object - :link ::Link)))) + ::Object + ::Link)) ;http://www.w3.org/ns/activitystreams#object (s/def ::object (s/and + ::owl/Class ::owl/ObjectProperty - (map-class-spec - (s/or - :object ::Object - :link ::Link)))) + ::Object + ::Link)) ;http://www.w3.org/ns/activitystreams#object -(defmulti object-type map?) -(defmethod object-type true [_] - (s/and ::Class - (s/keys :opt-un [::id]))) -(defmethod object-type false [_] - (s/and ::Class)) -(s/def ::Object object-type) +(s/def ::Object + (s/and ::owl/Class + (sh/map-spec (s/keys :opt-un [::id])))) ;http://www.w3.org/ns/activitystreams#Link ;TODO: definition in progress -(defmulti link-type map?) -(defmethod link-type true [_] - (s/and ::Class - (s/keys :opt-un [::id]))) -(defmethod link-type false [_] - (s/and ::Class)) -(s/def ::Link link-type) +(s/def ::Link + (s/and ::owl/Class + (sh/map-spec (s/keys :opt-un [::id])))) 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 0113755..86fce47 100644 --- a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/owl.cljc @@ -15,8 +15,7 @@ (defn-spec owl-class? boolean? [elem any?] (or (p/uri-string? elem) - (map? elem) - (vector? elem))) + (coll? elem))) (s/def ::Class owl-class?) ;http://www.w3.org/2002/07/owl#DatatypeProperty diff --git a/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/spec_helper.cljc b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/spec_helper.cljc new file mode 100644 index 0000000..cfebc7e --- /dev/null +++ b/src/main/cljc/org/domaindrivenarchitecture/activity_pub_poc/spec_helper.cljc @@ -0,0 +1,14 @@ +(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))) \ 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 index 72a6d86..10f0dc3 100644 --- a/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_test.clj +++ b/src/test/cljc/org/domaindrivenarchitecture/activity_pub_poc/activitystreams2_test.clj @@ -16,7 +16,6 @@ (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"])))) -;TODO: where does the ability for a link reference come from ? (deftest object-test (is (s/valid? ::sut/object "http://example.org/posts/1")) (is (s/valid? ::sut/object {:type "Note",