CMR-291: Added tests for searching for fields with special characters.

error: pathspec 'test/cmr/system_int_test/search/concept_special_character_search_test.clj' did not match any file(s) known to git

--- test/cmr/system_int_test/search/concept_special_character_search_test.clj
+++ test/cmr/system_int_test/search/concept_special_character_search_test.clj
@@ -0,0 +1,47 @@
+(ns cmr.system-int-test.search.concept-special-character-search-test
+  "Integration tests for searching with special characters"
+  (:require [clojure.test :refer :all]
+            [cmr.system-int-test.utils.ingest-util :as ingest]
+            [cmr.system-int-test.utils.search-util :as search]
+            [cmr.system-int-test.utils.index-util :as index]
+            [cmr.system-int-test.data2.collection :as dc]
+            [cmr.system-int-test.data2.granule :as dg]
+            [cmr.system-int-test.data2.core :as d]))
+
+(use-fixtures :each (ingest/reset-fixture "CMR_PROV1"))
+
+(deftest search-collection-special-characters
+  (let [coll1 (d/ingest "CMR_PROV1" (dc/collection
+                                      {:entry-title "Dataset with degree and smiley face symbols"
+                                       :short-name "ShortName with degree ° and smiley face ☺ symbols"}))
+        coll2 (d/ingest "CMR_PROV1" (dc/collection
+                                      {:entry-title "Dataset with degree ° and smiley face ☺ symbols"
+                                       :short-name "ShortName2"}))
+        coll3 (d/ingest "CMR_PROV1" (dc/collection {}))]
+
+    (index/refresh-elastic-index)
+
+    (testing "search fields with special characters."
+      (are [key value items] (d/refs-match? items
+                                            (search/find-refs :collection {key value}))
+           :entry-title "Dataset with degree and smiley face symbols" [coll1]
+           :entry-title "Dataset with degree ° and smiley face ☺ symbols" [coll2]
+           :short-name "ShortName2" [coll2]
+           :short-name "ShortName with degree ° and smiley face ☺ symbols" [coll1]))))
+
+(deftest search-granule-special-characters
+  (let [coll1 (d/ingest "CMR_PROV1" (dc/collection {:short-name "ShortName with degree ° and smiley face ☺ symbols"}))
+        coll2 (d/ingest "CMR_PROV1" (dc/collection {:entry-title "Dataset with degree ° and smiley face ☺ symbols"}))
+        coll3 (d/ingest "CMR_PROV1" (dc/collection {}))
+        gran1 (d/ingest "CMR_PROV1" (dg/granule coll1 {:granule-ur "GranuleUR with degree ° and smiley face ☺ symbols"}))
+        gran2 (d/ingest "CMR_PROV1" (dg/granule coll2 {:granule-ur "Granule2"}))
+        gran3 (d/ingest "CMR_PROV1" (dg/granule coll3 {:granule-ur "Granule3"}))]
+
+    (index/refresh-elastic-index)
+
+    (testing "search fields with special characters."
+      (are [key value items] (d/refs-match? items
+                                            (search/find-refs :granule {key value}))
+           :short-name "ShortName with degree ° and smiley face ☺ symbols" [gran1]
+           :entry-title "Dataset with degree ° and smiley face ☺ symbols" [gran2]
+           :granule-ur "GranuleUR with degree ° and smiley face ☺ symbols" [gran1]))))


test fix

test fix

--- src/metabase/api/meta/db.clj
+++ src/metabase/api/meta/db.clj
@@ -34,7 +34,7 @@
   (->404 (sel :one Database :id id)
          (hydrate :organization)))

