only made it part way through 12.1

only made it part way through 12.1

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

--- src/joy/ch12.clj
+++ src/joy/ch12.clj
@@ -0,0 +1,59 @@
+(ns joy.ch12
+  (:require [clojure.java.io :as io]
+            [clojure.string :as string])
+  (:import [com.sun.net.httpserver HttpHandler HttpExchange
+            HttpServer]
+           [java.net InetSocketAddress URLDecoder URI]
+           [java.io File FilterOutputStream]))
+
+(def OK java.net.HttpURLConnection/HTTP_OK)
+
+(defn respond
+  ([exchange body]
+     (respond identity exchange body))
+  ([around exchange body]
+     (.sendResponseHeaders exchange OK 0)
+     (with-open [resp (around (.getResponseBody exchange))]
+       (.write resp (.getBytes body)))))
+
+(defn new-server [port path handler]
+  (doto
+      (HttpServer/create (InetSocketAddress. port) 0)
+    (.createContext path handler)
+    (.setExecutor nil)
+    (.start)))
+
+(defn default-handler [txt]
+  (proxy (HttpHandler)
+      []
+    (handle [exchange]
+      (respond exchange txt))))
+
+#_(def server
+  (new-server
+   8123
+   "/joy/hello"
+   (default-handler "Hello Atlanta")))
+
+(comment
+
+ (.stop server 0)
+
+ )
+
+(def p (default-handler
+         "There's no problem that can't be solved with another level of indirection"))
+
+
+(def server (new-server 8123 "/" p))
+
+(update-proxy p
+              {"handle" (fn [this exchange]
+                          (respond exchange (str "this is" this)))})
+
+(def echo-handler
+  (fn [_ exchange]
+    (let [headers (.getRequestHeaders exchange)]
+      (respond exchange (prn-str headers)))))
+
+(update-proxy p {"handle" echo-handler})


implement server side rest logic

implement server side rest logic

error: pathspec 'cljs-rest-client-server-demo/src/cljs_rest_client_server_demo/handler.clj' did not match any file(s) known to git

--- cljs-rest-client-server-demo/src/cljs_rest_client_server_demo/handler.clj
+++ cljs-rest-client-server-demo/src/cljs_rest_client_server_demo/handler.clj
@@ -0,0 +1,26 @@
+(ns cljs-rest-client-server-demo.handler
+  (:require [ring.util.response :as ring-res]
+            [compojure.route :as route]
+            [compojure.handler :as handler]
+            [ring.middleware.resource :as resources]
+            [ring.middleware.params :as params]
+            [compojure.core :refer :all]
+            [ring.middleware.file-info :refer :all]))
+
+(defroutes app-routes
+  (PUT "/:id" {params :params}
+       (str "put colled with params: " params))
+  (POST "/:id" {params :params}
+        (str "post called with params: " params))
+  (route/resources "/")
+  (route/not-found
+   "Try it"))
+
+(def app
+  (-> app-routes
+      (params/wrap-params)
+      handler/api
+      (resources/wrap-resource "public")
+      (wrap-file-info)))
+
+


[admin] Relax TXT record matching

[admin] Relax TXT record matching

Some folks create the record as `clojars-username` instead of
`clojars username`, so this allows the partially automated
verification to still work.

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/tobias/clojars-web.git/'


Berrizendatu, ez azkenentzat bakarrik

Berrizendatu, ez azkenentzat bakarrik

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.bez.git/'


Fix advisory lock handling in next-item*

We need to wait for the lock in a separate transaction so that we will
be guaranteed to see the effect of the other transaction here.

