1650 lines
118 KiB
HTML
1650 lines
118 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../../coverage.css"/> <title> dog_and_duck/quack/picky.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns dog-and-duck.quack.picky "Fault-finder for ActivityPub documents.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 Generally, each `-faults` function will return:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 1. `nil` if no faults were found;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 2. a sequence of fault objects if faults were found.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 Each fault object shall have the properties:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 1. `:@context` whose value shall be the URL of a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 document specifying this vocabulary;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 2. `:type` whose value shall be `Fault`;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 3. `:severity` whose value shall be one of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 `info`, `minor`, `should`, `must` or `critical`;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 4. `:fault` whose value shall be a unique token
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 representing the particular fault type;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 5. `:narrative` whose value shall be a natural
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 language description of the fault type.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 Note that the reason for the `:fault` property is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 to be able to have a well known place, linked to
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 from the @context URL, which allows narratives
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 for each fault type to be served in as many
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 natural languages as possible.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 The idea further is that it should ultimately be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 possible to serialise a fault report as a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
028 document which in its own right conforms to the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 ActivityStreams spec."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 (:require [clojure.set :refer [intersection]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 [dog-and-duck.quack.fault-messages :refer [messages]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 [dog-and-duck.utils.process :refer [get-hostname get-pid]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 [taoensso.timbre :as timbre
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
034 ;; Optional, just refer what you like:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 :refer [warn]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 [clojure.data.json :as json])
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
037 (:import [java.net URI URISyntaxException]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
038
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 ;;; Copyright (C) Simon Brooke, 2022
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
040
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 ;;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 ;;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 ;;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 ;;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
045
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
046 ;;; This program is distributed in the hope that it will be useful,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
048 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 ;;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
050
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 ;;; You should have received a copy of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 ;;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 ;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
054
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 ;; ERRATA
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
056
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
057 (def ^:dynamic *reify-refs*
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
058 "If `true`, references to objects in fields will be reified and validated.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
059 If `false`, they won't, but an `:info` level fault report will be generated.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
060
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
061 There are several things in the spec which, in a document, may correctly be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 either
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
064 1. a fully fleshed out object, or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
065 2. a URI pointing to such an object.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 Obviously to fully validate a document we ought to reify all the refs and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
068 check that they are themselves valid, but
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 a. in some of the published test documents the URIs do not reference a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 valid document;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 b. there will be performance costs to reifying all the refs;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 c. in perverse cases, reifying refs might result in runaway recursion.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
074
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
075 TODO: I think that in production this should default to `true`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
076 false)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
077
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
078 (def ^:dynamic *reject-severity*
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
079 "The severity at which the binary validator will return `false`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
080
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
081 In practice documents seen in the wild do not typically appear to be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
082 fully valid, and this does not matter. This allows the sensitivity of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
083 the binary validator (`dog-and-duck.quack.quack`) to be tuned. It's in
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 this (`dog-and-duck.quack.picky`) namespace, not that one, because this
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
085 namespace is where concerns about severity are handled."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 :must)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
087
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
088 (def ^:const context-key
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
089 "The Clojure reader barfs on `:@context`, although it is in principle a valid
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
090 keyword. So we'll make it once, here, to make the code more performant and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
091 easier to read."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
092 (keyword "@context"))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
093
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
094 (def ^:const severity
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
095 "Severity of faults found, as follows:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
096
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
097 0. `:info` not actually a fault, but an issue noted during validation;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
098 1. `:minor` things which I consider to be faults, but which
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
099 don't actually breach the spec;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
100 2. `:should` instances where the spec says something SHOULD
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
101 be done, which isn't;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
102 3. `:must` instances where the spec says something MUST
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
103 be done, which isn't;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
104 4. `:critical` instances where I believe the fault means that
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
105 the object cannot be meaningfully processed."
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
106 #{:info :minor :should :must :critical})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
107
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
108 (def ^:const severity-filters
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 "Hack for implementing a severity hierarchy"
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
110 {:all #{}
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
111 :info #{}
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
112 :minor #{:info}
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
113 :should #{:info :minor}
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
114 :must #{:info :minor :should}
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
115 :critical severity})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
116
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
117 (defn truthy?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
118 "Return `true` if `x` is truthy, else `false`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
119 [x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
120 (if x true false))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
121
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
122 (defn has-type?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
123 "Return `true` if object `x` has type `type`, else `false`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
124
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
125 The values of `type` fields of ActivityStreams objects may be lists; they
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
126 are considered to have a type if the type token is a member of the list."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
127 [x type]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 18 forms covered">
|
|
128 (assert (map? x) (string? type))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
129 (let [tv (:type x)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
130 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 14 forms covered">
|
|
131 (coll? tv) (truthy? (not-empty (filter #(= % type) tv)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
132 :else (= tv type))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
133
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
134 (defn filter-severity
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
135 "Return a list of reports taken from these `reports` where the severity
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
136 of the report is greater than this or equal to this `severity`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
137 [reports severity]
|
|
</span><br/>
|
|
<span class="partial" title="6 out of 7 forms covered">
|
|
138 (cond (nil? reports) nil
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 10 forms covered">
|
|
139 (and
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
140 (coll? reports)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
141 (every? map? reports)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
142 (every? :severity reports)) (remove
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
143 #((severity-filters severity) (:severity %))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
144 reports)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
146 (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
147 (ex-info
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
148 "Argument `reports` was not a collection of fault reports"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
149 {:arguments {:reports reports
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
150 :severity severity}}))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
151
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
152 (def ^:const activitystreams-context-uri
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
153 "The URI of the context of an ActivityStreams object is expected to be this
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
154 literal string."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
155 "https://www.w3.org/ns/activitystreams")
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
156
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
157 (def ^:const validation-fault-context-uri
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
158 "The URI of the context of a validation fault report object shall be this
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
159 literal string."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
160 "https://simon-brooke.github.io/dog-and-duck/codox/Validation_Faults.html")
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
161
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
162 (defn context?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
163 "Returns `true` iff `x` quacks like an ActivityStreams context, else false.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
164
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
165 A context is either
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
166 1. the URI (actually an IRI) `activitystreams-context-uri`, or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
167 2. a collection comprising that URI and a map."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
168 [x]
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 6 forms covered">
|
|
169 (cond
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
170 (nil? x) false
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
171 (string? x) (and (= x activitystreams-context-uri) true)
|
|
</span><br/>
|
|
<span class="partial" title="19 out of 20 forms covered">
|
|
172 (coll? x) (and (context? (first (remove map? x)))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
173 (= (count x) 2)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
174 true)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
175 :else false))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
176
|
|
</span><br/>
|
|
<span class="covered" title="33 out of 33 forms covered">
|
|
177 (defmacro has-context?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
178 "True if `x` is an ActivityStreams object with a valid context, else `false`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
179 [x]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
180 `(context? (context-key ~x)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
181
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
182 (defn make-fault-object
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
183 "Return a fault object with these `severity`, `fault` and `narrative` values.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
184
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
185 An ActivityPub object MUST have a globally unique ID. Whether this is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
186 meaningful depends on whether we persist fault report objects and serve
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
187 them, which at present I have no plans to do."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
188 ;; TODO: should not pass in the narrative; instead should use the :fault value
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
189 ;; to look up the narrative in a resource file.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
190 [severity fault]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
191 (assoc {}
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
192 context-key validation-fault-context-uri
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
193 :id (str "https://"
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
194 (get-hostname)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
195 "/fault/"
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
196 (get-pid)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
197 ":"
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
198 (inst-ms (java.util.Date.)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
199 :type "Fault"
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
200 :severity severity
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
201 :fault fault
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 8 forms covered">
|
|
202 :narrative (or (messages fault)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
203 (do
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 17 forms covered">
|
|
204 (warn "No narrative provided for fault token " fault)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
205 (str fault)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
206
|
|
</span><br/>
|
|
<span class="partial" title="62 out of 68 forms covered">
|
|
207 (defmacro nil-if-empty
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
208 "if `x` is an empty collection, return `nil`; else return `x`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
209 [x]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
210 `(if (and (coll? ~x) (empty? ~x)) nil
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
211 ~x))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
212
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
213 (defn has-type-or-fault
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
214 "If object `x` has a `:type` value which is `acceptable`, return `nil`;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
215 else return a fault object with this `severity` and `token`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
216
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
217 `acceptable` may be passed as either nil, a string, or a set of strings.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
218 If `acceptable` is `nil`, no type specific tests will be performed."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
219 [x acceptable severity token]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
220 (when acceptable
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
221 (let [tv (:type x)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
222 (when-not
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
223 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 13 forms covered">
|
|
224 (and (string? tv) (string? acceptable)) (= tv acceptable)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 13 forms covered">
|
|
225 (and (string? tv) (set? acceptable)) (acceptable tv)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 15 forms covered">
|
|
226 (and (coll? tv) (string? acceptable)) ((set tv) acceptable)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
227 (and (coll? tv) (set? acceptable)) (not-empty
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
228 (intersection (set tv) acceptable))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
229 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
230 (throw (ex-info "Type value or `acceptable` argument not as expected."
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
231 {:arguments {:x x
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
232 :acceptable acceptable
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
233 :severity severity
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
234 :token token}})))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
235 (make-fault-object severity token)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
236
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
237 (defn object-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
238 "Return a list of faults found in object `x`, or `nil` if none are.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
239
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
240 If `expected-type` is also passed, verify that `x` has `expected-type`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
241 `expected-type` may be passed as a string or as a set of strings."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
242 ([x]
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 8 forms covered">
|
|
243 (nil-if-empty
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
244 (remove empty?
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
245 (list
|
|
</span><br/>
|
|
<span class="covered" title="18 out of 18 forms covered">
|
|
246 (when-not (map? x)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
247 (make-fault-object :critical :not-an-object))
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
248 (when-not
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
249 (has-context? x)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
250 (make-fault-object :should :no-context))
|
|
</span><br/>
|
|
<span class="covered" title="18 out of 18 forms covered">
|
|
251 (when-not (:type x)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
252 (make-fault-object :minor :no-type))
|
|
</span><br/>
|
|
<span class="covered" title="42 out of 42 forms covered">
|
|
253 (when-not (and (map? x) (contains? x :id))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
254 (make-fault-object :minor :no-id-transient))))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
255 ([x expected-type]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
256 (nil-if-empty
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
257 (remove empty?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
258 (concat
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
259 (object-faults x)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
260 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
261 ;; TODO: should resolve the correct `-faults`function for the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
262 ;; `expected-type` and call that; but that's for later.
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 18 forms covered">
|
|
263 (has-type-or-fault x expected-type :critical :unexpected-type)))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
264
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
265 (defn uri-or-fault
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
266 "If `u` is not a valid URI, return a fault object with this `severity` and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
267 `if-invalid-token`. If it's `nil`, return a fault object with this `severity`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
268 and `if-missing-token`. Otherwise return nil."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
269 ([u severity if-missing-token]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
270 (uri-or-fault u severity if-missing-token if-missing-token))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
271 ([u severity if-missing-token if-invalid-token]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
272 (try
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
273 (if (uri? (URI. u))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
274 nil
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
275 (make-fault-object severity if-invalid-token))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
276 (catch URISyntaxException _
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
277 (make-fault-object severity if-invalid-token))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
278 (catch NullPointerException _
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
279 (make-fault-object severity if-missing-token)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
280
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
281 (defn persistent-object-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
282 "Return a list of faults found in persistent object `x`, or `nil` if none are."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
283 [x]
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 8 forms covered">
|
|
284 (nil-if-empty
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
285 (remove empty?
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
286 (concat
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
287 (object-faults x)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
288 (list
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
289 (if (contains? x :id)
|
|
</span><br/>
|
|
<span class="covered" title="18 out of 18 forms covered">
|
|
290 (try (let [id (URI. (:id x))]
|
|
</span><br/>
|
|
<span class="covered" title="18 out of 18 forms covered">
|
|
291 (when-not (= (.getScheme id) "https")
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
292 (make-fault-object :should :id-not-https)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
293 (catch URISyntaxException _
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
294 (make-fault-object :must :id-not-uri))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
295 (catch NullPointerException _
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
296 (make-fault-object :must :null-id-persistent)))
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
297 (make-fault-object :must :no-id-persistent)))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
298
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
299 (def ^:const actor-types
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
300 "The set of types we will accept as actors.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
301
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
302 There's an [explicit set of allowed actor types]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
303 (https://www.w3.org/TR/activitystreams-vocabulary/#actor-types)."
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
304 #{"Application"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
305 "Group"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
306 "Organization"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
307 "Person"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
308 "Service"})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
309
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
310 (defn actor-type?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
311 "Return `true` if the `x` is a recognised actor type, else `false`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
312 [^String x]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
313 (if (actor-types x) true false))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
314
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
315 (defn has-actor-type?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
316 "Return `true` if the object `x` has a type which is an actor type, else
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
317 `false`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
318 [x]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
319 (let [tv (:type x)]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
320 (cond
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 11 forms covered">
|
|
321 (coll? tv) (truthy? (not-empty (filter actor-type? tv)))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
322 :else (actor-type? tv))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
323
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
324 (defn actor-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
325 "Return a list of faults found in actor `x`, or `nil` if none are."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
326 [x]
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 8 forms covered">
|
|
327 (nil-if-empty
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
328 (remove empty?
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
329 (concat (persistent-object-faults x)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
330 (list
|
|
</span><br/>
|
|
<span class="covered" title="18 out of 18 forms covered">
|
|
331 (when-not (has-actor-type? x)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
332 (make-fault-object :must :not-actor-type))
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
333 (uri-or-fault
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
334 (:inbox x) :must :no-inbox :invalid-inbox-uri)
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
335 (uri-or-fault
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
336 (:outbox x) :must :no-outbox :invalid-outbox-uri))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
337
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
338 (def ^:const verb-types
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
339 "The set of types we will accept as verbs.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
340
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
341 There's an [explicit set of allowed verb types]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
342 (https://www.w3.org/TR/activitystreams-vocabulary/#activity-types)."
|
|
</span><br/>
|
|
<span class="covered" title="29 out of 29 forms covered">
|
|
343 #{"Accept" "Add" "Announce" "Arrive" "Block" "Create" "Delete" "Dislike"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
344 "Flag" "Follow" "Ignore" "Invite" "Join" "Leave" "Like" "Listen" "Move"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
345 "Offer" "Question" "Reject" "Read" "Remove" "TentativeAccept"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
346 "TentativeReject" "Travel" "Undo" "Update" "View"})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
347
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
348 (defn verb-type?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
349 "`true` if `x`, a string, represents a recognised ActivityStreams activity
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
350 type."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
351 [^String x]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
352 (if (verb-types x) true false))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
353
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
354 (defn has-activity-type?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
355 "Return `true` if the object `x` has a type which is an activity type, else
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
356 `false`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
357 [x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
358 (let [tv (:type x)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
359 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
360 (coll? tv) (truthy? (not-empty (filter verb-type? tv)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
361 :else (actor-type? tv))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
362
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
363 (defn string-or-fault
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
364 "If this `value` is not a string, return a fault object with this `severity`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
365 and `token`, else `nil`. If `pattern` is also passed, it is expected to be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
366 a Regex, and the fault object will be returned unless `value` matches the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
367 `pattern`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
368 ([value severity token]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 10 forms covered">
|
|
369 (when-not (string? value) (make-fault-object severity token)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
370 ([value severity token pattern]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 14 forms covered">
|
|
371 (when not (and (string? value) (re-matches pattern value))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
372 (make-fault-object severity token))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
373
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
374 (defn link-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
375 "A link object is required to have an `href` property. It may have all of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
376 `rel` | `mediaType` | `name` | `hreflang` | `height` | `width` | `preview`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
377 but I *think* they're all optional."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
378 [x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
379 (list
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
380 (uri-or-fault
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
381 (:href x) :must :no-href-uri :invalid-href-uri)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
382 (string-or-fault (:mediaType x) :minor :no-media-type #"\w+\/[-+.\w]+")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
383 ;; TODO: possibly more here. Audit against the specs
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
384 ))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
385
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
386 (defn object-reference-or-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
387 "If this `value` is either
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
388
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
389 1. an object of `expected-type`;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
390 2. a URI referencing an object of `expected-type`; or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
391 3. a link object referencing an object of `expected-type`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
392
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
393 and no faults are returned from validating the linked object, then return
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
394 `nil`; else return a sequence comprising a fault object with this `severity`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
395 and `token`, prepended to the faults returned.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
396
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
397 As with `has-type-or-fault` (q.v.), `expected-type` may be passed as a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
398 string or as a set of strings.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
399
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
400 **NOTE THAT** if `*reify-refs*` is `false`, referenced objects will not
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
401 actually be checked."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
402 [value expected-type severity token]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
403 (let [faults (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
404 (string? value) (try (let [uri (URI. value)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
405 object (when *reify-refs*
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
406 (json/read-str (slurp uri)))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
407 (when object
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
408 (object-faults object expected-type)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
409 (catch URISyntaxException _
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
410 (make-fault-object severity token)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
411 (map? value) (if (has-type? value "Link")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
412 (cond
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
413 ;; if we were looking for a link and we've
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
414 ;; found a link, that's OK.
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
415 (= expected-type "Link") nil
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 10 forms covered">
|
|
416 (and (set? expected-type) (expected-type "Link")) nil
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
417 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
418 (object-reference-or-faults
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
419 (:href value) expected-type severity token))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
420 (object-faults value expected-type))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
421 :else (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
422 (ex-info
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
423 "Argument `value` was not an object or a link to an object"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
424 {:arguments {:value value}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
425 :expected-type expected-type
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
426 :severity severity
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
427 :token token})))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 10 forms covered">
|
|
428 (when faults (cons (make-fault-object severity token) faults))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
429
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
430 (defn link-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
431 "Return a list of faults found in the link `x`, or `nil` if none are found."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
432 [x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
433 (object-reference-or-faults x "Link" :critical :expected-link))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
434
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
435 (defn coll-object-reference-or-fault
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
436 "As object-reference-or-fault, except `value` argument may also be a list of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
437 objects and/or object references."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
438 [value expected-type severity token]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
439 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
440 (map? value) (object-reference-or-faults value expected-type severity token)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
441 (coll? value) (nil-if-empty
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
442 (remove nil?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
443 (reduce concat
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
444 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
445 #(object-reference-or-faults
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
446 % expected-type severity token)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
447 value))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
448 :else (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
449 (ex-info
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
450 "Argument `value` was not an object, a link to an object, nor a list of these."
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
451 {:arguments {:value value}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
452 :expected-type expected-type
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
453 :severity severity
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
454 :token token}))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
455
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
456 (def ^:const base-activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
457 "Properties most activities should have. Values are validating functions, each.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
458
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
459 See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-activity"
|
|
</span><br/>
|
|
<span class="partial" title="5 out of 11 forms covered">
|
|
460 {:summary (fn [v] (when-not (string? v)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
461 (list (make-fault-object :should :no-summary))))
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 7 forms covered">
|
|
462 :actor (fn [v] (object-reference-or-faults v actor-types :must :no-actor))
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 7 forms covered">
|
|
463 :object (fn [v] (object-reference-or-faults v nil :must :no-object))})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
464
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
465 (def ^:const intransitive-activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
466 "Properties intransitive activities should have.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
467
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
468 See https://www.w3.org/TR/activitystreams-vocabulary/#dfn-intransitiveactivity"
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
469 (dissoc base-activity-required-properties :object))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
470
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
471 (def ^:const accept-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
472 "As base-activity-required-properties, except that the type of the object
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
473 is restricted."
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
474 (assoc base-activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
475 :object
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
476 (fn [v]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
477 (object-reference-or-faults v #{"Invite" "Person"}
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
478 :must
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
479 :bad-accept-target))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
480
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
481 (def ^:const activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
482 "Properties activities should have, keyed by activity type. Values are maps
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
483 of the format of `base-activity-required-properties`, q.v."
|
|
</span><br/>
|
|
<span class="covered" title="30 out of 30 forms covered">
|
|
484 {"Accept" accept-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
485 "Add" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
486 "Announce" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
487 "Arrive" intransitive-activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
488 ;; TODO: is `:location` required for arrive?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
489 "Block" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
490 "Create" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
491 "Delete" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
492 "Dislike" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
493 "Flag" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
494 "Follow" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
495 ;; TODO: is `:object` required to be an actor?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
496 "Ignore" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
497 "Invite" (assoc base-activity-required-properties :target
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
498 (fn [v]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
499 (coll-object-reference-or-fault v #{"Event" "Group"}
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
500 :must
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
501 :bad-accept-target)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
502 ;; TODO: are here other things one could meaningfully be invited to?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
503 "Join" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
504 "Leave" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
505 "Like" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
506 "Listen" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
507 "Move" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
508 "Offer" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
509 "Question" intransitive-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
510 "Reject" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
511 "Read" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
512 "Remove" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
513 "TentativeReject" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
514 "TentativeAccept" accept-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
515 "Travel" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
516 "Undo" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
517 "Update" base-activity-required-properties
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
518 "View" base-activity-required-properties})
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
519
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
520 (defn activity-type-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
521 "Return a list of faults found in the activity `x`; if `type` is also
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
522 specified, it should be a string naming a specific activity type for
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
523 which checks should be performed.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
524
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
525 Some specific activity types have specific requirements which are not
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
526 requirements."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
527 ([x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
528 (if (coll? (:type x))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 10 forms covered">
|
|
529 (map #(activity-type-faults x %) (:type x))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
530 (activity-type-faults x (:type x))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
531 ([x type]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
532 (let [checks (activity-required-properties type)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
533 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
534 #(apply (checks %) (x %))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
535 (keys checks)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
536
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
537 (defn activity-faults
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
538 [x]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
539 (nil-if-empty
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
540 (remove empty?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 15 forms covered">
|
|
541 (concat (persistent-object-faults x)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
542 (activity-type-faults x)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
543 (list
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
544 (when-not
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
545 (has-activity-type? x)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
546 (make-fault-object :must :not-activity-type))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 36 forms covered">
|
|
547 (when-not (string? (:summary x)) (make-fault-object :should :no-summary)))))))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|