-(defendpoint PUT "/:id" [id :as {{:keys [name engine details]} :body}]
+(defendpoint PUT "/:id" [id :as {body :body}]
   (write-check Database id)
   (check-500 (->> (u/select-non-nil-keys body :name :engine :details)
                   (medley/mapply upd Database id)))


Vary test no longer uses deprecated code

--- test/yada/vary_test.clj
+++ test/yada/vary_test.clj
@@ -4,26 +4,33 @@
   (:require
    [clojure.test :refer :all]
    [clojure.string :as str]
-   [ring.mock.request :refer (request)]
+   [ring.mock.request :refer [request]]
    [schema.test :as st]
    [yada.charset :as charset]
-   [yada.representation :refer (coerce-representations representation-seq vary)]
-   [yada.util :refer (parse-csv)]
+   [yada.representation :refer [vary]]
+   [yada.schema :as ys]
+   [yada.util :refer [parse-csv]]
    [yada.yada :as yada :refer [yada]]))

 (st/deftest vary-test
   (is (= #{:media-type}
          (vary
-          (representation-seq (coerce-representations [{:media-type #{"text/plain" "text/html"}}])))))
+          (ys/representation-seq
+           (ys/representation-set-coercer
+            [{:media-type #{"text/plain" "text/html"}}])))))

+  (is (= #{:charset}
+         (vary
+          (ys/representation-seq
+           (ys/representation-set-coercer
+            [{:media-type "text/html" :charset #{"UTF-8" "Latin-1"}}])))))

-  (is (= #{:charset} (vary
-                      (representation-seq (coerce-representations [{:charset #{"UTF-8" "Latin-1"}}])))))
-
-  (is (= #{:media-type :charset} (vary
-                                  (representation-seq (coerce-representations [{:media-type #{"text/plain" "text/html"}
-                                                                                :charset #{"UTF-8" "Latin-1"}}])))))
-)
+  (is (= #{:media-type :charset}
+         (vary
+          (ys/representation-seq
+           (ys/representation-set-coercer
+            [{:media-type #{"text/plain" "text/html"}
+              :charset #{"UTF-8" "Latin-1"}}]))))))

 (st/deftest vary-header-test []
   (let [resource "Hello World!"


nah, nevermind, dumb idea

nah, nevermind, dumb idea

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jtbeckha/alda.git/'


Formatting

Formatting

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/michaelsbradleyjr/shen.clj.git/'


example runnable script

example runnable script

error: pathspec 'examples/helloworld.clj' did not match any file(s) known to git

--- examples/helloworld.clj
+++ examples/helloworld.clj
@@ -0,0 +1,3 @@
+":"; mkdir -p ~/.dj; if [ ! -e "$HOME/.dj/run" ]; cd $HOME/.dj; curl -O 'https://raw.githubusercontent.com/bmillare/dj3/master/bin/run'; cd -; fi; exec sh ~/.dj/run $0 $@
+(prn "clojure runs baybe" *command-line-args*)
+(println (System/getProperty "user.dir"))


can create todo-item (with functions) and has a transform data to todo-item function

error: pathspec 'src/todos/todo_item.clj' did not match any file(s) known to git

--- src/todos/todo_item.clj
+++ src/todos/todo_item.clj
@@ -0,0 +1,22 @@
+(ns todos.todo-item)
+
+(defn todo-create
+  [n]
+  (let [todo-name (atom n)
+        done (atom false)]
+    {:name     (fn [] @todo-name)
+     :done?    (fn [] @done)
+     :rename   (partial reset! todo-name)
+     :set-done (partial reset! done)
+     :plain    (fn [] {:name @todo-name :done? @done})
+     }))
+
+; (atom []) cant be saved! be aware to build a transformfunction
+;
+(defn todo-load-from-plain
+  [todo-plain]
+  (let [item (todo-create (todo-plain :name))]
+    ((item :set-done) (todo-plain :done?))
+    item
+    ))
+


Stub for config_test.clj

Stub for config_test.clj

error: pathspec 'test/zg/config_test.clj' did not match any file(s) known to git

--- test/zg/config_test.clj
+++ test/zg/config_test.clj
@@ -0,0 +1,13 @@
+(ns zg.config-test
+  (:require [clojure.test :refer :all]
+            [zg.config :refer :all]))
+
+;
+; Common functions used by tests.
+;
+
+(defn callable?
+    "Test if given function-name is bound to the real function."
+    [function-name]
+    (clojure.test/function? function-name))
+


Use multi-arity handler instead of mountified handler-wrapper

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/mail-works.git/'


Added Clojure maze solution.

Added Clojure maze solution.

error: pathspec 'src/main/clojure/maze-layout.clj' did not match any file(s) known to git


Fixed wrong way of determining RN environment

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/artemyarulin/koh.git/'


Bump counter for optimistic loops

Bump counter for optimistic loops

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leif47/immutabledb-experimental.git/'


Iteration

Iteration

error: pathspec 'src/mark-volkmann-tutorial/iteration.clj' did not match any file(s) known to git

--- src/mark-volkmann-tutorial/iteration.clj
+++ src/mark-volkmann-tutorial/iteration.clj
@@ -0,0 +1,43 @@
+;; Iteration
+;; http://java.ociweb.com/mark/clojure/article.html#Iteration
+
+; dotimes - execute n times expression, _ ommit value (from 0)
+(dotimes [card-number 3]
+  (println "deal card number" (inc card-number)))
+
+(defn my-fn [ms]
+  (println "entered my-fn")
+  (Thread/sleep ms)
+  (println "leaving my-fn"))
+
+; while - execute body while is true
+(let [thread (Thread. #(my-fn 1))]
+  (.start thread)
+  (println "started thread")
+  (while (.isAlive thread)
+    (print ".")
+    (flush))
+  (println "thread stopped"))
+
+
+;; List Comprehension
+; for - lazy, doseq - return nil, side-effects: :when, :while - filtering
+
+(def cols "ABCD")
+(def rows (range 1 4)) ; purposely larger than needed to demonstarte :while
+
+(println "for demo")
+; dorun - force evaluation of lazy for
+(dorun
+  (for [col cols :when (not= col \B)
+        row rows :while (< row 3)]
+    (println (str col row))))
+
+(println "\ndoseq demo")
+(doseq [col cols :when (not= col \B)
+        row rows :while (< row 3)]
+  (println (str col row)))
+
+; my: doseq = (dorun (for ...))
+
+; loop, recur


added p11.clj

added p11.clj

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/drcabana/euler-fp.git/'


scrub real names from test data

scrub real names from test data

--- test/metabase/test_data/data.clj
+++ test/metabase/test_data/data.clj
@@ -12,21 +12,21 @@

 ;; [name last_login]
 (defonce ^:private users
-  [["Justin Ho" (timestamp 2014 4 1 1 30)]
-   ["David Baden" (timestamp 2014 12 5 7 15)]
-   ["Roberto Sanabria" (timestamp 2014 11 6 8 15)]
-   ["Noah Sidman-Gale" (timestamp 2014 1 1 0 30)]
-   ["Cam Saül" (timestamp 2014 10 3 10 30)]
-   ["Kyle Doherty" (timestamp 2014 8 2 5 30)]
-   ["Anshu Agarwal" (timestamp 2014 8 2 2 30)]
-   ["Kiah Buchner" (timestamp 2014 2 1 2 15)]
-   ["Adam Stocker" (timestamp 2014 4 3 2 30)]
-   ["Allen Gilliland" (timestamp 2014 7 3 12 30)]
-   ["Christina Crosetti" (timestamp 2014 11 1)]
-   ["Sameer Al-Sakran" (timestamp 2014 7 2 18 30)]
-   ["Daniel Wiesenthal" (timestamp 2014 8 1 3 30)]
-   ["Douglas Graves" (timestamp 2014 10 3 6 45)]
-   ["RoveLine Ibañez" (timestamp 2014 8 1 5 45)]])
+  [["Plato Yeshua" (timestamp 2014 4 1 1 30)]
+   ["Felipinho Asklepios" (timestamp 2014 12 5 7 15)]
+   ["Kaneonuskatew Eiran" (timestamp 2014 11 6 8 15)]
+   ["Simcha Yan" (timestamp 2014 1 1 0 30)]
+   ["Quentin Sören" (timestamp 2014 10 3 10 30)]
+   ["Shad Ferdynand" (timestamp 2014 8 2 5 30)]
+   ["Conchúr Tihomir" (timestamp 2014 8 2 2 30)]
+   ["Szymon Theutrich" (timestamp 2014 2 1 2 15)]
+   ["Nils Gotam" (timestamp 2014 4 3 2 30)]
+   ["Frans Hevel" (timestamp 2014 7 3 12 30)]
+   ["Spiros Teofil" (timestamp 2014 11 1)]
+   ["Kfir Caj" (timestamp 2014 7 2 18 30)]
+   ["Dwight Gresham" (timestamp 2014 8 1 3 30)]
+   ["Broen Olujimi" (timestamp 2014 10 3 6 45)]
+   ["Rüstem Hebel" (timestamp 2014 8 1 5 45)]])

 ;; name
 (defonce ^:private categories


Vanilla y-combinator, unmodified.

Vanilla y-combinator, unmodified.

error: pathspec 'Clojure/y-combinator.clj' did not match any file(s) known to git

--- Clojure/y-combinator.clj
+++ Clojure/y-combinator.clj
@@ -0,0 +1,21 @@
+; :mode=clojure:
+
+; Experiments with the y-combinator, initially copied from here:
+; http://www.enrico-franchi.org/2011/01/y-combinator-in-clojure.html
+
+(defn Y [F]
+    (let [G (fn [K]
+        (F (fn [& A]
+            (apply (K K) A))))]
+        (G G)))
+
+
+(def fact
+    (Y (fn [f]
+        (fn [n]
+            (if (<= n 0)
+                1
+                (* n (f (- n 1))))))))
+
+(println (fact 5))
+


#29 add a wrapper for nanao

#29 add a wrapper for nanao

error: pathspec 'src/tamaki/text/similarity.clj' did not match any file(s) known to git

--- src/tamaki/text/similarity.clj
+++ src/tamaki/text/similarity.clj
@@ -0,0 +1,11 @@
+(ns tamaki.text.similarity
+  [:import (com.ranceworks.nanao.vsm SimilarityCalculator)
+          (java.util HashMap) ]
+  )
+
+
+(defn calc-similarity [text other-key-text-pairs]
+  (let [pairs (reduce #(do (.put %1 (:key %2) (:text %2)) %1) (new HashMap) other-key-text-pairs)]
+    (for [key-score (SimilarityCalculator/calcSimilarity text pairs)]
+      {:key (.getKey key-score) :score (.getScore key-score)}
+      )))


Whitespace

Whitespace

--- 2-collectors/clojure-collector/src/snowplow/clojure_collector/config.clj
+++ 2-collectors/clojure-collector/src/snowplow/clojure_collector/config.clj
@@ -33,6 +33,7 @@
    cookie should last for"
   (get (System/getenv) duration-varname default-duration))

+
 (def p3p-header
   "Get the P3P header.
    Return a default P3P policy if not set"


Load tabular data

Load tabular data

error: pathspec 'raw_data/convert_players.clj' did not match any file(s) known to git

--- raw_data/convert_players.clj
+++ raw_data/convert_players.clj
@@ -0,0 +1,12 @@
+(use '[clojure.string :only (split-lines split)])
+
+(defn read_tabular_file [filename]
+  (let [data (slurp filename)
+        lines (split-lines data)
+        split-by-tab #(split % #"\t")]
+    (map split-by-tab lines)))
+
+
+(def raw (read_tabular_file "2010/brazil.data"))
+
+(println (ffirst raw))


Add reg-deadline to context

Add reg-deadline to context

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-notification-works.git/'


Simplify state ID instructions since we only show for by-mail


STORM-1027: Use overflow buffer for emitting metrics

--- storm-core/src/clj/backtype/storm/daemon/executor.clj
+++ storm-core/src/clj/backtype/storm/daemon/executor.clj
@@ -294,27 +294,32 @@
           receive-queue
           [[nil (TupleImpl. worker-context [interval] Constants/SYSTEM_TASK_ID Constants/METRICS_TICK_STREAM_ID)]]))))))

-(defn metrics-tick [executor-data task-data ^TupleImpl tuple]
-  (let [{:keys [interval->task->metric-registry ^WorkerTopologyContext worker-context]} executor-data
-        interval (.getInteger tuple 0)
-        task-id (:task-id task-data)
-        name->imetric (-> interval->task->metric-registry (get interval) (get task-id))
-        task-info (IMetricsConsumer$TaskInfo.
-                    (hostname (:storm-conf executor-data))
-                    (.getThisWorkerPort worker-context)
-                    (:component-id executor-data)
-                    task-id
-                    (long (/ (System/currentTimeMillis) 1000))
-                    interval)
-        data-points (->> name->imetric
-                      (map (fn [[name imetric]]
-                             (let [value (.getValueAndReset ^IMetric imetric)]
-                               (if value
-                                 (IMetricsConsumer$DataPoint. name value)))))
-                      (filter identity)
-                      (into []))]
-      (if (seq data-points)
-        (task/send-unanchored task-data Constants/METRICS_STREAM_ID [task-info data-points]))))
+(defn metrics-tick
+  ([executor-data task-data ^TupleImpl tuple overflow-buffer]
+   (let [{:keys [interval->task->metric-registry ^WorkerTopologyContext worker-context]} executor-data
+         interval (.getInteger tuple 0)
+         task-id (:task-id task-data)
+         name->imetric (-> interval->task->metric-registry (get interval) (get task-id))
+         task-info (IMetricsConsumer$TaskInfo.
+                     (hostname (:storm-conf executor-data))
+                     (.getThisWorkerPort worker-context)
+                     (:component-id executor-data)
+                     task-id
+                     (long (/ (System/currentTimeMillis) 1000))
+                     interval)
+         data-points (->> name->imetric
+                          (map (fn [[name imetric]]
+                                 (let [value (.getValueAndReset ^IMetric imetric)]
+                                   (if value
+                                     (IMetricsConsumer$DataPoint. name value)))))
+                          (filter identity)
+                          (into []))]
+     (if (seq data-points)
+       (task/send-unanchored task-data Constants/METRICS_STREAM_ID [task-info data-points] overflow-buffer))))
+  ([executor-data task-data ^TupleImpl tuple]
+    (metrics-tick executor-data task-data tuple nil)
+    ))
+

 (defn setup-ticks! [worker executor-data]
   (let [storm-conf (:storm-conf executor-data)
@@ -453,7 +458,16 @@
         last-active (atom false)
         spouts (ArrayList. (map :object (vals task-datas)))
         rand (Random. (Utils/secureRandomLong))
-
+
+        ;; the overflow buffer is used to ensure that spouts never block when emitting
+        ;; this ensures that the spout can always clear the incoming buffer (acks and fails), which
+        ;; prevents deadlock from occuring across the topology (e.g. Spout -> Bolt -> Acker -> Spout, and all
+        ;; buffers filled up)
+        ;; when the overflow buffer is full, spouts stop calling nextTuple until it's able to clear the overflow buffer
+        ;; this limits the size of the overflow buffer to however many tuples a spout emits in one call of nextTuple,
+        ;; preventing memory issues
+        overflow-buffer (ConcurrentLinkedQueue.)
+
         pending (RotatingMap.
                  2 ;; microoptimize for performance of .size method
                  (reify RotatingMap$ExpiredCallback
@@ -465,7 +479,7 @@
                           (let [stream-id (.getSourceStreamId tuple)]
                             (condp = stream-id
                               Constants/SYSTEM_TICK_STREAM_ID (.rotate pending)
-                              Constants/METRICS_TICK_STREAM_ID (metrics-tick executor-data (get task-datas task-id) tuple)
+                              Constants/METRICS_TICK_STREAM_ID (metrics-tick executor-data (get task-datas task-id) tuple overflow-buffer)
                               Constants/CREDENTIALS_CHANGED_STREAM_ID
                                 (let [task-data (get task-datas task-id)
                                       spout-obj (:object task-data)]
@@ -489,16 +503,7 @@
         event-handler (mk-task-receiver executor-data tuple-action-fn)
         has-ackers? (has-ackers? storm-conf)
         emitted-count (MutableLong. 0)
-        empty-emit-streak (MutableLong. 0)
-
-        ;; the overflow buffer is used to ensure that spouts never block when emitting
-        ;; this ensures that the spout can always clear the incoming buffer (acks and fails), which
-        ;; prevents deadlock from occuring across the topology (e.g. Spout -> Bolt -> Acker -> Spout, and all
-        ;; buffers filled up)
-        ;; when the overflow buffer is full, spouts stop calling nextTuple until it's able to clear the overflow buffer
-        ;; this limits the size of the overflow buffer to however many tuples a spout emits in one call of nextTuple,
-        ;; preventing memory issues
-        overflow-buffer (ConcurrentLinkedQueue.)]
+        empty-emit-streak (MutableLong. 0)]

     [(async-loop
       (fn []


sweet sieve, fits in a tweet, p10.clj

sweet sieve, fits in a tweet, p10.clj


Add test-utils/service

Add test-utils/service

The response-for calls in tests use this as their first arg.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/turbovote-http-api.git/'


Checkin an attempt at a test

Checkin an attempt at a test

error: pathspec 'test/circle/integration/production.clj' did not match any file(s) known to git

--- test/circle/integration/production.clj
+++ test/circle/integration/production.clj
@@ -0,0 +1,48 @@
+(ns circle.integration.production
+  (:require [circle.sh :as sh])
+  (:require [clojure.java.io :as io])
+  (:use [robert.bruce :only (try-try-again)])
+  (:require [clj-http.client :as http])
+  (:require [circle.util.posix :as posix])
+  (:use midje.sweet))
+
+;;
+;; This test is currently not working because we're having difficulty killing the trinidad process at the end of the test.
+;;
+
+;; (fact "the server starts up in production mode"
+;;   (let [success? (atom nil) ;; nil = unknown. false = fail
+;;         process (sh/process "trinidad &> trinidad.log; echo $! > trinidad.pid"
+;;                             :environment {"RAILS_ENV" "production"
+;;                                           ;; unset swank in case the current process is using it
+;;                                           "CIRCLE_SWANK" "''"}
+;;                             :pwd "")
+
+;;         t (Thread. (fn []
+;;                      (let [exit (.waitFor process)]
+;;                        (println "server exited:" exit
+;;                                 ;; java is retarded, getInputStream actually returns stdout, not stdin.
+;;                                 (-> process .getInputStream (slurp))
+;;                                 (-> process .getErrorStream (slurp))))
+;;                      ;; if we got here, the process exited, and the test fails.
+;;                      (println "setting success=false")
+;;                      (swap! success? (constantly false))))]
+;;     (.start t)
+;;     (try-try-again
+;;      {:sleep 5000
+;;       :tries (* 12 5)
+;;       :error-hook (fn [e]
+;;                     (if (nil? @success?)
+;;                       nil
+;;                       false))}
+;;      (fn []
+;;        (let [resp (http/get "http://localhost:3000")]
+;;          (when (= 200 (-> resp :status))
+;;            (swap! success? (constantly true))))))
+
+;;     @success? => true
+;;     (let [trinidad-pid (Integer/parseInt (slurp "trinidad.pid"))]
+;;       (println "trinidad-pid= " trinidad-pid))
+;;     ;; (posix/kill :signal 9)
+;;     ))
+


[EN] Small refactorings.

[EN] Small refactorings.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/form-works.git/'


Simplify tempfile impl having new closeable abstraction.

--- src/uxbox/util/tempfile.clj
+++ src/uxbox/util/tempfile.clj
@@ -13,18 +13,10 @@
            java.nio.file.attribute.FileAttribute
            java.nio.file.attribute.PosixFilePermissions))

-(defrecord CloseablePath [^Path path]
-  java.lang.AutoCloseable
-  (close [_]
-    (Files/deleteIfExists path)))
-
 (defn create
   "Create a temporal file."
-  [& {:keys [suffix prefix wrap]}]
+  [& {:keys [suffix prefix]}]
   (let [perms (PosixFilePermissions/fromString "rwxr-xr-x")
         attr (PosixFilePermissions/asFileAttribute perms)
-        attrs (into-array FileAttribute [attr])
-        file (Files/createTempFile prefix suffix attrs)]
-    (if wrap
-      (CloseablePath. file)
-      file)))
+        attrs (into-array FileAttribute [attr])]
+    (Files/createTempFile prefix suffix attrs)))


review on protocols

review on protocols

error: pathspec 'src/language/protocol.clj' did not match any file(s) known to git

--- src/language/protocol.clj
+++ src/language/protocol.clj
@@ -0,0 +1,77 @@
+(ns language.protocol)
+
+
+(defprotocol Matrix
+  "Protocol for working with 2d data structures"
+  (lookup [matrix i j])
+  (update [matrix i j val])
+  (rows [matrix])
+  (cols [matrix])
+  (dims [matrix]))
+
+(extend-protocol Matrix
+
+  clojure.lang.IPersistentVector
+  (lookup [vov x y]
+          (get-in vov [x y]))
+  (update [vov x y val]
+          (assoc-in vov [x y] val))
+  (rows [vov]
+        (seq vov))
+  (cols [vov]
+        (apply map vector vov))
+  (dims [vov]
+        [(count vov) (count (first vov))])
+
+  nil
+  (lookup [x i j])
+  (update [x i j val])
+  (rows [x] [])
+  (cols [x] [])
+  (dims [x] [0 0])
+
+  (Class/forName "[[D")
+  (lookup [arr i j]
+          (aget arr i j))
+  (update [arr i j val]
+          (let [clone (aclone arr)]
+            (aset clone i
+                  (doto (aclone (aget clone i))
+                    (aset j val)))
+            clone))
+  (rows [arr]
+        (map vec arr))
+  (cols [arr]
+        (apply map vector arr))
+  (dims [arr]
+        (let [rs (count arr)]
+          (if (zero? rs)
+            [0 0]
+            [rs (count (aget arr 0))]))))
+
+
+(defn vov [h v]
+  "create a vector of h v-item vectors"
+  (vec (repeat h (vec (repeat v nil)))))
+
+;(update [[1 2 3] [4 5 9] [6 7 8]] 2 1 100)
+;(dims [[1 2 3] [4 5 9] [6 7 8]])
+;(cols nil)
+;(dims nil)
+;(def vov-a (vov 3 5))
+;(update vov-a 2 4 3)
+;(cols (update vov-a 2 4 3))
+
+
+
+
+
+
+;;;;;;;;;;;;;;;;;;;tips;;;;;;;;;;;;;;
+
+(vector 1 2 3)
+(vec "123")
+(apply map vector [[1 2 3] [4 5 6] [7 8]])
+
+
+


core.clj test is ready (testing the obvious)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/colophon/clarango.git/'


Add query planner hint for message sending

Uses `pg_hint_plan` under the hood, which is assumed to be present on a
production server. The directives can be ignored for development
purposes. At this time, I am not able to reproduce the conditions under
which the production server uses a suboptimal plan, just that it does
occasionally.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/scheduled-message-works.git/'


pandigital for 41

pandigital for 41

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tlight/project-euler.git/'


REPL-ean midje gehitu

REPL-ean midje gehitu

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lnmnd/magnet.zer.git/'


Add file for dynamic integration of discuss-cljs

error: pathspec 'src/discuss/integration.cljs' did not match any file(s) known to git

--- src/discuss/integration.cljs
+++ src/discuss/integration.cljs
@@ -0,0 +1,36 @@
+(ns discuss.integration
+  (:require-macros [cljs.core.async.macros :refer [go]])
+  (:require [goog.events :as events]
+            [cljs.core.async :refer [put! chan <!]]
+            [discuss.lib :as lib]
+            [goog.dom :as gdom]
+            [goog.object :as gobj]
+            ))
+
+(defn selected-text []
+  (let [selection (str (. js/window (getSelection)))]
+    (.log js/console selection)))
+
+(defn listen [el type]
+  (let [out (chan)]
+    (events/listen el type
+                   (fn [e] (put! out e)))
+    out))
+
+
+;(lib/log (.getElementsByTagName js/document "p"))
+;(apply print (.getElementsByTagName js/document "p"))
+
+
+(gobj/forEach (.getElementsByTagName js/document "p")
+                     (fn [obj] (lib/log obj)))
+
+(let [clicks (listen (.getElementById js/document "discuss-text") "click")
+      col (.getElementsByTagName js/document "p")
+      ;ps (gobj/forEach col #(listen % "click"))
+      ;ps (map #(listen % "click") (js->clj (.getElementsByTagName js/document "p")))
+      ]
+  (go (while true
+        (.log js/console (<! clicks)))))
+
+;; http://www.thesoftwaresimpleton.com/blog/2014/12/30/core-dot-async-dot-mouse-dot-down/


speeding up dependents sorting, and correctly sorting

--- sidecar/src/figwheel_sidecar/core.clj
+++ sidecar/src/figwheel_sidecar/core.clj
@@ -243,21 +243,48 @@
         :eval-body (slurp %)})
    (dependency-files st)))

-(def ^:dynamic *transitive-dep-cache* false)
-
-(defn transitive-dependents [nm]
-  (let [cached (get-in @*transitive-dep-cache* (name nm))]
-    (if (not (nil? cached))
-      cached
-      (let [res (set (ana/ns-dependents nm))]
-        (swap! *transitive-dep-cache* assoc (name nm) res)
-        res))))
+
+;; inlining this for now so that people can use it now
+
+(defn get-deps [ns]
+  (set
+   (map first
+        (filter
+         (fn [[_ ns-info]]
+           (contains? (:requires ns-info) ns))
+         (get @cljs.env/*compiler* :cljs.analyzer/namespaces)))))
+
+;; from cljs.util; will use that one in when it hits mainstream
+(defn cljs-topo-sort
+  ([x get-deps]
+    (cljs-topo-sort x 0 (atom (sorted-map)) (memoize get-deps)))
+  ([x depth state memo-get-deps]
+    (let [deps (memo-get-deps x)]
+      (swap! state update-in [depth] (fnil into #{}) deps)
+      (doseq [dep deps]
+        (cljs-topo-sort dep (inc depth) state memo-get-deps))
+      (doseq [[<depth _] (subseq @state < depth)]
+        (swap! state update-in [<depth] difference deps))
+      (when (= depth 0)
+        (distinct (apply concat (vals @state)))))))
+
+(defn create-ns-dependents-fn []
+  (let [mem-deps (memoize get-deps)]
+    (memoize
+     (fn [ns]
+       (set (cljs-topo-sort ns 0 (atom (sorted-map)) mem-deps))))))
+
+;; creating a new memoized fn each time we get a request
+(def ^:dynamic *transitive-dep-fn* false)

 (defn topo-compare [nm nm2]
   (cond
     (= nm nm2) 0
-    (get (transitive-dependents nm) nm2) -1
+    (get (*transitive-dep-fn* nm) nm2) -1
     :else 1))
+
+(defn topo-sort [ns-syms]
+  (vec (sort topo-compare ns-syms)))

 (defn mark-changed-ns [state ns-syms]
   (mapv (fn [nm]
@@ -265,9 +292,6 @@
                      (if (target-file-changed? state nm) true false)))
         ns-syms))

-(defn topo-sort [ns-syms]
-  (vec (sort topo-compare ns-syms)))
-
 (defn find-figwheel-always []
   (set (filter (fn [n] (-> n meta :figwheel-always)) (ana-api/all-ns))))

@@ -275,8 +299,10 @@
   (cond
     (nil? cljs.env/*compiler*) changed-ns-syms'
     (false? (:recompile-dependents state))
-    (union (keep (fn [n] (:name (ana-api/find-ns n))) changed-ns-syms')
-           (find-figwheel-always))
+    (topo-sort
+     (reverse (union (keep (fn [n] (:name (ana-api/find-ns n))) changed-ns-syms')
+                     (find-figwheel-always))))
+
     :else
     (let [changed-ns-syms       (set (keep (fn [n] (:name (ana-api/find-ns n))) changed-ns-syms'))
           dependants            (set (mapcat
@@ -341,7 +367,7 @@
   ;; this is the new way where if additional changes are needed they
   ;; are made explicitely
   ([state old-mtimes new-mtimes additional-ns]
-   (binding [*transitive-dep-cache* (atom {})]
+   (binding [*transitive-dep-fn* (create-ns-dependents-fn)]
      (notify-cljs-ns-changes state
        (set (concat additional-ns
                     (keep get-ns-from-source-file-path


Removed incovenient logger

Removed incovenient logger

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/acessocard/microscope.git/'


nil check for docs description

nil check for docs description

--- cljs-server/cljsinfo_server/html.cljs
+++ cljs-server/cljsinfo_server/html.cljs
@@ -451,7 +451,8 @@
           [:div.inner-left-0193f
             (doc-page-title namespace-str symbol-str)
             (signature symbol-str (:signature docs))
-            [:div.description-71ed4 (marked (:description docs))]]
+            [:div.description-71ed4 (when-let [desc (:description docs)]
+                                      (marked desc))]]
           [:div.inner-right-f3567 (docs-info-table docs)]
           [:div.clr-43e49]
           (when-let [exs (:examples docs)] (examples exs))


Correct stack access

Correct stack access

--- src/re_frame/middleware.cljs
+++ src/re_frame/middleware.cljs
@@ -2,7 +2,7 @@
   (:require
     [reagent.ratom  :refer [IReactiveAtom]]
     [re-frame.undo  :refer [store-now!]]
-    [re-frame.utils :refer [warn log dbg group groupEnd]]
+    [re-frame.utils :refer [warn log group groupEnd]]
     [clojure.data   :as data]))

@@ -51,7 +51,7 @@
       (handler db v)
       (catch :default e     ;; ooops, handler threw
         (do
-          (.error js/console e.stack)
+          (.error js/console (.-stack e))
           (throw e))))))

@@ -62,6 +62,7 @@
   [handler]
   (fn debug-handler
     [db v]
+    (log  "-- New Event ----------------------------------------------------")
     (group "re-frame event: " v)
     (let [new-db  (handler db v)
           diff    (data/diff db new-db)]


Updated cryogen-core dependency

Updated cryogen-core dependency

--- src/leiningen/new/cryogen/project.clj
+++ src/leiningen/new/cryogen/project.clj
@@ -7,7 +7,7 @@
                            [ring/ring-devel "1.3.2"]
                            [compojure "1.3.1"]
                            [ring-server "0.3.1"]
-                           [cryogen-core "0.1.5"]]
+                           [cryogen-core "0.1.6"]]
             :plugins [[lein-ring "0.8.13"]]
             :main cryogen-core.compiler
             :ring {:init cryogen.server/init


add piggieback middleware to support brepl

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aamedina/om-cljs.git/'


Added a Clojure wrapper for the App Engine user service.

error: pathspec 'src/appengine_magic/services/user.clj' did not match any file(s) known to git

--- src/appengine_magic/services/user.clj
+++ src/appengine_magic/services/user.clj
@@ -0,0 +1,30 @@
+(ns appengine-magic.services.user
+  (:import [com.google.appengine.api.users User UserService UserServiceFactory]))
+
+
+(defonce *default-user-service* (atom nil))
+
+
+(defn- ensure-user-service [user-service]
+  (when (nil? @user-service)
+    (reset! user-service (UserServiceFactory/getUserService))))
+
+
+(defn current-user [& {:keys [user-service]
+                       :or {user-service *default-user-service*}}]
+  (ensure-user-service user-service)
+  (.getCurrentUser @user-service))
+
+
+(defn login-url [& {:keys [user-service destination]
+                    :or {user-service *default-user-service*
+                         destination "/"}}]
+  (ensure-user-service user-service)
+  (.createLoginURL @user-service destination))
+
+
+(defn logout-url [& {:keys [user-service destination]
+                     :or {user-service *default-user-service*
+                          destination "/"}}]
+  (ensure-user-service user-service)
+  (.createLogoutURL @user-service destination))


Start to add tests.

Start to add tests.

error: pathspec 'test/afterglow/effects/color-test.clj' did not match any file(s) known to git

--- test/afterglow/effects/color-test.clj
+++ test/afterglow/effects/color-test.clj
@@ -0,0 +1,11 @@
+(ns afterglow.effects.color-test
+  (:require [clojure.test :refer :all]
+            [afterglow.effects.color :refer :all]
+            [afterglow.channels :as channels]
+            [com.evocomputing.colors :as colors]
+            [afterglow.fixtures.chauvet :as chauvet]
+            [taoensso.timbre :as timbre :refer [error warn info debug spy]]))
+
+(deftest test-extract-rgb
+  (testing "Finding RGB color channels")
+  (is (= [2 3 4] (map :offset (#'afterglow.effects.color/extract-rgb [(chauvet/slimpar-hex3-irc)])))))


add lein profile

add lein profile

error: pathspec 'files/lein/profiles.clj' did not match any file(s) known to git

--- files/lein/profiles.clj
+++ files/lein/profiles.clj
@@ -0,0 +1,3 @@
+{:ppedn {:dependencies [[org.clojure/clojure "1.6.0"]
+                        [mvxcvi/puget "0.8.0"]]}}
+


Generate latex and pdf

Generate latex and pdf

error: pathspec 'src/catalog/latex.clj' did not match any file(s) known to git

--- src/catalog/latex.clj
+++ src/catalog/latex.clj
@@ -0,0 +1,208 @@
+(ns catalog.latex
+  "Generate LaTeX for catalogues"
+  (:require [catalog.vubis :as vubis]
+            [clojure.java.shell :as shell]
+            [clojure.string :as string]))
+
+(def temp-name "/tmp/catalog.tex")
+(def translations {:hörbuch "Hörbücher"
+                   :braille "Braille"
+                   :grossdruck "Grossdruck"
+                   :e-book "E-Books"
+                   :hörfilm "Hörfilme"
+                   :ludo "Spiele"
+                   :belletristik "Belletristik"
+                   :sachbücher "Sachbücher"
+                   :kinder-und-jugendbücher "Kinder- und Jugendbücher"
+                   :action-und-thriller "Action und Thriller"
+                   :beziehungsromane "Beziehungsromane"
+                   :fantasy-science-fiction "Fantasy, Science Fiction"
+                   :gesellschaftsromane "Gesellschaftsromane"
+                   :historische-romane "Historische Romane"
+                   :hörspiele "Hörspiele"
+                   :krimis "Krimis"
+                   :lebensgeschichten-und-schicksale "Lebensgeschichten und Schicksale"
+                   :literarische-gattungen "Literarische Gattungen"
+                   :literatur-in-fremdsprachen "Literatur in Fremdsprachen"
+                   :mundart-heimat-natur "Mundart, Heimat, Natur"
+                   :glaube-und-philosophie "Glaube und Philosophie"
+                   :biografien "Biografien"
+                   :freizeit-haus-garten "Freizeit, Haus, Garten"
+                   :geschichte-und-gegenwart "Geschichte und Gegenwart"
+                   :kunst-kultur-medien "Kunst, Kultur, Medien"
+                   :lebensgestaltung-gesundheit-erziehung "Lebensgestaltung, Gesundheit, Erziehung"
+                   :philosophie-religion-esoterik "Philosophie, Religion, Esoterik"
+                   :reisen-natur-tiere "Reisen, Natur, Tiere"
+                   :sprache "Sprache"
+                   :wissenschaft-technik "Wissenschaft, Technik"
+                   :jugendbücher "Jugendbücher"
+                   :kinder-und-jugendsachbücher "Kinder- und Jugendsachbücher"
+                   :kinderbücher-ab-10 "Kinderbücher (ab 10)"
+                   :kinderbücher-ab-6 "Kinderbücher (ab 6)"})
+
+(def formats [:hörbuch :braille :grossdruck :e-book :hörfilm :ludo])
+(def genres [:belletristik :sachbücher :kinder-und-jugendbücher])
+(def subgenres [:action-und-thriller :beziehungsromane :fantasy-science-fiction
+                :gesellschaftsromane :historische-romane :hörspiele :krimis
+                :lebensgeschichten-und-schicksale :literarische-gattungen
+                :literatur-in-fremdsprachen :mundart-heimat-natur :glaube-und-philosophie
+                :biografien :freizeit-haus-garten :geschichte-und-gegenwart
+                :kunst-kultur-medien :lebensgestaltung-gesundheit-erziehung
+                :philosophie-religion-esoterik :reisen-natur-tiere :sprache
+                :wissenschaft-technik :jugendbücher :kinder-und-jugendsachbücher
+                :kinderbücher-ab-10 :kinderbücher-ab-6])
+
+(defn escape
+  "Escape characters that have a special meaning to LaTeX (see [The
+  Comprehensive LaTeX Symbol
+  List](http://www.ctan.org/tex-archive/info/symbols/comprehensive/symbols-a4.pdf))"
+  [text]
+  (if (nil? text) ""
+      (->
+       text
+       ;; backslash
+       (string/replace #"\\" "\\\\textbackslash ")
+       ;; drop excessive white space
+       (string/replace #"\s+" " ")
+       ;; quote special chars
+       (string/replace #"(\$|&|%|#|_|\{|\})" "\\\\$1")
+       ;; append a '{}' to special chars so they are not missinterpreted
+       (string/replace #"(~|\^)" "$1{}")
+       ;; add non-breaking space in front of emdash or endash followed by
+       ;; punctuation
+       (string/replace #" ([–—]\p{P})" " $1")
+       ;; add non-breaking space in front ellipsis followed by punctuation
+       (string/replace #" ((\.{3}|…)\p{P})" " $1")
+       ;; [ and ] can sometimes be interpreted as the start or the end of
+       ;; an optional argument
+       (string/replace #"\[" "\\\\lbrack{}")
+       (string/replace #"\]" "\\\\rbrack{}")
+       ;; << and >> is apparently treated as a shorthand and is not
+       ;; handled by our shorthand disabling code
+       (string/replace #"<<" "{<}<")
+       (string/replace #">>" "{>}>"))))
+
+(defn preamble [{:keys [title font creator] :or {font "Verdana"}}]
+  ["\\isopage[12]"
+   "\\fixpdflayout"
+   "\\checkandfixthelayout"
+   "\\usepackage{graphicx}"
+   "\\usepackage[ngerman]{babel}"
+   "\\def\\languageshorthands#1{}"
+   "\\usepackage{fontspec,xunicode,xltxtra}"
+   "\\defaultfontfeatures{Mapping=tex-text}"
+   (str "\\setmainfont{" font "}")
+   "\\usepackage{hyperref}"
+   (str "\\hypersetup{pdftitle={" (escape title) "}, pdfauthor={" (escape creator) "}}")
+   "\\setsecnumdepth{subsubsection}"
+   "\\setlength{\\parindent}{0pt}"])
+
+(defn frontmatter [{:keys [title issue-number year]}]
+  ["\\frontmatter"
+   "\\begin{Spacing}{1.75}"
+   (str  "{\\huge " (escape title) "}\\\\[0.5cm]")
+   "\\end{Spacing}"
+   "{\\large Ausgabenummer und Jahr}\\\\[1.5cm]"
+   "\\vfill"
+   "Logo\\\\ "
+   "SBS Schweizerische Bibliothek für Blinde, Seh- und Lesebehinderte\\\\[0.5cm]"
+   "\\cleartorecto"])
+
+(defn mainmatter [env]
+  ["\\mainmatter"
+   ;; "\\pagestyle{plain}"
+   "\\tableofcontents"])
+
+(defn catalog-entry [{:keys [title creator description source_publisher source_date genre duration]}]
+  ["\\begin{description}"
+   (string/join " " [(format "\\item[%s]" (escape title))
+                 (escape creator)
+                 (escape source_publisher)
+                 (escape source_date)
+                 (translations genre) "\\\\"
+                 (escape description)
+                 "Spieldauer"
+                 (escape duration)])
+   "\\end{description}"])
+
+(defn catalog-entries [items]
+  (for [item items] (catalog-entry item)))
+
+(defn subgenre-entry [subgenre items]
+  (when (subgenre items)
+    [(str "\\subsubsection{" (translations subgenre "FIXME")"}")
+     (catalog-entries (subgenre items))]))
+
+(defn subgenre-entries [items]
+  (for [subgenre subgenres] (subgenre-entry subgenre items)))
+
+(defn genre-entry [genre items]
+  (when (genre items)
+    [(str "\\subsection{" (translations genre "FIXME") "}")
+     (subgenre-entries (genre items))]))
+
+(defn genre-entries [items]
+  (for [genre genres] (genre-entry genre items)))
+
+(defn format-entry [format items]
+  (when (format items)
+    [(str "\\section{" (translations format "FIXME") "}")
+     (genre-entries (format items))]))
+
+(defn format-entries [items]
+  (for [format formats] (format-entry format items)))
+
+(defn catalog [{items :items}]
+  ["\\chapter{Katalog}"
+   (format-entries items)])
+
+(defn impressum [env]
+   ["\\chapter{Impressum}"
+   ""
+   "Neu im Sortiment"
+   ""
+   "Für Kundinnen und Kunden der SBS sowie für Interessenten"
+   ""
+   "Erscheint sechsmal jährlich und weist alle seit der letzten Ausgabe neu in die SBS aufgenommenen Bücher nach"
+   ""
+   "Neu im Sortiment kann im Jahresabonnement per Post zu CHF XX oder per E-Mail gratis bezogen werden."
+   ""
+   "Herausgeber:\\\\ "
+   "SBS Schweizerische Bibliothek für Blinde, Seh- und Lesebehinderte\\\\ "
+   "Grubenstrasse 12\\\\ "
+   "CH-8045 Zürich\\\\ "
+   "Fon +41 43 333 32 32\\\\ "
+   "Fax +41 43 333 32 33\\\\ "
+   "www.sbs.ch"
+   ""
+   "Abonnement, Ausleihe und Verkauf: nutzerservice@sbs.ch\\\\ "
+   "Verkauf Institutionen: medienverlag@sbs.ch"
+   ""
+   "Copyright Vermerk"])
+
+(defn document [{:keys [class options]
+                 :or {class "memoir"
+                      options #{"11pt" "a4paper" "oneside" "openright"}}
+                 :as env}]
+  (string/join "\n"
+   (flatten
+    [(str "\\documentclass[" (string/join "," options) "]{" class "}")
+     (preamble env)
+     "\\begin{document}"
+     (frontmatter env)
+     (mainmatter env)
+     (catalog env)
+     (impressum env)
+     "\\end {document}"])))
+
+(defn generate-latex []
+  (let [items (->
+               "/home/eglic/src/catalog/samples/vubis_export.xml"
+               vubis/read-file
+               vubis/order-and-group)]
+    (spit temp-name (document
+                     {:title "Neu im Sortiment"
+                      :items items}))))
+
+(defn generate-pdf []
+  (shell/sh "latexmk" "-xelatex" temp-name :dir "/tmp"))


Invoke delete-jars with values that actually exist.

--- src/clojars/admin.clj
+++ src/clojars/admin.clj
@@ -52,7 +52,7 @@
         (fn []
           (println "Deleting" pretty-coords)
           (repo->backup [group-id jar-id version])
-          (apply db/delete-jars coords)))
+          (apply db/delete-jars group-id jar-id (if version [version] []))))
       (println "No artifacts found under" group-id jar-id version))))

 (defn init []


Allow deletion of jars that have a nil description

--- src/clojars/admin.clj
+++ src/clojars/admin.clj
@@ -51,9 +51,9 @@

 (defn delete-jars [group-id jar-id & [version]]
   (let [pretty-coords (format "%s/%s %s" group-id jar-id (or version "(all versions)"))]
-    (if-let [description (:description (if version
-                                         (db/find-jar *db* group-id jar-id version)
-                                         (db/find-jar *db* group-id jar-id)))]
+    (if-let [{:keys [description]} (if version
+                                     (db/find-jar *db* group-id jar-id version)
+                                     (db/find-jar *db* group-id jar-id))]
       (do
         (println "Giving you a fn to delete jars that match" pretty-coords)
         (when-not


Added make-form.

Added make-form.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/inchingforward/eon.git/'


chore(pool): add env var to configure pool control period

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/B2W-Digital/pdg-core.git/'


tighten up tests, use simple-check's defspec

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/QuiltProject/sedan.git/'


fix ordering for test startup

fix ordering for test startup

--- test/metabase/test_utils.clj
+++ test/metabase/test_utils.clj
@@ -7,23 +7,41 @@
                       [db :refer :all]
                       [test-data :refer :all])))

+(declare set-test-logging-level
+         setup-test-db
+         start-jetty)
+
+;; # SETTINGS
+
+;; Don't run unit tests whenever JVM shuts down
+;; it's pretty annoying to have our DB reset all the time
+(expectations/disable-run-on-shutdown)
+

 ;; # FUNCTIONS THAT GET RUN ON TEST SUITE START / STOP
+
+(defn test-setup
+  {:expectations-options :before-run}
+  []
+  (set-test-logging-level)
+  (setup-test-db)
+  (start-jetty))
+
+
+;; ## Logging Setup
+
+(defn set-test-logging-level
+  "Disable debug logging since it clutters up our output."
+  []
+  (.setLevel (org.apache.log4j.Logger/getLogger "metabase") org.apache.log4j.Level/INFO))
+

 ;; ## DB Setup
 ;; WARNING: BY RUNNING ANY UNIT TESTS THAT REQUIRE THIS FILE OR BY RUNNING YOUR ENTIRE TEST SUITE YOU WILL EFFECTIVELY BE WIPING OUT YOUR DATABASE.
 ;; SETUP-DB DELETES YOUR DATABASE FILE, AND GETS RAN AUTOMATICALLY BY EXPECTATIONS. USE AT YOUR OWN RISK!

-;; Don't run unit tests whenever JVM shuts down
-;; it's pretty annoying to have our DB reset all the time
-(expectations/disable-run-on-shutdown)
-
-;; Disable debug logging since it clutters up our output
-(.setLevel (org.apache.log4j.Logger/getLogger "metabase") org.apache.log4j.Level/INFO)
-
 (defn setup-test-db
-  "setup database schema"
-  {:expectations-options :before-run}
+  "Setup database schema."
   []
   (let [filename (-> (re-find #"file:(\w+\.db).*" (db-file)) second)] ; db-file is prefixed with "file:", so we strip that off
     (map (fn [file-extension]                                         ; delete the database files, e.g. `metabase.db.h2.db`, `metabase.db.trace.db`, etc.
@@ -54,7 +72,6 @@

 (defn start-jetty
   "Start the Jetty web server."
-  {:expectations-options :before-run}
   []
   (log/info "STARTING THE JETTY SERVER...")
   @jetty-instance)


first commit with auto directory

first commit with auto directory

error: pathspec 'src/auto/regression.clj' did not match any file(s) known to git

--- src/auto/regression.clj
+++ src/auto/regression.clj
@@ -0,0 +1,2 @@
+(ns auto.regression)
+


Add handy general utils files.

Add handy general utils files.

error: pathspec 'src/mrc/utils.clj' did not match any file(s) known to git

--- src/mrc/utils.clj
+++ src/mrc/utils.clj
@@ -0,0 +1,7 @@
+(ns mrc.utils)
+
+(defn run-method [instance method args]
+  (clojure.lang.Reflector/invokeInstanceMethod instance method (to-array args)))
+
+(defn thr [pieces]
+  (throw (Exception. (apply str pieces))))


Tidy up

Tidy up

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/delitescere/yada.git/'


removed duplicated undefined-handling of step result

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobiasbayer/lambdacd.git/'


First victory! Calculated the mean of a double array. Its the small things.

error: pathspec 'src/clojure/example.clj' did not match any file(s) known to git

--- src/clojure/example.clj
+++ src/clojure/example.clj
@@ -0,0 +1,14 @@
+(ns the-nature-of-sound.example
+  (import [xtract]
+          [xtractJNI]))
+
+(def v (xtract/doublea_to_voidp (xtract/new_double_array 1)))
+(def len 8)
+(def a (let [a (xtract/new_double-array len)]
+         (doseq [idx (range 0 len)] (xtract/double_array_setitem a idx (double (* idx 2)))) a))
+(xtract/double_array_getitem a 1)
+
+(def r (double-array 1))
+;;  public static int xtract_mean(SWIGTYPE_p_double data, int N, SWIGTYPE_p_void argv, double[] result) {
+(xtract/xtract_mean a 7 nil r)
+(println (str "Mean: " (first r)))


button hacking

button hacking

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/couragelabs/coachbot.git/'


Use the right access token.

Use the right access token.


Updated protein coding gene type assertion rule to work with ccp ext ontology

error: pathspec 'resources/rules/post_identifier_merge/ice_to_bio/protein_coding_gene_type_assertions.clj' did not match any file(s) known to git

--- resources/rules/post_identifier_merge/ice_to_bio/protein_coding_gene_type_assertions.clj
+++ resources/rules/post_identifier_merge/ice_to_bio/protein_coding_gene_type_assertions.clj
@@ -0,0 +1,22 @@
+;; ------------------------------------------------------
+;; --------- Protein Coding Gene Type Assertion ---------
+;; ------------------------------------------------------
+`{:name "protein-coding-gene-type-assertions"
+  :description "This rule asserts protein coding gene type"
+  :head ((?/gene rdfs/subClassOf obo/SO_0001217)) ; SO:protein_coding_gene
+
+  :body ((?/record rdf/type ccp/IAO_EXT_0000681) ; ccp:NCBI_gene_info_record
+         (?/record obo/BFO_0000051 ?/dna_field_value) ; BFO:has_part
+         (?/gene_field_value rdf/type ccp/IAO_EXT_0000876) ; ccp:NCBI_gene_info_record__gene_identifier_field_value
+         (?/gene_field_value rdf/type ?/gene_ice_id)
+         (?/gene_ice_id obo/IAO_0000219 ?/gene) ; IAO:denotes
+
+         ;; retrieve gene type
+         (?/record obo/BFO_0000051 ?/type_field_value) ; BFO:has_part
+         (?/type_field_value rdf/type ccp/IAO_EXT_0000884) ; ccp:NCBI_gene_info_record__type_of_gene_field_value
+         (?/type_field_value rdf/type ?/type_ice_id)
+         (?/type_ice_id obo/IAO_0000219 ?/type) ; IAO:denotes
+
+         (= ?/type "protein-coding"))
+
+  }


Added a files namespace to handle file input

error: pathspec 'src/extracter/files.clj' did not match any file(s) known to git

--- src/extracter/files.clj
+++ src/extracter/files.clj
@@ -0,0 +1,28 @@
+(ns extracter.files
+  (:require [clojure.java.io :as io]))
+
+(defn contains?
+  [^java.util.regex.Pattern re ^String s]
+  (boolean (re-find re s)))
+
+(defn fact?
+  "Returns true if the given file appears to contain at least one fact docstring."
+  [^java.io.File f]
+  (with-open [fin (io/reader f)]
+    (->> fin
+         line-seq
+         (some (partial contains? #"# Fact: ")))))
+
+(defn file?
+  [^java.io.File f]
+  (.isFile f))
+
+(defn facts-in-dir
+  "Returns a lazy sequence of java.io.File instances for every fact source file in a directory path.
+  Scans recursively."
+  [^String path]
+  (->> path
+       io/file
+       file-seq
+       (filter file?)
+       (filter fact?)))


[WM] update docstring in states/registration-methods

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/voter-registration-works.git/'


Moved cache namespace from indexer-app to common-lib.

error: pathspec 'src/cmr/common/cache.clj' did not match any file(s) known to git

--- src/cmr/common/cache.clj
+++ src/cmr/common/cache.clj
@@ -0,0 +1,29 @@
+(ns cmr.common.cache
+  "A system level cache based on clojure.core.cache library.
+  Follows basic usage pattern as given in - https://github.com/clojure/core.cache/wiki/Using"
+  (:require [cmr.common.log :as log :refer (debug info warn error)]
+            [cmr.system-trace.context :as context]
+            [clojure.core.cache :as cc]))
+
+
+(defn cache-lookup
+  "Returns value of a key if present else it will create a cache entry with the suplied key and value
+  generated by the supplied function."
+  [cache-atom key f]
+  (-> (swap! cache-atom
+             (fn [cache]
+               (if (cc/has? cache key)
+                 (cc/hit cache key)
+                 (cc/miss cache key (f)))))
+      (get key)))
+
+(defn create-cache
+  "Create system level cache."
+  []
+  (atom (cc/lru-cache-factory {})))
+
+(defn reset-cache
+  [cache-atom]
+  (reset! cache-atom (cc/lru-cache-factory {})))
+
+


pending badges

pending badges

error: pathspec 'src/cljs/salava/badge/ui/pending.cljs' did not match any file(s) known to git

--- src/cljs/salava/badge/ui/pending.cljs
+++ src/cljs/salava/badge/ui/pending.cljs
@@ -0,0 +1,89 @@
+(ns salava.badge.ui.pending
+  (:require [reagent.core :refer [atom cursor]]
+            [salava.core.ui.ajax-utils :as ajax]
+            [salava.core.i18n :refer [t]]
+            [salava.core.ui.helper :refer [path-for]]
+            [salava.core.ui.content-language :refer [init-content-language content-language-selector content-setter]]
+            [salava.badge.ui.helper :as bh]
+            [salava.badge.ui.modal :as bm]
+            [salava.core.time :refer [date-from-unix-time]]))
+
+
+(defn- init-badge-preview [state]
+  (ajax/GET
+    (path-for (str "/obpv1/badge/info/" (:id @state)))
+    {:handler (fn [data]
+                (swap! state assoc :result data
+                       :id (:id @state)
+                       :content-language (init-content-language (:content data))))}))
+
+
+(defn- show-more-content [state]
+  (fn []
+    (let [ data (:result @state)
+           selected-language (cursor state [:content-language])
+           {:keys [id badge_id issued_on expires_on issued_by_obf verified_by_obf obf_url first_name last_name content]}  data
+           expired?                                                                 (bh/badge-expired? expires_on)
+           show-recipient-name-atom                                                 (cursor state [:result :show_recipient_name])
+           {:keys [name description tags alignment criteria_content image_file issuer_content_id issuer_content_name issuer_content_url issuer_contact issuer_image issuer_description criteria_url creator_content_id creator_name creator_url creator_email creator_image creator_description message_count endorsement_count]} (content-setter @selected-language content)]
+      [:div#badge-info {:class "preview-badge" :style {:display (:show-result @state)}}
+       [:div.row.flip
+        [:div.col-md-9.badge-info
+         (if (< 1 (count content))
+           [:div.inline [:label (t :core/Languages)": "](content-language-selector selected-language content)])
+         (bm/issuer-modal-link issuer_content_id issuer_content_name)
+         (bm/creator-modal-link creator_content_id creator_name)
+         (if (and issued_on (> issued_on 0))
+           [:div [:label (t :badge/Issuedon) ": "]  (date-from-unix-time (* 1000 issued_on))])
+         (if (and expires_on (not expired?))
+           [:div [:label (t :badge/Expireson) ": "]  (date-from-unix-time (* 1000 expires_on))])
+         (if (pos? @show-recipient-name-atom)
+           [:div [:label (t :badge/Recipient) ": "]  first_name " " last_name])
+         [:div {:class "criteria-html"}
+          [:h2.uppercase-header (t :badge/Criteria)]
+          [:a {:href criteria_url :target "_blank"} (t :badge/Opencriteriapage) "..."]
+          [:div {:dangerouslySetInnerHTML {:__html criteria_content}}]]
+         ]]])))
+
+(defn- show-more [state]
+  (fn []
+    [:div
+     [:br]
+     [:a {:href "#"
+          :style {:display (:show-link @state)}
+          :on-click #(do
+                       (swap! state assoc :show-result "block"
+                              :show-link "none")
+                       (init-badge-preview state))
+          }(t :admin/Showmore)]
+     [show-more-content state]]))
+
+
+(defn pending-badge-content [{:keys [id image_file name description meta_badge meta_badge_req issuer_content_name issuer_content_url issued_on issued_by_obf verified_by_obf obf_url]}]
+  (let [state (atom {:id id
+                     :show-result "none"
+                     :show-link "block"
+                     :result {}})]
+    (init-badge-preview state)
+    (fn []
+      (let [data (:result @state)
+            selected-language (cursor state [:content-language])
+            {:keys [badge_id content]} data
+            {:keys [name description tags alignment criteria_content image_file issuer_content_id issuer_content_name issuer_content_url issuer_contact issuer_image issuer_description criteria_url creator_content_id creator_name creator_url creator_email creator_image creator_description message_count endorsement_count]} (content-setter @selected-language content)]
+
+        [:div
+         (if (or verified_by_obf issued_by_obf)
+           [:div.row.flip
+            (bh/issued-by-obf obf_url verified_by_obf issued_by_obf)])
+         [:div.row.flip
+          [:div.col-md-3.badge-image
+           [:img.badge-image {:src (str "/" image_file)}]
+           (bm/badge-endorsement-modal-link badge_id endorsement_count)]
+          [:div.col-md-9
+           [:h4.media-heading name]
+
+           ;METABADGE
+           [:div (bh/meta-badge meta_badge meta_badge_req)]
+
+           [:div description]
+           [show-more state]]] ]))))


using getItem and setItem on localstorage

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wilkerlucio/youtube-looper.git/'


forgotten !

forgotten !

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/vincentstorme/clojureme.git/'


Added main class

Added main class

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/amedw/mud-server.git/'


Test configuration data

Test configuration data

error: pathspec 'test/ruuvi_server/test/dummy-config.clj' did not match any file(s) known to git

--- test/ruuvi_server/test/dummy-config.clj
+++ test/ruuvi_server/test/dummy-config.clj
@@ -0,0 +1,3 @@
+{
+ :database 1
+ }


coerce to a set before we do a lookup, like we do elsewhere in this code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/electorate-works.git/'


Add specs for the results of parsing queries with clojure.spec/conform

error: pathspec 'src/main/workflo/macros/specs/conforming_query.cljc' did not match any file(s) known to git

--- src/main/workflo/macros/specs/conforming_query.cljc
+++ src/main/workflo/macros/specs/conforming_query.cljc
@@ -0,0 +1,93 @@
+(ns workflo.macros.specs.conforming-query
+  (:require #?(:cljs [cljs.spec :as s]
+               :clj  [clojure.spec :as s])
+            #?(:cljs [cljs.spec.impl.gen :as gen]
+               :clj  [clojure.spec.gen :as gen])
+            [workflo.macros.props.util :as util]
+            [workflo.macros.specs.query]))
+
+;;;; Simple properties
+
+(s/def ::simple-property
+  (s/tuple #{:simple}
+           :workflo.macros.specs.query/property-name))
+
+;;;; Links
+
+(s/def ::link
+  (s/tuple #{:link}
+           :workflo.macros.specs.query/link))
+
+;;;; Joins
+
+(s/def ::model-join
+  (s/tuple #{:model-join}
+           :workflo.macros.specs.query/model-join))
+
+(s/def ::recursive-join
+  (s/tuple #{:recursive-join}
+           :workflo.macros.specs.query/recursive-join))
+
+(s/def ::properties-join
+  (s/tuple #{:properties-join}
+           :workflo.macros.specs.query/properties-join))
+
+(s/def ::join
+  (s/tuple #{:join}
+           (s/or :model-join ::model-join
+                 :recursive-join ::recursive-join
+                 :properties-join ::properties-join)))
+
+;;;; Individual properties
+
+(s/def ::property-value
+  (s/or :simple ::simple-property
+        :link   ::link
+        :join   ::join))
+
+(s/def ::property
+  (s/tuple #{:property} ::property-value))
+
+;;;; Nested properties
+
+(s/def ::base
+  :workflo.macros.specs.query/property-name)
+
+(s/def ::children
+  (s/with-gen
+    (s/and vector? (s/+ ::property-value))
+    #(gen/vector (s/gen ::property-value)
+                 1 10)))
+
+(s/def ::nested-properties-value
+  (s/keys :req-un [::base ::children]))
+
+(s/def ::nested-properties
+  (s/tuple #{:nested-properties} ::nested-properties-value))
+
+;;;; Queries
+
+(s/def ::regular-query-value
+  (s/or :property ::property
+        :nested-properties ::nested-properties))
+
+(s/def ::regular-query
+  (s/tuple #{:regular-query} ::regular-query-value))
+
+(s/def ::parameters
+  :workflo.macros.specs.query/parameters)
+
+(s/def ::parameterized-query-value
+  (s/keys :req-un [::regular-query-value ::parameters]))
+
+(s/def ::parameterized-query
+  (s/tuple #{:parameterized-query} ::parameterized-query-value))
+
+(s/def ::query
+  (s/with-gen
+    (s/and vector?
+           (s/+ (s/alt :regular-query ::regular-query
+                       :parameterized-query ::parameterized-query)))
+    #(gen/vector (gen/one-of [(s/gen ::regular-query)
+                              (s/gen ::parameterized-query)])
+                 1 10)))


change buildserver benchmark options

change buildserver benchmark options

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/altamiracorp/honeycomb.git/'


Probetan lkonfig oinarri gisa erabili

Probetan lkonfig oinarri gisa erabili

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lnmnd/magnet.zer.git/'


atom_committers_test

error: pathspec 'test/atom_finder/atom_committers_test.clj' did not match any file(s) known to git

--- test/atom_finder/atom_committers_test.clj
+++ test/atom_finder/atom_committers_test.clj
@@ -0,0 +1,21 @@
+(ns atom-finder.atom-committers-test
+  (:require [clojure.test :refer :all]
+            [atom-finder.util :refer :all]
+            [atom-finder.constants :refer :all]
+            [atom-finder.patch :refer :all]
+            [atom-finder.atom-patch :refer :all]
+            [atom-finder.questions.atom-committers :refer :all]
+            [atom-finder.classifier :refer :all]
+            [clj-jgit.porcelain  :as gitp]
+            [clj-jgit.querying :as gitq]
+            [clj-jgit.internal :as giti]
+            [clojure.pprint :refer :all]
+            ))
+
+(deftest atom-committers-test
+  (testing "added-atoms"
+    (= (->>
+        (added-atoms (parse-frag "int x = z = y++") (parse-frag "int x = z = w ? y : y++"))
+        :revised (map #(->> % class .getSimpleName)))
+       ["CPPASTConditionalExpression" "CPPASTConditionalExpression"])))
+


add handy trigger fns for responding to events created by the send-trig ugen

error: pathspec 'src/overtone/sc/trig.clj' did not match any file(s) known to git

--- src/overtone/sc/trig.clj
+++ src/overtone/sc/trig.clj
@@ -0,0 +1,59 @@
+(ns overtone.sc.trig
+  (:use [overtone.libs event counters]
+        [overtone.sc.node]))
+
+(on-sync-event "/tr"
+               (fn [{path :path args :args}]
+                 (let [[node-id trig-id val] args]
+                   (event [:overtone :trigger trig-id] :val val)
+                   (event [:overtone :trigger node-id trig-id] :val val)))
+               ::forward-trigger-event)
+
+(defn trig-id
+  "Returns a new globally unique id useful for feeding into send-trig
+   and matching on the event stream.
+
+   (def uid (trig-id))
+   (defsynth foo [] (send-trig (impulse 10) uid (sin-osc)))
+   (on-trigger uid
+               (fn [val] (println \"trig val:\" val)))
+   (foo)"
+  []
+  (next-id ::trig-id))
+
+(defn- add-handler
+  [handler-type event-pattern handler-fn key]
+  (handler-type event-pattern
+                (fn [{val :val}]
+                  (handler-fn val))
+                key))
+
+(defn on-trigger
+  "Registers a standard on-event handler with key which will call
+   handler when matching triggers are recieved. Triggers are created
+   with the send-trig ugen. Handler should be a fn which takes one
+   argument - the latest trigger value."
+  ([trig-id handler key]
+     (add-handler on-event [:overtone :trigger trig-id] handler key))
+  ([node trig-id handler key]
+     (add-handler on-event [:overtone :trigger (to-sc-id node) trig-id] handler key)))
+
+(defn on-latest-trigger
+  "Registers a standard on-latest-event handler with key which will call
+   handler when matching triggers are recieved. Triggers are created
+   with the send-trig ugen. Handler should be a fn which takes one
+   argument - the latest trigger value."
+  ([trig-id handler key]
+     (add-handler on-latest-event [:overtone :trigger trig-id] handler key))
+  ([node trig-id handler key]
+     (add-handler on-latest-event [:overtone :trigger (to-sc-id node) trig-id] handler key)))
+
+(defn on-sync-trigger
+  "Registers a standard on-sync-event handler with key which will call
+   handler when matching triggers are recieved. Triggers are created
+   with the send-trig ugen. Handler should be a fn which takes one
+   argument - the latest trigger value."
+  ([trig-id handler key]
+     (add-handler on-sync-event [:overtone :trigger trig-id] handler key))
+  ([node trig-id handler key]
+     (add-handler on-sync-event [:overtone :trigger (to-sc-id node) trig-id] handler key)))


texture test

texture test

error: pathspec 'test/infinitelives/pixi/texture_test.cljs' did not match any file(s) known to git

--- test/infinitelives/pixi/texture_test.cljs
+++ test/infinitelives/pixi/texture_test.cljs
@@ -0,0 +1,2 @@
+(ns infinitelives.pixi.texture-test
+  (:require [infinitelives.pixi.texture]))


Note the shape of the data. The joy of dynamically typed languages, the comments are the documentation of the data format.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mtravers/incidents.git/'


Hot fix for maps problem

Hot fix for maps problem

--- backend/src/akvo/lumen/lib/visualisation/map_config.clj
+++ backend/src/akvo/lumen/lib/visualisation/map_config.clj
@@ -342,7 +342,8 @@
                                  "srid" "3857"}})
                    (let [geom-column (get-geom-column layer)
                          {:keys [columns]} (dataset-by-id tenant-conn {:id datasetId})
-                         where-clause (filter/sql-str (walk/keywordize-keys columns) filters)
+                         where-clause (filter/sql-str (walk/keywordize-keys columns)
+                                                      (walk/keywordize-keys filters))
                          popup-columns (mapv #(get % "column") popup)
                          point-color-column pointColorColumn
                          sql (get-sql tenant-conn columns table-name geom-column


Formatting

Formatting

--- src/cljx/cats/core.cljx
+++ src/cljx/cats/core.cljx
@@ -45,10 +45,10 @@
 (defn get-current-context-or
   [default]
   (cond
-    (not (nil? *context*))        *context*
-    :else                         (if (satisfies? p/Context default)
-                                    (p/get-context default)
-                                    default)))
+    (not (nil? *context*)) *context*
+    :else                  (if (satisfies? p/Context default)
+                             (p/get-context default)
+                             default)))

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Trying out a more permissive message

Trying out a more permissive message

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/couragelabs/coachbot.git/'


Add the old API back as an imp'l of the API methods

error: pathspec 'src/grimoire/api/fs.clj' did not match any file(s) known to git

--- src/grimoire/api/fs.clj
+++ src/grimoire/api/fs.clj
@@ -0,0 +1,227 @@
+(ns grimoire.api.fs
+  "Filesystem datastore implementation of the Grimoire API."
+  (:refer-clojure :exclude [isa?])
+  (:require [grimoire.util :as util]
+            [grimoire.things :refer :all]
+            [grimoire.api :as api]
+            [clojure.java.io :as io]
+            [clojure.string :as string]
+            [clojure.edn :as edn]
+            [clj-semver.core :as semver]))
+
+;; Private helpers for getting fs handles
+;;--------------------
+(defn- thing->handle
+  "Helper for grabbing handles for reading/writing.
+
+  :meta     -> .edn file
+  :related  -> .txt
+  :notes    -> .md file
+  :examples -> dir"
+
+  [{store :datastore} which thing]
+  (let [which-store (if-not (= :notes which)
+                      :docs :notes)
+        d           (get store which (which-store store))
+        parent      (:parent thing)
+        p           (io/file (str d "/" (when parent (thing->path parent))))
+        e           (case which
+                      (:meta)     ".edn"
+                      (:related)  ".txt"
+                      (:examples) "/examples/"
+                      (:notes)    ".md"
+                      nil)
+        n           (if (= :def (:type thing))
+                      (util/munge (:name thing))
+                      (:name thing))
+        h           (io/file p (str n e))]
+    (.mkdirs p)
+    (when (= :examples which)
+      (when-not (.isDirectory h)
+        (.mkdir h)))
+    h))
+
+(defn- thing->notes-handle
+  "Helper for grabbing the handle of a notes file "
+
+  [c thing]
+  (thing->handle c :notes thing))
+
+(defn- thing->example-handle
+  "Helper for getting a file handle for reading and writing a named example."
+
+  [c thing name]
+  (let [h (thing->handle c :examples thing)]
+    (io/file h (str name ".clj"))))
+
+(defn- thing->meta-handle
+  "Helper for getting a file handle for reading and writing meta"
+
+  [c thing]
+  (let [h (thing->handle c :meta thing)]
+    h))
+
+(defn- thing->related-handle
+  "Helper for getting a file handle for reading and writing related files"
+
+  [c thing]
+  (let [h (thing->handle c :related thing)]
+    h))
+
+;; List things
+;;--------------------
+(defmethod api/list-groups :filesystem [config]
+  (let [handle (io/file (-> config :datastore :docs))]
+    (for [d (.listFiles handle)
+          :when (.isDirectory d)]
+      (->T :group nil (.getName d)))))
+
+(defmethod api/list-artifacts :filesystem [config thing]
+  (let [thing  (ensure-thing thing)
+        thing  (thing->group thing)
+        _      (assert thing)
+        handle (thing->handle config :else thing)]
+    (for [d (.listFiles handle)
+          :when (.isDirectory d)]
+      (->T :artifact thing (.getName d)))))
+
+(defmethod api/list-versions :filesystem [config thing]
+  (let [thing    (ensure-thing thing)
+        artifact (thing->artifact thing)
+        _        (assert artifact)
+        handle   (thing->handle config :else artifact)]
+    (for [d     (.listFiles handle)
+          :when (.isDirectory d)]
+      (->T :version artifact (.getName d)))))
+
+(defmethod api/list-namespaces :filesystem [config thing]
+  (let [thing   (ensure-thing thing)
+        _       (assert thing)
+        version (thing->version thing)
+        _       (assert version)
+        handle  (thing->handle config :else version)]
+    (for [d     (.listFiles handle)
+          :when (.isDirectory d)]
+      (->T :namespace version (.getName d)))))
+
+(defmethod api/list-defs :filesystem [config thing]
+  (let [thing     (ensure-thing thing)
+        _         (assert thing)
+        namespace (thing->namespace thing)
+        _         (assert namespace)
+        handle    (thing->handle config :else namespace)]
+    (for [d     (.listFiles handle)
+          :when (.isFile d)]
+      (->T :def namespace (string/replace (.getName d) #".edn" "")))))
+
+;; FIXME: this should really be handled in data generation not in data use
+(defn- normalize-version [x]
+  (if-not (re-matches #"[0-9]+.[0-9]+.[0-9]+" x)
+    (str x ".0")
+    x))
+
+(defmethod api/thing->prior-versions :filesystem [config thing]
+  (let [thing    (ensure-thing thing)
+        currentv (thing->version thing)               ; version handle
+        current  (normalize-version (:name currentv)) ; version string
+        added    (-> config
+                     (api/read-meta thing)
+                     (get :added "1.0.0")             ; FIXME: added in 1.0.0 by default. OK for core.
+                     normalize-version)               ; version string
+        versions (->> (:parent currentv)
+                      (api/list-versions config))
+        unv-path (thing->relative-path :version thing)]
+    (for [v     versions
+          :when (or (semver/newer? (:name v) added)
+                    (semver/equal? (:name v) added))
+          :when (or (semver/older? (:name v) current)
+                    (semver/equal? (:name v) current))]
+      ;; FIXME: this could be a direct constructor given an
+      ;; appropriate vehicle for doing so since the type is directed
+      ;; and single but may not generally make sense if this is not
+      ;; the case.
+      (path->thing (str (thing->path v) "/" unv-path)))))
+
+;; Read things
+;;--------------------
+(defmethod api/read-notes :filesystem [config thing]
+  (let [thing  (ensure-thing thing)]
+    (for [thing (api/thing->prior-versions config thing)
+          :let  [v (:name (thing->version thing))
+                 h (thing->notes-handle config thing)]
+          :when (.exists h)
+          :when (.isFile h)]
+      [v (slurp h)])))
+
+(defmethod api/read-examples :filesystem [config thing]
+  (let [thing  (ensure-thing thing)]
+    (for [thing (api/thing->prior-versions config thing)
+          :let  [v (:name (thing->version thing))
+                 h (thing->handle config :examples thing)]
+          ex    (.listFiles h)
+          :when (.isFile ex)]
+      [v (slurp ex)])))
+
+(defmethod api/read-meta :filesystem [config thing]
+  (let [thing  (ensure-thing thing)
+        handle (thing->meta-handle config thing)]
+    (when (.exists handle) ;; guard against missing files
+      (-> handle
+          slurp
+          (string/replace #"#<.*?>" "nil") ;; FIXME: Hack to ignore unreadable #<>s
+          edn/read-string))))
+
+(defmethod api/read-related :filesystem [config thing]
+  (let [thing  (ensure-thing thing)]
+    (for [thing (api/thing->prior-versions config thing)
+          :let  [v (:name (thing->version thing))
+                 h (thing->related-handle config thing)]
+          :when (.exists h)
+          :when (.isFile h)
+          line  (line-seq (io/reader h))]
+      (path->thing line))))
+
+;; Interacting with the datastore - writing
+;;--------------------------------------------------------------------
+
+;; FIXME: Remove this update when 1.7 drops
+(defn update
+  "λ [{A → B} A (λ [B args*] → C) args*] → {A → C}
+
+  Updates a key in the map by applying f to the value at that key more
+  arguments, returning the resulting map."
+
+  [map key f & args]
+  (assoc map key
+         (apply f (get map key) args)))
+
+(defmethod api/write-meta :filesystem [config thing data]
+  (let [thing  (ensure-thing thing)
+        _      (assert thing)
+        handle (thing->meta-handle config thing)
+        _      (assert handle)]
+    (spit handle (pr-str data))
+    nil))
+
+(defmethod api/write-notes :filesystem [config thing data]
+  {:pre [(string? data)
+         thing
+         config
+         (-> config :datastore :doc)]}
+  (let [thing  (ensure-thing thing)
+        _      (assert thing)
+        handle (thing->notes-handle config thing)
+        _      (assert thing)]
+    (spit handle data)))
+
+;; FIXME: add write-example
+
+(defmethod api/write-related :filesystem [config thing related-things]
+  (let [thing  (ensure-thing thing)
+        _      (assert thing)
+        _      (assert (isa? :def thing))
+        handle (thing->related-handle config thing)
+        _      (assert thing)]
+    (doseq [thing related-things]
+      (spit handle (str (thing->path thing) \newline)
+            :append true))))


Cleaner parsing.

Cleaner parsing.


fix indentation

fix indentation

--- src/metabase/api/qs.clj
+++ src/metabase/api/qs.clj
@@ -5,10 +5,9 @@
             [metabase.db :refer :all]
             [metabase.driver :as driver]
             [metabase.driver.query-processor :as qp]
-            (metabase.models
-              [database :refer [Database]]
-              [hydrate :refer :all]
-              [query-execution :refer [QueryExecution all-fields]])
+            (metabase.models [database :refer [Database]]
+                             [hydrate :refer :all]
+                             [query-execution :refer [QueryExecution all-fields]])
             [metabase.util :refer [contains-many? now-iso8601]]))


update access-control headers

update access-control headers

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/physion/ovation-webapi.git/'


Deprecate streams/over and streams/under

--- src/riemann/streams.clj
+++ src/riemann/streams.clj
@@ -1518,18 +1518,20 @@
 (defn over
   "Passes on events only when their metric is greater than x"
   [x & children]
-  (fn stream [event]
-    (when-let [m (:metric event)]
-      (when (< x m)
-        (call-rescue event children)))))
+  (deprecated "streams/over is deprecated in favor of (where (< x metric))"
+              (fn stream [event]
+                (when-let [m (:metric event)]
+                  (when (< x m)
+                    (call-rescue event children))))))

 (defn under
   "Passes on events only when their metric is smaller than x"
   [x & children]
-  (fn stream [event]
-    (when-let [m (:metric event)]
-      (when (> x m)
-        (call-rescue event children)))))
+  (deprecated "streams/under is deprecated in favor of (where (< metric x))"
+              (fn stream [event]
+                (when-let [m (:metric event)]
+                  (when (> x m)
+                    (call-rescue event children))))))

 (defn- where-test [k v]
   (condp some [k]


you can tell the ITL node has a prefix Int indicating size because the first Int in the buffer is much larger than its neighbors

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aamedina/swg.git/'


two auto-builders were started with :repl set to false

--- sidecar/src/figwheel_sidecar/repl.clj
+++ sidecar/src/figwheel_sidecar/repl.clj
@@ -431,7 +431,9 @@
 (defn create-autobuild-env [{:keys [figwheel-options all-builds build-ids]}]
   (let [logfile-path (or (:server-logfile figwheel-options) "figwheel_server.log")
         _ (config/mkdirs logfile-path)
-        log-writer        (io/writer logfile-path :append true)
+        log-writer       (if (false? (:repl figwheel-options))
+                           *out*
+                           (io/writer logfile-path :append true))
         state-atom        (atom {:autobuilder nil
                                  :focus-ids  build-ids})
         all-builds        (mapv auto/prep-build all-builds)
@@ -449,6 +451,5 @@
     (start-autobuild (:build-ids *autobuild-env*))
     (start-nrepl-server figwheel-options *autobuild-env*)
     (if (false? (:repl figwheel-options))
-      (when (figwheel-sidecar.auto-builder/autobuild-ids *autobuild-env*)
-        (loop [] (Thread/sleep 30000) (recur)))
+      (loop [] (Thread/sleep 30000) (recur))
       (repl-switching-loop))))


it should probably actually show the options

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


route to home at startup if no other route active

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojurecup/cc2014-frontend.git/'


added one uber master fn to schedule the project.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tnteam/milestones-clojurecup2014.git/'


updated project.clj file

updated project.clj file

error: pathspec 'src/clojure/project.clj' did not match any file(s) known to git

--- src/clojure/project.clj
+++ src/clojure/project.clj
@@ -0,0 +1,18 @@
+(defproject hypower-org/matlab-to-physicloud "0.1.0-SNAPSHOT"
+  :description ""
+  :url "http://github.com/hypower-org/matlab-to-physicloud"
+  :license {:name "Eclipse Public License"
+            :url "http://www.eclipse.org/legal/epl-v10.html"}
+  :dependencies [[org.clojure/clojure "1.6.0"]
+                 [hypower-org/physicloud "0.1.1"]
+		 [hypower-org/watershed "0.1.5"]
+                 [manifold "0.1.0-beta10"]
+                 [jkobuki "1.1.0"]
+                 [phidget "1.0.0"]
+                 [jssc "2.8.0"]
+                 ]
+  :java-source-paths ["src/physicloud/PhysiCloudClient"]
+  :main physicloud.matlab-client
+  :aot [physicloud.matlab-client]
+  )
+


button hacking

button hacking


Mild refactoring.

Mild refactoring.


fix strain file not committed

fix strain file not committed

error: pathspec 'src/wb_es/datomic/data/strain.clj' did not match any file(s) known to git

--- src/wb_es/datomic/data/strain.clj
+++ src/wb_es/datomic/data/strain.clj
@@ -0,0 +1,14 @@
+;; Genotype
+;; species
+(ns wb-es.datomic.data.strain
+  (:require [datomic.api :as d]
+            [wb-es.datomic.data.util :as data-util]))
+
+(deftype Strain [entity]
+  data-util/Document
+  (metadata [this] (data-util/default-metadata entity))
+  (data [this]
+    {:wbid (:strain/id entity)
+     :label (:strain/id entity)
+     :description (:strain/genotype entity)
+     :species (data-util/format-species-enum (:strain/species entity))}))


Add basic deps file

Add basic deps file

error: pathspec 'src/deps.cljs' did not match any file(s) known to git

--- src/deps.cljs
+++ src/deps.cljs
@@ -0,0 +1,4 @@
+{:foreign-libs
+ [{:file "ace/ace.js"
+   :file-min "ace/ace.min.js"}]
+ :externs ["ace/ace.js"]}


put in an app global config entry for :max-session-age

--- src/metabase/config.clj
+++ src/metabase/config.clj
@@ -2,4 +2,5 @@

 (def app-defaults
   "Global application defaults"
-  {:database-file "metabase.db"})+  {:database-file "metabase.db"                             ; name of the local h2 database file
+   :max-session-age (* 60 24 14)})                           ; session length in minutes


add fressian cljs test

add fressian cljs test

error: pathspec 'test/incognito/fressian_test.cljs' did not match any file(s) known to git

--- test/incognito/fressian_test.cljs
+++ test/incognito/fressian_test.cljs
@@ -0,0 +1,52 @@
+(ns incognito.fressian-test
+  (:require [cljs.test :refer-macros [deftest is testing run-tests async use-fixtures]]
+            [incognito.fressian :refer [incognito-read-handlers incognito-write-handlers]]))
+
+(enable-console-print!)
+
+(defmethod cljs.test/report [:cljs.test/default :end-run-tests] [m]
+  (if (cljs.test/successful? m)
+    (println "Success!")
+    (println "FAIL")))
+
+(use-fixtures :once
+  {:before
+   #(do (prn "START TEST"))
+   :after
+   #(do (prn "DONE"))})
+
+(defrecord Bar [a b])
+
+(deftest incognito-roundtrip-test
+  (testing "Test incognito transport."
+    (let [bar (map->Bar {:a [1 2 3] :b {:c "Fooos"}})
+          r   (let [buffer (fress.api/byte-stream)
+
+                    read-handlers  (atom {'incognito.fressian-test.Bar map->Bar})
+                    write-handlers (atom {'incognito.fressian-test.Bar
+                                          (fn [bar] (assoc bar :c "donkey"))})
+                    w              (fress.api/create-writer buffer :handlers (incognito-write-handlers write-handlers))]
+                (fress.api/write-object w bar)
+                (fress.api/read buffer :handlers (incognito-read-handlers (atom {}))))]
+      (is (= {:c "donkey", :b {:c "Fooos"}, :a [1 2 3]} (:value r)))
+      (is (= 'incognito.fressian-test/Bar (:tag r)))
+      (is (= incognito.base/IncognitoTaggedLiteral (type r))))))
+
+(deftest double-roundtrip-test
+  (testing "Test two roundtrips, one incognito and deserialize at end."
+    (let [bar            (map->Bar {:a [1 2 3] :b {:c "Fooos"}})
+          write-handlers (atom {})
+          read-handlers  (atom {'incognito.fressian-test/Bar map->Bar})]
+      (is (= bar
+             (let [buffer (fress.api/byte-stream)
+                   w      (fress.api/create-writer buffer
+                                                   :handlers
+                                                   (incognito-write-handlers write-handlers))]
+               (fress.api/write-object w bar)
+               (fress.api/write-object w (fress.api/read buffer
+                                                         :handlers
+                                                         (incognito-read-handlers (atom {}))))
+               (fress.api/read buffer
+                               :handlers (incognito-read-handlers read-handlers))))))))
+
+(run-tests)


Correct a bug in streams/rate which could cause divide-by-zero.

Where (unix-time) is idential between two partitions of part-time-fast,
streams/rate would divide by zero. This patch ignores the actual times
in favor of just using the interval directly. This is not as accurate in
cases where GC pauses interfere with thread scheduling, but I suspect in
those cases part-time-fast's internal timing could *also* be
inconsistent. LMAO if you care about time in Java, I guess. :-/

The right thing to do is just fix part-time, and use that.

--- src/riemann/streams.clj
+++ src/riemann/streams.clj
@@ -315,7 +315,7 @@
               (dosync
                 (when-let [state (deref (:state r))]
                   (let [count (deref (r :count))
-                        rate (/ count (- end start))]
+                        rate (/ count interval)]
                     (merge state
                            {:metric rate :time (round end)}))))]
           (call-rescue event children)))))


dumping to kl works

dumping to kl works

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/michaelsbradleyjr/shen.clj.git/'


Add example of SSE channel close notification

--- dev/src/yada/dev/examples.clj
+++ dev/src/yada/dev/examples.clj
@@ -1,13 +1,32 @@
 (ns yada.dev.examples
   (:require
    [yada.yada :as yada]
-   [manifold.stream :as ms]))
+   [manifold.stream :as ms]
+   [manifold.deferred :as d]))

 (defn routes []
   ["/examples"
    [
-    ["/sse-body" (yada/resource
-             {:methods
-              {:get {:produces "text/event-stream"
-                     :response (fn [ctx] (ms/periodically 400 (fn [] "foo")))}}})]
-    ["/sse-resource" (yada/handler (ms/periodically 400 (fn [] "foo")))]]])
+    ["/sse-resource" (yada/handler (ms/periodically 400 (fn [] "foo")))]
+    ["/sse-body"
+     (yada/resource
+      {:methods
+       {:get {:produces "text/event-stream"
+              :response (fn [ctx]
+                          (let [source (ms/periodically 400 (fn [] "foo"))
+                                sink (ms/stream 10)]
+                            (ms/on-closed
+                             sink
+                             (fn [] (println "closed")))
+                            (ms/connect source sink)
+                            sink
+                            ))}}})]
+    ["/sse-body-with-close"
+     (yada/resource {:methods {:get
+                               {:produces "text/event-stream"
+                                :response (fn [ctx]
+                                            (let [source (ms/periodically 400 (fn [] "foo"))
+                                                  sink (ms/stream 10)]
+                                              (ms/on-closed sink (fn [] (println "closed")))
+                                              (ms/connect source sink)
+                                              sink))}}})]]])


improve giving a default value to a number input field


figwheel doesn't honor :warning-handlers

--- sidecar/src/figwheel_sidecar/config.clj
+++ sidecar/src/figwheel_sidecar/config.clj
@@ -275,6 +275,7 @@
 (defn prep-builds [builds]
   (-> builds
       map-to-vec-builds
+      (->> (mapv #(dissoc % :warning-handlers)))
       fix-builds
       prep-builds-for-figwheel-client
       ensure-output-dirs


Documentation only

Documentation only

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/turbovote-http-api.git/'


Serializing messages with IO

Serializing messages with IO

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/acessocard/microscope.git/'


Addition of whalesong sketch by Aaron Arnett

error: pathspec 'spectacles/src/spectacles/whalesong.clj' did not match any file(s) known to git

--- spectacles/src/spectacles/whalesong.clj
+++ spectacles/src/spectacles/whalesong.clj
@@ -0,0 +1,33 @@
+(ns spectacles.whalesong
+  (:require [quil.core :as q]
+            [quil.middleware :as m]))
+
+(defn setup [] )
+
+(defn update [state] state)
+
+(defn draw [state]
+  (q/frame-rate 2)
+  ;; (q/background 127 127 127 64)
+  (q/stroke 235 235 235)
+  (q/fill 235 235 235 32)
+  (q/rect 0 0 (q/width) (q/height))
+  (let [x1 (q/random (q/width))
+        y1 (q/random (q/height))
+        x2 (q/random (q/width))
+        y2 (q/random (q/height))]
+    (q/no-fill)
+    (q/stroke-weight 1)
+    (q/stroke 0 0 0)
+    (q/bezier 50 50 x1 y1 x2 y2 (- (q/width) 50) (- (q/height) 50))
+    (q/stroke-weight 4)
+    (q/point x1 y1)
+    (q/point x1 y2)))
+
+;; (q/defsketch whalesong
+;;   :title "Whalesong"
+;;   :size [800 600]
+;;   :setup setup
+;;   :draw draw
+;;   :features [:always-on-top]
+;;   :middleware [show-frame-rate-middleware show-frame-count-middleware])