Exits if no builds are detected

Exits if no builds are detected

--- plugin/src/leiningen/figwheel.clj
+++ plugin/src/leiningen/figwheel.clj
@@ -56,16 +56,20 @@
         (catch Exception e#
           (do
             (.printStackTrace e#)
-           (System/exit 1))))
+            (System/exit 1))))
      requires)))

 (defn run-compiler [project {:keys [all-builds build-ids] :as autobuild-opts}]
-  (run-local-project
-   project all-builds
-   '(require 'figwheel-sidecar.repl-api)
-   `(do
-      (figwheel-sidecar.repl-api/system-asserts)
-      (figwheel-sidecar.repl-api/start-figwheel-from-lein '~autobuild-opts))))
+  (if (empty? all-builds)
+    (do
+      (println "\nFigwheel: No builds detected. Exiting ...")
+      (System/exit 1))
+    (run-local-project
+     project all-builds
+     '(require 'figwheel-sidecar.repl-api)
+     `(do
+        (figwheel-sidecar.repl-api/system-asserts)
+        (figwheel-sidecar.repl-api/start-figwheel-from-lein '~autobuild-opts)))))

 (defn figwheel-edn? [] (.exists (io/file "figwheel.edn")))


Refactors and fixes bugs

Refactors and fixes bugs

--- src/expound/spec.cljs
+++ src/expound/spec.cljs
@@ -1,5 +1,5 @@
 (ns expound.spec
-  "Drop-in replacement for clojure.spec.alpha, with
+  "Drop-in replacement for clojure.spec.alpha, with
   human-readable `explain` function"
   (:require [clojure.data]
             [cljs.spec.alpha :as s]
@@ -16,17 +16,7 @@

 (def header-size 35)
 (def section-size 25)
-
-(defn pprint-str [x]
-  (pprint/write x :stream nil))
-
 (def indent-level 2)
-
-(defn no-trailing-whitespace [s]
-  (->> s
-       string/split-lines
-       (map string/trimr)
-       (string/join "\n")))

 (def headers {:problem/missing-key   "Spec failed"
               :problem/not-in-set    "Spec failed"
@@ -34,7 +24,24 @@
               :problem/regex-failure "Syntax error"
               :problem/unknown       "Spec failed"})

+(defn pprint-str
+  "Returns the pretty-printed string"
+  [x]
+  (pprint/write x :stream nil))
+
+(defn no-trailing-whitespace
+  "Given an potentially multi-line string, returns that string with all
+  trailing whitespace removed."
+  [s]
+  (->> s
+       string/split-lines
+       (map string/trimr)
+       (string/join "\n")))
+
 (defn indent
+  "Given an potentially multi-line string, returns that string indented by
+   'indent-level' spaces. Optionally, can indent first line and other lines
+   different amounts."
   ([s]
    (indent indent-level s))
   ([indent-level s]
@@ -46,7 +53,7 @@
                         (map #(str (apply str (repeat rest-lines-indent " ")) %) lines))))))

 (defn prefix-path?
-  "True iff partial-path is a prefix of full-path."
+  "True if partial-path is a prefix of full-path."
   [partial-path full-path]
   (and (< (count partial-path) (count full-path))
        (= partial-path
@@ -60,7 +67,8 @@
 (def mapv-indexed (comp vec map-indexed))

 (defn walk-with-path
-  "Like walk but passes both the path and current value to inner and outer."
+  "Recursively walks data structure. Passes both the path and current
+   value to 'inner' and 'outer' functions"
   ([inner outer path form]
    (cond
      (vector? form) (outer path (mapv-indexed (fn [idx x] (inner (conj path idx) x)) form))
@@ -76,7 +84,9 @@
   ([f path form]
    (walk-with-path (partial postwalk-with-path f) f path form)))

-(defn kps-path? [x]
+(defn kps-path?
+  "True if path points to a key"
+  [x]
   (and (vector? x)
        (kps? (last x))))

@@ -103,7 +113,9 @@
        ::irrelevant))
    form))

-(defn highlight-line [prefix replacement]
+;; TODO - this function is not intuitive.
+(defn highlight-line
+  [prefix replacement]
   (let [max-width (apply max (map #(count (str %)) (string/split-lines replacement)))]
     (indent (count (str prefix))
             (apply str (repeat max-width "^")))))
@@ -190,7 +202,7 @@
 should have additional elements. The next element is named `%s` and satisfies

 %s"
-   (indent (value-in-context val path (:val problem)))
+   (indent (value-in-context val path))
    (pr-str (first (:path problem)))
    (indent (:pred problem))))

@@ -256,7 +268,7 @@
  Dispatch function:     `%s`
  Dispatch value:        `%s`
  "
-     (indent (value-in-context val path (:val problem)))
+     (indent (value-in-context val path))
      (pr-str mm)
      (pr-str retag)
      (pr-str (if retag (retag (value-in val path)) nil)))))
@@ -274,7 +286,7 @@

 %s"
    (header-label "Spec failed")
-   (indent (value-in-context val path (:val (first problems))))
+   (indent (value-in-context val path))
    (string/join "," (map #(str "`" (missing-key (:pred %)) "`") problems))
    (relevant-specs problems)))

@@ -405,6 +417,7 @@
         _ (doseq [problem problems]
             (s/assert (s/nilable #{"Insufficient input" "Extra input" "no method"}) (:reason problem)))
         leaf-problems (leaf-problems (map (partial adjust-in form) (::s/problems (s/explain-data spec form))))
+
         _ (assert (every? :in1 leaf-problems) leaf-problems)
         grouped-problems (sort (path+problem-type->problems leaf-problems))]
     (if (empty? problems)


Update server.clj

Update server.clj

--- src/falkor/server.clj
+++ src/falkor/server.clj
@@ -27,7 +27,7 @@
 ;; ROUTES

 ;; 1. Get a page basic structure and information
-;; Query (get all images) /api/page?query=img
+;; 2. Run a CSS selector query e.g. get all images) => /api/page?query=img

 (defroutes app-routes
   (GET "/api/query" {params :query-params}


Performance optimizations for remote solution: it too long to collect response/diff after evolving

--- src/flatgui/focus.clj
+++ src/flatgui/focus.clj
@@ -60,6 +60,8 @@
             (inc i)))
         (sort-lines lines)))))

+;;; Sorts focusable components so that they are traversed in left->right, up->down direction.
+;;; To make such ad order, arranges components in a vector of horizontal "lines"
 (fg/defevolverfn :focus-traversal-order
   (let [accepting-children (get-accepting-children (get-property [:this] :children))]
     (if (pos? (count accepting-children))
@@ -110,7 +112,7 @@
      :focused-child child-id}
     (throw (IllegalArgumentException. (str "child-id must be a keyword but is: " child-id)))))

-;; For :parent-of-focused and :has-focus the latest focus movent direction (if any) is tracked in :throw-mode
+;;; For :parent-of-focused and :has-focus the latest focus movent direction (if any) is tracked in :throw-mode
 (defn focus-child-by-direction [child-id dir]
   (assoc (focus-child child-id) :throw-mode dir))


Modify config a bit.

Modify config a bit.

Define reset! and default config to reset to.
Rename assoc and merge to assoc! and merge.

--- src/incise/config.clj
+++ src/incise/config.clj
@@ -3,22 +3,27 @@
             [clojure.edn :as edn]
             [manners.victorian :refer [defmannerisms]])
   (:import [java.io PushbackReader])
-  (:refer-clojure :exclude [merge load assoc get]))
+  (:refer-clojure :exclude [reset! load assoc! get]))

-(defonce config (atom {:in-dir "content"
-                       :uri-root ""
-                       :out-dir "public"}))
+(def ^:private default-config
+  {:in-dir "content"
+   :uri-root ""
+   :out-dir "public"})
+
+(defonce config (atom default-config))
+
+(defn reset! [] (clojure.core/reset! config default-config))

 (defn get [& more]
   (if (empty? more)
     @config
     (apply @config more)))

-(defn merge [& more]
+(defn merge! [& more]
   (apply swap! config
          clojure.core/merge more))

-(defn assoc [& more]
+(defn assoc! [& more]
   (apply swap! config clojure.core/assoc more))

 (defonce config-path (atom nil))
@@ -28,9 +33,9 @@
 (defn load
   "Load the config from "
   [& [path-to-config]]
-  (when path-to-config (reset! config-path path-to-config))
+  (when path-to-config (clojure.core/reset! config-path path-to-config))
   (when-let [config-file (file (or @config-path (resource "incise.edn")))]
-    (merge (edn/read (PushbackReader. (reader config-file))))))
+    (merge! (edn/read (PushbackReader. (reader config-file))))))

 (defn- str-starts-or-ends-with-slash?
   [a-str]


Update docstring

Update docstring

--- src/io/perun/core.clj
+++ src/io/perun/core.clj
@@ -18,7 +18,7 @@
   (into {} (for [d data] [(:path d) d])))

 (defn set-meta
-  "Update `+meta-key+` metadata for the fileset and return updates fileset"
+  "Update `+meta-key+` metadata for files in `data` and return updates fileset"
   [fileset data]
   (boot/add-meta fileset (into {} (for [d data] [(:path d) {+meta-key+ d}]))))


bugfix: destructuring is broken

bugfix: destructuring is broken

--- src/mojo_ui/core.cljs
+++ src/mojo_ui/core.cljs
@@ -34,7 +34,7 @@
 (defn tabs
   "A tab component,
   If tab-index is string, convert it to number first using tab keys."
-  [{:key [key]} & children]
+  [{:keys [key]} & children]
   (let [cur @(subscribe [:tab-index key])
         title-list (map get-title children)
         key-map (into {} (map #(if-let [key (get-key %1)]


deref vars in util/run-handler so that arg-count works correctly

--- src/overtone/util.clj
+++ src/overtone/util.clj
@@ -83,11 +83,13 @@
     (alength p)))

 (defn run-handler [handler & args]
-  (try
-    (apply handler (take (arg-count handler) args))
-    (catch Exception e
-      (log/debug "Handler Exception - got args:" args"\n"
-                 (with-out-str (.printStackTrace e))))))
+  ;;deref vars so arg-count works correctly
+  (let [handler (if (var? handler) @handler handler)]
+    (try
+      (apply handler (take (arg-count handler) args))
+      (catch Exception e
+        (log/debug "Handler Exception - got args:" args"\n"
+                   (with-out-str (.printStackTrace e)))))))

 (defn map-vals [f m]
   (zipmap (keys m)


Removed useless 'test.clj'

Removed useless 'test.clj'

--- src/parbench/test.clj
+++ src/parbench/test.clj
@@ -1,25 +0,0 @@
-(ns parbench.testy
-  (:require [parbench.runner :as runner]
-            [parbench.utils :as utils]
-            [clojure.tools.logging :as log])
-  (:use clojure.tools.logging
-        noir-async.utils
-        lamina.core))
-
-(defprotocol Benchmarkable
-  (start [this])
-  (stop [this])
-  (started? [this])
-  (stopped? [this])
-  (set-started [this])
-  (broadcast-at-interval [this millis]))
-
-
-
-(defrecord Benchmark [state work max-runs run-count recorder output-ch]
-  (start [this]
-	  (if (init-run worker-count max-runs)
-	    (run-workers init-worker-fn worker-count)
-	    (io! (log/warn "Could not start, already started"))))
-
-  )


don't throw an error if reciever isn't subscribed

--- src/pc/http/sente.clj
+++ src/pc/http/sente.clj
@@ -491,10 +491,11 @@
         data (select-keys ?data [:candidate :sdp :consumer :producer :subscribe-to-recording :stream-id :close-connection])]
     (assert (contains? (set [consumer producer]) client-id)
             (format "client (%s) is not the consumer (%s) or producer (%s)" client-id consumer producer))
-    (assert (get-in @document-subs [document-id target])
-            (format "%s is the target, but isn't subscribed to %s" target document-id))
-    (log/infof "sending signal from %s to %s" client-id target)
-    ((:send-fn @sente-state) target [:rtc/signal data])))
+    (if (get-in @document-subs [document-id target])
+      (do
+        (log/infof "sending signal from %s to %s" client-id target)
+        ((:send-fn @sente-state) target [:rtc/signal data]))
+      (log/warnf (format "%s is the target, but isn't subscribed to %s" target document-id)))))

 (defmethod ws-handler :rtc/diagnostics [{:keys [client-id ?data] :as req}]
   (email/send-connection-stats {:client-id client-id


Compile error

Compile error

--- src/pericles/gpio.clj
+++ src/pericles/gpio.clj
@@ -14,7 +14,7 @@
   (let [open-new-port? (or
                          (not old-port)
                          (not= (:num old-port) new-port-num))]
-    (if (open-new-port?)
+    (if open-new-port?
       (do
         (if old-port (gpio/close! (:port old-port)))
         {:num new-port-num :port (gpio/open-port new-port-num :direction :out)})


Some slight tweaking

Some slight tweaking

--- src/picard/server.clj
+++ src/picard/server.clj
@@ -60,16 +60,24 @@
                        (if (= current waiting-for-response)
                          [incoming-request args]
                          [current args true])))
-    (.addListener (last-write netty/close-channel-future-listener))))
+    (.addListener last-write netty/close-channel-future-listener))
+  (fn [& args] (throw (Exception. "This request is finished"))))
+
+(defn- is-keepalive?
+  [req-keepalive? hdrs]
+  (and req-keepalive?
+       (or (hdrs "content-length")
+           (= (hdrs "transfer-encoding") "chunked"))))

 (defn- initialize-resp
-  [evt val req-state chan keepalive? streaming? last-write]
+  [evt [_ hdrs :as val] req-state chan keepalive? streaming? last-write]
   (when-not (= :respond evt)
     (throw (Exception. "Um... responses start with the head?")))
   (let [write (.write chan (resp-to-netty-resp val))]
     #(stream-or-finalize-resp %1 %2
                               req-state chan
-                              keepalive? streaming? write)))
+                              (is-keepalive? keepalive? hdrs)
+                              streaming? write)))

 (defn- downstream-fn
   [state channel keepalive?]
@@ -91,7 +99,6 @@
    since pipelining is not (yet?) supported. Also, if the connection
    does not support keep alives, the connection will get into this state."
   [_ _ _ _]
-  (println "BLOWING UP")
   (throw (Exception. "Not expecting a message right now")))

 (defn- transition-from-req-done


In core/finally, ignore cb args & call supplied fn w/ no args

--- src/promesa/core.cljc
+++ src/promesa/core.cljc
@@ -172,8 +172,8 @@
   resolved or rejected."
   [p callback]
   #?(:clj (-> p
-              (then #(callback))
-              (catch #(callback)))
+              (then (fn [_] (callback)))
+              (catch (fn [_] (callback))))
      :cljs (.finally p callback)))

 (defn all


Fix docstrings

Fix docstrings

--- src/pronouns/util.clj
+++ src/pronouns/util.clj
@@ -19,8 +19,9 @@

 (defn print-and-return "for debugging" [x] (println x) x)

-(defn slurp-tabfile [path]
-  "read a tabfile from a filesystem <path> as a table"
+(defn slurp-tabfile
+  "Read a tabfile from a filesystem <path> as a table"
+  [path]
   (let [lines (s/split (slurp path) #"\n")]
     (map #(s/split % #"\t") lines)))

@@ -98,10 +99,11 @@
   [table]
   (map (partial shortest-unambiguous-path table) table))

-(defn vec-coerce [x]
+(defn vec-coerce
   "wrap a value <x> in a vector if it is not already in one. note that if
   <x> is already in a sequence for which vector? is false, this will add
   another layer of nesting."
+  [x]
   (if (vector? x) x [x]))

 (defn strip-markup [form]


Fix conflict

Fix conflict

--- src/re_demo/core.cljs
+++ src/re_demo/core.cljs
@@ -5,7 +5,7 @@
             [reagent.core                  :as    reagent]
             [alandipert.storage-atom       :refer [local-storage]]
             [secretary.core                :as    secretary]
-            [re-com.core                   :refer [h-box v-box box gap line scroller border label title alert-box] :refer-macros [handler-fn]]
+            [re-com.core                   :refer [h-box v-box box gap line scroller border label title alert-box h-split] :refer-macros [handler-fn]]
             [re-com.util                   :refer [get-element-by-id item-for-id]]
             [re-demo.utils                 :refer [panel-title]]
             [re-demo.introduction          :as    introduction]
@@ -110,7 +110,8 @@
             is-major?  (= (:level tab) :major)
             has-panel? (some? (:panel tab))]
       [:div
-       {:style {:width            "150px"
+       {:style {;:width            "150px"
+                :white-space "nowrap"
                 :line-height      "1.3em"
                 :padding-left     (if is-major? "24px" "32px")
                 :padding-top      (when is-major? "6px")
@@ -135,7 +136,7 @@
     [v-box
      :class    "noselect"
      :style    {:background-color "#fcfcfc"}
-     :size    "1 0 auto"
+     ;:size    "1"
      :children (for [tab tabs-definition]
                  [nav-item tab selected-tab-id on-select-tab])])

@@ -154,6 +155,12 @@
                        :color       "#fefefe"}
                ]]])

+
+(defn right-side-nav [selected-tab-id]
+  [box
+   ;:height "100%"
+   :child ((:panel (item-for-id @selected-tab-id tabs-definition)))])
+
 (defn browser-alert
   []
   [box
@@ -184,24 +191,27 @@
     (fn
       []
       ;(set! re-com.box/debug true)
-      [h-box
+      [h-split
        ;; Outer-most box height must be 100% to fill the entrie client height.
        ;; This assumes that height of <body> is itself also set to 100%.
        ;; width does not need to be set.
        :height   "100%"
-       :gap      "60px"
-       :children [[scroller
-                   :size  "none"
-                   :v-scroll :auto
-                   :h-scroll :off
-                   :child [v-box
-                           :children [[re-com-title-box]
-                                      [left-side-nav-bar selected-tab-id on-select-tab]]]]
-                  [scroller
-                   :child [v-box
-                           :size  "auto"
-                           :children [(when-not (-> js/goog .-labs .-userAgent .-browser .isChrome) [browser-alert])
-                                      [(:panel (item-for-id @selected-tab-id tabs-definition))]]]]]])))    ;; the tab panel to show, for the selected tab
+       ;:gap      "60px"
+       :initial-split 15
+       :margin "0px"
+       :panel-1 [scroller
+                 ;:size  "none"
+                 :v-scroll :auto
+                 :h-scroll :off
+                 :child [v-box
+                         :size "1"
+                         :children [[re-com-title-box]
+                                    [left-side-nav-bar selected-tab-id on-select-tab]]]]
+       :panel-2 [scroller
+                 :child [v-box
+                         :size  "1"
+                         :children [(when-not (-> js/goog .-labs .-userAgent .-browser .isChrome) [browser-alert])
+                                    [right-side-nav selected-tab-id]]]]])))    ;; the tab panel to show, for the selected tab

 (defn ^:export mount-demo
   []


updated to return args for intermediate tags

--- src/selmer/parser.clj
+++ src/selmer/parser.clj
@@ -32,9 +32,9 @@
     (if-not (== -1 ch) (char ch))))

 (defn for-handler [[id _ items] rdr]
-  (let [content (:endfor (tag-content rdr :endfor))
+  (let [content (:content (:endfor (tag-content rdr :endfor)))
         id (map keyword (.split id "\\."))
-        items (keyword items)]
+        items (keyword items)]
     (fn [args]
       (let [buf (StringBuilder.)]
         (doseq [value (get args items)]
@@ -44,6 +44,12 @@
 (defn if-handler [[] rdr]
   (let [tags (tag-content rdr :else :endif)]
     ))
+
+(defn tag-handler [handler open-tag & end-tags]
+  (fn [args rdr]
+    (if (not-empty end-tags)
+      (let [content (apply (partial tag-content rdr) end-tags)]
+        (handler args content)))))

 (def expr-tags
   {:for {:handler for-handler}
@@ -92,9 +98,11 @@
         tags

         (= tag-open ch)
-        (let [{:keys [tag-name tag-type] :as tag} (read-tag-info rdr)]
-          (if (some #{tag-name} end-tags)
-            (let [tags     (assoc tags tag-name (conj content (.toString buf)))
+        (let [{:keys [tag-name args] :as tag} (read-tag-info rdr)]
+          (if (and tag-name (some #{tag-name} end-tags))
+            (let [tags     (assoc tags tag-name
+                                  {:args args
+                                   :content (conj content (.toString buf))})
                   end-tags (rest (drop-while #(not= tag-name %) end-tags))]
               (.setLength buf 0)
               (recur (read-char rdr) tags [] end-tags))


CMR-2354 Removes comment blocks

CMR-2354 Removes comment blocks

--- system-int-test/test/cmr/system_int_test/ingest/collection_ingest_test.clj
+++ system-int-test/test/cmr/system_int_test/ingest/collection_ingest_test.clj
@@ -133,9 +133,6 @@
         (index/wait-until-indexed)
         (is (= [422 ["Concept-id [C1111-PROV1] does not match the existing concept-id [C1000-PROV1] for native-id [Atlantic-1]"]]
                [status errors]))))))
-(comment
-  (cmr.metadata-db.int-test.utility/find-concepts :collection
-                                                  {:provider-id "PROV1"}))

 ;; Verify that the accept header works
 (deftest collection-ingest-accept-header-response-test
@@ -353,16 +350,6 @@
       (is (= 5 delete-revision-id))
       (is (mdb/concept-exists-in-mdb? (:concept-id ingest-result) 5)))))

-
-(comment
-
-  (dev-sys-util/reset)
-  (ingest/create-provider {:provider-guid "provguid1" :provider-id "PROV1"})
-  (def coll1 (d/ingest "PROV1" (dc/collection)))
-  (ingest/delete-concept coll1)
-  (get-in user/system [:apps :metadata-db :db]))
-
-
 (deftest delete-collection-test
   (let [coll1 (d/ingest "PROV1" (dc/collection))
         gran1 (d/ingest "PROV1" (dg/granule coll1))
@@ -566,19 +553,6 @@
     (is (= ["Unknown UMM JSON schema version: \"9000.1\""]
            (:errors response)))))

-(comment
-  ((ingest/reset-fixture {"provguid1" "PROV1" "provguid2" "PROV2"}) println)
-  (let [json (umm-spec/generate-metadata exc/example-collection-record "application/vnd.nasa.cmr.umm+json;version=1.0")
-        coll-map {:provider-id  "PROV1"
-                  :native-id    "umm_json_coll_V1"
-                  :concept-type :collection
-                  :format       "application/vnd.nasa.cmr.umm+json;version=9000.1"
-                  :metadata     json}
-        response (ingest/ingest-concept coll-map {:accept-format :json})]
-    (is (= 200 (:status response)))
-    (println "response =" response))
-  )
-
 ;; Verify ingest of collection with string larger than 80 characters for project(campaign) long name is successful (CMR-1361)
 (deftest project-long-name-can-be-upto-1024-characters
   (let [project (dc/project "p1" (str "A long name longer than eighty characters should not result"


fix warnings for individual build

fix warnings for individual build

--- sidecar/src/figwheel_sidecar/auto_builder.clj
+++ sidecar/src/figwheel_sidecar/auto_builder.clj
@@ -31,25 +31,40 @@
      parsed-notify-command
      (str "Successfully compiled " output-to))))

+(defn merge-build-into-server-state [figwheel-server {:keys [id build-options]}]
+  (merge figwheel-server
+         (if id {:build-id id} {})
+         (select-keys build-options [:output-dir :output-to])))
+
 (defn check-changes [figwheel-server build]
   (let [{:keys [additional-changed-ns build-options id old-mtimes new-mtimes]} build]
     (binding [cljs.env/*compiler* (:compiler-env build)]
-      (fig/check-for-changes (merge figwheel-server
-                                    (if id {:build-id id} {})
-                                    (select-keys build-options [:output-dir :output-to]))
-                             old-mtimes
-                             new-mtimes
-                             additional-changed-ns))))
-
-(defn handle-exceptions [figwheel-server {:keys [build-options exception]}]
+      (fig/check-for-changes
+       (merge-build-into-server-state figwheel-server build)
+       old-mtimes
+       new-mtimes
+       additional-changed-ns))))
+
+(defn handle-exceptions [figwheel-server {:keys [build-options exception id] :as build}]
   (println (auto/red (str "Compiling \"" (:output-to build-options) "\" failed.")))
   (clj-stacktrace.repl/pst+ exception)
-  (fig/compile-error-occured figwheel-server exception))
+  (fig/compile-error-occured
+   (merge-build-into-server-state figwheel-server build)
+   exception))
+
+(defn warning [builder warn-handler]
+  (fn [build]
+    (binding [cljs.analyzer/*cljs-warning-handlers* (conj cljs.analyzer/*cljs-warning-handlers*
+                                                          (warn-handler build))]
+      (builder build))))

 (defn builder [figwheel-server]
   (-> cbuild/build-source-paths*
-    (auto/warning (auto/warning-message-handler
-                   (partial fig/compile-warning-occured figwheel-server)))
+    (warning
+     (fn [build]
+       (auto/warning-message-handler
+        (partial fig/compile-warning-occured
+                 (merge-build-into-server-state figwheel-server build)))))
     auto/time-build
     (auto/after auto/compile-success)
     (auto/after (partial check-changes figwheel-server))


Adjusted up and down arrow position slight

--- desktop/src-common/escape_game/core.clj
+++ desktop/src-common/escape_game/core.clj
@@ -60,7 +60,7 @@
   `(defentity
     ({:left "left" :right "right" :up "up" :down "down"} ~direction)
     ({:left "images/arrowLeft.png" :right "images/arrowRight.png" :up "images/arrowUp.png" :down "images/arrowDown.png"} ~direction)
-    ({:left 50 :right 600 :up 318 :down 318} ~direction) ({:left 200 :right 200 :up 391 :down 25} ~direction) 64 64
+    ({:left 50 :right 600 :up 316 :down 316} ~direction) ({:left 200 :right 200 :up 391 :down 25} ~direction) 64 64
     :action (fn
               [ent# screen# entities#]
               (switch-to-room (:current-room screen#) ~target))))


Prevent reloading and fix lint errors

Prevent reloading and fix lint errors

--- etc/repl.clj
+++ etc/repl.clj
@@ -1,13 +1,11 @@
-(ns R
+(ns ^{:clojure.tools.namespace.repl/load false} R
   (:refer-clojure :exclude [find-ns])
   (:require
-    [clojure.java.io :as io]
     [clojure.pprint]
-    [clojure.repl :as repl]
-    [clojure.test :as test]
     [clojure.tools.namespace.find :as ns.find]
     [clojure.tools.namespace.repl :as ns.repl]
-    [kaocha.repl])
+    [kaocha.repl]
+    [clojure.string :as str])
   (:import
     (java.io
       File)))
@@ -21,9 +19,9 @@
   thing)

-(defn help [& n]
+(defn help [& _n]
   (println (str ">>> in ns " 'R))
-  (mapv (fn [[k v]]
+  (mapv (fn [[_k v]]
           (println v)) (ns-publics 'R))
   ::ok)

@@ -95,12 +93,11 @@
    ;; automagically guess the <app>.user namespace
    (let [an-ns (-> *ns*
                    str
-                   (clojure.string/replace #"\..+" ".user")
+                   (str/replace #"\..+" ".user")
                    symbol)]
      (require an-ns)
      (start-system! an-ns)))
   ([an-ns]
-   (do
      (printf "!! Starting %s\n" an-ns)
      (if (get @system-status an-ns)
        (println "!! System possibly running" an-ns)
@@ -112,7 +109,7 @@
          (if-let [f (ns-resolve an-ns 'start)]
            (do
              (f)
-             (swap! system-status (fn [s] (assoc s an-ns true))))))))))
+             (swap! system-status (fn [s] (assoc s an-ns true)))))))))

 (defn stop-system!


Added "Seikkailu", "Fantasia" and "Sci-fi" back.

--- src/vertigo/views.clj
+++ src/vertigo/views.clj
@@ -31,7 +31,7 @@
                        (cond (and (some #{"Komedia"} genres)
                                   (some #{"Draama"} genres)) :drama
                              (some #{"Komedia"} genres) :comedy
-                             (some #{"Toiminta"} genres) :action
+                             (some #{"Toiminta" "Sci-fi" "Seikkailu" "Fantasia"} genres) :action
                              (some #{"Draama" "Romantiikka"} genres) :drama
                              :otherwise :other))
                      (filter (fn [show] (= (common/format-date date)


tap and displayed added

tap and displayed added

--- src/webdriver/api.clj
+++ src/webdriver/api.clj
@@ -8,6 +8,7 @@
 ;; todo http timeout
 ;; global param names
 ;; client module?
+;; todo use as->
 ;;

 ;;
@@ -171,27 +172,40 @@
 ;; Switch To Parent Frame
 ;; https://www.w3.org/TR/webdriver/#dfn-switch-to-parent-frame

-;; todo doesn't work
-(defn get-window-rect [server session]
+(defn get-window-size [server session]
+  (-> server
+      (api :get [:session (session-id session) :window :size])))
+
+(defn set-window-size [server session width height]
+  (-> server
+      (api :post [:session (session-id session) :window :size]
+           {:width width :height height})))
+
+(defn set-window-position [server session x y]
+  (-> server
+      (api :post [:session (session-id session) :window :position]
+           {:x x :y y})))
+
+(defn ^:not-implemented
+  get-window-rect [server session]
   "https://www.w3.org/TR/webdriver/#dfn-get-window-rect"
   (-> server
-      (api :get [:session (session-id session) :window :size])))
-
-;; todo doesn't work
-(defn set-window-rect [server session x y width height]
+      (api :get [:session (session-id session) :window :rect])))
+
+(defn ^:not-implemented
+  set-window-rect [server session x y width height]
   "https://www.w3.org/TR/webdriver/#dfn-set-window-rect"
   (api :post
        [:session (session-id session) :window :rect]
        {:x x :y y :width width :height height}))

-;; todo doesn't work
 (defn maximize-window [server session]
   "https://www.w3.org/TR/webdriver/#dfn-maximize-window"
   (api server :post
        [:session (session-id session) :window :maximize]))

-;; todo doesn't work
-(defn fullscreen-window [server session]
+(defn ^:not-implemented
+  fullscreen-window [server session]
   "https://www.w3.org/TR/webdriver/#dfn-fullscreen-window"
   (api server :post
        [:session (session-id session) :window :fullscreen]))
@@ -240,6 +254,13 @@
       :value
       (->> (mapv parse-element))))

+(defn is-element-displayed [server session element]
+  "https://www.w3.org/TR/webdriver/#dfn-is-element-selected"
+  (-> server
+      (api :get
+           [:session (session-id session) :element element :displayed])
+      :value))
+
 (defn is-element-selected [server session element]
   "https://www.w3.org/TR/webdriver/#dfn-is-element-selected"
   (-> server
@@ -300,6 +321,12 @@
   (-> server
       (api :post
            [:session (session-id session) :element element :click])))
+
+(defn element-tap [server session element]
+  "https://www.w3.org/TR/webdriver/#dfn-is-element-enabled"
+  (-> server
+      (api :post
+           [:session (session-id session) :element element :tap])))

 (defn element-clear [server session element]
   "https://www.w3.org/TR/webdriver/#dfn-element-clear"
@@ -381,8 +408,7 @@
   (-> server
       (api :post
            [:session (session-id session) :actions] ;; :data ;; id
-           {:actions [{:type "none" :id "foo" :actions [{:type "pause" :value "R"}
-                                                        ]}]})))
+           {:actions [{:type "pointer" :actions [{:type "pointerDown" :button 123}]}]})))

 ;; todo doesn't work
 (defn release-actions [server session]


Add API for ZooKeeper distributed queue

Add API for ZooKeeper distributed queue

+ enqueue
  Adds an object in queue
+ dequeue
  Removes the head of the queue, returns nil if queue is empty
+ peek
  Returns data from head of the queue, doesn't remove it. Returns nil if
  queue is empty
+ blocking-dequeue
  same as dequeue, but blocks if queue is empty

--- src/zk_queue/core.clj
+++ src/zk_queue/core.clj
@@ -1,7 +1,8 @@
 (ns ^{:doc "A thin clojure wrapper over Zookeeper Queue Recipe"
       :author "Kiran Kulkarni <kk.questworld@gmail.com>"}
   zk-queue.core
-  (:require [clojure.string :as cs])
+  (:require [clojure.string :as cs]
+            [zk-queue.utils :refer [to-byte-array]])
   (:import (org.apache.zookeeper ZooKeeper WatchedEvent Watcher)
            (java.util.concurrent CountDownLatch TimeUnit)
            org.apache.zookeeper.recipes.queue.DistributedQueue))
@@ -68,3 +69,28 @@
   "Closes connection with zookeeper associate with this queue."
   [zk-queue]
   (.close zk-queue))
+
+
+(defn enqueue
+  "Accepts data and enqueues it"
+  [^DistributedQueue zk-queue data]
+  (.offer zk-queue (to-byte-array data)))
+
+
+(defn dequeue
+  "Removes the head of the queue. Returns nil if queue is empty"
+  [^DistributedQueue zk-queue]
+  (.poll zk-queue))
+
+
+(defn peek
+  "Returns the data at first element, doesn't remove it.
+   If queue is empty returns nil"
+  [^DistributedQueue zk-queue]
+  (.peek zk-queue))
+
+
+(defn blocking-dequeue
+  "Removes the head of the queue, blocks if queue is empty"
+  [zk-queue]
+  (.take zk-queue))


[#1077] Increased size of small map points

--- backend/src/akvo/lumen/lib/visualisation/map_config.clj
+++ backend/src/akvo/lumen/lib/visualisation/map_config.clj
@@ -5,8 +5,8 @@
   (let [point-size (if (string? point-size)
                      (Long/parseLong point-size)
                      point-size)]
-    ({1 3
-      2 4
+    ({1 4
+      2 5
       3 7
       4 10
       5 13} point-size 8)))


implement Shipment from MirrorMorph

implement Shipment from MirrorMorph

--- src/clj/game/cards-operations.clj
+++ src/clj/game/cards-operations.clj
@@ -339,6 +339,14 @@
                                (= (:type %) "Agenda"))}
     :msg (msg "1 advancement tokens on " (count targets) " cards")
     :effect (req (doseq [t targets] (add-prop state :corp t :advance-counter 1)))}
+
+   "Shipment from MirrorMorph"
+   (let [shelper (fn sh [n] {:prompt "Select a card to install"
+                             :choices {:req #(and (:side % "Corp") (not= (:type %) "Operation") (= (:zone %) [:hand]))}
+                             :effect (req (corp-install state side target nil)
+                                          (when (< n 3)
+                                            (resolve-ability state side (sh (inc n)) card nil)))})]
+     {:effect (effect (resolve-ability (shelper 1) card nil))})

    "Shipment from SanSan"
    {:choices ["0", "1", "2"] :prompt "How many advancement tokens?"


rewriting select using react/om components

--- src/cljs/heroku/createserver.cljs
+++ src/cljs/heroku/createserver.cljs
@@ -11,11 +11,54 @@

   )

+
+
 (defn g-value [owner ref]
   (let [input (om/get-node owner ref)]
     (.-value (.-selectedIndex input))
     ))

+(defn option [opt owner]
+  (reify
+    om/IInitState
+    (init-state [_]
+      {})
+    om/IRenderState
+    (render-state [_ _]
+      (dom/option #js {:className "list-group-item" :style #js {:float "left"  :width "800px" }} (:name opt)))))
+
+(defn select [app owner]
+  (reify
+    om/IInitState
+    (init-state [_]
+      {:own-chan (chan)})
+
+    om/IWillMount
+    (will-mount [this]
+      (let [connection (om/get-state owner :own-chan)]
+        (go (loop []
+              (let [connection-type (<! connection)]
+                (recur))))))
+
+    om/IRenderState
+    (render-state [this state]
+      (dom/div nil
+               (dom/h3 nil (str "select component" ))
+
+
+
+
+
+               (apply dom/select #js{:ref "juan"
+                                     :onChange (fn [e]
+                                                 (let [v (om/get-node owner "juan")]
+                                                   (.dir js/console (.-selectedIndex (.-options  v )))))}
+
+                        (om/build-all option  (get-in app [:create-server :images])
+                                      {:init-state {:own-chan (om/get-state owner :own-chan)}})))
+
+
+      )))

 (defn main-form [app owner]
   (reify
@@ -35,7 +78,8 @@
     (render-state [this state]
       (dom/div nil
                (dom/h3 nil (str "create server area" ))
-               (apply dom/select #js{:ref "juan"  :onChange
+               (om/build select app {:init-state {:in-chan (om/get-state owner :own-chan)}} )
+               #_(apply dom/select #js{:ref "juan"  :onChange
                                      (fn [e] (let [v (om/get-node owner "juan")]
                                               (.dir js/console (.-selectedIndex (.-options  v )))))}
                       (map #(dom/option #js{:value (:id %)} (:name %) )  (get-in app [:create-server :images]) ))


dont load tos.json unless we need it [risk: low] (#1449)

dont load tos.json unless we need it

--- src/cljs/main/broadfcui/auth.cljs
+++ src/cljs/main/broadfcui/auth.cljs
@@ -267,12 +267,17 @@
           (:declined :not-agreed) [:div {:style {:padding "2rem" :margin "5rem auto" :maxWidth 600
                                                  :border style/standard-line}}
                                    [:h2 {:style {:marginTop 0}} "You must accept the Terms of Service to use FireCloud."]
-                                   (if tos
-                                     [:div {:style {:display "flex" :flexDirection "column" :alignItems "center"}}
+                                   [:div {:style {:display "flex" :flexDirection "column" :alignItems "center"}}
+                                    (if tos
                                       [markdown/MarkdownView {:text tos}]
-                                      [:div {:style {:display "flex" :width 200 :justifyContent "space-evenly" :marginTop "1rem"}}
-                                       [buttons/Button {:text "Accept" :onClick #(endpoints/tos-set-status true update-status)}]]]
-                                     (spinner "Loading Terms of Service..."))]
+                                      (spinner
+                                        [:span {}
+                                         "Loading Terms of Service; also available "
+                                         [:a {:target "_blank"
+                                              :href "http://gatkforums.broadinstitute.org/firecloud/discussion/6819/firecloud-terms-of-service#latest"}
+                                         "here"] "."]))
+                                    [:div {:style {:display "flex" :width 200 :justifyContent "space-evenly" :marginTop "1rem"}}
+                                     [buttons/Button {:text "Accept" :onClick #(endpoints/tos-set-status true update-status)}]]]]
           [:div {}
            [:div {:style {:color (:state-exception style/colors) :paddingBottom "1rem"}}
             "Error loading Terms of Service information. Please try again later."]
@@ -282,7 +287,6 @@
              [:tr {} [:td {:style {:fontStyle "italic" :textAlign "right" :paddingRight "0.3rem"}} "Status code:"] [:td {} (:statusCode error)]]]]])]))
    :component-did-mount
    (fn [{:keys [state this]}]
-     (ajax/get-google-bucket-file "tos" #(swap! state assoc :tos (% (-> (config/tos-version) str keyword))))
      (this :-get-status))
    :-get-status
    (fn [{:keys [props state]}]
@@ -291,12 +295,14 @@
         (fn [{:keys [success? status-code get-parsed-response]}]
           (if success?
             (on-success)
-            (case status-code
-              ;; 403 means the user declined the TOS (or has invalid token? Need to distinguish)
-              403 (swap! state assoc :error :declined)
-              ;; 404 means the user hasn't seen the TOS yet and must agree (or url is wrong? need to distinguish)
-              404 (swap! state assoc :error :not-agreed)
-              (swap! state assoc :error (handle-server-error status-code get-parsed-response))))))))})
+            (do
+              (ajax/get-google-bucket-file "tos" #(swap! state assoc :tos (% (-> (config/tos-version) str keyword))))
+              (case status-code
+                ;; 403 means the user declined the TOS (or has invalid token? Need to distinguish)
+                403 (swap! state assoc :error :declined)
+                ;; 404 means the user hasn't seen the TOS yet and must agree (or url is wrong? need to distinguish)
+                404 (swap! state assoc :error :not-agreed)
+                (swap! state assoc :error (handle-server-error status-code get-parsed-response)))))))))})

 (defn reject-tos [on-done] (endpoints/tos-set-status false on-done))


Double ; for comments

Double ; for comments

--- src/metabase/driver/postgres.clj
+++ src/metabase/driver/postgres.clj
@@ -17,8 +17,8 @@
             [metabase.driver.generic-sql :as generic-sql]
             (metabase.driver.generic-sql [interface :refer [ISqlDriverDatabaseSpecific]]
                                          [util :refer [with-jdbc-metadata]]))
-  ; This is necessary for when NonValidatingFactory is passed in the sslfactory connection string argument,
-  ; e.x. when connecting to a Heroku Postgres database from outside of Heroku.
+  ;; This is necessary for when NonValidatingFactory is passed in the sslfactory connection string argument,
+  ;; e.x. when connecting to a Heroku Postgres database from outside of Heroku.
   (:import org.postgresql.ssl.NonValidatingFactory))

 (def ^:private ^:const column->base-type


Use description metadata in docs if they have one.

--- src-cljs/frontend/controllers/navigation.cljs
+++ src-cljs/frontend/controllers/navigation.cljs
@@ -454,6 +454,7 @@
        doc
        (do
          (set-page-title! (:title doc))
+         (set-page-description! (:description doc))
          (scroll! params)
          (analytics/track-page "View Docs")
          (when (and (empty? (:children doc))


second part of last commit

second part of last commit

--- src/edu/berkeley/ai/envs/envs.clj
+++ src/edu/berkeley/ai/envs/envs.clj
@@ -32,19 +32,32 @@
 (defmethod state-str  ::Environment [env state] (state-str (get-state-space env) state))

-; For real-time algorithms.
-(defn next-environment [[env [act-seq reward-so-far]] action]
-  (let [state (get-initial-state env)
-	[next reward] ((:fn action) state)]
-    [(make-environment next (get-state-space env) (get-action-space env) (get-goal env))
-     [(conj act-seq action)
-      (+ reward-so-far reward)]]))
+(derive ::SubEnvironment ::Environment)
+(defstruct str-sub-environment :class :env :initial-state :goal)

 ; Can't do this because of goal preprocessing. ..
 (defn sub-environment "Make a new environment with changed initial state and/or goal.  This may be very DANGEROUS since instance may preprocess the goal in ways not taken into account here."
   ([env new-init] (sub-environment env new-init (get-goal env)))
   ([env new-init new-goal]
-     (make-environment new-init (get-state-space env) (get-action-space env) new-goal)))
+     (struct str-sub-environment ::SubEnvironment
+	     (if (isa? (:class env) ::SubEnvironment) (util/safe-get env :env) env)
+	     new-init new-goal)))
+
+(defmethod get-state-space   ::SubEnvironment [env]
+  (get-state-space (util/safe-get env :env)))
+
+(defmethod get-action-space  ::SubEnvironment [env]
+  (get-action-space (util/safe-get env :env)))
+
+
+; For real-time algorithms.
+(defn next-environment [[env [act-seq reward-so-far]] action]
+  (let [state (get-initial-state env)
+	[next reward] ((:fn action) state)]
+    [(sub-environment env next  (get-goal env))
+     [(conj act-seq action)
+      (+ reward-so-far reward)]]))
+

 ;; Useful sanity check


pagination

pagination

--- src/om_bootstrap/pagination.cljs
+++ src/om_bootstrap/pagination.cljs
@@ -3,7 +3,6 @@
   (:require [om.core :as om]
             [om-bootstrap.types :as t]
             [om-bootstrap.util :as u]
-            [om-tools.dom :as d :include-macros true]
             [schema.core :as s])
   (:require-macros [schema.macros :as sm]))

@@ -18,18 +17,18 @@
   (let [[bs props] (t/separate Page opts {:href "#"})
         classes {:disabled (:disabled? bs)
                  :active (:active? bs)}]
-    (d/li (u/merge-props props {:class (u/class-set classes)})
-          (d/a {:href (:href bs)
+    [:li (u/merge-props props {:class (u/class-set classes)})
+          [:a {:href (:href bs)
                 :on-click (:on-click bs)}
-               children))))
+               children]]))

 (sm/defn previous :- t/Component [opts :- Page]
-  (page (assoc opts :aria-label "Previous") (d/span {:aria-hidden "true"} "«")))
+  (page (assoc opts :aria-label "Previous") [:span {:aria-hidden "true"} "«"]))

 (sm/defn next :- t/Component [opts :- Page]
-  (page (assoc opts :aria-label "Next") (d/span {:aria-hidden "true"} "»")))
+  (page (assoc opts :aria-label "Next") [:span {:aria-hidden "true"} "»"]))

 (sm/defn pagination :- t/Component [opts & children]
-  (d/nav
-    (d/ul {:class "pagination"}
-          children)))
+  [:nav
+    [:ul {:class "pagination"}
+          children]])


Name it drum rather than clap.

Name it drum rather than clap.

--- src/african_polyphony_and_polyrhythm/talk.clj
+++ src/african_polyphony_and_polyrhythm/talk.clj
@@ -39,13 +39,13 @@
 (defn clapping-music []
   (let [african-bell-pattern (rhythm [1/8 1/8 1/4 1/8 1/4 1/4 1/8 1/4])]
     (->> african-bell-pattern forever (all :part :clap1)
-         (canon #(->> % (take 64) (then (rhythm [1/8])) forever (all :part :clap2))))))
+         (canon #(->> % (take 32) (then (rhythm [1/8])) forever (all :part :clap2))))))

 (comment
   (->> (clapping-music)
        live/play))

-(definst clap [freq 440 vol 0.5 pan 0]
+(definst drum [freq 440 vol 0.5 pan 0]
   (-> (* 2/3 (brown-noise))
       (+ (* 1/2 (sin-osc (* 3 freq))))
       (+ (* 1/5 (sin-osc (* 5 freq))))
@@ -56,13 +56,13 @@
       (* vol)))

 (defmethod live/play-note :clap1 [_]
-  (clap 225 :pan 0.75))
+  (drum 225 :pan 0.75))

 (defmethod live/play-note :clap2 [_]
-  (clap 150 :pan -0.75))
+  (drum 150 :pan -0.75))

 (defmethod live/play-note :clap3 [_]
-  (clap 75 :pan 0))
+  (drum 75 :pan 0))

 (defn vary [t f]
   (fn [notes]
@@ -179,16 +179,11 @@
          (map pan))))

 (comment
-  (fx-reverb)
-  (map fx-chorus [0 1])
-  (map fx-distortion [0 1])
   (->>
     balendoro
     (where :pitch (comp temperament/equal A car))
     (tempo (bpm 120))
-    (live/play)
-    )
-  )
+    (live/play)))

 (def first-drum
   (let [model (->> (rhythm [2/5 3/5 1/5 1/5 3/5]) (all :part :clap1))


Add `:perun/trace` to file metadata Each built-in task that modifies file metadata conjes a keyword onto the `:perun/trace` vector. This will aid in debugging, and possibly have applications in tasks.

--- src/io/perun.clj
+++ src/io/perun.clj
@@ -40,6 +40,10 @@
         (io.perun.print-meta/print-meta ~(vec (map map-fn (perun/get-meta fileset))))))
     fileset))

+(defn trace
+  [kw entries]
+  (map #(update-in % [:perun/trace] (fnil conj []) kw) entries))
+
 (def ^:private filedata-deps
   '[[com.novemberain/pantomime "2.8.0"]])

@@ -55,7 +59,10 @@
    establish metadata structure."
   []
   (boot/with-pre-wrap fileset
-    (let [updated-files (add-filedata (boot/user-files fileset))]
+    (let [updated-files (->> fileset
+                             boot/user-files
+                             add-filedata
+                             (trace :perun/base))]
       (perun/set-meta fileset updated-files))))

 (def ^:private images-dimensions-deps
@@ -71,7 +78,8 @@
           files (->> fileset
                      boot/user-files
                      (boot/by-ext ["png" "jpeg" "jpg"])
-                     add-filedata)
+                     add-filedata
+                     (trace :perun/images-dimensions))
           updated-files (pod/with-call-in @pod
                          (io.perun.contrib.images-dimensions/images-dimensions ~files {}))]
       (perun/set-meta fileset updated-files))))
@@ -96,7 +104,8 @@
           files (->> fileset
                      boot/user-files
                      (boot/by-ext ["png" "jpeg" "jpg"])
-                     add-filedata)
+                     add-filedata
+                     (trace :perun/images-resize))
           updated-files (pod/with-call-in @pod
                          (io.perun.contrib.images-resize/images-resize ~(.getPath tmp) ~files ~options))]
       (perun/report-debug "images-resize" "new resized images" updated-files)
@@ -133,11 +142,15 @@
             updated-files (pod/with-call-in @pod
                              (io.perun.markdown/parse-markdown ~md-files ~options))
             initial-metadata (perun/merge-meta* (perun/get-meta fileset) @prev-meta)
-            ; Pure merge instead of `merge-with merge` (meta-meta).
-            ; This is because updated metadata should replace previous metadata to
-            ; correctly handle cases where a metadata key is removed from post metadata.
-            final-metadata   (vals (merge (perun/key-meta initial-metadata) (perun/key-meta updated-files)))
-            final-metadata   (remove #(-> % :path removed?) final-metadata)]
+            final-metadata   (->> updated-files
+                                  perun/key-meta
+                                  ; Pure merge instead of `merge-with merge` (meta-meta).
+                                  ; This is because updated metadata should replace previous metadata to
+                                  ; correctly handle cases where a metadata key is removed from post metadata.
+                                  (merge (perun/key-meta initial-metadata))
+                                  vals
+                                  (remove #(-> % :path removed?))
+                                  (trace :perun/markdown))]
         (reset! prev-fs fileset)
         (reset! prev-meta final-metadata)
         (perun/set-meta fileset final-metadata)))))
@@ -171,8 +184,9 @@
   (let [pod (create-pod ttr-deps)]
     (boot/with-pre-wrap fileset
       (let [files         (perun/get-meta fileset)
-            updated-files (pod/with-call-in @pod
-                            (io.perun.ttr/calculate-ttr ~files))]
+            updated-files (trace :perun/ttr
+                                 (pod/with-call-in @pod
+                                   (io.perun.ttr/calculate-ttr ~files)))]
         (perun/report-debug "ttr" "generated time-to-read" (map :ttr updated-files))
         (perun/set-meta fileset updated-files)))))

@@ -182,8 +196,9 @@
   (let [pod (create-pod ttr-deps)]
     (boot/with-pre-wrap fileset
       (let [files         (perun/get-meta fileset)
-            updated-files (pod/with-call-in @pod
-                            (io.perun.word-count/count-words ~files))]
+            updated-files (trace :perun/word-count
+                                 (pod/with-call-in @pod
+                                   (io.perun.word-count/count-words ~files)))]
         (perun/report-debug "word-count" "counted words" (map :word-count updated-files))
         (perun/set-meta fileset updated-files)))))

@@ -198,8 +213,9 @@
   (let [pod (create-pod gravatar-deps)]
     (boot/with-pre-wrap fileset
       (let [files         (perun/get-meta fileset)
-            updated-files (pod/with-call-in @pod
-                            (io.perun.gravatar/find-gravatar ~files ~source-key ~target-key))]
+            updated-files (trace :perun/gravatar
+                                 (pod/with-call-in @pod
+                                   (io.perun.gravatar/find-gravatar ~files ~source-key ~target-key)))]
         (perun/report-debug "gravatar" "found gravatars" (map target-key updated-files))
        (perun/set-meta fileset updated-files)))))

@@ -209,7 +225,9 @@
   []
   (boot/with-pre-wrap fileset
     (let [files         (perun/get-meta fileset)
-          updated-files (remove #(true? (:draft %)) files)]
+          updated-files (->> files
+                             (remove #(true? (:draft %)))
+                             (trace :perun/draft))]
       (perun/report-info "draft" "removed draft files. Remaining %s files" (count updated-files))
       (perun/set-meta fileset updated-files))))

@@ -220,7 +238,9 @@
     (let [files           (perun/get-meta fileset)
           global-meta     (perun/get-global-meta fileset)
           now             (java.util.Date.)
-          updated-files   (map #(assoc % :date-build now) files)
+          updated-files   (->> files
+                               (map #(assoc % :date-build now))
+                               (trace :perun/build-date))
           new-global-meta (assoc global-meta :date-build now)
           updated-fs      (perun/set-meta fileset updated-files)]
         (perun/report-debug "build-date" "added :date-build" (map :date-build updated-files))
@@ -243,7 +263,9 @@
   (boot/with-pre-wrap fileset
     (let [slug-fn       (or slug-fn default-slug-fn)
           files         (perun/get-meta fileset)
-          updated-files (map #(assoc % :slug (-> % :filename slug-fn)) files)]
+          updated-files (->> files
+                             (map #(assoc % :slug (-> % :filename slug-fn)))
+                             (trace :perun/slug))]
       (perun/report-debug "slug" "generated slugs" (map :slug updated-files))
       (perun/report-info "slug" "added slugs to %s files" (count updated-files))
       (perun/set-meta fileset updated-files))))
@@ -263,7 +285,9 @@
     (let [options       (merge +permalink-defaults+ *opts*)
           files         (filter (:filterer options) (perun/get-meta fileset))
           assoc-perma   #(assoc % :permalink ((:permalink-fn options) %))
-          updated-files (map assoc-perma files)]
+          updated-files (->> files
+                             (map assoc-perma)
+                             (trace :perun/permalink))]
       (perun/report-debug "permalink"  "generated permalinks" (map :permalink updated-files))
       (perun/report-info "permalink" "added permalinks to %s files" (count updated-files))
       (perun/merge-meta fileset updated-files))))
@@ -282,7 +306,9 @@
                   :canonical-url
                   ; we need to call perun/relativize-url to remove leading / because base-url has trailing /
                   (str base-url (perun/relativize-url (:permalink  %))))
-          updated-files (map assoc-can-url files)]
+          updated-files (->> files
+                             (map assoc-can-url)
+                             (trace :perun/canonical-url))]
         (perun/report-info "canonical-url" "added canonical urls to %s files" (count updated-files))
         (perun/merge-meta fileset updated-files))))

@@ -494,7 +520,7 @@
                                             (perun/report-info "collection" "rendered collection %s" page)
                                             new-entry)))
                                       grouped-files))
-                    updated-files    (apply conj files new-files)
+                    updated-files    (apply conj files (trace :perun/collection new-files))
                     updated-fileset  (perun/set-meta fileset updated-files)]
                   (commit updated-fileset tmp))))))


Add swagger to API endpoints

Add swagger to API endpoints

--- src/clj/coffee_table/component/web_server.clj
+++ src/clj/coffee_table/component/web_server.clj
@@ -4,6 +4,7 @@
             [coffee-table.component.visits :refer [visit-routes]]
             [com.stuartsierra.component :as component]
             [yada.yada :as yada]
+            [yada.swagger :refer [swaggered]]
             [taoensso.timbre :as timbre]))

 (timbre/refer-timbre)
@@ -13,8 +14,11 @@
   [visits]
   [""
    [
-    ["/hello" (yada/handler "Hello World")]
-    ["/api" [(visit-routes visits)]]
+    ["/api" (swaggered (visit-routes visits)
+                       {:info {:title "Visits"
+                               :version "1.0"
+                               :description "A visits service"}
+                        :basePath "/api"})]
     [true (yada/handler nil)]]])

 (s/defrecord WebServer [host port visits listener]


Remove old containers on startup

Remove old containers on startup

--- src/replme/components/docker.clj
+++ src/replme/components/docker.clj
@@ -1,6 +1,7 @@
 (ns replme.components.docker
   (:require [com.stuartsierra.component :as component]
             [docker.core :as docker]
+            [docker.container :as container]
             [clojure.tools.logging :as log]))

 (defrecord Docker [url client]
@@ -9,7 +10,10 @@
     (if (:client component)
       component
       (do (log/info (str "Connecting to docker server at " url))
-          (assoc component :client (docker/make-client url)))))
+          (let [client (docker/make-client url)]
+            (doseq [old-container (map :Id (container/show-all client))]
+              (container/remove client old-container :force true))
+            (assoc component :client client)))))

   (stop [component]
     (if-not (:client component)


get unique key on select options to make reagent happy

--- src/cljs/early_vote_site/elections/views.cljs
+++ src/cljs/early_vote_site/elections/views.cljs
@@ -7,8 +7,10 @@
             [reagent.ratom :as ratom]))

 (defn state-select-row
-  [state]
-  [:option {:value (:fips-code state) :key (:fips-code state)} (:state-name state)])
+  [id state]
+  [:option {:value (:fips-code state)
+            :key (str id "-" (:fips-code state))}
+   (:state-name state)])

 (defn form [id]
   (let [all-forms @(re-frame/subscribe [:elections/forms])
@@ -19,7 +21,8 @@
         editing? (not= :new id)]
     [:tr {:key (str "editing-" id)}
      [:td
-      [:select {:id "state" :type "text"
+      [:select {:id "state"
+                :type "text"
                 :class (str "form-control"
                             (when (contains? form-errors :state)
                               " error-highlight"))
@@ -27,7 +30,7 @@
                 :on-change #(re-frame/dispatch [:election-form/update
                                                 id :state
                                                 (-> % .-target .-value)])}
-       (map #(state-select-row %)
+       (map #(state-select-row id %)
             (concat [{:fips-code "" :state-name "Select a State"}]
                     constants/states))]]
      [:td


Bump versions.

Bump versions.

--- src/leiningen/new/onyx_plugin.clj
+++ src/leiningen/new/onyx_plugin.clj
@@ -9,8 +9,8 @@
   [name medium]
   (let [data {:name name
               :medium medium
-              :clojure-version "1.7.0"
-              :onyx-version "0.12.7"
+              :clojure-version "1.8.0"
+              :onyx-version "0.13.0"
               :sanitized (name-to-path name)}
         sanitized-medium (name-to-path medium)]
     (main/info "Generating fresh 'lein new' onyx-plugin project.")


Sanitize medium name in file names

Sanitize medium name in file names

--- src/leiningen/new/onyx_plugin.clj
+++ src/leiningen/new/onyx_plugin.clj
@@ -10,12 +10,13 @@
   (let [data {:name name
               :medium medium
               :clojure-version "1.6.0"
-              :sanitized (name-to-path name)}]
+              :sanitized (name-to-path name)}
+        sanitized-medium (name-to-path medium)]
     (main/info "Generating fresh 'lein new' onyx-plugin project.")
     (->files data
              ["README.md" (render "README.md" data)]
              ["project.clj" (render "project.clj" data)]
-             ["src/onyx/plugin/{{medium}}_input.clj" (render "medium_input.clj" data)]
-             ["test/onyx/plugin/{{medium}}_input_test.clj" (render "medium_input_test.clj" data)]
-             ["src/onyx/plugin/{{medium}}_output.clj" (render "medium_output.clj" data)]
-             ["test/onyx/plugin/{{medium}}_output_test.clj" (render "medium_output_test.clj" data)])))
+             [(str "src/onyx/plugin/" sanitized-medium "_input.clj") (render "medium_input.clj" data)]
+             [(str "test/onyx/plugin/" sanitized-medium "_input_test.clj") (render "medium_input_test.clj" data)]
+             [(str "src/onyx/plugin/" sanitized-medium "_output.clj") (render "medium_output.clj" data)]
+             [(str "test/onyx/plugin/" sanitized-medium "_output_test.clj") (render "medium_output_test.clj" data)])))


remove debug print for ns-display-name

remove debug print for ns-display-name

--- src/main/cljs_api_gen/display.clj
+++ src/main/cljs_api_gen/display.clj
@@ -41,9 +41,7 @@
      (= "special" ns-) "special forms"
      (= "specialrepl" ns-) "special forms (repl)"
      (= "syntax" ns-) "syntax forms"
-     (= "cljs.repl" ns-) (do
-                           (println "api-type for" ns- "=" api-type)
-                           (str ns- " (" (name api-type) ")"))
+     (= "cljs.repl" ns-) (str ns- " (" (name api-type) ")")
      :else ns-)))

 ;;----------------------------------------------------------------------


refer defevent

refer defevent

--- src/server/client-interface.cljs
+++ src/server/client-interface.cljs
@@ -8,7 +8,7 @@
             [moomoo.config :as config]
             [moomoo.file-hash :as file-hash]
             [moomoo.lastfm :as lastfm])
-  (:require-macros [moomoo.socket :as s]
+  (:require-macros [moomoo.socket :as s :refer [defevent]]
                    [cljs.core.async.macros :refer [go go-loop]]))

 (defonce socketio (nodejs/require "socket.io"))


my first fnil -- and it feels GOOD.

my first fnil -- and it feels GOOD.

--- src/midje/ideas/metaconstants.clj
+++ src/midje/ideas/metaconstants.clj
@@ -103,11 +103,7 @@

 (defn metaconstant-for-form [[function-symbol & _ :as inner-form]]
   (let [swap-fn (fn [current-value function-symbol]
-                  (if-let [cur-val (current-value function-symbol)]
-                    (assoc current-value function-symbol (inc cur-val))
-                    (assoc current-value function-symbol 1)))
+                  (assoc current-value function-symbol ((fnil inc 0) (current-value function-symbol))))
         number ((swap! *metaconstant-counts* swap-fn function-symbol)
                   function-symbol)]
-    (symbol (format "...%s-value-%s..." (name function-symbol) number))))
-
-
+    (symbol (format "...%s-value-%s..." (name function-symbol) number))))


Add function to mark tasks as complete.

Add function to mark tasks as complete.

--- src/todo_repl_webapp/handler.clj
+++ src/todo_repl_webapp/handler.clj
@@ -7,12 +7,15 @@
             [todo-repl.core :as todo]
             [todo-repl-webapp.views :as views]))

-(def *tasks-ref* (ref []))
+(def ^:dynamic *tasks-ref* (ref []))
 (defn tasks [] (deref *tasks-ref*))
 (defn add-new-task [x]
-  (dosync (alter *tasks-ref* #(cons
-                                (todo/new-task-better x)
-                                %1))))
+  (dosync (alter *tasks-ref* #(conj
+                                %1
+                                (todo/new-task-better x)))))
+(defn complete-task [index]
+  "Sets the :status of task at index to :complete"
+  (dosync (alter *tasks-ref* assoc-in [index :status] :complete)))

 ;; Initialize some tasks
 (add-new-task {:name "Go get some milk"


Replace string with constant

Replace string with constant

--- src/cylon/oauth/impl/authorization_server.clj
+++ src/cylon/oauth/impl/authorization_server.clj
@@ -19,6 +19,8 @@
    [cylon.session :refer (create-session! assoc-session! ->cookie get-session-value get-cookie-value get-session)]
    [ring.middleware.cookies :refer (wrap-cookies cookies-request cookies-response)]))

+(def SESSION-ID "session-id")
+
 (defrecord AuthorizationServer [store scopes iss]

   WebService
@@ -30,7 +32,7 @@
         (if-let [session
                  (get-session
                   (:session-store this)
-                  (-> req cookies-request :cookies (get "session-id") :value))]
+                  (-> req cookies-request :cookies (get SESSION-ID) :value))]
           ;; TODO Obey the 'prompt' value in OpenID/Connect
           (do
             (infof "Hi - it appears you're already logged in, session is %s" (pr-str session))
@@ -46,7 +48,7 @@
             (cookies-response
                       {:status 302
                        :headers {"Location" (path-for (:modular.bidi/routes req) ::get-authenticate-form)}
-                       :cookies {"session-id" (->cookie session)}}))))
+                       :cookies {SESSION-ID (->cookie session)}}))))
          wrap-params)

      ::get-authenticate-form
@@ -56,7 +58,7 @@
          :body (html
                 [:body
                  [:h1 "API Server"]
-                 [:p "The application with client id " (get-session-value req  "session-id" (:session-store this) :client-id)
+                 [:p "The application with client id " (get-session-value req  SESSION-ID (:session-store this) :client-id)
                   " is requesting access to the Azondi API on your behalf. Please login if you are happy to authorize this client."]
                  [:form {:method :post
                          :action (path-for (:modular.bidi/routes req) ::post-authenticate-form)}
@@ -75,10 +77,14 @@
            (let [params (-> req :form-params)
                  identity (get params "user")
                  password (get params "password")
-                 client-id (get-session-value req  "session-id" (:session-store this) :client-id)
-                 scope (get-session-value req  "session-id" (:session-store this) :scope)
-                 state (get-session-value req  "session-id" (:session-store this) :state)
+
+                 session (get-session (:session-store this) (get-cookie-value req SESSION-ID))
+
+                 client-id (get session :client-id)
+                 scope (get session :scope)
+                 state (or (get session :state) "") ; to avoid a java.lang.NullPointerException on str/split
                  scopes (set (str/split scope #"[\s]+"))
+
                  ;; Lookup client
                  {:keys [callback-uri] :as application}
                  (lookup-client+ (:client-registry this) client-id)]
@@ -114,7 +120,7 @@

                      (cookies-response {:status 302
                        :headers {"Location" (path-for (:modular.bidi/routes req) ::get-totp-code)}
-                       :cookies {"session-id" (->cookie session)}}))
+                       :cookies {SESSION-ID (->cookie session)}}))

                    ;; So it's not 2FA, continue with OAuth exchange
                    ;; Generate the temporary code that we'll exchange for an access token later
@@ -133,7 +139,7 @@
                                   "%s?code=%s&state=%s"
                                   callback-uri code state
                                   )}
-                       :cookies {"session-id" (->cookie session)}}))))
+                       :cookies {SESSION-ID (->cookie session)}}))))
                ;; Fail
                {:status 302
                 :headers {"Location" (format "%s" (path-for (:modular.bidi/routes req) ::get-authenticate-form))}
@@ -147,7 +153,7 @@
         :body (html
                [:h1 "Please can I have your auth code"]

-               (let [secret (get-session-value req "session-id" (:session-store this) :totp-secret)]
+               (let [secret (get-session-value req SESSION-ID (:session-store this) :totp-secret)]
                  [:div

@@ -162,11 +168,11 @@
      ::post-totp-code
      (-> (fn [req]
            (let [totp-code (-> req :form-params (get "code"))
-                 secret (get-session-value req "session-id" (:session-store this) :totp-secret)
+                 secret (get-session-value req SESSION-ID (:session-store this) :totp-secret)
                  ]
              (if (= totp-code (totp-token secret))
                ;; Success, set up the exchange
-               (let [session (get-session (:session-store this) (get-cookie-value req "session-id"))
+               (let [session (get-session (:session-store this) (get-cookie-value req SESSION-ID))
                      client-id (get session :client-id)
                      _ (infof "Looking up app with client-id %s yields %s" client-id (lookup-client+ (:client-registry this) client-id))
                      {:keys [callback-uri] :as client}


added some todos

added some todos

--- src/dda/pallet/crate/servertest/fact/file.clj
+++ src/dda/pallet/crate/servertest/fact/file.clj
@@ -18,32 +18,35 @@
   (:require
     [dda.pallet.servertest.core.fact :refer :all]))

+; todo: create crate boundary & schema for configuration & result
+
 (def fact-id-netstat ::file)

 (def FileFactConfig {:file-paths [s/Str]})

-(def FileFactResult {s/Keyword {:exist s/Bool
-                                :directory s/Bool
-                                :link s/Bool
-                                :owner s/Str
+(def FileFactResult {s/Keyword {:size-in-bytes s/Num
+                                :user s/Str
                                 :group s/Str
                                 :mod s/Str
-                                :size s/Num
-                                :}})
-
-
+                                :type s/Str ;use keywords instead here?
+                                :created s/Str
+                                :modified s/Str
+                                :accessed s/Str}})

 (defn parse-find
   [file-resource]
+  ;todo create parse function
   (map #(zipmap
-          [:name :size :user :group :mod :type :created :modified :accessed]
+          [:name :size-in-bytes :user :group :mod :type :created :modified :accessed]
           (clojure.string/split (clojure.string/trim %) #"\s+|/"))
      (drop-while #(not (re-matches #"\s*(tcp|udp).*" %))
        (clojure.string/split netstat-resource #"\n"))))

 (s/defn collect-netstat-fact
   "Defines the netstat resource.
-   This is automatically done serverstate crate is used."
+   This is automatically done serverstate crate is used.
+   See also: https://unix.stackexchange.com/questions/128985/why-not-parse-ls, http://man7.org/linux/man-pages/man1/find.1.html"
   [files-to-inspect :- FileFactConfig]
   ;find linked-entry -prune -printf "'%f' '%s' '%u' '%g' '%m' '%y' '%c' '%t' '%a'\n"
+  ;todo: iterate over files-to-inspect & create one script
   (collect-fact fact-id-netstat '("find" ~path "-prune" "-printf \"'%f' '%s' '%u' '%g' '%m' '%y' '%c' '%t' '%a'\n\"") :transform-fn parse-find))


Use finally to remove security manager

Use finally to remove security manager

--- src/net/sekao/nightcode/utils.clj
+++ src/net/sekao/nightcode/utils.clj
@@ -13,9 +13,8 @@
        (proxy [SecurityManager] []
          (checkExit [status#]
            (throw (SecurityException. "Exit not allowed.")))))
-     (let [result# ~body]
-       (System/setSecurityManager nil)
-       result#)))
+     (try ~body
+       (finally (System/setSecurityManager nil)))))

 (fdef get-relative-path
   :args (s/cat :project-path string? :selected-path string?)


Added try/catch to midi event hdlr function call

--- src/overtime/midi_controllers.clj
+++ src/overtime/midi_controllers.clj
@@ -130,8 +130,10 @@
   (ot/on-event
     [:midi event-type]
     (fn [event]
-      (let [handlers (get-in @handlers-per-knob (get-device-and-midi-knob event) [])]
-        (doseq [[_k f] handlers] (f (:velocity event) (:velocity-f event)))))
+      (doseq [[key f] (get-in @handlers-per-knob (get-device-and-midi-knob event) [])]
+        (try
+          (f (:velocity event) (:velocity-f event))
+          (catch Exception e (log/error (str "Caught exception in midi event hdlr " key ": ") e)))))
     hdlr-key))

 (defn start [] (doseq [[event-type hdlr-key] [[:control-change ::cc-hdlr] [:note-on ::note-hdlr]]] (set-midi-event-hdlr event-type hdlr-key)))


Adds description to tooltip

Adds description to tooltip

--- src/pasmo_gigi/geo/db/surveys.clj
+++ src/pasmo_gigi/geo/db/surveys.clj
@@ -37,6 +37,7 @@
                  (assoc % :geometry loc)))
          (map #(-> %
                    (assoc :properties {:title (get-in % [:location :name])
+                                       :description (str (when (:condomsAvailable %) "Condoms were available.") " " (str (when (:lubesAvailable %) "Lubes were available.")))
                                        :marker-size "large"
                                        :marker-symbol "building"
                                        :marker-color (marker-color %)})
@@ -44,3 +45,5 @@
          (map #(select-keys % [:_id :lubesAvailable :survey :geometry :type :condomsAvailable :properties])))))

+
+(clojure.pprint/pprint (all-survey-details-for 2020 "November"))


Fix tests.

Fix tests.

--- test/potok/tests.cljs
+++ test/potok/tests.cljs
@@ -18,24 +18,26 @@
 (t/deftest synchronous-state-transformation-test
   (t/async done
     (let [store (ptk/store {:state {:counter 0}})]
-      (-> (rx/take 1 store)
-          (rx/subscribe (fn [{:keys [counter]}]
+      (as-> store $
+        (rx/skip 1 $)
+        (rx/take 1 $)
+        (rx/subscribe $ (fn [{:keys [counter]}]
                           (t/is (= counter 1)))
-                        nil
-                        done))
-
+                      nil
+                      done))
       (ptk/emit! store (->IncrementBy 1)))))

 (t/deftest asynchronous-state-transformation-test
   (t/async done
     (let [store (ptk/store {:state {:counter 0}})]
-      (-> (rx/take 1 store)
-          (rx/subscribe (fn [{:keys [counter]}]
+      (as-> store $
+        (rx/skip 1 $)
+        (rx/take 1 $)
+        (rx/subscribe $ (fn [{:keys [counter]}]
                           (t/is (= counter 2)))
-                        nil
-                        done))
-
+                      nil
+                      done))
       (ptk/emit! store (->AsyncIncrementBy 2)))))

 (set! *main-cli-fn* #(t/run-tests))


use satisfy

use satisfy


fix badge pdf :- remove extra spaces from criteria


fixes warnings for :build-notify (#718)

fixes warnings for :build-notify (#718)

fixes warnings for :build-notify

--- src/main/shadow/cljs/devtools/client/env.cljs
+++ src/main/shadow/cljs/devtools/client/env.cljs
@@ -200,7 +200,7 @@
 ;; do work that all client impls would share here instead of repeating the code
 (defn preprocess-ws-msg [{:keys [type] :as msg}]
   (case type
-    :build-completed
+    :build-complete
     (let [{:keys [info]} msg

           warnings
@@ -401,4 +401,4 @@
 (defn filter-reload-sources [info reload-info]
   (if (= "full" reload-strategy)
     (filter-sources-to-get-full info reload-info)
-    (filter-sources-to-get-optimized info reload-info)))+    (filter-sources-to-get-optimized info reload-info)))


Hard-code content type to RDF format mapping.

The sesame mapping from content type to RDF formats is global and
mutable, which may have unintended consequences if modified. Hard-code
the common content types in mimetype->rdf-format and fallback to the
sesame registry if the lookup fails.

--- src/rdf-common/grafter/rdf/io.clj
+++ src/rdf-common/grafter/rdf/io.clj
@@ -340,7 +340,22 @@
   [mime-type]
   (let [base-type (str (mime/base-type mime-type))]
     (condp = base-type
-      "application/n-triples" RDFFormat/NTRIPLES ;; Sesame doesn't yet support application/n-triples
+      "application/rdf+xml" RDFFormat/RDFXML
+      "application/xml" RDFFormat/RDFXML
+      "text/plain" RDFFormat/NTRIPLES
+      "application/n-triples" RDFFormat/NTRIPLES
+      "text/turtle" RDFFormat/TURTLE
+      "application/x-turtle" RDFFormat/TURTLE
+      "text/n3" RDFFormat/N3
+      "text/rdf+n3" RDFFormat/N3
+      "application/trix" RDFFormat/TRIX
+      "application/x-trig" RDFFormat/TRIG
+      "application/x-binary-rdf" RDFFormat/BINARY
+      "text/x-nquads" RDFFormat/NQUADS
+      "application/ld+json" RDFFormat/JSONLD
+      "application/rdf+json" RDFFormat/RDFJSON
+      "application/xhtml+xml" RDFFormat/RDFA
+      "application/html" RDFFormat/RDFA
       (Rio/getParserFormatForMIMEType mime-type))))

 (defn rdf-serializer


cleanup send-entity-email

cleanup send-entity-email

--- src/pc/email.clj
+++ src/pc/email.clj
@@ -204,6 +204,18 @@
                        :text (str "You've been granted early access to precursor's paid feaures: https://precursorapp.com")
                        :html (view/early-access-html cust)})))

+(defmacro with-email-accounting [email-enum eid & body]
+  `(if (mark-sent-email ~eid ~email-enum)
+     (try+
+      (log/infof "sending %s email for %s" (name ~email-enum) ~eid)
+      ~@body
+      (catch Object t#
+        (log/errorf (:throwable ~'&throw-context) "error sending %s email for %s" (name ~email-enum) ~eid)
+        (.printStackTrace (:throwable ~'&throw-context))
+        (unmark-sent-email ~eid ~email-enum)
+        (throw+ t#)))
+     (log/infof "not re-sending %s email for %s" (name ~email-enum) ~eid)))
+
 (defn send-entity-email-dispatch-fn [db email-enum eid] email-enum)

 (defmulti send-entity-email send-entity-email-dispatch-fn)
@@ -214,65 +226,28 @@

 (defmethod send-entity-email :email/access-grant-created
   [db email-enum eid]
-  (if (mark-sent-email eid :email/access-grant-created)
-    (try+
-      (log/infof "sending access-grant email for %s" eid)
-      (send-access-grant-email db eid)
-      (catch Object t
-        (.printStackTrace (:throwable &throw-context))
-        (unmark-sent-email eid :email/access-grant-created)
-        (throw+ t)))
-    (log/infof "not re-sending access-grant email for %s" eid)))
+  (with-email-accounting email-enum eid
+    (send-access-grant-email db eid)))

 (defmethod send-entity-email :email/access-request-created
   [db email-enum eid]
-  (if (mark-sent-email eid :email/access-request-created)
-    (try+
-      (log/infof "sending access-request email for %s" eid)
-      (send-access-request-email db eid)
-      (catch Object t
-        (.printStackTrace (:throwable &throw-context))
-        (unmark-sent-email eid :email/access-request-created)
-        (throw+ t)))
-    (log/infof "not re-sending access-request email for %s" eid)))
-
-;; TODO: deprecated by
-(defmethod send-entity-email :email/document-permission-for-customer-granted
-  [db email-enum eid]
-  (if (mark-sent-email eid :email/document-permission-for-customer-granted)
-    (try+
-      (log/infof "sending access-request email for %s" eid)
-      (send-permission-grant-email db eid)
-      (catch Object t
-        (.printStackTrace (:throwable &throw-context))
-        (unmark-sent-email eid :email/document-permission-for-customer-granted)
-        (throw+ t)))
-    (log/infof "not re-sending access-request email for %s" eid)))
+  (with-email-accounting email-enum eid
+    (send-access-request-email db eid)))

 (defmethod send-entity-email :email/permission-granted
   [db email-enum eid]
-  (if (mark-sent-email eid :email/permission-granted)
-    (try+
-      (log/infof "sending access-request email for %s" eid)
-      (send-permission-grant-email db eid)
-      (catch Object t
-        (.printStackTrace (:throwable &throw-context))
-        (unmark-sent-email eid :email/permission-granted)
-        (throw+ t)))
-    (log/infof "not re-sending access-request email for %s" eid)))
+  (with-email-accounting email-enum eid
+    (send-permission-grant-email db eid)))

 (defmethod send-entity-email :email/early-access-granted
   [db email-enum eid]
-  (if (mark-sent-email eid :email/early-access-granted)
-    (try+
-      (log/infof "sending early access email for %s" eid)
-      (send-early-access-granted-email db eid)
-      (catch Object t
-        (.printStackTrace (:throwable &throw-context))
-        (unmark-sent-email eid :email/early-access-granted)
-        (throw+ t)))
-    (log/infof "not re-sending early-access-granted email for %s" eid)))
-
+  (with-email-accounting email-enum eid
+    (send-early-access-granted-email db eid)))
+
+(defmethod send-entity-email :email/early-access-granted
+  [db email-enum eid]
+  (with-email-accounting email-enum eid
+    (unmark-sent-email eid :email/early-access-granted)))

 (defn send-missed-entity-emails-cron
   "Used to catch any emails missed by the transaction watcher."


Test liberator resource definitions.

Test liberator resource definitions.

--- src/wareblog/core.clj
+++ src/wareblog/core.clj
@@ -35,6 +35,8 @@
 	 #wareblog/paragraph (\"Starting with something new is exciting, but can turn soon into frustration. Let's see how it works with \" #wareblog/abbreviation :edn))
 }"))

+(def articles
+  {:abc some-edn})

 (defn -main
   "I don't do a whole lot ... yet."
@@ -43,12 +45,21 @@

 (defresource article
   :available-media-types ["text/html"]
+  :allowed-methods [:get :options]
   :handle-ok (fn [ctx] (str "Id of the request: " (get-in ctx [:request :route-params :id]))))
+
+(defresource show-article
+  :available-media-types ["text/html"]
+  :allowed-methods [:get :options]
+  :handle-ok (fn [ctx] (let [id (get-in ctx [:request :route-params :id])]
+                         ((keyword id) articles))))

 (def handler
   (make-handler ["/" {"index.html" (resource :available-media-types ["text/html"]
                            :handle-ok "<html>Hello, Internet.</html>")
-                      ["articles/" :id "/article.html"] article}]))
+                      "articles/" {[:id] article
+                                   [:id "/show"] show-article
+                                   [:id "/comment"] :comment}}]))

 (def wrap-handler
   (-> handler


add +/- grade template implementation

add +/- grade template implementation

--- src/sandbox/template/template.clj
+++ src/sandbox/template/template.clj
@@ -24,3 +24,24 @@
 (def full-grade-reporter (make-grade-reporter full-grade-converter print-histogram))

 (def sample-grades [5.0 4.0 4.4 2.2 3.3 3.5])
+
+(defn plus-minus-grade-converter [grade]
+  (cond
+    (and (<= grade 5.0) (> grade 4.7)) "A"
+    (and (<= grade 4.7) (> grade 4.3)) "A-"
+    (and (<= grade 4.3) (> grade 4.0)) "B+"
+    (and (<= grade 4.0) (> grade 3.7)) "B"
+    (and (<= grade 3.7) (> grade 3.3)) "B-"
+    (and (<= grade 3.3) (> grade 3.0)) "C+"
+    (and (<= grade 3.0) (> grade 2.7)) "C"
+    (and (<= grade 2.7) (> grade 2.3)) "C"
+    (and (<= grade 2.3) (> grade 0)) "D"
+    (= grade 0) "F" :else "N/A"))
+
+(defn print-all-grades [grades]
+  (doseq [grade grades]
+    (println "Grade is:" grade)))
+
+(def plus-minus-grade-repoerter
+  (make-grade-reporter plus-minus-grade-converter print-all-grades))
+


Test for functions that read words from dictionary

--- test/clj_mrazik/irc_bot_test.clj
+++ test/clj_mrazik/irc_bot_test.clj
@@ -242,3 +242,36 @@
         (with-redefs [dictionary/word-exist? (fn [input] true)]
             (is (is-word-from-dictionary? "word")))))

+(def test-word
+ {:description
+  "For details, see the universal Glossary.",
+  :use 1,
+  :copyrighted 0,
+  :source "The Glossary",
+  :internal 0,
+  :incorrect_forms "",
+  :term "abend",
+  :product nil,
+  :class "adjective",
+  :see_also "",
+  :correct_forms "",
+  :verified 1})
+
+(deftest test-return-words-from-dictionary
+    "Check the behaviour of function clj-dopey.irc-bot/return-words-from-dictionary"
+    (testing "the function return-words-from-dictionary"
+        (with-redefs [dictionary/find-word (fn [input] (dictionary/correct-forms test-word))]
+            (is (= (return-words-from-dictionary "test") (dictionary/correct-forms test-word))))))
+
+(deftest test-return-word-like-this
+    "Check the behaviour of function clj-dopey.irc-bot/return-word-like-this"
+    (testing "the function return-word-like-this"
+        (with-redefs [dictionary/find-word-like-this (fn [input] input)]
+            (is (= (return-word-like-this "test") "test")))))
+
+(deftest test-return-more-words-like-this
+    "Check the behaviour of function clj-dopey.irc-bot/return-more-words-like-this"
+    (testing "the function return-more-words-like-this"
+        (with-redefs [dictionary/find-words-like-this (fn [input] ["one" "two"])]
+            (is (= (return-more-words-like-this "test") ["one" "two"])))))
+


(maint) Update ezbake to 1.6.5

(maint) Update ezbake to 1.6.5

--- project.clj
+++ project.clj
@@ -211,7 +211,7 @@
                                                [puppetlabs/puppetserver ~ps-version :exclusions [puppetlabs/jruby-deps]]
                                                [puppetlabs/trapperkeeper-webserver-jetty9 nil]
                                                [org.clojure/tools.nrepl nil]]
-                      :plugins [[puppetlabs/lein-ezbake "1.6.3"]]
+                      :plugins [[puppetlabs/lein-ezbake "1.6.5"]]
                       :name "puppetserver"}
              :uberjar {:aot [puppetlabs.trapperkeeper.main]
                        :dependencies [[puppetlabs/trapperkeeper-webserver-jetty9 nil]]}


Cleaned up build aliases.

Cleaned up build aliases.

--- project.clj
+++ project.clj
@@ -178,8 +178,7 @@
       ["generate-html"]]
     ;; Build tasks
     "build-lite" ["do"
-      ["ltest" ":unit"]
-      ["junit" ":unit"]]
+      ["ltest" ":unit"]]
     "build" ["do"
       ["ltest" ":unit"]
       ["junit" ":unit"]
@@ -187,7 +186,6 @@
       ["uberjar"]]
     "build-full" ["do"
       ["ltest" ":unit"]
-      ["junit" ":unit"]
       ["generate-static"]
       ["ubercompile"]
       ["uberjar"]]


Update clojurescript version and add options for improve build performance.

--- project.clj
+++ project.clj
@@ -17,7 +17,7 @@
                  [figwheel "0.1.7-SNAPSHOT"]

                  ;; Frontend dependencies
-                 [org.clojure/clojurescript "0.0-2496"]
+                 [org.clojure/clojurescript "0.0-2511"]
                  [secretary "1.2.1"]
                  [sablono "0.2.22" :exclusions [com.facebook/react]]
                  [om "0.8.0-beta3"]
@@ -31,7 +31,7 @@

   :source-paths ["src/clj"]
   :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}
-  :plugins [[lein-cljsbuild "1.0.3"]
+  :plugins [[lein-cljsbuild "1.0.4-SNAPSHOT"]
             [hiccup-bridge "1.0.1"]
             [lein-figwheel "0.1.7-SNAPSHOT"]]
   :cljsbuild {:builds
@@ -40,12 +40,14 @@
                 :compiler {:output-to "resources/public/js/app.js"
                            :output-dir "resources/public/js"
                            :optimizations :none
+                           :cache-analysis true
                            :source-map true}}

                {:id "normal"
                 :source-paths ["src/cljs"]
                 :compiler {:output-to "resources/public/js/app.js"
                            :optimizations :whitespace
+                           :cache-analysis true
                            :pretty-print true}}

                {:id "release"
@@ -53,6 +55,7 @@
                 :compiler {:output-to "resources/public/js/app.js"
                            :optimizations :advanced
                            :pretty-print false
+                           :cache-analysis true
                            :externs ["react/externs/react.js"
                                      "assets/externs/stanza.io.js"]}}]}


Removed useless mongodb support

Removed useless mongodb support

--- project.clj
+++ project.clj
@@ -8,7 +8,6 @@
                  [cheshire "5.7.1"] ; Json parsing librairy
                  [org.clojure/java.jdbc "0.7.0"] ; jdbc support
                  [com.h2database/h2 "1.4.196"] ; h2 database support
-                 [com.novemberain/monger "3.1.0"] ; mongodb support
                  [ring/ring-json "0.4.0"]
                  [ring/ring-defaults "0.3.1"]] ; ring server default dependencies
   :plugins [[lein-ring "0.12.0"]


Updated transit-clj -> 0.8.275, transit-cljs -> 0.8.220

--- project.clj
+++ project.clj
@@ -16,8 +16,8 @@
                  [http-kit "2.1.19"]

                  [com.taoensso/sente "1.5.0" :exclusions [org.clojure/tools.reader]]
-                 [com.cognitect/transit-clj "0.8.271" :exclusions [commons-codec]]
-                 [com.cognitect/transit-cljs "0.8.215"]
+                 [com.cognitect/transit-clj "0.8.275" :exclusions [commons-codec]]
+                 [com.cognitect/transit-cljs "0.8.220"]

                  [reagent "0.5.0"]
                  [org.webjars/bootstrap "3.3.4"]]


update 0.4-SNAPSHOT

update 0.4-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject clabango "0.3"
+(defproject clabango "0.4-SNAPSHOT"
   :description "A templating language?"
   :dependencies [[org.clojure/clojure "1.4.0"]
                  [cheshire "4.0.4"]


Disabling lein-v activity b/c it's buggy w/ uberjars :/

Bug report has been filed.

--- project.clj
+++ project.clj
@@ -29,8 +29,8 @@
                        :aot :all
                        :uberjar-name "coffee_table.jar"}}

-  :prep-tasks [["v" "cache" "src"]]
-  :release-tasks [["vcs" "assert-committed"]
+  #_ :prep-tasks #_ [["v" "cache" "src/clj"]]
+  #_ :release-tasks #_ [["vcs" "assert-committed"]
                   ["v" "update"] ;; compute new version and tag it
                   ["vcs" push]
                   ["deploy"]])


Updated dependencies

Updated dependencies

--- project.clj
+++ project.clj
@@ -4,10 +4,10 @@
   :url "http://example.com/FIXME"

   :dependencies [[org.clojure/clojure "1.7.0"]
-                 [selmer "0.8.8"]
-                 [com.taoensso/timbre "4.1.0"]
+                 [selmer "0.9.1"]
+                 [com.taoensso/timbre "4.1.1"]
                  [com.taoensso/tower "3.0.2"]
-                 [markdown-clj "0.9.67"]
+                 [markdown-clj "0.9.69"]
                  [environ "1.0.0"]
                  [compojure "1.4.0"]
                  [ring/ring-defaults "0.1.5"]
@@ -15,29 +15,29 @@
                  [liberator "0.13"]
                  [cheshire "5.5.0"]
                  [metosin/ring-middleware-format "0.6.0"]
-                 [metosin/ring-http-response "0.6.3"]
+                 [metosin/ring-http-response "0.6.4"]
                  [bouncer "0.3.3"]
                  [prone "0.8.2"]
                  [org.clojure/tools.nrepl "0.2.10"]
                  [ring-server "0.4.0"]
-                 [buddy "0.6.1"]
-                 [migratus "0.8.2"]
-                 [clj-time "0.10.0"]
+                 [buddy "0.6.2"]
+                 [migratus "0.8.4"]
+                 [clj-time "0.11.0"]
                  [org.clojure/java.jdbc "0.4.1"]
                  [instaparse "1.4.1"]
-                 [yesql "0.5.0-SNAPSHOT"]
+                 [yesql "0.5.0"]
                  [org.postgresql/postgresql "9.3-1102-jdbc41"]
-                 [org.clojure/clojurescript "1.7.58" :scope "provided"]
+                 [org.clojure/clojurescript "1.7.107" :scope "provided"]
                  [org.clojure/tools.reader "0.9.2"]
                  [reagent "0.5.0"]
                  [cljsjs/react "0.13.3-1"]
-                 [reagent-forms "0.5.5"]
+                 [reagent-forms "0.5.6"]
                  [reagent-utils "0.1.5"]
                  [org.clojars.frozenlock/reagent-modals "0.2.3"]
                  [secretary "1.2.3"]
                  [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                  [cljs-ajax "0.3.14"]
-                 [org.clojure/data.csv "0.1.2"]]
+                 [org.clojure/data.csv "0.1.3"]]

   :min-lein-version "2.0.0"
   :uberjar-name "arcis.jar"
@@ -51,8 +51,8 @@

   :plugins [[lein-ring "0.9.6"]
             [lein-environ "1.0.0"]
-            [migratus-lein "0.1.5"]
-            [lein-cljsbuild "1.0.6"]]
+            [migratus-lein "0.1.7"]
+            [lein-cljsbuild "1.1.0"]]


Version 0.0.1

Version 0.0.1

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject stockpile "0.0.1-SNAPSHOT"
+(defproject stockpile "0.0.1"
   :description "Simple, durable Clojure queuing library"
   ;; :url "http://example.com/FIXME"
   :license {:name "Apache License Version 2.0"


Exclude out-of-date slf4j and netty from http.async.client dependency

--- project.clj
+++ project.clj
@@ -43,7 +43,8 @@

                  ; http
                  [clj-http "0.7.7"]
-                 [http.async.client "0.5.2"]
+                 [http.async.client "0.5.2" :exclusions [[org.slf4j/slf4j-api]
+                                                         [io.netty/netty]]]

                  ; web
                  [compojure "1.1.5"]


Launching test deployment with the test keys

I need to figure out how to deploy keys to Heroku, so sending the
test keys while I find that out.  This won't be live for anyone.

--- project.clj
+++ project.clj
@@ -86,7 +86,10 @@
                        :env         {:production   true
                                      :cluster-name "memento"
                                      :index-name   "memento"
-                                     :host-name    "localhost"}
+                                     :host-name    "localhost"
+                                     :auth-conf    {:passphrase "testpassword"
+                                                    :pubkey     "keys/dev_auth_pubkey.pem"
+                                                    :privkey    "keys/dev_auth_privkey.pem"}}
                        :hooks       [leiningen.cljsbuild]
                        :cljsbuild
                                     {:jar true


Two new dependencies

Two new dependencies

--- project.clj
+++ project.clj
@@ -29,7 +29,9 @@
                                                       javax.jms/jms
                                                       com.sun.jmdk/jmxtools
                                                       com.sun.jmx/jmxri]]
-                   [hiccup "1.0.4"]]
+                   [hiccup "1.0.4"]
+                   [org.clojars.tisnik/clj-utils "0.1.0-SNAPSHOT"]
+                   [org.clojars.tisnik/clj-config-loader "0.1.0-SNAPSHOT"]]
     :dev-dependencies [[lein-ring "0.8.10"]]
     :plugins [[lein-ring "0.8.10"]
               [codox "0.8.11"]


added test for ad blocking

added test for ad blocking

--- test/sparkledriver/core_test.clj
+++ test/sparkledriver/core_test.clj
@@ -42,7 +42,9 @@
     [:div
      [:p#loosed-upon-the-world.some-revelation {:style "color:red;"}
       [:span.mere-anarchy "The blood-dimmed tide is loosed, and everywhere"]
-      [:span.mere-anarchy "The ceremony of innocence is drowned"]]]]])
+      [:span.mere-anarchy "The ceremony of innocence is drowned"]]]
+    [:div
+     [:img#test-ad {:src "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="}]]]])

 (defroutes taxi-server
   (GET "/" [] (html test-page))
@@ -165,6 +167,15 @@
                (*retry-fn* #(throw (Exception. "fail!"))))
              (catch Exception e "fail!"))))))

+(deftest block-ads
+  (let [js "function isAdLoaded(img) { if (typeof img === 'undefined') { return true; }; if (typeof img.naturalWidth !== 'undefined' && img.naturalWidth <= 1) { return true; }; return false; }\n
+            document.getElementById('test-ad').src = 'http://widgets.outbrain.com/images/widgetIcons/ob_logo_16x16.png?advertiser=1&' + escape(new Date());\n
+            return isAdLoaded(document.getElementById('test-ad'));"]
+    (testing "ad should get blocked"
+      (with-browser [browser (fetch! (make-browser :block-ads true) (str "http://0.0.0.0:" port))]
+        (is (= (execute-script browser js)
+               true))))))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; for quick interactive tests


upgrade dependencies, change figwheel config

Use latest reagent release
Include ReactGridLayout
Remove HTTP handler from figwheel. We will be running a separate HTTP server.

--- project.clj
+++ project.clj
@@ -13,7 +13,8 @@
                  [compojure "1.5.0"]
                  [environ "1.0.2"]
                  [http-kit "2.1.19"]
-                 [reagent "0.5.1"]]
+                 [reagent "0.6.0-alpha"]
+                 [cljsjs/react-grid-layout "0.10.8-0"]]

   :plugins [[lein-cljsbuild "1.1.1"]
             [lein-environ "1.0.1"]]
@@ -65,7 +66,6 @@
              ;; assets and API endpoints can all be accessed on the same host
              ;; and port. If you prefer a separate server process then take this
              ;; out and start the server with `lein run`.
-             :ring-handler user/http-handler

              ;; Start an nREPL server into the running figwheel process. We
              ;; don't do this, instead we do the opposite, running figwheel from


Add atomic dependency

Add atomic dependency

--- project.clj
+++ project.clj
@@ -13,6 +13,8 @@
                  [reagent-forms "0.4.4"]
                  [reagent-utils "0.1.3"]
                  [secretary "1.2.1"]
+                 [com.datomic/datomic-pro "0.9.5130"
+                  :exclusions [org.apache.httpcomponents/httpclient joda-time]]
                  [cljs-ajax "0.3.10"]
                  [org.clojure/clojurescript "0.0-3058" :scope "provided"]
                  [ring "1.3.2"]
@@ -21,6 +23,10 @@
                  [compojure "1.3.2"]
                  [selmer "0.8.0"]
                  [environ "1.0.0"]]
+
+  :repositories [["my.datomic.com" {:url "https://my.datomic.com/repo"
+                                    :username [:env/datomic_username]
+                                    :password [:env/datomic_password]}]]

   :plugins [
             [lein-cljsbuild "1.0.4"]


Make it a map, easier to look at.

Make it a map, easier to look at.

--- project.clj
+++ project.clj
@@ -8,21 +8,18 @@
                  [org.clojure/math.numeric-tower "0.0.4"]]
   :plugins [[lein-codox "0.9.0"]
             [lein-cljsbuild "1.1.1"]]
-  :cljsbuild {:builds
-              [{:id           "src"
-                :source-paths ["src"]
-                :compiler     {:output-to     "target/js/src/brute.js"
-                               :output-dir    "target/js/src"
-                               :source-map    true
-                               :optimizations :none
-                               :pretty-print  true}}
-               {:id           "test"
-                :source-paths ["src" "test"]
-                :compiler     {:output-to     "target/js/test/brute.js"
-                               :output-dir    "target/js/test"
-                               :source-map    true
-                               :optimizations :none
-                               :pretty-print  true}}]}
+  :cljsbuild {:builds {:src  {:source-paths ["src"]
+                              :compiler     {:output-to     "target/js/src/brute.js"
+                                             :output-dir    "target/js/src"
+                                             :source-map    true
+                                             :optimizations :none
+                                             :pretty-print  true}}
+                       :test {:source-paths ["src" "test"]
+                              :compiler     {:output-to     "target/js/test/brute.js"
+                                             :output-dir    "target/js/test"
+                                             :source-map    true
+                                             :optimizations :none
+                                             :pretty-print  true}}}}
   :profiles {:dev {:dependencies [[org.clojure/tools.namespace "0.2.10"]]
                    :source-paths ["dev"]
                    :repl-options {:init-ns user}


Version 1.0.18-SNAPSHOT

Version 1.0.18-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject mixradio/radix "1.0.17"
+(defproject mixradio/radix "1.0.18-SNAPSHOT"
   :description "A Clojure library providing the root functionality for web services"
   :license "https://github.com/mixradio/radix/blob/master/LICENSE"
   :url "https://github.com/mixradio/radix"


Update dependencies.

Update dependencies.

--- project.clj
+++ project.clj
@@ -12,5 +12,5 @@
                      :plugins [[codox "0.8.10"]]
                      :codox {:output-dir "target/codox"
                              :defaults {:doc/format :markdown}}
-                     :dependencies [[org.clojure/tools.namespace "0.2.7"]
-                                    [com.h2database/h2 "1.4.183"]]}})
+                     :dependencies [[org.clojure/tools.namespace "0.2.8"]
+                                    [com.h2database/h2 "1.4.184"]]}})


bumped clojurescript version

bumped clojurescript version

--- project.clj
+++ project.clj
@@ -3,7 +3,7 @@
   :url "https://github.com/vheuken/moomoo"

   :dependencies [[org.clojure/clojure "1.8.0"]
-                 [org.clojure/clojurescript "1.9.229"]
+                 [org.clojure/clojurescript "1.9.293"]
                  [org.clojure/core.async "0.2.385"]
                  [org.omcljs/om "0.9.0"]
                  [com.cognitect/transit-cljs "0.8.225"]