--- src/pepa/processor.clj
+++ src/pepa/processor.clj
@@ -11,8 +11,8 @@

 (defn ^:private next-item* [component processor]
   (db/with-transaction [db (:db component)]
-    (db/advisory-xact-lock! db (:notify-topic processor))
-    (db/query db (next-item component) :result-set-fn first)))
+    (db/advisory-xact-lock! db (:notify-topic processor)))
+  (db/query (:db component) (next-item component) :result-set-fn first))

 (defn ^:private process-next [component processor]
   (let [{:keys [notify-chan control-chan]} processor]


Failing join test.

Failing join test.

error: pathspec 'test/onyx/peer/join_test.clj' did not match any file(s) known to git

--- test/onyx/peer/join_test.clj
+++ test/onyx/peer/join_test.clj
@@ -0,0 +1,152 @@
+(ns onyx.peer.join-test
+  (:require [com.stuartsierra.component :as component]
+            [midje.sweet :refer :all]
+            [onyx.system :refer [onyx-development-env]]
+            [onyx.queue.hornetq-utils :as hq-util]
+            [onyx.peer.task-lifecycle-extensions :as l-ext]
+            [onyx.api]))
+
+(def id (java.util.UUID/randomUUID))
+
+(def config (read-string (slurp (clojure.java.io/resource "test-config.edn"))))
+
+(def env-config
+  {:hornetq/mode :udp
+   :hornetq/server? true
+   :hornetq.server/type :embedded
+   :hornetq.udp/cluster-name (:cluster-name (:hornetq config))
+   :hornetq.udp/group-address (:group-address (:hornetq config))
+   :hornetq.udp/group-port (:group-port (:hornetq config))
+   :hornetq.udp/refresh-timeout (:refresh-timeout (:hornetq config))
+   :hornetq.udp/discovery-timeout (:discovery-timeout (:hornetq config))
+   :hornetq.embedded/config (:configs (:hornetq config))
+   :zookeeper/address (:address (:zookeeper config))
+   :zookeeper/server? true
+   :zookeeper.server/port (:spawn-port (:zookeeper config))
+   :onyx/id id
+   :onyx.coordinator/revoke-delay 5000})
+
+(def peer-config
+  {:hornetq/mode :udp
+   :hornetq.udp/cluster-name (:cluster-name (:hornetq config))
+   :hornetq.udp/group-address (:group-address (:hornetq config))
+   :hornetq.udp/group-port (:group-port (:hornetq config))
+   :hornetq.udp/refresh-timeout (:refresh-timeout (:hornetq config))
+   :hornetq.udp/discovery-timeout (:discovery-timeout (:hornetq config))
+   :zookeeper/address (:address (:zookeeper config))
+   :onyx/id id
+   :onyx.peer/inbox-capacity (:inbox-capacity (:peer config))
+   :onyx.peer/outbox-capacity (:outbox-capacity (:peer config))
+   :onyx.peer/job-scheduler :onyx.job-scheduler/round-robin})
+
+(def dev (onyx-development-env env-config))
+
+(def env (component/start dev))
+
+(def batch-size 2)
+
+(def echo 1)
+
+(def name-queue (str (java.util.UUID/randomUUID)))
+
+(def age-queue (str (java.util.UUID/randomUUID)))
+
+(def out-queue (str (java.util.UUID/randomUUID)))
+
+(def hq-config {"host" (:host (:non-clustered (:hornetq config)))
+                "port" (:port (:non-clustered (:hornetq config)))})
+
+(hq-util/create-queue! hq-config name-queue)
+
+(hq-util/create-queue! hq-config age-queue)
+
+(hq-util/create-queue! hq-config out-queue)
+
+(def people
+  [{:id 1 :name "Mike" :age 23}
+   {:id 2 :name "Dorrene" :age 24}
+   {:id 3 :name "Benti" :age 23}
+   {:id 4 :name "John" :age 19}
+   {:id 5 :name "Shannon" :age 31}
+   {:id 6 :name "Kristen" :age 25}])
+
+(def names (map #(select-keys % [:id :name]) people))
+
+(def ages (map #(select-keys % [:id :age]) people))
+
+(hq-util/write-and-cap! hq-config name-queue names 1)
+
+(hq-util/write-and-cap! hq-config age-queue ages 1)
+
+(defn join-person [local-state segment]
+  (let [state @local-state]
+    (if-let [record (get state (:id segment))]
+      (let [result (merge record segment)]
+        (swap! local-state dissoc (:id segment))
+        result)
+      (do (swap! local-state assoc (:id segment) (dissoc segment :id))
+          []))))
+
+(def catalog
+  [{:onyx/name :names
+    :onyx/ident :hornetq/read-segments
+    :onyx/type :input
+    :onyx/medium :hornetq
+    :onyx/consumption :concurrent
+    :hornetq/queue-name name-queue
+    :hornetq/host (:host (:non-clustered (:hornetq config)))
+    :hornetq/port (:port (:non-clustered (:hornetq config)))
+    :onyx/batch-size batch-size}
+
+   {:onyx/name :ages
+    :onyx/ident :hornetq/read-segments
+    :onyx/type :input
+    :onyx/medium :hornetq
+    :onyx/consumption :concurrent
+    :hornetq/queue-name age-queue
+    :hornetq/host (:host (:non-clustered (:hornetq config)))
+    :hornetq/port (:port (:non-clustered (:hornetq config)))
+    :onyx/batch-size batch-size}
+
+   {:onyx/name :join-person
+    :onyx/fn :onyx.peer.join-test/join-person
+    :onyx/type :function
+    :onyx/consumption :concurrent
+    :onyx/group-by-key :id
+    :onyx/batch-size batch-size}
+
+   {:onyx/name :out
+    :onyx/ident :hornetq/write-segments
+    :onyx/type :output
+    :onyx/medium :hornetq
+    :onyx/consumption :concurrent
+    :hornetq/queue-name out-queue
+    :hornetq/host (:host (:non-clustered (:hornetq config)))
+    :hornetq/port (:port (:non-clustered (:hornetq config)))
+    :onyx/batch-size batch-size}])
+
+(def workflow
+  [[:names :join-person]
+   [:ages :join-person]
+   [:join-person :out]])
+
+(defmethod l-ext/inject-lifecycle-resources :join-person
+  [_ event]
+  {:onyx.core/params [(atom {})]})
+
+(def v-peers (onyx.api/start-peers! 1 peer-config))
+
+(onyx.api/submit-job peer-config
+                     {:catalog catalog :workflow workflow
+                      :task-scheduler :onyx.task-scheduler/round-robin})
+
+(def results (hq-util/consume-queue! hq-config out-queue echo))
+
+(doseq [v-peer v-peers]
+  ((:shutdown-fn v-peer)))
+
+(component/stop env)
+
+(fact (into #{} (butlast results)) => (into #{} people))
+
+


replace newlines in slack

replace newlines in slack

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/m1dnight/a-slack-and-irc-bot.git/'


Add content inflation on enter/leave for item...

... Before, when an item would expand or shrink vertically (on creation
or checkmarking), the text and checkbox would be 100% height from the
first instant, meaning that it would overflow. Ugly! Now, it is hidden
within the expanding/shrinking div. Yay!

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/Reefersleep/sleepydo.git/'


(TK-174) Use handler/api rather than handler/site

handler/site from Compojure adds a lot of middleware that we don't need.
handler/api just adds middleware related to adding the query params into the
request map in a more useful way. This commit updates the routes to use
handler/api instead of handler/site, so we aren't using middleware that we
don't need.

Also, take advantage of the fact that handler/api uses `wrap-keyword-params`
and thus that params in `:params` are keywords (whereas params in
`:query-params` are not).

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/nathanielksmith/trapperkeeper-status.git/'


Tidied up with more doc strings

Tidied up with more doc strings

--- 2-collectors/clojure-collector/src/snowplow/clojure_collector/responses.clj
+++ 2-collectors/clojure-collector/src/snowplow/clojure_collector/responses.clj
@@ -21,9 +21,44 @@
            (java.util UUID)))

 (def ^:const cookie-name "sp")
-
 (def pixel (Base64/decodeBase64 (.getBytes "R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="))) ; Can't define ^:const on this as per http://stackoverflow.com/questions/13109958/why-cant-i-use-clojures-const-with-a-java-byte-array
 (def ^:const pixel-length (str (alength pixel)))
+
+(defn- uuid
+  "Returns a string representation of new type 4 UUID"
+  []
+  (str (UUID/randomUUID)))
+
+(defn- now-plus
+  "Creates a DateTime `duration` seconds from now"
+  [duration]
+  (-> (new DateTime) (.plusSeconds duration)))
+
+(defn- set-cookie
+  "Sets a SnowPlow cookie with visitor `id`, lasting `duration` seconds for `domain`"
+  [id duration domain]
+  {:value    id
+   ; :domain   domain ; Comment this line out to test locally, because of http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain
+   :expires  (now-plus duration)})
+
+(defn- generate-id
+  "Checks `cookies` and generates a uuid for the visitor as necessary"
+  [cookies]
+  (let [id (:value (cookies cookie-name))]
+    (if (empty? id) (uuid) id)))
+
+(defn send-cookie-and-pixel
+  "Respond with a transparent pixel and the cookie"
+  [cookies duration domain]
+  (let [id (generate-id cookies)
+        cookie-contents (set-cookie id duration domain)]
+    {:status  200
+     :headers {"Content-Type"   "image/gif"
+               "P3P"            "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
+               "Content-Length"  pixel-length}
+     :cookies {cookie-name cookie-contents}
+     :body    (ByteArrayInputStream. pixel)}))
+

 (def send-404
   "Respond with a 404"
@@ -31,37 +66,9 @@
    :headers {"Content-Type" "text/plain"}
    :body    "404 Not found"})

+
 (def send-200
   "Respond with a 200"
   {:status  200
    :headers {"Content-Type" "text/plain"}
-   :body    "OK"})
-
-(defn- set-cookie
-  "Sets the SnowPlow ID cookie"
-  [id duration domain]
-  {:value    id
-   ; :domain   domain ; Comment this line out to test locally, because of http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain
-   :expires  (-> (new DateTime) (.plusSeconds duration))})
-
-(defn- uuid [] (str (UUID/randomUUID)))
-
-(defn- generate-id
-  "Generates a new uuid for a visitor as necessary"
-  [cookies]
-  (let [id (:value (cookies cookie-name))]
-    (if (empty? id) (uuid) id)))
-
-(defn send-cookie-and-pixel
-  "Responds with a transparent pixel and the cookie"
-  [cookies duration domain]
-  ; Set the user's uuid if not already set
-  (let [id (generate-id cookies)
-        cookie-data (set-cookie id duration domain)]
-    ; Set cookie and return pixel
-    {:status  200
-     :headers {"Content-Type"   "image/gif"
-               "P3P"            "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID PSA OUR IND COM NAV STA\""
-               "Content-Length"  pixel-length}
-     :cookies {cookie-name cookie-data}
-     :body    (ByteArrayInputStream. pixel)}))+   :body    "OK"})


add nil glyph for missing - character

add nil glyph for missing - character

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/'


Return a better 404 for missing API routes

--- src/metabase/core.clj
+++ src/metabase/core.clj
@@ -22,7 +22,10 @@
 ;; placeholder until we actually define real API routes
 (defroutes api-routes
   ;; call /api/test to see this
-  (GET "/test" [] {:status 200 :body {:message "We can serialize JSON <3"}}))
+  (GET "/test" [] {:status 200 :body {:message "We can serialize JSON <3"}})
+  (route/not-found (fn [{:keys [request-method uri]}]
+                        {:status 404
+                         :body (str (.toUpperCase (name request-method)) " " uri " is not yet implemented.")})))

 (letfn [(serve-index [_] (resp/file-response "frontend_client/index.html"))]
   (defroutes routes


sample dissoc and lazy example

sample dissoc and lazy example

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

--- src/simple/dissoc.clj
+++ src/simple/dissoc.clj
@@ -0,0 +1,17 @@
+; lazyness
+(defn find-first [pred col]
+  (first (filter pred col)))
+
+; use lazyness to find the first element
+; stop the processing as soon as the first element is found
+(find-first
+ #(> % 10)
+ '(1 5 8 2 15 20 31 5 1))
+
+; iterate creates an infinite lazy collection
+(take 5
+      (iterate
+       #(+ % 2) 0))
+
+
+


Resolve confusing deps (#37)

Resolve confusing deps (#37)

* resolve confusing dep: ring-codec

* resolve confusing dep: instaparse

* resolve confusing dep: cheshire

* resolve confusing dep: clj-time

* resolve confusing dep: tools.reader

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/Yleisradio/yle-api-template.git/'


remove debug jvm-opts

remove debug jvm-opts


Fix bug in defel macro.

Fix bug in defel macro.

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/'


Update message format for delete-subscription-by-phone

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/'


start on a in-memory indexed KV store

start on a in-memory indexed KV store

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

--- src/subrosa/database.clj
+++ src/subrosa/database.clj
@@ -0,0 +1,31 @@
+(ns subrosa.database
+  (:refer-clojure :exclude [get])
+  (:import [java.util UUID]))
+
+(defonce db (atom {}))
+
+(defn ensure-id [m]
+  (if (:id m)
+    m
+    (assoc m :id (str (UUID/randomUUID)))))
+
+(defn get
+  ([db table]
+     (vals (get-in db [table :id])))
+  ([db table column value]
+     (get-in db [table column value])))
+
+(defn put [db table m]
+  (let [m (ensure-id m)]
+    (reduce (fn [a [k v]]
+              (update-in a [table k] assoc v m))
+            db
+            m)))
+
+(defn delete [db table id]
+  (let [m (get db table :id id)]
+    (assoc db
+      table (reduce (fn [a [k v]]
+                      (update-in a [k] dissoc v))
+                    (db table)
+                    m))))


Remove link to tests on doc index

Remove link to tests on doc index

--- dev/src/yada/dev/website.clj
+++ dev/src/yada/dev/website.clj
@@ -34,32 +34,31 @@
       templater
       "templates/page.html.mustache"
       {:content
-       (let [header [:button.btn.btn-primary {:onClick "testAll()"} "Repeat tests"]]
-         (html
-          [:div.container
-           [:h2 "Welcome to " [:span.yada "yada"] "!"]
-           [:ol
-            [:li [:a {:href (path-for @*router :yada.dev.user-manual/user-manual)} "User manual"] " (and " [:a {:href (path-for @*router :yada.dev.user-manual/tests)} "tests"] ")"]
-            [:li "HTTP and related specifications"
-             [:ul
-              [:li [:a {:href "/static/spec/rfc2616.html"} "RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1"]]
-              (for [i (range 7230 (inc 7240))]
-                [:li [:a {:href (format "/static/spec/rfc%d.html" i)}
-                      (format "RFC %d: %s" i (or (get titles i) ""))]])]]
-            [:li [:a {:href
-                      (format "%s/index.html?url=%s/swagger.json"
-                              (path-for @*router :swagger-ui)
-                              (path-for @*router :yada.dev.user-api/user-api)
-                              )}
-                  "Swagger UI"]
-             " - to demonstrate Swagger integration"]
-            [:li [:a {:href
-                      (format "%s/index.html?url=%s/swagger.json"
-                              (path-for @*router :swagger-ui)
-                              (path-for @*router :hello-api)
-                              )}
-                  "Swagger UI (hello)"]
-             ]]]))}))
+       (html
+        [:div.container
+         [:h2 "Welcome to " [:span.yada "yada"] "!"]
+         [:ol
+          [:li [:a {:href (path-for @*router :yada.dev.user-manual/user-manual)} "User manual"]]
+          [:li "HTTP and related specifications"
+           [:ul
+            [:li [:a {:href "/static/spec/rfc2616.html"} "RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1"]]
+            (for [i (range 7230 (inc 7240))]
+              [:li [:a {:href (format "/static/spec/rfc%d.html" i)}
+                    (format "RFC %d: %s" i (or (get titles i) ""))]])]]
+          [:li [:a {:href
+                    (format "%s/index.html?url=%s/swagger.json"
+                            (path-for @*router :swagger-ui)
+                            (path-for @*router :yada.dev.user-api/user-api)
+                            )}
+                "Swagger UI"]
+           " - to demonstrate Swagger integration"]
+          [:li [:a {:href
+                    (format "%s/index.html?url=%s/swagger.json"
+                            (path-for @*router :swagger-ui)
+                            (path-for @*router :hello-api)
+                            )}
+                "Swagger UI (hello)"]
+           ]]])}))
    {:id ::index
     :representations [{:content-type #{"text/html"}
                        :charset #{"utf-8"}


trim snippet was added

trim snippet was added

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/abtv/personal-aggregator.git/'


Added basic localstorage helpers

Added basic localstorage helpers

Also, comments contain Paredit mnemonics

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

--- src/cljs/mathom/core.cljs
+++ src/cljs/mathom/core.cljs
@@ -0,0 +1,56 @@
+
+(ns mathom.core
+  (:require
+            [m]
+            [devtools.core :as devtools]))
+
+(enable-console-print!)
+
+(devtools/set-pref! :install-sanity-hints true)
+(devtools/install!)
+
+(defn set-item!
+  "Set `key' in browser's localStorage to `val`."
+  [key val]
+  (.setItem (.-localStorage js/window) key val))
+
+(defn get-item
+  "Returns value of `key' from browser's localStorage."
+  [key]
+  (.getItem (.-localStorage js/window) key))
+
+(defn remove-item!
+  "Remove the browser's localStorage value for the given `key`"
+  [key]
+  (.removeItem (.-localStorage js/window) key))
+
+(defn serialize-local
+  "Serializes given data to localstorage under given key
+  assuming that data is convertable to JS"
+  [key data]
+  (set-item! key (.stringify js/JSON (clj->js data))))
+
+(defn deserialize-local
+  "Returns Cljs datastructure from localstorage
+  for given key"
+  [key]
+  (js->clj (.parse js/JSON (get-item key))))
+
+
+; Paredit mnemonics
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; all commands with C-M
+; d goes down forward
+; its reverse is u
+; b goes down backward
+; its reverse is n
+; or to put it other way d and u go from position inward right or outward left
+; b and n goes inward left and outward right
+; barf and slurp go backwards with ctrl and forwards with shift j and k
+; splice, split, raise and join are M-s M-S-s Cmd-' and ^-Cmd-s
+; movement and selection is through various arrows and M and/or S
+; Wrappers now work with Cmd + whatever is necessary to add the closing wrapping
+; Like Cmd-s-9 when s-9 is ), or Cmd-M-9 for ] and Cmd-M-S-9 for }
+; Kill is the regular C-k, it works from cursor to form end, which is ), ], " or }
+; Raise actually works now, because Cmd-' is seen by IntelliJ as Cmd-\ for some reason...
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Upgrade jetty-server 7.6.8->7.6.13 for NIO fixes

Solve occasional failing jetty start caused by:

    java.lang.IllegalStateException: !Selecting

when using the max-queued option.

See also:
http://dev.eclipse.org/mhonarc/lists/jetty-users/msg02279.html
https://travis-ci.org/ring-clojure/ring/jobs/12571861

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/meowcakes/ring.git/'


More sample reports.

More sample reports.

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/'


impl mutex-based cache type; consistency in cache methods; use clojure persistent maps for ref,atom,volatile! types

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/transwarp.git/'


prefer ~e to e#

prefer ~e to e#


[ECS][VPC]

[ECS][VPC]

error: pathspec 'src/clj/aliyuncs/ecs/vpc.clj' did not match any file(s) known to git

--- src/clj/aliyuncs/ecs/vpc.clj
+++ src/clj/aliyuncs/ecs/vpc.clj
@@ -0,0 +1,47 @@
+(ns aliyuncs.ecs.vpc
+  (:import [com.aliyuncs.ecs.model.v20140526
+            CreateVpcRequest
+            CreateVpcResponse
+            DeleteVpcRequest
+            DeleteVpcResponse
+            DescribeVpcsRequest
+            DescribeVpcsResponse
+            ModifyVpcAttributeRequest
+            ModifyVpcAttributeResponse])
+    (:require [aliyuncs.core :as acs])
+    (:use [clojure.java.data]))
+
+(defn create-vpc
+  "Create an ecs vpc and return vpc-id"
+  [client {:keys [vpc-name vpc-desc vpc-cidr vpc-user-cidr]}]
+  (let [^CreateVpcRequest create-req (CreateVpcRequest.)]
+    (-> create-req
+      (.setVpcName vpc-name)
+      (.setDescription vpc-desc)
+      (.setCidrBlock vpc-cidr))
+    (when-not (nil? vpc-user-cidr)
+      (.setUserCidr create-req vpc-user-cidr))
+    (let [^CreateVpcResponse create-resp (acs/get-response client create-req)]
+     (.getVpcId create-resp))))
+
+(defn describe-vpcs
+ "Describe vpcs"
+ [client]
+ (let [describe-req (DescribeVpcsRequest.)
+       ^DescribeVpcsResponse describe-resp (acs/get-response client describe-req)]
+       (from-java describe-resp)))
+
+(defn describe-vpc
+ "Describe a single vpc"
+ [client vpc-id]
+ (let [describe-req (DescribeVpcsRequest.)]
+   (.setVpcId describe-req vpc-id)
+   (let [^DescribeVpcsResponse describe-resp (acs/get-response client describe-req)]
+       (from-java describe-resp))))
+
+(defn delete-vpc
+  "Delete a vpc"
+  [client vpc-id]
+  (let [^DeleteVpcRequest delete-req (DeleteVpcRequest.)]
+    (.setVpcId delete-req vpc-id)
+    (acs/do-action client delete-req)))


pmap paraleloan prozesatzeko

pmap paraleloan prozesatzeko

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/'


aldatuk pasatako konexioa erabiltzea

aldatuk pasatako konexioa erabiltzea


prevent centering jumps with the scrollbar

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/'


Prepping.

Prepping.

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/monument.git/'


Clarify message in retry-able exception logs

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/email-works.git/'


Handle GET group-membership

Handle GET group-membership

[#145811513}

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/'


"X era existitzen da" mezu txukunagoa

"X era existitzen da" mezu txukunagoa

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.bez.git/'


minor cleanup

minor cleanup

--- src/metabase/api/user.clj
+++ src/metabase/api/user.clj
@@ -56,7 +56,7 @@
   "Fetch a `User`. You must be fetching yourself *or* be a superuser."
   [id]
   (check-self-or-superuser id)
-  (check-404 (sel :one User :id id :is_active true)))
+  (check-404 (sel :one User :id id, :is_active true)))

 (defendpoint PUT "/:id"


Fixed auto generation of all ebook files

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/hudren/ebook-novel.git/'


fix clean-targets

fix clean-targets

--- sidecar/project.clj
+++ sidecar/project.clj
@@ -28,9 +28,7 @@
    [clj-fuzzy "0.3.1"]
    [fipp "0.6.4"]]

-  :clean-targets ^{:protect false} ["resources/compiled-utils/figwheel-helper-deploy.js"
-                                    "dev-resources/public/js"
-                                    "target"]
+  :clean-targets ^{:protect false} ["dev-resources/public/js" "target"]

   :profiles {:dev {:dependencies [[com.cemerick/piggieback "0.2.1"]]
                    :source-paths ["cljs_src" "src"]


Fix ensure-failing-without-answers, per Caleb Phillips' macro-replacement 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/croeder/clojure-koans-work.git/'


clj-http middleware to retry requests

clj-http middleware to retry requests

error: pathspec 'src/clj/runbld/util/http.clj' did not match any file(s) known to git

--- src/clj/runbld/util/http.clj
+++ src/clj/runbld/util/http.clj
@@ -0,0 +1,17 @@
+(ns runbld.util.http
+  (:require [robert.bruce :refer [try-try-again]]))
+
+(defn wrap-retries*
+  [client {:keys [retries-config] :as req} & args]
+  (try-try-again
+   {:sleep (:sleep retries-config 500)
+    :tries (:tries retries-config 20)}
+   #(apply client (dissoc req :retries-config) args)))
+
+(defn wrap-retries
+  [client]
+  (fn
+    ([req]
+     (wrap-retries* client req))
+    ([req respond raise]
+     (wrap-retries* client req respond raise))))


tag "cache" symbol as transwarp.protocol.ICache


Add first rudimentary tests for system start order

fatal: unable to access 'https://github.com/GetContented/component.git/': The requested URL returned error: 403


update boot deploy task

update boot deploy task

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/'


Add a test for sodium init

Add a test for sodium init

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

--- test/caesium/sodium_test.clj
+++ test/caesium/sodium_test.clj
@@ -0,0 +1,7 @@
+(ns caesium.sodium-test
+  (:require [caesium.sodium :as s]
+            [clojure.test :refer [deftest is]]))
+
+(deftest init-test
+  (is (#{0 1} (s/init)))
+  (is (= 1 (s/init))))


fix zip file names in tasks test

fix zip file names in tasks test

fatal: unable to access 'https://github.com/fhirbase/fhirterm.git/': The requested URL returned error: 403


Fix typo

Fix typo

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/Yleisradio/rabid.git/'


adds moment conversion helpers to util library

fatal: unable to access 'https://github.com/starcity-properties/odin.git/': The requested URL returned error: 403


Fix new project.clj creation

Fix new project.clj creation

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/bsmr-clojure/Nightcode.git/'


Add footer

Add footer


Add styled button to personal.background-check/declined

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/'


Sort posts in reverse chronological order in atom feed

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/magoyette/marcandregoyette.com.git/'


Fix #70 Don't NPE if setup fails

Fix #70 Don't NPE if setup fails

--- Clojure/src/ambly/repl/jsc.clj
+++ Clojure/src/ambly/repl/jsc.clj
@@ -187,25 +187,31 @@
     (remove nil?)
     vec))

+(def not-conected-result
+  {:status :error
+   :value "Not connected."})
+
 (defn jsc-eval
   "Evaluate a JavaScript string in the JSC REPL process."
   [repl-env js]
   {:pre [(map? repl-env) (string? js)]}
   (let [{:keys [out]} @(:socket repl-env)
         response-promise (promise)]
-    (reset! (:response-promise repl-env) response-promise)
-    (write out js)
-    (let [response @response-promise]
-      (if (= :eof response)
-        {:status :error
-         :value  "Connection to JavaScriptCore closed."}
-        (let [result (json/read-str response
-                       :key-fn keyword)]
-          (merge
-            {:status (keyword (:status result))
-             :value  (:value result)}
-            (when-let [raw-stacktrace (:stacktrace result)]
-              {:stacktrace raw-stacktrace})))))))
+    (if out
+      (do
+        (reset! (:response-promise repl-env) response-promise)
+        (write out js)
+        (let [response @response-promise]
+          (if (= :eof response)
+            not-conected-result
+            (let [result (json/read-str response
+                           :key-fn keyword)]
+              (merge
+                {:status (keyword (:status result))
+                 :value  (:value result)}
+                (when-let [raw-stacktrace (:stacktrace result)]
+                  {:stacktrace raw-stacktrace}))))))
+      not-conected-result)))

 (defn load-javascript
   "Load a Closure JavaScript file into the JSC REPL process."


[TH] trace more things in list-partner-sites

fatal: unable to access 'https://github.com/democracyworks/partner-works.git/': The requested URL returned error: 403


define Instance as a protocol and define stationary, oval, and bottom circle implementations

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/gltut.git/'


Adding hatti.utils.om.state that takes some functions from hatti.shared, and builds more.

error: pathspec 'src/hatti/utils/om/state.cljs' did not match any file(s) known to git

--- src/hatti/utils/om/state.cljs
+++ src/hatti/utils/om/state.cljs
@@ -0,0 +1,28 @@
+(ns hatti.utils.om.state
+  (:require [om.core :as om :include-macros true]))
+
+(defn- transact!
+  "A transact! function that optionally uses swap! if this atom is not yet transactable?"
+  [app-state]
+  (if (satisfies? om/ITransact app-state) om/transact! swap!))
+
+(defn transact-app-state!
+  "Like om/transact! but also works on atoms that are not transactable?"
+  ([app-state transact-fn]
+   ((transact! app-state) app-state transact-fn))
+  ([app-state ks transact-fn]
+   ((transact! app-state) app-state #(update-in % ks transact-fn))))
+
+(defn update-app-state!
+  "Like om/update! but also works on atoms that are not transactable?"
+ ([app-state update-val]
+  (transact-app-state! app-state #(-> update-val)))
+ ([app-state ks update-val]
+  (transact-app-state! app-state ks #(-> update-val))))
+
+(defn merge-into-app-state!
+  "Merges provided state into existing app-state, possibly after zoomint into ks."
+  ([app-state state-to-merge]
+   (transact-app-state! app-state #(merge % state-to-merge)))
+  ([app-state ks state-to-merge]
+   (transact-app-state! app-state ks #(merge % state-to-merge))))


Type hint

Type hint

--- ext/aleph/src/yada/aleph.clj
+++ ext/aleph/src/yada/aleph.clj
@@ -3,6 +3,7 @@
 (ns yada.aleph
   (:require
    [aleph.http :as http]
+   [clojure.tools.logging :refer :all]
    [yada.handler :refer [as-handler]]))

 (defn listener
@@ -14,7 +15,7 @@
          (as-handler routes)
          (merge aleph-options {:port (or (:port aleph-options) 0) :raw-stream? true}))]
     {:port (aleph.netty/port server)
-     :close (fn [] (.close server))
+     :close (fn [] (.close ^java.io.Closeable server))
      :server server}))

 ;; Alias


Test running with deleted directories

Test running with deleted directories

--- test/desdemona/cli_test.clj
+++ test/desdemona/cli_test.clj
@@ -61,4 +61,15 @@
         (let [[result stdout] (with-fake-launcher-side-effects (aeron/-main))]
           (is @launched)
           (is (= result ::blocked-forever))
+          (is (= stdout "Launched the Media Driver. Blocking forever...\n"))))))
+  (testing "regular run with deleted directories"
+    (let [launched (atom false)]
+      (with-redefs [aeron/launch-media-driver!
+                    (fn [ctx]
+                      (is (.dirsDeleteOnStart ctx))
+                      (reset! launched true))]
+        (let [[result stdout] (with-fake-launcher-side-effects
+                                (aeron/-main "-d"))]
+          (is @launched)
+          (is (= result ::blocked-forever))
           (is (= stdout "Launched the Media Driver. Blocking forever...\n")))))))


New Clojure script

New Clojure script

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

--- clojure/basic_types.clj
+++ clojure/basic_types.clj
@@ -0,0 +1,8 @@
+(assert (= (type 3) Long))
+(assert (= (type 5.0) Double))
+(assert (= (type (/ 3 9)) clojure.lang.Ratio))
+(assert (= (type 5N) clojure.lang.BigInt))
+(assert (= (type 5.88M) BigDecimal))
+(assert (= (type 'dog) clojure.lang.Symbol))
+(assert (= (type :dog) clojure.lang.Keyword))
+


Circle radius from arc length and chord length measurements.

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

--- Clojure/radius.clj
+++ Clojure/radius.clj
@@ -0,0 +1,17 @@
+; :mode=clojure:
+
+(defn sin [v] (Math/sin v))
+(defn cos [v] (Math/cos v))
+
+(defn inner [n a b]
+    (sin
+        (if (zero? n)
+            (- 1.0 (/ b a))
+            (* (/ a b) (inner (dec n) a b))
+        )
+    )
+)
+(defn g [a b]
+    (/ b (* 2 (inner 2000 a b))))
+
+(g 3050.0 2985.0)


Style step complete

Style step complete


remove ui dependency on wilkerdev.dom

remove ui dependency on wilkerdev.dom

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/'


Add (empty) console/cljs.cljs which will contain the ClojureScript console.

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

--- src/cljs/cljs_browser_repl/console/cljs.cljs
+++ src/cljs/cljs_browser_repl/console/cljs.cljs
@@ -0,0 +1,20 @@
+(ns cljs-browser-repl.console.cljs
+  (:require [reagent.core :as reagent]
+            [cljs-browser-repl.console :as console]))
+
+(defn cljs-console-did-mount []
+  (js/$
+   (fn []
+     (let [jqconsole (console/new-jqconsole "#cljs-console"
+                                            :prompt-label "Let me echo it for you: ")]
+       #_(echo-prompt jqconsole)))))
+
+(defn cljs-console-render []
+  [:div.console-container
+   [:div#cljs-console.console.cljs-console]])
+
+(defn cljs-console
+  "A console for evaluating Clojure(Script) forms."
+  []
+  (reagent/create-class {:reagent-render cljs-console-render
+                         :component-did-mount cljs-console-did-mount}))


add core functionality (initial commit)

add core functionality (initial commit)

error: pathspec 'src/ca_recipe/tnywb/core.clj' did not match any file(s) known to git

--- src/ca_recipe/tnywb/core.clj
+++ src/ca_recipe/tnywb/core.clj
@@ -0,0 +1,8 @@
+(ns ca-recipe.tnywb.core
+  (:require [clojure.string :as str])
+  (:import (com.mblinn.oo.tinyweb RenderingException ControllerException)))
+
+(defn- render [view model]
+  (try
+    (view model)
+    (catch Exception e (throw (RenderingException. e)))))


Parse json.

Parse json.

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/cstorey/nrod.git/'


Update test to match new grouped response

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/'


added static dependency management functions

error: pathspec 'src/distillery/view/dependencies.clj' did not match any file(s) known to git

--- src/distillery/view/dependencies.clj
+++ src/distillery/view/dependencies.clj
@@ -0,0 +1,31 @@
+(ns distillery.view.dependencies
+  (:require [clojure.java.io :refer (resource)])
+  (:require [distillery.files :refer :all]))
+
+(def static-resources
+  ["reset.css"
+   "base.css"
+   "layout.css"
+   "distillery.css"
+   "jquery.js"
+   "video.js"
+   "video-js.min.css"
+   "video-js.png"
+   "video-js.swf"
+   "vjs.eot"
+   "vjs.woff"
+   "vjs.ttf"
+   "vjs.svg"])
+
+(defn save-dependency
+  "Saves a static resource dependency relative to the given HTML file path."
+  [^String target-dir ^String resource]
+  (let [src (get-path resource)
+        trg (get-path target-dir (file-name resource))]
+    (copy-file src trg)))
+
+(defn save-dependencies
+  "Saves all static resource dependencies relative to the given HTML file path."
+  [^String target-dir]
+  (doseq [rn static-resources]
+    (save-dependency target-dir (resource rn))))


Remove redundant redundancy

Remove redundant redundancy

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/vote-by-mail-works.git/'


Remove #_id from return item from db

Remove #_id from return item from db

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/expez/jada.git/'


clojure sieve

clojure sieve

fatal: unable to access 'https://github.com/askl56/Challenges.git/': The requested URL returned error: 403


dox cleanup

dox cleanup

--- src/metabase/api/common/throttle.clj
+++ src/metabase/api/common/throttle.clj
@@ -62,9 +62,9 @@
                       ;; Once throttling is in effect, initial delay before allowing another attempt. This grows
                       ;; according to DELAY-EXPONENT.
                       ^Integer initial-delay-ms
-                      ;; For each subsequent failure past ATTEMPTS-THRESHOLD, increase the delay by
-                      ;; (num-attempts-over-theshold ^ DELAY-EXPONENT). e.g. if INITIAL-DELAY-MS is 15 and
-                      ;; DELAY-EXPONENT is 2, the first attempt past ATTEMPTS-THRESHOLD will require the user to wait
+                      ;; For each subsequent failure past ATTEMPTS-THRESHOLD, increase the delay to
+                      ;; INITIAL-DELAY-MS * (num-attempts-over-theshold ^ DELAY-EXPONENT). e.g. if INITIAL-DELAY-MS is 15
+                      ;; and DELAY-EXPONENT is 2, the first attempt past ATTEMPTS-THRESHOLD will require the user to wait
                       ;; 15 seconds (15 * 1^2), the next attempt after that 60 seconds (15 * 2^2), then 135, and so on.
                       ^Integer delay-exponent])


add markdown tests

add markdown tests

error: pathspec 'test/braid/test/server/markdown.clj' did not match any file(s) known to git

--- test/braid/test/server/markdown.clj
+++ test/braid/test/server/markdown.clj
@@ -0,0 +1,27 @@
+(ns braid.test.server.markdown
+  (:require [clojure.test :refer :all]
+            [clojure.string :as string]
+            [braid.server.markdown :refer [markdown->hiccup]]))
+
+(deftest basic-changelog-markdown
+  (testing
+    (is (= (markdown->hiccup
+             (string/join
+               "\n"
+               ["# Hello World"
+                ""
+                " - thing one"
+                " - thing two"
+                ""
+                "## Other Heading"
+                ""
+                " - x"
+                " - y"
+                ""]))
+           [:div
+            [:h1 "Hello World"]
+            [:ul
+             [:li "thing one"]
+             [:li "thing two"]]
+            [:h2 "Other Heading"]
+            [:ul [:li "x"] [:li "y"]]]))))


Group memberships

Group memberships

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/'


Hizkuntzentzat datalist gehitu

Hizkuntzentzat datalist gehitu

fatal: unable to access 'https://github.com/lnmnd/magnet.bez.git/': The requested URL returned error: 403


Create core.clj

Create core.clj

fatal: unable to access 'https://github.com/yumzia/iyye.git/': The requested URL returned error: 403


Simpler

Simpler

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/'


Update name for consistency

Update name for consistency


Make tests more robust

Make tests more robust

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/Yleisradio/rabid.git/'


remove config

remove config

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/'


move auth tests to own namespace

move auth tests to own namespace

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

--- test/doc/auth.clj
+++ test/doc/auth.clj
@@ -0,0 +1,122 @@
+(ns doc.auth
+  (:require [clojure.core.incubator :refer [dissoc-in]]
+            [midje.sweet :refer :all]
+            [geschichte.sync :refer [client-peer server-peer wire]]
+            [geschichte.p2p.log :refer [logger]]
+            [geschichte.p2p.auth :refer [auth]]
+            [geschichte.repo :as repo]
+            [geschichte.platform :refer [create-http-kit-handler! start stop]]
+            [konserve.store :refer [new-mem-store]]
+            [geschichte.stage :as s]
+            [clojure.core.async :refer [<! >! <!! >!! timeout chan go go-loop pub sub]]))
+
+[[:chapter {:tag "authentication" :title "Authentication of geschichte"}]]
+""
+
+[[:section {:tag "authentication-protocol" :title "Full Message Protocol"}]]
+""
+
+(def log-atom (atom {}))
+
+(facts
+ (try
+   (let [ ;; create a platform specific handler (needed for server only)
+         handler (create-http-kit-handler! "ws://127.0.0.1:9090/")
+         ;; remote server to sync to
+         remote-store (<!! (new-mem-store))
+         local-users {"john" "haskell" "jane" "lisp"}
+         input-users {"john" "haskell" "jane" "lisp"}
+         auth-fn (fn [users] (go (into {} (filter #(users (key %)) input-users ))))
+         cred-fn (fn [token] (if (= (:password token) (get local-users (:username token))) true nil))
+         _ (def remote-peer (server-peer handler remote-store (comp (partial logger log-atom :remote-core))))
+
+         ;; start it as its own server (usually you integrate it in ring e.g.)
+         _ (start remote-peer)
+         ;; local peer (e.g. used by a stage)
+         local-store (<!! (new-mem-store))
+         _ (def local-peer (client-peer "CLIENT" local-store (comp (partial logger log-atom :local-core)
+                                                                   (partial auth local-store auth-fn cred-fn (atom #{})))))
+         ;; hand-implement stage-like behaviour with [in out] channels
+         in (chan)
+         out (chan)]
+     ;; to steer the local peer one needs to wire the input as our 'out' and output as our 'in'
+     (<!! (wire local-peer [out in]))
+     ;; subscribe to publications of repo '1' from user 'john'
+     (>!! out {:topic :meta-sub
+               :metas {"john" {42 #{"master"}}}
+               :peer "STAGE"})
+     ;; subscription (back-)propagation (in peer network)
+     (<!! in) => {:topic :meta-sub,
+                  :metas {"john" {42 #{"master"}}}
+                  :peer "CLIENT"}
+     ;; connect to the remote-peer
+     (>!! out {:topic :connect
+               :url "ws://127.0.0.1:9090/"
+               :peer "STAGE"})
+     ;; ack sub
+     (<!! in) => {:metas {"john" {42 #{"master"}}},
+                  :peer "STAGE",
+                  :topic :meta-subed}
+     ;; ack
+     (<!! in) => {:topic :connected,
+                  :url "ws://127.0.0.1:9090/",
+                  :peer "STAGE"}
+     ;; publish a new value of repo '42' of user 'john'
+     (>!! out {:topic :meta-pub,
+               :peer "STAGE",
+               :metas {"john" {42 {:id 42
+                                   :causal-order {1 []
+                                                  2 [1]}
+                                   :last-update (java.util.Date. 0)
+                                   :description "Bookmark collection."
+                                   :head "master"
+                                   :branches {"master" #{2}}
+                                   :schema {:type :geschichte
+                                            :version 1}}}}})
+     ;; auth required
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 5}
+     ;; send some credentials
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "häßkl"}})
+     ;; ups
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 4}
+     ;; let's try again
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "häskl"}})
+     ;; wrong, how could that be?
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 3}
+     ;; oh my, next try
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "häskel"}})
+     ;; wrong again
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 2}
+     ;; it's getting close
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "häsckl"}})
+     ;; doh, wrong again
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 1}
+     ;; last try
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "häskil"}})
+     ;; oh no, epic fail
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-failed, :users #{"john"}}
+     ;; let's try again
+     (>!! out {:topic :meta-pub,
+               :peer "STAGE",
+               :metas {"john" {42 {:id 42
+                                   :causal-order {1 []
+                                                  2 [1]}
+                                   :last-update (java.util.Date. 0)
+                                   :description "Bookmark collection."
+                                   :head "master"
+                                   :branches {"master" #{2}}
+                                   :schema {:type :geschichte
+                                            :version 1}}}}})
+     ;; auth required again
+     (<!! in) => {:topic :geschichte.p2p.auth/auth-required, :users #{"john"},:tries-left 5}
+     ;; this time with correct password
+     (>!! out {:topic :geschichte.p2p.auth/auth :users {"john" "haskell"}})
+     ;; authed
+     (<!! in) => {:topic :geschichte.p2p.auth/authed, :users #{"john"}}
+     ;; the peer replies with a request for missing commit values
+
+     ;; stop peers
+     (stop local-peer)
+     (stop remote-peer))
+   (catch Exception e
+     (.printStackTrace e))))


Refactor 304 response code a bit

Refactor 304 response code a bit


Initial commit of rule to link bio nodes to nil

error: pathspec 'kabob-build/src/main/resources/edu/ucdenver/ccp/kabob/build/rules/post-identifier-merge/step_b-ontology_to_ice/step_b/link_bio_with_nil.clj' did not match any file(s) known to git

--- kabob-build/src/main/resources/edu/ucdenver/ccp/kabob/build/rules/post-identifier-merge/step_b-ontology_to_ice/step_b/link_bio_with_nil.clj
+++ kabob-build/src/main/resources/edu/ucdenver/ccp/kabob/build/rules/post-identifier-merge/step_b-ontology_to_ice/step_b/link_bio_with_nil.clj
@@ -0,0 +1,8 @@
+`{:name "link-bio-with-nil"
+  :description "This link-bio-with-properties rule requires both
+  things being linked to be 'bioentities' and thus this rule excludes
+  links within RDF lists that connect to rdf:nil. This rule fills in
+  those missing links."
+  :head ((?/bio ?/p rdf/nil))
+  :body ((?/c obo/IAO_0000219 ?/bio)
+         (?/c ?/p rdf/nil))}


Add a worksheet to test JLink is operational.

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

--- ws/JLink_test.clj
+++ ws/JLink_test.clj
@@ -0,0 +1,69 @@
+;; gorilla-repl.fileformat = 1
+
+;; **
+;;; # Testing JLink
+;;;
+;;; You can use this worksheet to test whether JLink is set up correctly on your computer.
+;; **
+
+;; @@
+(ns warm-swamp
+  (:require [gorilla-plot.core :as plot])
+  (:import [com.wolfram.jlink]))
+;; @@
+;; =>
+;;; {"type":"html","content":"nil","value":"nil"}
+;; <=
+
+;; @@
+(def kernel (com.wolfram.jlink.MathLinkFactory/createKernelLink "-linkmode launch -linkname \"/Applications/Mathematica.app/Contents/MacOS/MathKernel\""))
+;; @@
+;; =>
+;;; {"type":"html","content":"#'warm-swamp/kernel","value":"#'warm-swamp/kernel"}
+;; <=
+
+;; @@
+(.waitForAnswer kernel)
+;; @@
+;; =>
+;;; {"type":"html","content":"8","value":"8"}
+;; <=
+
+;; @@
+(.getString kernel)
+;; @@
+;; =>
+;;; {"type":"html","content":""In[1]:= "","value":"\"In[1]:= \""}
+;; <=
+
+;; @@
+(.evaluate kernel "1 + 1")
+;; @@
+;; =>
+;;; {"type":"html","content":"nil","value":"nil"}
+;; <=
+
+;; @@
+(.waitForAnswer kernel)
+;; @@
+;; =>
+;;; {"type":"html","content":"3","value":"3"}
+;; <=
+
+;; @@
+(.getString kernel)
+;; @@
+;; =>
+;;; {"type":"html","content":""2"","value":"\"2\""}
+;; <=
+
+;; @@
+(.close kernel)
+;; @@
+;; =>
+;;; {"type":"html","content":"nil","value":"nil"}
+;; <=
+
+;; @@
+
+;; @@


Added 'Add new group' forms onto chapter list page

--- src/hurvinek/html_renderer.clj
+++ src/hurvinek/html_renderer.clj
@@ -258,9 +258,18 @@
                                 [:td [:h4 (:name chapter)]
                                     (for [group (get groups-per-chapter (:id chapter))]
                                         (str "   " (:name group) "
"))
+                                    (form/form-to [:get "add-new-group"]
+                                        (form/hidden-field "product-id" product-id)
+                                        (form/hidden-field "chapter-id" (:id chapter))
+                                        (form/hidden-field "back-to" "chapter-list")
+                                    "   "[:input {:type "text" :id "group-name" :name "group-name" :placeholder "group name"}]
+                                                        [:button {:type "submit" :class "btn btn-link"} "Add new group"]
+                                    )
                                 ]
                                 [:td {:style "vertical-align:top"} [:h4 [:a {:href (str "edit-chapter?product-id=" product-id "&chapter-id=" (:id chapter) )} "rename"]]]
-                                [:td {:style "vertical-align:top"} [:h4 [:a {:href (str "chapter?product-id=" product-id "&chapter-id=" (:id chapter))} "group list"]]]])
+                                [:td {:style "vertical-align:top"} [:h4 [:a {:href (str "chapter?product-id=" product-id "&chapter-id=" (:id chapter))} "group list"]]]
+                                [:td {:style "vertical-align:top"}
+                                ]])
                     ]]
                     [:br]
                     [:h3 "New chapter"]


Add unit tests for key functions.

Add unit tests for key functions.

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

--- test/merkle_db/key_test.clj
+++ test/merkle_db/key_test.clj
@@ -0,0 +1,37 @@
+(ns merkle-db.key-test
+  (:require
+    [clojure.test :refer :all]
+    [merkle-db.key :as key])
+  (:import
+    blocks.data.PersistentBytes))
+
+
+(defn ->key
+  "Construct a new `PersistentBytes` value containing the given byte data."
+  [& data]
+  (PersistentBytes/wrap (byte-array data)))
+
+
+(deftest lexicographic-ordering
+  (testing "equal arrays"
+    (is (zero? (key/compare (byte-array 0) (byte-array 0))))
+    (is (zero? (key/compare (byte-array [1 2 3]) (byte-array [1 2 3])))))
+  (testing "equal prefixes"
+    (is (neg? (key/compare (byte-array [1 2 3])
+                           (byte-array [1 2 3 4]))))
+    (is (pos? (key/compare (byte-array [1 2 3 4])
+                           (byte-array [1 2 3])))))
+  (testing "order-before"
+    (is (neg? (key/compare (byte-array [1 2 3])
+                           (byte-array [1 2 4]))))
+    (is (neg? (key/compare (byte-array [1 2 3])
+                           (byte-array [1 3 2]))))
+    (is (neg? (key/compare (byte-array [0 2 3 4])
+                           (byte-array [1 3 2 1]))))
+  (testing "order-after"
+    (is (pos? (key/compare (byte-array [1 2 4])
+                           (byte-array [1 2 3]))))
+    (is (pos? (key/compare (byte-array [1 3 2])
+                           (byte-array [1 2 3]))))
+    (is (pos? (key/compare (byte-array [1 3 2 1])
+                           (byte-array [0 2 3 4])))))))


Fixed tests

Fixed tests


etc.dotfiles: Added lein profiles.clj file to make latest version of Cider work

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/dotfiles.git/'


update docstring

update docstring

fatal: unable to access 'https://github.com/democracyworks/election-notification-works.git/': The requested URL returned error: 403


typo fix

typo fix

fatal: unable to access 'https://github.com/pjagielski/acha.git/': The requested URL returned error: 403


invoke protocol-method w/ type hint

invoke protocol-method w/ type hint

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/transwarp.git/'


Add links to documentation and fix wording here and there

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/manenko/re-widgets.git/'


Removed unused data functions

Removed unused data functions

--- src/clj/clojuredocs/data.clj
+++ src/clj/clojuredocs/data.clj
@@ -1,6 +1,5 @@
 (ns clojuredocs.data
   (:require [somnium.congomongo :as mon]
-            [clojuredocs.schemas :as cds]
             [schema.core :as sc]))

 (defn validate-payload [comp context-name payload]
@@ -29,15 +28,6 @@

 ;; Examples

-(defn insert-example! [payload]
-  (insert! cds/ExampleComp payload))
-
-(defn update-example-where! [where payload]
-  (update-where! cds/ExampleComp where payload))
-
-(defn update-example-by-id! [payload]
-  (update-by-id! cds/ExampleComp payload))
-
 (defn find-examples-for [{:keys [ns name library-url]}]
   (mon/fetch :examples
     :where {:var.name name
@@ -47,9 +37,6 @@

 ;; Notes

-(defn update-note-where! [where payload]
-  (update-where! cds/NoteComp where payload))
-
 (defn find-notes-for [{:keys [ns name library-url]}]
   (mon/fetch :notes
     :where {:var.ns ns :var.name name :var.library-url library-url}
@@ -58,9 +45,6 @@

 ;; See Alsos

-(defn update-see-also-where! [where payload]
-  (update-where! cds/SeeAlsoComp where payload))
-
 (defn find-see-alsos-for [{:keys [ns name library-url]}]
   (->> (mon/fetch-one :see-alsos :where {:var.name name
                                          :var.ns ns


Add JSON-encoding convenience function to public API.

--- src/clojure/abracad/avro.clj
+++ src/clojure/abracad/avro.clj
@@ -195,6 +195,14 @@
   (with-open [out (ByteArrayOutputStream.)]
     (apply encode schema out records)
     (.toByteArray out)))
+
+(defn json-encoded
+  "Return string produced by JSON-encoding `records` with `schema`
+via `encode`."
+  [schema & records]
+  (with-open [out (ByteArrayOutputStream.)]
+    (apply encode schema (json-encoder schema out) records)
+    (String. (.toByteArray out))))

 (defn compare
   "Compare `x` and `y` according to `schema`."


code cleanuup 10,000 :sunglasses:

code cleanuup 10,000 :sunglasses:

--- src/metabase/models/user.clj
+++ src/metabase/models/user.clj
@@ -38,8 +38,8 @@
     (when email
       (assert (u/is-email? email)))
     (cond-> user
-      reset_token (assoc :reset_token (creds/hash-bcrypt reset_token)))
-    )
+      reset_token (assoc :reset_token (creds/hash-bcrypt reset_token))))
+
   (post-select [_ {:keys [first_name last_name], :as user}]
     (cond-> user
       (or first_name last_name) (assoc :common_name (str first_name " " last_name))))


Add thin layer for transit that is aware of java8 Instant times.

error: pathspec 'src/uxbox/util/transit.clj' did not match any file(s) known to git

--- src/uxbox/util/transit.clj
+++ src/uxbox/util/transit.clj
@@ -0,0 +1,17 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
+
+(ns uxbox.util.transit
+  (:require [catacumba.serializers :as sz]
+            [uxbox.util.datetime :as dt]))
+
+(defn decode
+  [data]
+  (sz/decode data :transit+json {:handlers dt/+read-handlers+}))
+
+(defn encode
+  [data]
+  (sz/encode data :transit+json {:handlers dt/+write-handlers+}))


Add problem73.clj

Add problem73.clj

Only slightly faster than 1 minute. Will revisit.

error: pathspec 'euler_clojure/src/euler/problem73.clj' did not match any file(s) known to git

--- euler_clojure/src/euler/problem73.clj
+++ euler_clojure/src/euler/problem73.clj
@@ -0,0 +1,23 @@
+(ns euler.problem73
+  "https://projecteuler.net/problem=73
+
+  Consider the fraction, n/d, where n and d are positive integers. If n<d and
+  HCF(n,d)=1, it is called a reduced proper fraction.
+
+  If we list the set of reduced proper fractions for d ≤ 8 in ascending order
+  of size, we get:
+
+  1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
+
+  It can be seen that there are 3 fractions between 1/3 and 1/2.
+
+  How many fractions lie between 1/3 and 1/2 in the sorted set of reduced
+  proper fractions for d ≤ 12,000?"
+  (:require [euler.toolset :refer [gcd]]))
+
+(defn problem73 []
+  (reduce + (for [d (range 1 (inc 12000))
+                  n (range 1 d)
+                  :when (and (< 1/3 (/ n d) 1/2)
+                             (= 1 (gcd n d)))]
+              1)))


Correct comment

Correct comment

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/ducky427/re-frame.git/'


[WM] send user command msgs outside go blocks

This means the message will be on its way already while the go block is
parking the thread to wait for the response to come down the response
channel. The way it was before we were making the go thread kick off the
message send and then re-park to wait for the response. H/T to Eric for
the suggestion.

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/user-http-api.git/'


Associate API hits w/ 3scale endpoint names

This will be important as we add more than one API endpoint that uses 3scale for authn/z.

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/'


Add datomic namespace

Add datomic namespace

Used for loading data into datomic, particularly in dev

error: pathspec 'env/dev/clj/gtfve/datomic.clj' did not match any file(s) known to git

--- env/dev/clj/gtfve/datomic.clj
+++ env/dev/clj/gtfve/datomic.clj
@@ -0,0 +1,222 @@
+(ns gtfve.datomic
+  (:import datomic.Peer)
+  (:require [clojure.string :as string :refer [split join trim]]
+            [clojure.pprint :as pp :refer [pprint]]
+            [clj-time.format :as tf]
+            [clj-time.coerce :refer [to-date]]
+            [clojure.instant :as instant :refer [read-instant-date]]
+            [datomic.api :as d]
+            [clojure.java.io :as io]
+            [clojure-csv.core :as csv]))
+
+;; Datomic ;;
+;;;;;;;;;;;;;
+
+(def uri "datomic:dev://localhost:4334/sakay")
+
+(def feed "resources/public/gtfs/")
+
+(def conn (d/connect uri))
+
+(defn load-schema! []
+  (d/transact conn (read-string (slurp "resources/gtfs-schema.edn"))))
+
+;; Utilities ;;
+;;;;;;;;;;;;;;;
+
+(defn- drop-empty [hmap]
+  (->> hmap
+       (filter (fn [[_ v]]
+                 (try
+                   (not (empty? v))
+                   (catch IllegalArgumentException e
+                     true))))
+       (into {})))
+
+(defn- assoc-temp-id [m]
+  (assoc m :db/id (d/tempid :db.part/user)))
+
+(defn csv->map
+  "Create a transaction from csv found in path. header-map is a map of strings
+  to keywords defining column to keyword mappings for the generated transaction
+  map. transform-vals is a map of keywords to functions defining function
+  transformations on values in the generated transaction map.
+
+  a,b,c  -> {:a 1 :b 2 :c 3}
+  1,2,3"
+  [header-map val-transforms path]
+  (let [[headers & body] (csv/parse-csv (slurp path))
+        header-keys (map #(header-map %) headers)]
+    (letfn [(zipheaders [header]
+              (zipmap header-keys header))
+            (transform-vals [row]
+              (reduce (fn [acc [k v]]
+                        (if-let [f (val-transforms k)]
+                          (assoc acc k (f v))
+                          (assoc acc k v)))
+                      {} row))]
+      (->> body
+           (map zipheaders)
+           (map transform-vals)
+           (map drop-empty)))))
+
+;; Agency ;;
+;;;;;;;;;;;;
+
+(def agency-header-keys
+  {"agency_id" :agency/id
+   "agency_name" :agency/name
+   "agency_url" :agency/url
+   "agency_timezone" :agency/timezone
+   "agency_lang" :agency/lang
+   "agency_phone" :agency/phone})
+
+(defn load-agency! [path conn]
+  (->> path
+       (csv->map agency-header-keys {})
+       (d/transact conn)))
+
+;; Routes ;;
+;;;;;;;;;;;;
+
+(def routes-header-keys
+  {"agency_id" :route/agency
+   "route_short_name" :route/short-name
+   "route_long_name" :route/long-name
+   "route_desc" :route/description
+   "route_type" :route/type
+   "route_url" :route/url
+   "route_color" :route/color
+   "route_text_color" :route/text-color
+   "route_id" :route/id})
+
+(def routes-val-transforms
+  {:route/agency #(vector :agency/id %)})
+
+(defn load-routes! [path conn]
+  (d/transact conn (csv->map routes-header-keys routes-val-transforms path)))
+
+;; Stops ;;
+;;;;;;;;;;;
+
+(def stops-header-keys
+  {"stop_id" :stop/id
+   "stop_code" :stop/code
+   "stop_name" :stop/name
+   "stop_desc" :stop/description
+   "stop_lat" :stop/latitude
+   "stop_lon" :stop/longitude
+   "zone_id" :stop/zone-id ; TODO: not yet implemented fare_rules for this ref
+   "stop_url" :stop/url
+   "location_type" :stop/location-type
+   "parent_station" :stop/parent-station
+   "wheelchair_boarding" :stop/wheelchair-boarding})
+
+(def stops-val-transforms
+  {:stop/latitude (comp double read-string)
+   :stop/longitude (comp double read-string)
+   :stop/wheelchair-boarding read-string
+   :stop/location-type read-string})
+
+(defn load-stops! [path conn]
+  (d/transact conn (csv->map stops-header-keys stops-val-transforms path)))
+
+;; Calendar ;;
+;;;;;;;;;;;;;;
+
+(def calendar-days
+  [:calendar.day/monday :calendar.day/tuesday
+   :calendar.day/wednesday :calendar.day/thursday
+   :calendar.day/friday :calendar.day/saturday
+   :calendar.day/sunday])
+
+(def calendar-header-keys
+  {"service_id" :service/id
+   "monday" :calendar.day/monday
+   "tuesday" :calendar.day/tuesday
+   "wednesday" :calendar.day/wednesday
+   "thursday" :calendar.day/thursday
+   "friday" :calendar.day/friday
+   "saturday" :calendar.day/saturday
+   "sunday" :calendar.day/sunday
+   "start_date" :service/start-date
+   "end_date" :service/end-date})
+
+(def ^:dynamic *service-date-formatter* (tf/formatter "yyyyMMdd"))
+
+(def calendar-val-transforms
+  (merge
+   {:service/start-date #(to-date (tf/parse *service-date-formatter* %))
+    :service/end-date #(to-date (tf/parse *service-date-formatter* %))}
+   (into {} (for [d calendar-days]
+              [d (partial read-string)]))))
+
+(defn- process-calendar-map [days m]
+  (let [schedule (select-keys m days)
+        agg (->> schedule
+                 (filter (fn [[_ bool]] (not (zero? bool))))
+                 (keys)
+                 (into []))]
+    (merge
+     (apply dissoc m (keys schedule))
+     {:service/days agg})))
+
+(defn load-calendar! [path conn]
+  (->> path
+       (csv->map calendar-header-keys calendar-val-transforms)
+       (map (partial process-calendar-map calendar-days))
+       (map drop-empty)
+       (d/transact conn)))
+
+;; Shapes ;;
+;;;;;;;;;;;;
+
+(def shapes-header-keys
+  {"shape_id" :shape/id
+   "shape_pt_sequence" :shape.point/sequence
+   "shape_dist_traveled" :shape.point/distance-traveled
+   "shape_pt_lat" :shape.point/latitude
+   "shape_pt_lon" :shape.point/longitude})
+
+(def shapes-val-transforms
+  {:shape/id (fn [x] nil)
+   :shape.point/sequence read-string
+   :shape/distance-traveled (comp double read-string)
+   :shape.point/latitude (comp double read-string)
+   :shape.point/longitude (comp double read-string)})
+
+(defn load-shapes! [path conn]
+  (csv->map shapes-header-keys
+          shapes-val-transforms
+          path))
+
+;; Frequencies ;;
+;;;;;;;;;;;;;;;;;
+
+(def frequencies-header-keys
+  {"trip_id" :delete/trip/id
+   "start_time" :trip.frequency/start-time
+   "end_time" :trip.frequency/end-time
+   "headway_secs" :trip.frequency/headway-seconds
+   "exact_times" :trip.frequency/exact-times?})
+
+(def frequencies-val-transforms
+  {:delete/trip/id (fn [x] nil)
+   :trip.frequency/headway-seconds read-string
+   :trip.frequency/exact-times? (comp not zero? read-string)})
+
+(defn load-frequencies! [path conn]
+  (d/transact conn (csv->map frequencies-header-keys
+                           frequencies-val-transforms
+                           path)))
+
+;; Main ;;
+;;;;;;;;;;
+
+(defn load-feed! [path conn]
+  (load-agency! (str path "agency.txt") conn)
+  (load-routes! (str path "routes.txt") conn)
+  (load-stops! (str path "stops.txt") conn)
+  (load-calendar! (str path "calendar.txt") conn)
+  (load-shapes! (str path "shapes.txt"))
+  (load-frequencies! (str path "frequencies.txt") conn))


Switch back to indicating the highlighted train through the state.

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/cstorey/nrod.git/'


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

--- src/clj/playground/expander.clj
+++ src/clj/playground/expander.clj
@@ -0,0 +1,36 @@
+(defn
+ seq-avg
+ "Gets the average of collection"
+ [s]
+ (/ (reduce + s) (count s)))
+
+(defn
+ simple-expander
+ "Expands sequence by inserting new values between each existing element.
+  These values are the average of the two values on either side of the
+  insertion point.
+
+  Ex.: (simple-expander (range 5))
+  => (0 0.5 1 1.5 2 2.5 3 3.5 4)
+
+  "
+  [s]
+  (cond
+      (empty? s) '[]
+      :else
+          (cons
+              (first s)
+              (cond
+                  (= (count s) 1) (rest s)
+                  :else
+                     (cons (/ (+ (first s) (second s)) 2.)
+                           (simple-expander (rest s)))))))
+
+
+(defn
+  expander
+  "Same as simple-expander, except that the interpolation function can be
+   customized (defaults to average) and the size of the interpolation window
+   can be arbitrarily large (defaults to 1 element on either side of insertion
+   point."
+  [s n :or [1] f :or [seq-avg] window :or [1]])


changed deploy json for the project aim microservice

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/meandor/aim-pipeline.git/'


Fixed level check.

Fixed level check.

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/'


cleanup dox

cleanup dox

--- src/metabase/api/common.clj
+++ src/metabase/api/common.clj
@@ -180,9 +180,9 @@
    Dispatches on the arg annotation as a keyword, and is also passed the symbol
    of the argument that should be checked.

-    (defendpoint GET ... [id] {id required})
-
-     -> (let [id ~(arg-annotation-fn :required id)]
+    (defendpoint GET ... [id] {id Required})
+
+     -> (let [id ~(arg-annotation-fn :Required id)]
            ...)

      -> (let [id (do (require-params id) id)]


formatting fix.

formatting fix.

--- src/metabase/api/routes.clj
+++ src/metabase/api/routes.clj
@@ -36,8 +36,8 @@
   (context "/field"        [] (+auth field/routes))
   (context "/foreignkey"   [] (+auth fk/routes))
   (GET     "/health"       [] (if ((resolve 'metabase.core/initialized?))
-                                         {:status 200 :body {:status "ok"}}
-                                         {:status 503 :body {:status "initializing" :progress ((resolve 'metabase.core/initialization-progress))}}))
+                                {:status 200 :body {:status "ok"}}
+                                {:status 503 :body {:status "initializing" :progress ((resolve 'metabase.core/initialization-progress))}}))
   (context "/notify"       [] (+apikey notify/routes))
   (context "/revision"     [] (+auth revision/routes))
   (context "/session"      [] session/routes)


Add beginnings of system-cached asset management system.

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

--- src/overtone/libs/asset.clj
+++ src/overtone/libs/asset.clj
@@ -0,0 +1,79 @@
+(ns
+    ^{:doc "A simple local file system-cached asset management system. Assets
+           are specified as URLs which are then cached by being copied to a
+           centralised place in the file system if not already there. This
+           allows assets to be shared by multiple projects without needing to
+           duplicate them"
+      :author "Sam Aaron"}
+  overtone.libs.asset
+  (:import [java.io File])
+  (:use [clojure.string :only [split]]
+        [overtone.helpers.file]
+        [overtone.config.store :only [OVERTONE-DIRS]]))
+
+(def ^{:dynamic true} *cache-root* (:assets OVERTONE-DIRS))
+
+(defn safe-url
+  "Replace all non a-z A-Z 0-9 - chars in stringified version of url with _"
+  [url]
+  (let [url  (str url)
+        safe (.replaceAll url "http://" "")
+        safe (.replaceAll safe "https://" "")
+        safe (.replaceAll safe "/" "-")
+        safe (.replaceAll safe "[^a-zA-Z0-9-.]" "")]
+    safe))
+
+(defn url-hash
+  "Return a hash for stringified version of url"
+  [url]
+  (let [url (str url)]
+    (str (hash url))))
+
+(defn cache-dir
+  "Returns the name of a directory to cache an asset with the given url."
+  [url]
+  (let [safe (safe-url url)
+        hsh  (url-hash url)]
+    (mk-path *cache-root* (str safe "--" hsh))))
+
+(defn mk-cache-dir!
+  "Create a new cache dir for the specified url"
+  [url]
+  (let [dir (cache-dir url)]
+    (mkdir! dir)))
+
+(defn fetch-cached-path
+  "Returns the path to the cached asset if present, otherwise nil."
+  [url name]
+  (let [path (mk-path (cache-dir url) name)]
+    (when (path-exists? path)
+      path)))
+
+(defn download-and-cache-asset
+  "Downloads the file pointed to by url and caches it on the local file system"
+  [url name]
+  (let [tmp-dir   (str (mk-tmp-dir!))
+        tmp-file  (mk-path tmp-dir name)
+        dest-dir  (cache-dir url)
+        dest-file (mk-path dest-dir name)]
+    (mk-cache-dir! url)
+    (download-file url tmp-file)
+    (mv! tmp-file dest-file )
+    (rm-rf! tmp-dir)
+    dest-file))
+
+(defn asset-seq
+  "Returns a seq of asset names for a specific url"
+  [url]
+  (let [dir (cache-dir url)
+        dir (File. dir)]
+    (ls-names dir)))
+
+(defn asset
+  "Given a url will return a path to a copy of the asset on the local file
+  system. Will download and persist the asset if necessary."
+  ([url] (asset url (last (split url #"/"))))
+  ([url name]
+     (if-let [path (fetch-cached-path url name)]
+       path
+       (download-and-cache-asset url name))))


initial commit

initial commit

error: pathspec 'src/babel/francais/qa.clj' did not match any file(s) known to git

--- src/babel/francais/qa.clj
+++ src/babel/francais/qa.clj
@@ -0,0 +1,69 @@
+(ns babel.francais.qa
+  (:refer-clojure :exclude [get-in])
+  (:require
+   [babel.francais.grammar :refer [small medium]]
+   [babel.francais.workbook :refer [analyze generate parse]]
+   [babel.engine :as engine]
+   [babel.korma :as korma]
+   [babel.francais.morphology :refer [fo]]
+   [babel.parse :as parse]
+   [clojure.string :as string]
+   [clojure.tools.logging :as log]
+   [dag_unify.core :as unify :refer [deserialize get-in ref? strip-refs unify]]
+   [korma.core :as db]))
+
+;; DELETE FROM expression WHERE id IN (SELECT id FROM (SELECT id,surface FROM expression WHERE language='fr' AND structure->'synsem'->'sem'->'subj'->>'pred' = 'Juan') AS foo);
+
+(def total-errors (atom 0))
+(def total (atom 0))
+
+(defn read-expressions [this-many]
+  (let [this-many (if this-many (Integer. this-many))
+        results (db/exec-raw [(str "SELECT target.serialized::text AS target,target.surface
+                                      FROM expression AS target
+                                     WHERE target.language=?
+                                  ORDER BY target.surface")
+                              ["fr"]]
+                             :results)]
+    (count
+     (map (fn [result]
+            (let [structure (deserialize (read-string (:target result)))
+                  surface (:surface result)]
+              (log/info (str "surface: " surface))
+              (let [parsed (parse surface)]
+                (swap! total (fn [current] (+ 1 current)))
+                (if (= (count parsed) 0)
+                  (do (log/error (str "could not parse: '" surface "' with"
+                                      " root: " (get-in structure [:root :français :français])
+                                      " and tense: " (get-in structure [:synsem :sem :tense])
+                                      " and infl: " (get-in structure [:synsem :infl])))
+                      (let [spec
+                            {:synsem {:infl (get-in structure [:synsem :infl])
+                                      :agr (get-in structure [:synsem :agr])
+                                      :sem {:tense :past
+                                            :subj (get-in structure [:synsem :sem :subj])
+                                            :pred (get-in structure [:synsem :sem :pred])}}
+                             :root {:français {:français (get-in structure [:root :français :français])}}}]
+                        (log/error (str "we think it should be: (" spec "): '"
+                                        (fo (generate spec
+                                                      )
+                                            )
+                                        "'."
+                                        )
+                                   ))
+                      (swap! total-errors (fn [current] (+ 1 current)))
+                      (log/error (str "errors so far: " @total-errors " out of "
+                                      @total "; error rate=" (string/replace (str (/ @total-errors (+ 0.0 @total)) "00")
+                                                                       #"^(....).*" "$1"))))
+                  (log/info (str "parse results: " (count parsed)))))))
+          (if this-many
+            (take this-many results)
+            results)))))
+
+
+
+
+
+
+
+


first integration snippets 2

first integration snippets 2

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/encho/vvento4.git/'


Gurasoak koma bidez gehitzeko aukera

Gurasoak koma bidez gehitzeko aukera

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.bez.git/'


started on duffel.tree.paths, got fill-paths working

error: pathspec 'src/duffel/tree/paths.clj' did not match any file(s) known to git

--- src/duffel/tree/paths.clj
+++ src/duffel/tree/paths.clj
@@ -0,0 +1,66 @@
+(ns duffel.tree.paths
+  "Functions for filling out duffel trees with necessary information and pruning
+  them of unecessary dirs/files/information"
+  (:require [duffel.tree.core :refer [tree-dir-mapreduce
+                                      tree-file-map
+                                      dir-assoc]]))
+
+(defn- try-append-slash
+  "Given a string representing a directory, appends a slash to the string if
+  it's not already there"
+  [dir]
+  (if-not (= (last dir) \/) (str dir "/") dir))
+
+(defn fill-relpaths
+  "Goes through a duffel tree and fills all relative paths for both dir-maps and
+  file-maps"
+  [dtree]
+  (->> dtree
+    (tree-dir-mapreduce
+      (fn [dir-map acc _]
+        (let [rel-path (str acc (dir-map :real-name) "/")]
+          [ (assoc dir-map :rel-path rel-path)
+            rel-path ]))
+      "")
+    (tree-file-map
+      (fn [dir-map file-map]
+        (assoc file-map
+          :rel-path (str (dir-map :rel-path) (file-map :real-name)))))))
+
+(defn fill-abspaths
+  "Goes through a duffel tree and fills all absolute paths for both dir-maps and
+  file-maps. The absolute paths are chrooted such that the root of the tree's
+  abs-path is the given chroot, and all children follow from that"
+  [dtree root]
+  (let [real-root (try-append-slash root)
+        rooted-dtree (dir-assoc dtree :abs-path real-root)]
+    (->> rooted-dtree
+      (tree-dir-mapreduce
+        (fn [dir-map acc _]
+          (let [new-root (or (dir-map :abs-path)
+                             (str acc (dir-map :real-name) "/"))]
+            [ (assoc dir-map :abs-path new-root) new-root ]))
+        "")
+      (tree-file-map
+        (fn [dir-map file-map]
+          (assoc file-map
+            :abs-path (str (dir-map :abs-path) (file-map :real-name))))))))
+
+(defn fill-paths
+  "Goes through a duffel tree and fills all rel and abs paths using
+  fill-relpaths and fill-abspaths. root is passed through to fill-abspaths"
+  [dtree root]
+  (-> dtree
+    (fill-abspaths root)
+    (fill-relpaths)))
+
+(comment
+  (require '[duffel.tree.core :refer :all])
+  (require '[clojure.pprint :refer [pprint]])
+
+  (pprint
+    (fill-relpaths (dir->tree "my-duffel")))
+
+  (pprint
+    (fill-paths (dir->tree "my-duffel") "/tmp/duffel-test"))
+)


Less strict in URL regex.

Less strict in URL regex.

--- src/clojars/promote.clj
+++ src/clojars/promote.clj
@@ -72,7 +72,7 @@
         (check-file pom)

         (check-field info :description (complement empty?))
-        (check-field info :url (partial re-find #"http:"))
+        (check-field info :url #(re-find #"^http" (str %)))
         (check-field info :licenses seq)
         (check-field info :scm identity)


Remove these handlers while I switch to Onyx

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/bsima/aristotl.git/'


Correct precondition check

Correct precondition check

--- Clojure/src/ambly/repl/jsc.clj
+++ Clojure/src/ambly/repl/jsc.clj
@@ -295,7 +295,7 @@
 (defn- umount-webdav
   "Unmounts WebDAV, returning true upon success."
   [webdav-mount-point]
-  {:pre (string? webdav-mount-point)}
+  {:pre [(string? webdav-mount-point)]}
   (or
     (not (.exists (io/file webdav-mount-point)))
     (= 0 (sh 5000 -1 "umount" webdav-mount-point))


lein profiles

lein profiles

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

--- .lein/profiles.clj
+++ .lein/profiles.clj
@@ -0,0 +1,8 @@
+{:user {:plugins [[lein-cloverage                    "1.0.2"]
+                  [lein-fore-prob                    "0.1.2"]
+                  [lein-ancient                      "0.5.4"]
+                  [jonase/eastwood                   "0.1.0"]
+                  [lein-drip                         "0.1.1-SNAPSHOT"]
+                  [com.jakemccrary/lein-test-refresh "0.3.4"]
+                  [lein-pprint                       "1.1.1"]]
+        :signing {:gpg-key "E5B26621"}}}


Cool, time format is now correct.

Cool, time format is now correct.

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/'


test output should really be humane.

test output should really be humane.

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/sw1nn/dotfiles.git/'


Copy scripts/travis/add_github_tag to new 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/Yleisradio/yle-api-template.git/'


Add to-byte-array utility

Add to-byte-array utility

Queue Data needs to be byte-array hence adding this utility

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

--- src/zk_queue/utils.clj
+++ src/zk_queue/utils.clj
@@ -0,0 +1,56 @@
+(ns ^{:doc "Utilities"
+      :author "Kiran Kulkarni <kk@helpshift.com>"}
+  zk-queue.utils
+  (:import java.nio.ByteBuffer))
+
+
+(defprotocol IByteArray
+  (to-byte-array [this]))
+
+
+(extend-protocol IByteArray
+  nil
+  (to-byte-array [x] (byte-array 0))
+
+  java.lang.String
+  (to-byte-array [s] (.getBytes s "utf-8"))
+
+  java.lang.Short
+  (to-byte-array [short-int] (.. (ByteBuffer/allocate 2)
+                                 (putShort short-int)
+                                 array))
+
+  java.lang.Integer
+  (to-byte-array [integer] (.. (ByteBuffer/allocate 4)
+                               (putInt integer)
+                               array))
+
+  java.lang.Long
+  (to-byte-array [long-int] (.. (ByteBuffer/allocate 8)
+                                (putLong long-int)
+                                array))
+
+  java.nio.ByteBuffer
+  (to-byte-array [byte-buffer] (.array byte-buffer))
+
+  clojure.lang.Keyword
+  (to-byte-array [k] (.getBytes (name k) "utf-8"))
+
+  clojure.lang.IPersistentList
+  (to-byte-array [l] (.getBytes (binding [*print-dup* false]
+                                  (pr-str l))
+                                "utf-8"))
+
+  clojure.lang.APersistentVector
+  (to-byte-array [v] (.getBytes (binding [*print-dup* false]
+                                  (pr-str v))
+                                "utf-8"))
+  clojure.lang.APersistentMap
+  (to-byte-array [m] (.getBytes (binding [*print-dup* false]
+                                  (pr-str m))
+                                "utf-8"))
+
+  clojure.lang.APersistentSet
+  (to-byte-array [s] (.getBytes (binding [*print-dup* false]
+                                  (pr-str s))
+                                "utf-8")))


bump versions of global leiningen plugins.


Adding cmr.db migration so access control indexes can be created by the build process.

error: pathspec 'access-control-app/src/cmr/db.clj' did not match any file(s) known to git

--- access-control-app/src/cmr/db.clj
+++ access-control-app/src/cmr/db.clj
@@ -0,0 +1,32 @@
+(ns cmr.db
+  "Entry point for the db (elasticsearch) related operations. Defines a main method that accepts arguments."
+  (:require [cmr.common.log :refer (debug info warn error)]
+            [cmr.access-control.data.access-control-index :as ac-index]
+            [cmr.common-app.services.search.elastic-search-index :as search-index]
+            [cmr.elastic-utils.config :as es-config]
+            [cmr.common.lifecycle :as l])
+  (:gen-class))
+
+(defn migrate
+  []
+  (let [elastic-store (l/start (search-index/create-elastic-search-index) nil)]
+    (ac-index/create-index-or-update-mappings elastic-store)))
+
+(defn -main
+  "Execute the given database operation specified by input arguments."
+  [& args]
+  (info "Running " args)
+  (let [op (first args)]
+    (try
+      (cond
+        (= "migrate" op)
+        (migrate)
+
+        :else
+        (info "Unsupported operation: " op))
+
+      (catch Throwable e
+        (error e (.getMessage e))
+        (System/exit 1))))
+
+  (System/exit 0))


remove merge artifact

remove merge artifact

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/'


Add garden style generation with few background colors

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

--- src/styles/sidequarter_frontend/styles.clj
+++ src/styles/sidequarter_frontend/styles.clj
@@ -0,0 +1,19 @@
+(ns sidequarter-frontend.styles
+  (:require [garden.def :refer [defstylesheet defstyles defrule]]
+            [garden.units :refer [px]]))
+
+(defrule horizontal-list :ul.h-list)
+
+(defstyles screen
+  (horizontal-list
+   {:list-style-type "none"
+    :margin 0
+    :padding 0}
+   [:li
+    {:display "inline"
+     :margin-right (px 10)}])
+  [[:body
+    {:background-color "#00bcd4"}]
+   [:.sidekiq-list
+    [:.sidekiq
+     {:background-color "#fff"}]]])