move dev-only stuff to :dev

move dev-only stuff to :dev

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-;; -*- comment-column: 65; -*-
+;; -*- comment-column: 66; -*-
 ;; full set of options are here .. https://github.com/technomancy/leiningen/blob/master/sample.project.clj

 (defproject metabase "metabase-0.1.0-SNAPSHOT"
@@ -6,46 +6,40 @@
   :url "http://metabase.com/"
   :min-lein-version "2.3.0"
   :dependencies [[org.clojure/clojure "1.6.0"]
-                 [org.clojure/core.async "LATEST"]               ; facilities for async programming + communication (using 'LATEST' because this is an alpha library)
-                 [org.clojure/core.match "0.3.0-alpha4"]         ; optimized pattern matching library for Clojure
-                 [org.clojure/math.numeric-tower "0.0.4"]        ; math functions like `ceil`
-                 [org.clojure/core.memoize "0.5.7"]              ; needed by core.match; has useful FIFO, LRU, etc. caching mechanisms
-                 [org.clojure/data.csv "0.1.2"]                  ; CSV parsing / generation
-                 [org.clojure/data.json "0.2.6"]                 ; JSON parsing / generation
-                 [org.clojure/java.jdbc "0.3.6"]                 ; basic jdbc access from clojure
-                 [org.clojure/tools.logging "0.3.1"]             ; logging framework
-                 [org.clojure/tools.macro "0.1.5"]               ; tools for writing macros
-                 [org.clojure/tools.trace "0.7.8"]               ; "tracing macros/fns to help you see what your code is doing"
-                 [cheshire "5.4.0"]                              ; fast JSON encoding (used by Ring JSON middleware)
-                 [clj-time "0.9.0"]                              ; library for dealing with date/time
-                 [com.cemerick/friend "0.2.1"]                   ; auth library
-                 [com.h2database/h2 "1.4.186"]                   ; embedded SQL database
+                 [org.clojure/core.async "LATEST"]                ; facilities for async programming + communication (using 'LATEST' because this is an alpha library)
+                 [org.clojure/core.match "0.3.0-alpha4"]          ; optimized pattern matching library for Clojure
+                 [org.clojure/math.numeric-tower "0.0.4"]         ; math functions like `ceil`
+                 [org.clojure/core.memoize "0.5.7"]               ; needed by core.match; has useful FIFO, LRU, etc. caching mechanisms
+                 [org.clojure/data.csv "0.1.2"]                   ; CSV parsing / generation
+                 [org.clojure/data.json "0.2.6"]                  ; JSON parsing / generation
+                 [org.clojure/java.jdbc "0.3.6"]                  ; basic jdbc access from clojure
+                 [org.clojure/tools.logging "0.3.1"]              ; logging framework
+                 [org.clojure/tools.macro "0.1.5"]                ; tools for writing macros
+                 [org.clojure/tools.trace "0.7.8"]                ; "tracing macros/fns to help you see what your code is doing"
+                 [cheshire "5.4.0"]                               ; fast JSON encoding (used by Ring JSON middleware)
+                 [clj-time "0.9.0"]                               ; library for dealing with date/time
+                 [com.cemerick/friend "0.2.1"]                    ; auth library
+                 [com.h2database/h2 "1.4.186"]                    ; embedded SQL database
                  [com.mattbertolini/liquibase-slf4j "1.2.1"]
-                 [compojure "1.3.2"]                             ; HTTP Routing library built on Ring
-                 [environ "1.0.0"]                               ; easy environment management
-                 [korma "0.4.0"]                                 ; SQL lib
+                 [compojure "1.3.2"]                              ; HTTP Routing library built on Ring
+                 [environ "1.0.0"]                                ; easy environment management
+                 [korma "0.4.0"]                                  ; SQL lib
                  [log4j/log4j "1.2.17"
                   :exclusions [javax.mail/mail
                                javax.jms/jms
                                com.sun.jdmk/jmxtools
                                com.sun.jmx/jmxri]]
-                 [marginalia "0.8.0"]                            ; for documentation
-                 [medley "0.5.5"]                                ; lightweight lib of useful functions
+                 [medley "0.5.5"]                                 ; lightweight lib of useful functions
                  [org.apache.httpcomponents/httpclient "4.4"]
-                 [org.liquibase/liquibase-core "3.3.2"]          ; migration management (Java lib)
+                 [org.liquibase/liquibase-core "3.3.2"]           ; migration management (Java lib)
                  [org.slf4j/slf4j-log4j12 "1.7.10"]
-                 [org.yaml/snakeyaml "1.15"]                     ; YAML parser (required by liquibase)
-                 [postgresql "9.3-1102.jdbc41"]                  ; Postgres driver
-                 [ring/ring-jetty-adapter "1.3.2"]               ; Ring adapter using Jetty webserver (used to run a Ring server for unit tests)
-                 [ring/ring-json "0.3.1"]                        ; Ring middleware for reading/writing JSON automatically
-                 [swiss-arrows "1.0.0"]]                         ; 'Magic wand' macro -<>, etc.
-  :plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]                 ; Interactive development w/ cider NREPL in Emacs
-            [jonase/eastwood "0.2.1"]                            ; Linting
-            [lein-ancient "0.6.4"]                               ; Check project for outdated dependencies + plugins w/ 'lein ancient'
-            [lein-environ "0.5.0"]                               ; easy access to environment variables
-            [lein-expectations "0.0.7"]                          ; run unit tests with 'lein expectations'
-            [lein-marginalia "LATEST"]                           ; generate documentation with 'lein marg'
-            [lein-ring "0.8.10"]]                                ; start the HTTP server with 'lein ring server'
+                 [org.yaml/snakeyaml "1.15"]                      ; YAML parser (required by liquibase)
+                 [postgresql "9.3-1102.jdbc41"]                   ; Postgres driver
+                 [ring/ring-jetty-adapter "1.3.2"]                ; Ring adapter using Jetty webserver (used to run a Ring server for unit tests)
+                 [ring/ring-json "0.3.1"]                         ; Ring middleware for reading/writing JSON automatically
+                 [swiss-arrows "1.0.0"]]                          ; 'Magic wand' macro -<>, etc.
+  :plugins [[lein-environ "0.5.0"]                                ; easy access to environment variables
+            [lein-ring "0.8.10"]]                                 ; start the HTTP server with 'lein ring server'
   :java-source-paths ["src/java"]
   :main ^:skip-aot metabase.core
   :manifest {"Liquibase-Package" "liquibase.change,liquibase.changelog,liquibase.database,liquibase.parser,liquibase.precondition,liquibase.datatype,liquibase.serializer,liquibase.sqlgenerator,liquibase.executor,liquibase.snapshot,liquibase.logging,liquibase.diff,liquibase.structure,liquibase.structurecompare,liquibase.lockservice,liquibase.sdk,liquibase.ext"}
@@ -55,16 +49,22 @@
          :init metabase.core/init}
   :eastwood {:exclude-namespaces [:test-paths]
              :add-linters [:unused-private-vars]
-             :exclude-linters [:constant-test]}                  ; korma macros generate some formats with if statements that are always logically true or false
-  :profiles {:dev {:dependencies [[clj-http "1.0.1"]             ; HTTP Client
-                                  [expectations "2.0.16"]        ; unit tests
+             :exclude-linters [:constant-test]}                   ; korma macros generate some formats with if statements that are always logically true or false
+  :profiles {:dev {:dependencies [[clj-http "1.0.1"]              ; HTTP Client
+                                  [expectations "2.0.16"]         ; unit tests
+                                  [marginalia "0.8.0"]            ; for documentation
                                   [ring/ring-mock "0.2.0"]]
+                   :plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"] ; Interactive development w/ cider NREPL in Emacs
+                             [jonase/eastwood "0.2.1"]            ; Linting
+                             [lein-ancient "0.6.4"]               ; Check project for outdated dependencies + plugins w/ 'lein ancient'
+                             [lein-expectations "0.0.7"]          ; run unit tests with 'lein expectations'
+                             [lein-marginalia "LATEST"]]          ; generate documentation with 'lein marg'
                    :jvm-opts ["-Dlogfile.path=target/log"
-                              "-Xms1024m"                        ; give JVM a decent heap size to start with
-                              "-Xmx2048m"                        ; hard limit of 2GB so we stop hitting the 4GB container limit on CircleCI
-                              "-XX:PermSize=64m"                 ; start with a little more PermGen space
-                              "-XX:MaxPermSize=128m"             ; a little more headroom for PermGen
-                              "-XX:+CMSClassUnloadingEnabled"    ; let Clojure's dynamically generated temporary classes be GC'ed from PermGen
-                              "-XX:+UseConcMarkSweepGC"]}        ; Concurrent Mark Sweep GC needs to be used for Class Unloading (above)
+                              "-Xms1024m"                         ; give JVM a decent heap size to start with
+                              "-Xmx2048m"                         ; hard limit of 2GB so we stop hitting the 4GB container limit on CircleCI
+                              "-XX:PermSize=64m"                  ; start with a little more PermGen space
+                              "-XX:MaxPermSize=128m"              ; a little more headroom for PermGen
+                              "-XX:+CMSClassUnloadingEnabled"     ; let Clojure's dynamically generated temporary classes be GC'ed from PermGen
+                              "-XX:+UseConcMarkSweepGC"]}         ; Concurrent Mark Sweep GC needs to be used for Class Unloading (above)
              :uberjar {:aot :all
                        :prep-tasks ["npm" "gulp" "javac" "compile"]}})


Version 1.6.3-SNAPSHOT

Version 1.6.3-SNAPSHOT

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


bump version to 3.2.2 (#153)

bump version to 3.2.2 (#153)

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


clojurescript 0.0-2280

clojurescript 0.0-2280

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


Jenkins use a local repository

Jenkins use a local repository

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


Release 0.13.4

Release 0.13.4

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject clojars-web "0.13.3"
+(defproject clojars-web "0.13.4"
   :dependencies [[org.clojure/clojure "1.4.0"]
                  [org.clojure/tools.cli "0.2.1"]
                  [org.apache.maven/maven-model "3.0.4"


Update ring-core 1.6.0-beta6 -> 1.6.3 (#231)

This updates commons-fileupload 1.3.2 -> 1.3.3, alleviating
https://nvd.nist.gov/vuln/detail/CVE-2016-1000031 .

--- project.clj
+++ project.clj
@@ -22,7 +22,7 @@
    [org.clojure/tools.reader "1.0.0-beta4"]
    [potemkin "0.4.3"]
    [prismatic/schema "1.1.3"]
-   [ring/ring-core "1.6.0-beta6"]]
+   [ring/ring-core "1.6.3"]]

   :global-vars {*warn-on-reflection* true}


Version 0.1.8

Version 0.1.8

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


dev dependentziak bereizi

dev dependentziak bereizi

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


clj-librato 0.0.5

clj-librato 0.0.5

--- project.clj
+++ project.clj
@@ -25,7 +25,7 @@
     [org.spootnik/http-kit "2.1.18.1"]
     [clj-http "0.9.1"]
     [cheshire "5.3.1"]
-    [clj-librato "0.0.4"]
+    [clj-librato "0.0.5"]
     [clj-time "0.6.0"]
     [clj-wallhack "1.0.1"]
     [com.boundary/high-scale-lib "1.0.4"]


bump version to 3.2.1

bump version to 3.2.1


Use cljsbuild hooks to put build js file to jar

--- project.clj
+++ project.clj
@@ -49,10 +49,12 @@
     "resources/public/acha.min.js"
     "resources/public/acha.js"
   ]
+  :hooks [leiningen.cljsbuild]
   :cljsbuild {
     :builds [
       { :id "prod"
         :source-paths ["src-cljs"]
+        :jar true
         :compiler {
           :preamble      ["public/md5.js"]
           :output-to     "resources/public/acha.min.js"


bump version to 3.4.2

bump version to 3.4.2


Version 1.14.0

Version 1.14.0


Bump clj-stacktrace for fix in mmcgrana/clj-stacktrace#20

--- project.clj
+++ project.clj
@@ -22,7 +22,7 @@
                   :exclusions [org.clojure/clojure]]
                  [clj-time "0.3.8"]
                  [com.cemerick/friend "0.1.4"]
-                 [clj-stacktrace "0.2.5"]
+                 [clj-stacktrace "0.2.6"]
                  [ring-anti-forgery "0.2.1"]
                  [valip "0.2.0"]
                  [clucy "0.3.0"]


Upgrade aero

Upgrade aero

--- project.clj
+++ project.clj
@@ -77,7 +77,7 @@
           [markdown-clj "0.9.62"]
           [ring-mock "0.1.5"]

-          [aero "0.1.4"]
+          [aero "0.1.5"]

           [juxt.modular/aleph "0.1.3" :exclusions [manifold aleph]]
           [aleph "0.4.1-beta3"]


riemann-clojure-client 0.0.4

riemann-clojure-client 0.0.4

--- project.clj
+++ project.clj
@@ -35,7 +35,7 @@
     [com.boundary/high-scale-lib "1.0.3"]
     [clj-time "0.3.4"]
     [com.draines/postal "1.8.0"]
-    [riemann-clojure-client "0.0.4-SNAPSHOT"]
+    [riemann-clojure-client "0.0.4"]
     [slingshot "0.10.2"]
     [org.slf4j/slf4j-log4j12 "1.6.4"]
     [clj-http "0.4.1"]


latest cljs build

latest cljs build

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

   :dependencies [
     [org.clojure/clojure "1.6.0"]
-    [org.clojure/clojurescript "0.0-2173"] ;; 0.0-2202
+    [org.clojure/clojurescript "0.0-2227"]
   ]
   :cljsbuild {
     :builds [
@@ -24,7 +24,7 @@
   :profiles {
     :dev {
       :plugins [
-        [lein-cljsbuild "1.0.2"] ;; 1.0.3
+        [lein-cljsbuild "1.0.3"]
         [com.cemerick/clojurescript.test "0.3.0"]
       ]
       :cljsbuild {


Added nrepl to ring server

Added nrepl to ring server

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


add main method again

add main method again

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


Panelean sartu

Panelean sartu

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


implementation of table columns that won't explode in large collections

--- src/metabase/driver/mongo.clj
+++ src/metabase/driver/mongo.clj
@@ -24,9 +24,10 @@
   [table]
   (with-mongo-connection [^com.mongodb.DBApiLayer conn @(:db table)]
     (->> (mc/find-maps conn (:name table))
-         (r/map keys)
-         (r/map set)
-         (r/reduce set/union))))
+         (take 10000)                      ; it's probably enough to only consider the first 10,000 docs in the collection instead of iterating over potentially millions of them
+         (map keys)
+         (map set)
+         (reduce set/union))))

 (defn- field->base-type
   "Determine the base type of FIELD in the most ghetto way possible, via `values->base-type`."


Add notes n stuff

Add notes n stuff

error: pathspec 'src/fugue/notes.cljc' did not match any file(s) known to git

--- src/fugue/notes.cljc
+++ src/fugue/notes.cljc
@@ -0,0 +1,39 @@
+(ns fugue.notes)
+
+(def chords
+  {:dim [3]
+   :min [3 4]
+   :dom [4 3 3]
+   :maj [4 3]
+   :aug [4]})
+
+(defn chord [root name]
+  (reductions + root (cycle (chords name))))
+
+(def modes
+  {:maj 0
+   :dor 1
+   :mix 4
+   :min 5})
+
+(defn mode [root name]
+  (reductions + root (drop (modes name) (cycle [2 2 1 2 2 2 1]))))
+
+(def note-names [:c :c# :d :d# :e :f :f# :g :g# :a :a# :b])
+
+(def intervals
+  {:m2 1
+   :M2 2
+   :m3 3
+   :M3 4
+   :P4 5
+   :TT 6
+   :P5 7
+   :m6 8
+   :M6 9
+   :m7 10
+   :M7 11})
+
+(def overtones [0 0 7 0 4 7 10 0 2 4])
+(def undertones [0 0 5 0 8 5 2 0 10 8])
+(def harmonics [0 12 19 24 28 31 34 36 38 40])


XML Schema hierarchy

XML Schema hierarchy

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

--- src/rdf_path_examples/xml_schema.clj
+++ src/rdf_path_examples/xml_schema.clj
@@ -0,0 +1,57 @@
+(ns rdf-path-examples.xml-schema
+  "XML Schema 1.1 built-in datatypes <http://www.w3.org/TR/xmlschema-2/#built-in-datatypes>
+   However, the data types are rooted by xsd:string for the sake of comparison dispatch.")
+
+(derive ::boolean ::string)
+(derive ::base64binary ::string)
+(derive ::hexBinary ::string)
+(derive ::float ::string)
+(derive ::decimal ::string)
+(derive ::double ::string)
+(derive ::anyURI ::string)
+(derive ::QName ::string)
+(derive ::NOTATION ::string)
+(derive ::duration ::string)
+(derive ::dateTime ::string)
+(derive ::time ::string)
+(derive ::date ::string)
+(derive ::gYearMonth ::string)
+(derive ::gYear ::string)
+(derive ::gMonthDay ::string)
+(derive ::gDay ::string)
+(derive ::gMonth ::string)
+(derive ::normalizedString ::string)
+(derive ::token ::normalizedString)
+(derive ::language ::token)
+(derive ::Name ::token)
+(derive ::NMToken ::token)
+(derive ::NCName ::Name)
+(derive ::ID ::NCName)
+(derive ::IDREF ::NCName)
+(derive ::ENTITY ::NCName)
+(derive ::integer ::decimal)
+(derive ::nonPositiveInteger ::integer)
+(derive ::long ::integer)
+(derive ::nonNegativeInteger ::integer)
+(derive ::negativeInteger ::nonPositiveInteger)
+(derive ::int ::long)
+(derive ::short ::int)
+(derive ::byte ::short)
+(derive ::unsignedLong ::nonNegativeInteger)
+(derive ::positiveInteger ::nonNegativeInteger)
+(derive ::unsignedInt ::unsignedLong)
+(derive ::unsignedShort ::unsignedInt)
+(derive ::unsignedByte ::unsignedShort)
+
+(def ordinal-data-types #{::date
+                          ::dateTime
+                          ::decimal
+                          ::double
+                          ::duration
+                          ::float
+                          ::gDay
+                          ::gMonth
+                          ::gMonthDay
+                          ::gYear
+                          ::gYearMonth
+                          ::time})


contains-many? function.

contains-many? function.

--- src/metabase/util.clj
+++ src/metabase/util.clj
@@ -3,6 +3,10 @@
   (:require [medley.core :refer :all]
             [clj-time.format :as time]
             [clj-time.coerce :as coerce]))
+
+
+(defn contains-many? [m & ks]
+  (every? true? (map #(contains? m %) ks)))

 (defn select-non-nil-keys
   "Like `select-keys` but filters out key-value pairs whose value is nil."


Don't log env at startup

Don't log env at startup


New specs

New specs

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


Doh, disposition

Doh, disposition

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


formatter

formatter

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/jchli/jepsen-aurora.git/'


extractor fix

extractor fix

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/kokosro/kokos-crawler.git/'


un-earmuffed vars

un-earmuffed vars

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


Adding a post-process.cljs

Adding a post-process.cljs

error: pathspec 'src/cljs/hatti/ona/post-process.cljs' did not match any file(s) known to git

--- src/cljs/hatti/ona/post-process.cljs
+++ src/cljs/hatti/ona/post-process.cljs
@@ -0,0 +1,121 @@
+(ns hatti.ona.post-process
+  (:require [hatti.utils :refer [url last-url-param format]]
+            [hatti.ona.forms :as forms]
+            [hatti.shared :as shared]))
+
+;; OSM POST-PROCESSING
+
+(defn ona-osm-link
+  [data form]
+  "Given some data in Ona format, builds a data structure that we will use
+   to link osm data to Ona data."
+  (let [osmfields (filter forms/osm? form)]
+    (->> (for [datum data]
+           (for [field osmfields]
+             (let [osmkey (-> field :full-name)
+                   osmdatum (get datum osmkey)
+                   osmid (and osmdatum (re-find #"[0-9]+" osmdatum))]
+               (when osmid
+                 {osmid (merge {:field field}
+                             (select-keys datum #{"_id" "_rank"}))}))))
+         flatten
+         (into {}))))
+
+(defn osm-xml->geojson
+  [osm-xml-string]
+  "Takes OSM XML in string form, and returns cljs geojson."
+  (js->clj (js/osmtogeojson (.parseXML js/jQuery osm-xml-string))
+           :keywordize-keys true))
+
+(defn osm-id->osm-data
+  [data form osm-xml]
+  "Given some data in OSM format, an Ona Form, and osm xml string,
+   return a map from OSM ID to each osm feature. The map contains:
+   :osm-id, :name, :tags from osm xml,
+   :type, :geom from osm feature's geojson equivalent."
+  (let [ona-osm-link (ona-osm-link data form)
+        osmgeo (osm-xml->geojson osm-xml)
+        featureset (osmgeo :features)]
+    (into {}
+          (for [{:keys [type properties geometry] :as feature} featureset]
+            (let [{:keys [type id tags]} properties]
+              {id {:osm-id id
+                   :type type
+                   :geom geometry
+                   :name (:name tags)
+                   :tags tags}})))))
+
+(defn update-app-state-with-osm-data!
+  [form osm-xml]
+  "Given some data post-processed from the ona server (ie, containing _id, _rank),
+   and a string of osm-xml, produce a version with relevant osm data injected in."
+  (let [osm-fields (filter forms/osm? form)]
+    (when-not (empty? osm-fields)
+      (let [data (get-in shared/app-state [:map-page :data])
+            osm-id->osm-data (osm-id->osm-data data form osm-xml)
+            osm-val->osm-id #(re-find #"[0-9]+" %)
+            osm-val->osm-data (fn [osm-val]
+                                (when osm-val
+                                  (osm-id->osm-data
+                                   (osm-val->osm-id osm-val))))
+            updater (fn [osm-key]
+                      (fn [data]
+                        (for [datum data]
+                          (update-in datum [osm-key] osm-val->osm-data))))]
+        (doseq [osm-field osm-fields]
+          (shared/transact-app-data! (updater (:full-name osm-field))))))))
+
+;; IMAGE POST-PROCESSING
+(def ona-base-uri "htts://ona.io/api/v1")
+(defn make-ona-media-url [id fname]
+  (url ona-base-uri "files" (format "%s?filename=%s" id fname)))
+
+(defn url-obj [media-obj]
+  "Calculate full image and thumbnail urls given attachment information."
+  (let [media-id (get media-obj "id")
+        fname (get media-obj "filename")
+        file-url (make-ona-media-url media-id fname)]
+    {:filename fname
+     :download_url file-url
+     :small_download_url (str file-url "&suffix=small")}))
+
+(defn get-attach-map
+  "Helper function for integrate attachments; returns a map from
+   a filename to a `url-obj` (see specs in `url-obj` function)."
+  [record attachments]
+  (let [attachments (or attachments (get record "_attachments"))
+        fnames (map #(-> (get % "filename") last-url-param) attachments)]
+    (zipmap fnames (map url-obj attachments))))
+
+(defn integrate-attachments
+  "Inlines media data from within _attachments into each record."
+  [flat-form data & {:keys [attachments]}]
+  (let [image-fields (filter forms/image? flat-form)]
+    (for [record data]
+      (let [attach-map (get-attach-map record attachments)]
+        (reduce (fn [record img-field]
+                  (update-in record [(:full-name img-field)] attach-map))
+                record
+                image-fields)))))
+
+(defn integrate-attachments-in-repeats
+  "Inlines data from within _attachments into each datapoint within repeats."
+  [flat-form data]
+  (let [repeat-fields (filter forms/repeat? flat-form)
+        integrate (fn [record rpt-field]
+                    (let [key (:full-name rpt-field)]
+                      (assoc record key
+                        (integrate-attachments (:children rpt-field)
+                                               (get record key)
+                                               :attachments
+                                               (get record "_attachments")))))]
+    (for [record data]
+      (reduce integrate record repeat-fields))))
+
+(defn integrate-attachments!
+  [flat-form]
+  "Inlines data from within _atatchments into each record within app-state."
+  (shared/transact-app-data!
+   #(->> %
+         (integrate-attachments flat-form)
+         (integrate-attachments-in-repeats flat-form))))


Remove infof from upload example

Remove infof from upload example

--- src/yada/consume.clj
+++ src/yada/consume.clj
@@ -20,7 +20,7 @@
         (let [niobuf (b/to-byte-buffer buf)]
           (infof "Writing single buffer %s" (.capacity niobuf))
           (.write fc niobuf))
-
+
         (update ctx :count (fnil inc 0)))
       ctx
       (s/batch 100 100 body-stream))
@@ -36,13 +36,13 @@
     (d/chain
      (s/reduce
       (fn [ctx buf]
-        (infof "count is %s" (:count ctx))
+        #_(infof "count is %s" (:count ctx))
         #_(.retain buf)
         (let [niobuf (b/to-byte-buffer buf)]
           #_(infof "Writing single buffer %s, refCnt is %s" (.capacity niobuf) (.refCnt buf))
           (.write fc niobuf))
         #_(.release buf)
-
+
         (update ctx :count (fnil inc 0)))
       ctx
       body-stream)


Update methods.clj

Update methods.clj

Fix fn protocol name

--- src/yada/methods.clj
+++ src/yada/methods.clj
@@ -311,7 +311,7 @@
   (interpret-options-result [f ctx]
     (interpret-options-result (f ctx) ctx))
   nil
-  (interpret-post-result [_ ctx] ctx))
+  (interpret-options-result [_ ctx] ctx))

 (deftype OptionsMethod [])


cache 404 status page

cache 404 status page

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/20centaurifux/my-website.git/'


114 xpath tests added

114 xpath tests added

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

--- test/etaoin/xpath_text.clj
+++ test/etaoin/xpath_text.clj
@@ -0,0 +1,29 @@
+(ns etaoin.xpath-test
+  (:require [clojure.test :refer :all]
+            [etaoin.xpath :as xpath]))
+
+(def xpath-samples
+  [[{:tag :a} ".//a"]
+
+   [{:tag :form :method :GET :class :message :index 5}
+    ".//form[@method=\"GET\"][@class=\"message\"][5]"]
+
+   [{:tag :button :fn/text "Press Me"} ".//button[text()=\"Press Me\"]"]
+
+   [{:fn/has-text "download"} ".//*[contains(text(), \"download\")]"]
+
+   [{:tag :div :fn/has-class "overlay"} ".//div[contains(@class, \"overlay\")]"]
+
+   [{:fn/has-classes [:active :sticky :marked]}
+    ".//*[contains(@class, \"active\")][contains(@class, \"sticky\")][contains(@class, \"marked\")]"]
+
+   [{:tag :input :fn/disabled true} ".//input[@disabled=true()]"]
+
+   [{:tag :input :fn/enabled false} ".//input[@enabled=false()]"]
+
+   ])
+
+(deftest test-xpath-expand
+  (doseq [[q xpath] xpath-samples]
+    (testing (format "XPath %s" q)
+      (is (= (xpath/expand q) xpath)))))


Mild refactor

Mild refactor

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


Saioak proba gehiago

Saioak proba gehiago


First pass of user land testing macros, taken verbatim from @neotyk. All credit to them.

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

--- test/riemann/test/user.clj
+++ test/riemann/test/user.clj
@@ -0,0 +1,36 @@
+(ns riemann.test.user
+  "Userland macros for testing snippets of Riemann config."
+  (:use
+   riemann.streams
+   riemann.client
+   riemann.email
+   riemann.sns
+   [riemann.time :only [unix-time linear-time once! every!]])
+  (:require
+   riemann.streams
+   riemann.config
+   riemann.core
+   riemann.index
+   riemann.query))
+
+(defmacro configure-core [& conf]
+  `(binding [*ns* (find-ns 'riemann.config)]
+    (eval '(do
+              (~'riemann.time/reset-tasks!)
+              (~'clear!)
+              (~'pubsub/sweep! (:pubsub @~'core))
+              (~'logging/init)
+              (~'instrumentation {:enabled? false})
+              (~'periodically-expire)
+              (~'streams ~@conf)
+              (when-let [idx# (:index @~'core)]
+                (~'riemann.index/clear idx#))
+              (~'apply!)))))
+
+(defn stream-events [& events]
+  (doseq [ev events]
+    (riemann.core/stream! @riemann.config/core ev)))
+
+(defn search-index [query]
+  (riemann.index/search (:index @riemann.config/core)
+                        (riemann.query/ast query)))


chore: remove unused code

chore: remove unused code

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


chained list test

chained list test

error: pathspec 'test/morpheus/tests/chained_list.clj' did not match any file(s) known to git

--- test/morpheus/tests/chained_list.clj
+++ test/morpheus/tests/chained_list.clj
@@ -0,0 +1,27 @@
+(ns morpheus.tests.chained-list
+  (:require [midje.sweet :refer :all]
+            [morpheus.tests.server :refer [with-server]]
+            [morpheus.models.vertex.core :refer :all]
+            [morpheus.models.edge.core :refer :all]
+            [morpheus.models.edge.base :as eb]
+            [cluster-connector.utils.for-debug :refer [$ spy]]))
+
+(facts
+  "Chained Edge cid lists"
+  (let [max-list-items eb/max-list-size]
+    (with-server
+      (fact "Create schemas"
+            (new-vertex-group! :item {:body :defined :key-field :name
+                                      :fields [[:name :text]]}) => anything
+            (new-edge-group! :rel {:type :directed :body :simple}) => anything)
+      (fact "Create Vertex"
+            (new-vertex! :item {:name "v1"}) => anything
+            (new-vertex! :item {:name "v2"}) => anything)
+      (let [v1 (vertex-by-key :item "v1")
+            v2 (vertex-by-key :item "v2")]
+        (fact "Create edges that can fit in one list"
+              (apply link-group! v1 :rel (repeat max-list-items v2)))
+        (fact "Check Degree"
+              (degree (reload-vertex v1) :direction :*outbounds*) => max-list-items)
+        (fact "Check list link - single"
+              )))))


use hash set as func

use hash set as func

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


Temporarily add lein-droid fix to repo

Temporarily add lein-droid fix to repo

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


Remove :data from schema validation errors

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


Made the connect button dissappear

Made the connect button dissappear

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


refactoring

refactoring

error: pathspec 'src/fogus/me/provide.clj' did not match any file(s) known to git

--- src/fogus/me/provide.clj
+++ src/fogus/me/provide.clj
@@ -0,0 +1,50 @@
+(ns fogus.me.provide)
+
+(defn keys-apply [f ks m]
+  "Takes a function, a set of keys, and a map and applies the function
+   to the map on the given keys.  A new map of the results of the function
+   applied to the keyed entries is returned."
+  (let [only (select-keys m ks)]
+    (zipmap (keys only) (map f (vals only)))))
+
+(defn manip-map [f ks m]
+  "Takes a function, a set of keys, and a map and applies the function
+   to the map on the given keys.  A modified version of the original map
+   is returned with the results of the function applied to each keyed entry."
+  (conj m (keys-apply f ks m)))
+
+(def tests [
+            '([n] [pos? number? => pos? number?])
+            '([a b] [(every? number? [a b]) => pos?])
+
+            '([n] [pos? number?])
+            '([a b] [(every? number? [a b]) => pos?])
+
+            '([n] [=> [pos?]])
+            '([a b] [(every? number? [a b]) => pos?])
+
+            '([n] [=> [pos?]])
+
+            '([n] [number? => pos?])
+
+            '([n] [pos?])])
+
+(defn build-pre-post [cnstr]
+  (let [[L M R] (partition-by #{'=>} cnstr)]
+    {:pre  (when (not= L '(=>)) L)
+     :post (if (= L '(=>)) M R)}))
+
+(defn funcify [args cnstr]
+  (vec (map (fn [e]
+              (if (symbol? e)
+                (list* e args)
+                e))
+            cnstr)))
+
+(defn build-map [args cnstr]
+  [args
+   (manip-map (partial funcify args)
+              [:pre :post]
+              (build-pre-post cnstr))])
+
+(map (fn [[a c]] (build-map a c)) (take 2 tests))


Create fi.cljs

Create fi.cljs

Need to check the translations in the app later on.

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

--- src/status_im/translations/fi.cljs
+++ src/status_im/translations/fi.cljs
@@ -0,0 +1,314 @@
+(ns status-im.translations.fi)
+
+(def translations
+  {
+   ;common
+   :members-title                         "Jäsenet"
+   :not-implemented                       "!ei toteutettu"
+   :chat-name                             "Keskustelun nimi"
+   :notifications-title                   "Ilmoitukset ja äänet"
+   :offline                               "Poissa"
+   :search-for                            "Etsi..."
+   :cancel                                "Peruuta"
+   :next                                  "Seuraava"
+   :type-a-message                        "Kirjoita viesti..."
+   :type-a-command                        "Aloita komennon kirjoittaminen..."
+   :error                                 "Virhe"
+
+   :camera-access-error                   "Myöntääksesi vaadittu kameran käyttölupa, siirry järjestelmäasetuksiin ja varmista, että Status > Kamera on valittu."
+   :photos-access-error                   "Myöntääksesi vaadittu kuvien käyttölupa, siirry järjestelmäasetuksiin ja varmista, että Status > Kuvat on valittu."
+
+   ;drawer
+   :invite-friends                        "Kutsu ystäviä"
+   :faq                                   "UKK"
+   :switch-users                          "Vaihda käyttäjää"
+   :feedback                              "Anna palautetta?\nRavista puhelintasi!"
+   :view-all                              "Näytä kaikki"
+   :current-network                       "Nykyinen verkko"
+
+   ;chat
+   :is-typing                             "kirjoittaa"
+   :and-you                               "ja sinä"
+   :search-chat                           "Etsi keskustelusta"
+   :members                               {:one   "1 käyttäjä"
+                                           :other "{{count}} käyttäjää"
+                                           :zero  "ei käyttäjiä"}
+   :members-active                        {:one   "1 käyttäjä"
+                                           :other "{{count}} käyttäjää"
+                                           :zero  "ei käyttäjiä"}
+   :public-group-status                   "Julkinen"
+   :active-online                         "Linjalla"
+   :active-unknown                        "Ei tiedossa"
+   :available                             "Saatavilla"
+   :no-messages                           "Ei viestejä"
+   :suggestions-requests                  "Pyynnöt"
+   :suggestions-commands                  "Komennot"
+   :faucet-success                        "Faucet pyyntö vastaanotettu"
+   :faucet-error                          "Faucet pyyntö virhe"
+
+   ;sync
+   :sync-in-progress                      "Synkronoidaan..."
+   :sync-synced                           "Synkronoitu"
+
+   ;messages
+   :status-sending                        "Lähetetään"
+   :status-pending                        "Odottaa"
+   :status-sent                           "Lähetetty"
+   :status-seen-by-everyone               "Kaikki nähneet"
+   :status-seen                           "Nähty"
+   :status-delivered                      "Toimitettu"
+   :status-failed                         "Epäonnistui"
+
+   ;datetime
+   :datetime-ago-format                   "{{number}} {{time-intervals}} {{ago}}"
+   :datetime-second                       {:one   "sekunti"
+                                           :other "sekuntia"}
+   :datetime-minute                       {:one   "minuutti"
+                                           :other "minuuttia"}
+   :datetime-hour                         {:one   "tunti"
+                                           :other "tuntia"}
+   :datetime-day                          {:one   "päivä"
+                                           :other "päivää"}
+   :datetime-multiple                     "s"
+   :datetime-ago                          "sitten"
+   :datetime-yesterday                    "eilen"
+   :datetime-today                        "tänään"
+
+   ;profile
+   :profile                               "Profiili"
+   :edit-profile                          "Muokkaa profiilia"
+   :report-user                           "ILMIANNA KÄYTTÄJÄ"
+   :message                               "Viesti"
+   :username                              "Käyttäjätunnus"
+   :not-specified                         "Ei määritelty"
+   :public-key                            "Julkinen avain"
+   :phone-number                          "Puhelinnumero"
+   :email                                 "Sähköposti"
+   :update-status                         "Päivitä tila..."
+   :add-a-status                          "Lisää tila..."
+   :status-prompt                         "Luo tila, jonka avulla ihmiset tietävät mitä asioita tarjoat. Voit myös käyttää #hashtag-merkintöjä."
+   :add-to-contacts                       "Lisää kontakteihin"
+   :in-contacts                           "Kontakteissa"
+   :remove-from-contacts                  "Poista kontakteista"
+   :start-conversation                    "Aloita keskustelu"
+   :send-transaction                      "Lähetä tapahtuma"
+   :share-qr                              "Jaa QR koodi"
+   :error-incorrect-name                  "Ole hyvä ja valitse toinen nimi"
+   :error-incorrect-email                 "Virheellinen sähköposti"
+
+   ;;make_photo
+   :image-source-title                    "Profiilikuva"
+   :image-source-make-photo               "Kuvakaappaus"
+   :image-source-gallery                  "Valitse galleriasta"
+   :image-source-cancel                   "Peruuta"
+
+   ;;sharing
+   :sharing-copy-to-clipboard             "Kopioi leikepöydälle"
+   :sharing-share                         "Jaa..."
+   :sharing-cancel                        "Peruuta"
+
+   :browsing-title                        "Selaa"
+   :browsing-browse                       "@selaa"
+   :browsing-open-in-web-browser          "Avaa selaimessa"
+   :browsing-cancel                       "Peruuta"
+
+   ;sign-up
+   :contacts-syncronized                  "Yhteystietosi ovat synkronoitu"
+   :confirmation-code                     (str "Kiitos! Olemme lähettäneet sinulle tekstiviestin, jossa on vahvistus "
+                                               "koodi. Ole hyvä ja anna koodi vahvistaaksesi puhelinnumerosi")
+   :incorrect-code                        (str "Virheellinen koodi, ole hyvä ja yritä uudelleen")
+   :generate-passphrase                   (str "Luon sinulle tunnuslauseen, jotta voit palauttaa sinun "
+                                               "pääsysi tai kirjautua toisesta laitteesta")
+   :phew-here-is-your-passphrase          "*Phew* se oli vaikeaa, tässä on tunnuslauseesi, *kirjoita tämä ylös ja pidä tallessa!* Tarvitset sitä palauttaaksesi tilisi."
+   :here-is-your-passphrase               "Tässä on tunnuslauseesi, *kirjoita tämä ylös ja pidä tallessa!* Tarvitset sitä palauttaaksesi tilisi."
+   :written-down                          "Varmista, että olet tarkasti kirjoittanut sen talteen"
+   :phone-number-required                 "Napauta tähän syöttääksesi puhelinnumerosi niin löydän ystäväsi"
+   :shake-your-phone                      "Löysitkö vian tai onko sinulla ehdotus? Ravista puhelintasi!"
+   :intro-status                          "Keskustele kanssani määrittääksesi tai muuttaaksesi tilisi asetuksia!"
+   :intro-message1                        "Tervetuloa Statukseen\nNapauta tätä viestiä asettaaksesi salasanasi ja alkuun pääsemiseksi!"
+   :account-generation-message            "Ole hyvä ja odota hetki, käynnistän kvanttitietokoneeni tilisi luomiseksi!"
+   :move-to-internal-failure-message      "Meidän on siirrettävä joitain tärkeitä tiedostoja ulkoisesta sisäiseen tallennustilaan. Tätä varten tarvitsemme luvan. Emme tule käyttämään ulkoista tallennustilaa tulevissa versioissa."
+   :debug-enabled                         "Debug-palvelin käynnistetty! Löytääksesi palvelimen suorita samaan verkkoon kuuluvalta tietokoneeltasi *status-dev-cli scan*."
+
+   ;phone types
+   :phone-e164                            "Kansainvälinen 1"
+   :phone-international                   "Kansainvälinen 2"
+   :phone-national                        "Kansallinen"
+   :phone-significant                     "Merkittävä"
+
+   ;chats
+   :chats                                 "Keskustelut"
+   :new-chat                              "Uusi keskustelu"
+   :delete-chat                           "Poista keskustelu"
+   :new-group-chat                        "Uusi ryhmäkeskustelu"
+   :new-public-group-chat                 "Liity julkiseen keskusteluun"
+   :edit-chats                            "Muokkaa keskusteluja"
+   :search-chats                          "Etsi keskusteluja"
+   :empty-topic                           "Tyhjä otsikko"
+   :topic-format                          "Virheellinen muoto [a-z0-9\\-]+"
+   :public-group-topic                    "Otsikko"
+
+   ;discover
+   :discover                              "Löydä"
+   :none                                  "Tyhjä"
+   :search-tags                           "Kirjoita hakutunnisteesi tähän"
+   :popular-tags                          "Suositut tunnisteet"
+   :recent                                "Uusimmat"
+   :no-statuses-discovered                "Ei hakutuloksia"
+   :no-statuses-found                     "Ei hakutuloksia"
+
+   ;settings
+   :settings                              "Asetukset"
+
+   ;contacts
+   :contacts                              "Yhteystiedot"
+   :new-contact                           "Uusi yhteystieto"
+   :delete-contact                        "Poista yhteystieto"
+   :delete-contact-confirmation           "Tämä yhteystieto poistetaan yhteystiedoista"
+   :remove-from-group                     "Poista ryhmästä"
+   :edit-contacts                         "Muokkaa yhteystietoja"
+   :search-contacts                       "Etsi yhteystietoja"
+   :show-all                              "NÄYTÄ KAIKKI"
+   :contacts-group-dapps                  "ÐApps"
+   :contacts-group-people                 "Ihmiset"
+   :contacts-group-new-chat               "Aloita uusi keskustelu"
+   :choose-from-contacts                  "Valitse yhteystiedoista"
+   :no-contacts                           "No contacts yet"
+   :show-qr                               "Näytä QR"
+   :enter-address                         "Syötä osoite"
+   :more                                  "lisää"
+
+   ;group-settings
+   :remove                                "Poista"
+   :save                                  "Tallenna"
+   :delete                                "Poista"
+   :change-color                          "Muuta väriä"
+   :clear-history                         "Tyhjennä historia"
+   :mute-notifications                    "Mykistä ilmoitukset"
+   :leave-chat                            "Poistu keskustelusta"
+   :delete-and-leave                      "Poista ja poistu"
+   :chat-settings                         "Keskustelun asetukset"
+   :edit                                  "Muokkaa"
+   :add-members                           "Lisää käyttäjiä"
+   :blue                                  "Sininen"
+   :purple                                "Violetti"
+   :green                                 "Vihreä"
+   :red                                   "Punainen"
+
+   ;commands
+   :money-command-description             "Lähetä rahaa"
+   :location-command-description          "Lähetä sijainti"
+   :phone-command-description             "Lähetä puhelinnumero"
+   :phone-request-text                    "Puhelinnumero pyyntö"
+   :confirmation-code-command-description "Lähetä vahvistuskoodi"
+   :confirmation-code-request-text        "Vahvistuskoodi pyyntö"
+   :send-command-description              "Lähetä sijainti"
+   :request-command-description           "Lähetä pyyntö"
+   :keypair-password-command-description  ""
+   :help-command-description              "Apua"
+   :request                               "Pyyntö"
+   :chat-send-eth                         "{{amount}} ETH"
+   :chat-send-eth-to                      "{{amount}} ETH käyttäjälle {{chat-name}}"
+   :chat-send-eth-from                    "{{amount}} ETH käyttäjältä {{chat-name}}"
+
+   ;new-group
+   :group-chat-name                       "Keskustelun nimi"
+   :empty-group-chat-name                 "Ole hyvä ja annan nimi"
+   :illegal-group-chat-name               "Ole hyvä ja valitse toinen nimi"
+   :new-group                             "Uusi ryhmä"
+   :reorder-groups                        "Järjestele ryhmät uudelleen"
+   :group-name                            "Ryhmän nimi"
+   :edit-group                            "Muokkaa ryhmää"
+   :delete-group                          "Poista ryhmä"
+   :delete-group-confirmation             "Tämä ryhmä poistetaan ryhmistäsi. Tämä ei vaikuta yhteystietoihin"
+   :delete-group-prompt                   "Tämä ei vaikuta yhteystietoihin"
+   :group-members                         "Ryhmän jäsenet"
+   :contact-s                             {:one   "yhteystieto"
+                                           :other "yhteystietoa"}
+   ;participants
+   :add-participants                      "Lisää Osallistujia"
+   :remove-participants                   "Poista Osallistujia"
+
+   ;protocol
+   :received-invitation                   "poista keskustelukutsu"
+   :removed-from-chat                     "poista itsesi keskustelusta"
+   :left                                  "poistui"
+   :invited                               "kutsuttu"
+   :removed                               "poistettu"
+   :You                                   "Sinä"
+
+   ;new-contact
+   :add-new-contact                       "Lisää uusi yhteystieto"
+   :import-qr                             "Tuo"
+   :scan-qr                               "Skannaa QR"
+   :swow-qr                               "Näytä QR"
+   :name                                  "Nimi"
+   :whisper-identity                      "Whisper Identiteetti"
+   :address-explication                   "Ehkä tässä pitäisi olla jokin teksti, jossa selitetään, mikä osoite on ja mistä etsiä sitä"
+   :enter-valid-address                   "Anna voimassaoleva osoite tai skannaa QR koodi"
+   :enter-valid-public-key                "Anna voimassaoleva julkinen osoite tai skannaa QR koodi"
+   :contact-already-added                 "Tämä yhteystieto on jo lisätty"
+   :can-not-add-yourself                  "Et voi lisätä itseäsi"
+   :unknown-address                       "Tuntematon osoite"
+
+
+   ;login
+   :connect                               "Yhdistä"
+   :address                               "Osoite"
+   :password                              "Salasana"
+   :login                                 "Kirjaudu"
+   :sign-in-to-status                     "Luo Status -tili"
+   :sign-in                               "Luo tili"
+   :wrong-password                        "Väärä salasana"
+
+   ;recover
+   :recover-from-passphrase               "Palauta tunnuslauseella"
+   :recover-explain                       "Ole hyvä ja anna tunnuslause salasanan palauttamiseksi"
+   :passphrase                            "Tunnuslause"
+   :recover                               "Palauta"
+   :enter-valid-passphrase                "Ole hyvä ja syötä tunnuslause"
+   :enter-valid-password                  "Ole hyvä ja anna salasana"
+   :twelve-words-in-correct-order         "12 sanaa oikeassa järjestyksessä"
+
+   ;accounts
+   :recover-access                        "Palauta käyttöoikeus"
+   :add-account                           "Lisää tili"
+   :create-new-account                    "Luo uusi tili"
+
+   ;wallet-qr-code
+   :done                                  "Valmis"
+   :main-wallet                           "Ensisijainen Lompakko"
+
+   ;validation
+   :invalid-phone                         "Virheellinen puhelinnumero"
+   :amount                                "Määrä"
+   :not-enough-eth                        (str "Not enough ETH on balance "
+                                               "({{balance}} ETH)")
+   ;transactions
+   :confirm                               "Vahvista"
+   :confirm-transactions                  {:one   "Vahvista tapahtuma"
+                                           :other "Vahvista {{count}} tapahtumaa"
+                                           :zero  "Ei tapahtumia"}
+   :transactions-confirmed                {:one   "Tapahtuma vahvistettu"
+                                           :other "{{count}} tapahtumaa vahvistettu"
+                                           :zero  "Ei vahvistettuja tapahtumia"}
+   :transaction                           "Tapahtuma"
+   :unsigned-transactions                 "Allekirjoittamattomat tapahtumat"
+   :no-unsigned-transactions              "Ei allekirjoitettuja tapahtumia"
+   :enter-password-transactions           {:one   "Vahvista tapahtuma syöttämällä salasana"
+                                           :other "Vahvista tapahtumat syöttämällä salasana"}
+   :status                                "Tila"
+   :pending-confirmation                  "Odottaa vahvistusta"
+   :recipient                             "Vastaanottaja"
+   :one-more-item                         "One more item"
+   :fee                                   "Kulu"
+   :estimated-fee                         "Arvioitu kulu"
+   :value                                 "Arvo"
+   :to                                    "Vastaanottajalle"
+   :from                                  "Lähettäjältä"
+   :data                                  "Tieto"
+   :got-it                                "Vastaanotettu"
+   :contract-creation                     "Sopimusten Luominen"
+
+   ;:webview
+   :web-view-error                        "oops, virhe"})


shorter running time

shorter running time


Add defn-traced to links

Add defn-traced to links

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


Reid Draper: Use map destructuring instead of (or) and (let).

--- src/riemann/index.clj
+++ src/riemann/index.clj
@@ -41,9 +41,8 @@

   (expire [this]
           (filter
-            (fn [state]
-              (let [ttl (or (:ttl state) (default-ttl))
-                    age (- (unix-time) (:time state))]
+            (fn [{:keys [ttl time] :or {:ttl default-ttl} :as state}]
+              (let [age (- (unix-time) time)]
                 (when (> age ttl)
                   (delete this state)
                   true)))


Byte conversion tools

Byte conversion tools

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

--- src/caesium/bytes_conv.clj
+++ src/caesium/bytes_conv.clj
@@ -0,0 +1,20 @@
+(ns caesium.bytes-conv
+  "Utilities for switching between different byte types"
+  (:require [byte-streams :as bs])
+  (:import [java.nio ByteBuffer]))
+
+(defmacro ->indirect-byte-buf-macro
+  [x]
+  `(bs/convert ~x ByteBuffer {:direct? false}))
+
+(defmacro ->direct-byte-buf-macro
+  [x]
+  `(bs/convert ~x ByteBuffer {:direct? true}))
+
+(defn ->indirect-byte-buf
+  [x]
+  (bs/convert x ByteBuffer {:direct? false}))
+
+(defn ->direct-byte-buf
+  [x]
+  (bs/convert x ByteBuffer {:direct? true}))


formatting

formatting


introduce connections-test

introduce connections-test

error: pathspec 'test/busa_server/core/connections_test.clj' did not match any file(s) known to git

--- test/busa_server/core/connections_test.clj
+++ test/busa_server/core/connections_test.clj
@@ -0,0 +1,10 @@
+(ns busa-server.core.connections-test
+  (:require
+    [midje.sweet :refer :all]
+    [busa-server.core.connections :as connections]
+    [busa-server.model.connection :as connection]))
+
+(fact "should clear all connections"
+  (connections/clear-connections) => anything
+  (provided
+    (connection/delete-all) => anything))


Add stub test

Add stub test

error: pathspec 'test/desdemona/lifecycles/logging_test.clj' did not match any file(s) known to git

--- test/desdemona/lifecycles/logging_test.clj
+++ test/desdemona/lifecycles/logging_test.clj
@@ -0,0 +1,6 @@
+(ns desdemona.lifecycles.logging-test
+  (:require
+   [desdemona.lifecycles.logging :as l]
+   [clojure.test :refer [deftest is]]))
+
+(deftest log-batch-tests)


Remove test debugging printlns

Remove test debugging printlns

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


lock-version callback for LWT optimistic locking

error: pathspec 'src/er_cassandra/model/callbacks/lock_version_callback.clj' did not match any file(s) known to git

--- src/er_cassandra/model/callbacks/lock_version_callback.clj
+++ src/er_cassandra/model/callbacks/lock_version_callback.clj
@@ -0,0 +1,13 @@
+(ns er-cassandra.model.callbacks.lock-version-callback
+  (:require
+   [clj-uuid :as uuid]))
+
+(defn create-lock-version-callback
+  "moves the provided :lock_version to :lock_version_check
+   and creates a new :lock_version uuid... the :lock_version_check
+   value can be used with an LWT for optimistic locking"
+  []
+  (fn [r]
+    (-> r
+        (assoc :lock_version_check (:lock_version r))
+        (assoc :lock_version (uuid/v1)))))


seriously quickchecked base-10kint impl

seriously quickchecked base-10kint impl

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


refactor helpers w.r.t. imported classes


rev cache types and their factories

rev cache types and their factories


Breadcrumb service

Breadcrumb service


Add unit tests for mailgun output

Add unit tests for mailgun output

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

--- test/riemann/mailgun_test.clj
+++ test/riemann/mailgun_test.clj
@@ -0,0 +1,65 @@
+(ns riemann.mailgun-test
+  (:require [riemann.mailgun :as mailgun]
+            [clj-http.client :as client]
+            [clojure.test :refer [deftest testing is are]]))
+
+(defn- mock-post [result-atom email event]
+  (with-redefs [client/post (fn [url opts]
+                              (reset! result-atom
+                                      (merge (:form-params opts)
+                                             {:url url
+                                              :basic-auth (:basic-auth opts)})))]
+    (email event)))
+
+(deftest mailgun-test
+  (let [result-atom (atom {})
+        sandbox "mail.relay"
+        service-key "testkey"
+        recipient "somedude@somewhere.com"
+        default-body-result "At Wed Dec 31 16:02:03 PST 1969\ntest host testservice  (17)\nTags: []\nCustom Attributes: {}\n\n"
+        default-subject-result "test host testservice"
+        event {:service "testservice"
+               :host "test host"
+               :time 123
+               :metric 17}
+        mailer (mailgun/mailgun {:sandbox sandbox
+                                 :service-key service-key})
+        email (mailer recipient)]
+
+    (testing "ensure the data posted to mailgun matches expectations"
+      (mock-post result-atom email event)
+      (are [key result] (= result (key @result-atom))
+           :url (str "https://api.mailgun.net/v2/" sandbox "/messages")
+           :basic-auth ["api" service-key]
+           :from (str "Riemann <riemann@" sandbox ">")
+           :to (list recipient)
+           :subject default-subject-result
+           :text default-body-result))
+
+    (testing "ensure message overrides are used"
+      (let [body-formatter-result "this is the body"
+            body-formatter (fn [_] body-formatter-result)
+            subject-formatter-result "this is the subject"
+            subject-formatter (fn [_] subject-formatter-result)
+            from-override "my-override@xanadu"
+            mailer (mailgun/mailgun {:sandbox sandbox
+                                     :service-key service-key}
+                                    {:subject subject-formatter
+                                     :body body-formatter
+                                     :from from-override})
+            email (mailer recipient)]
+        (mock-post result-atom email event)
+        (are [rkey result] (= result (rkey @result-atom))
+           :subject subject-formatter-result
+           :text body-formatter-result
+           :from from-override)))
+
+    (testing "ensure mailgun options are split out when given only one map"
+      (let [from-override "my-override@xanadu"
+            mailer (mailgun/mailgun {:sandbox sandbox
+                                     :service-key service-key
+                                     :from from-override})
+            email (mailer recipient)]
+        (mock-post result-atom email event)
+        (is (= (:from @result-atom)
+               from-override))))))


Adds Simulant file.

Adds Simulant file.

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

--- test/onyx/coordinator/simulation_tests/coordinator_simulant_tests.clj
+++ test/onyx/coordinator/simulation_tests/coordinator_simulant_tests.clj
@@ -0,0 +1,3 @@
+(ns onyx.coordinator.coordinator-simulant-tests
+  (:require [clojure.test :refer :all]))
+


Added Question test.

Added Question test.

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


Committing my solution

Committing my solution

error: pathspec 'src/clojure_club/x106_number_maze/wmatson.clj' did not match any file(s) known to git

--- src/clojure_club/x106_number_maze/wmatson.clj
+++ src/clojure_club/x106_number_maze/wmatson.clj
@@ -0,0 +1,36 @@
+(def even-operations
+  {:double (partial * 2)
+   :halve #(/ % 2)
+   :plus2 (partial + 2)})
+
+(def odd-operations
+  (dissoc even-operations :halve))
+
+(defn node [num] {:num num :path [[:start num]]})
+
+(defn take-path [node [op-kw op]]
+  (-> node
+    (update :num op)
+    (update :path conj [op-kw (op (:num node))])))
+
+(defn get-ops [node]
+  (if (even? (:num node))
+    even-operations
+    odd-operations))
+
+(defn branch [node]
+  (map (partial take-path node) (get-ops node)))
+
+(defn min-solutions [start finish]
+  (let [branch-seq (iterate (partial mapcat branch) [(node start)])
+        is-solution? (fn [node] (= finish (:num node)))
+        skip-wrong (drop-while #(not-any? is-solution? %) branch-seq)]
+     (filter is-solution? (first skip-wrong))))
+
+(defn min-path-size [start finish]
+  (first (map (comp count :path) (min-solutions start finish))))
+
+;; (min-path-size 9 2)
+;; (map #(map second (:path %)) (min-solutions 9 2))
+;; (min-solutions 9 2)
+;; (clojure.pprint/pprint (min-solutions 9 2))


Adding challenge 2

Adding challenge 2

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

--- day3/challenge2/challenge2.clj
+++ day3/challenge2/challenge2.clj
@@ -0,0 +1,37 @@
+(defn read-file [] (slurp "../day3.txt"))
+(defn split-lines [str] (clojure.string/split str #"\n"))
+
+
+(defn get-numbers [string] (->>
+                            (clojure.string/split string #" ")
+                            (remove #(= % "" ))
+                            (map read-string)
+                            )
+)
+
+(defn make-numbers [strings] (map get-numbers strings))
+
+(defn make-triangles [[[a1 b1 c1] [a2 b2 c2] [a3 b3 c3] & triangles]]
+    (let [new-triangles [[a1 a2 a3] [b1 b2 b3] [c1 c2 c3]]]
+       (if (empty? triangles)
+        new-triangles
+        (concat new-triangles (make-triangles triangles))
+       )
+    )
+)
+
+(defn is-valid-triangle [t] (let [[a b c] (sort t)] (> (+ a b) c)))
+(defn get-valid-triangles [triangles] (filter is-valid-triangle triangles))
+
+(defn main [] (->
+               (read-file)
+               (split-lines)
+               (make-numbers)
+               (make-triangles)
+               (get-valid-triangles)
+               (count)
+              )
+)
+
+(main)
+


New namespace providing functions for mass selections

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

--- frontend/src/cruncher/selections.cljs
+++ frontend/src/cruncher/selections.cljs
@@ -0,0 +1,43 @@
+(ns cruncher.selections
+  "Enable mass selections of pokemon."
+  (:require [om.next :as om :refer-macros [defui]]
+            [om.dom :as dom :include-macros true]
+            [goog.dom :as gdom]
+            [cruncher.utils.views :as vlib]))
+
+(defn mass-selections
+  "Function for mass selections of pokemon depending on a predicate.
+
+   Example: Select all Pokemon which are not marked as favorite. The function
+   call would then look like this: (mass-selections \"data-favorite\" \"true\" = true)"
+  ([data-prop-str comparator operator checked]
+   (let [rows (gdom/getElementsByClass "poketable-row")]
+     (doall (map (fn [row]
+                   (let [id (.getAttribute row "data-id")
+                         data-prop (.getAttribute row data-prop-str)
+                         checkbox (gdom/getElement (str "poketable-checkbox-" id))]
+                     (if (operator comparator data-prop)
+                       (set! (.. checkbox -checked) checked)
+                       (set! (.. checkbox -checked) (not checked))))) rows))))
+  ([data-prop-str comparator] (mass-selections data-prop-str comparator = true)))
+
+(defn select-all-but-favorite []
+  (mass-selections "data-favorite" "false"))
+
+(defn unselect-all []
+  (mass-selections "data-id" 0 not= false))
+
+(defn select-all []
+  (mass-selections "data-id" 0 < true))
+
+
+;;;; Views
+(defui SelectionButtons
+       Object
+       (render [this]
+               (dom/div nil
+                        (dom/p #js {:className "lead"} "Selections")
+                        (vlib/button-primary select-all "Select all")
+                        (vlib/button-primary unselect-all "Unselect all")
+                        (vlib/button-primary select-all-but-favorite "Select all but favorite"))))
+(def controls (om/factory SelectionButtons))


more logging details on processing

more logging details on processing

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


Get ready to instantiate templates

Get ready to instantiate templates

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


add replace-/update-/delete-by-example method dummys to document namespace

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


Add CircleCI’s async namespace

Add CircleCI’s async namespace

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

--- src/cljs/gtfve/async.cljs
+++ src/cljs/gtfve/async.cljs
@@ -0,0 +1,14 @@
+(ns gtfve.async
+  (:require [cljs.core.async :as async]
+            [om.core :as om :include-macros true]))
+
+(def ^:dynamic *uuid* nil)
+
+(defn put! [port val & args]
+  (if (and (satisfies? IMeta val) *uuid*)
+    (apply async/put! port (vary-meta val assoc :uuid *uuid*) args)
+    (apply async/put! port val args)))
+
+(defn raise! [owner val & args]
+  (let [c (om/get-shared owner [:comms :controls])]
+    (apply put! c val args)))


Add tool to add net.clojars groups; verify org/net.clojars groups

[#781] [#782]

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


cqlsh timestamp parsing

cqlsh timestamp parsing

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

--- src/er_cassandra/time.clj
+++ src/er_cassandra/time.clj
@@ -0,0 +1,13 @@
+(ns er-cassandra.time
+  (:require
+   [clj-time.format :as f]))
+
+(def timestamp-format (f/formatter "yyyy-MM-dd HH:mm:ssZ"))
+
+(defn parse-timestamp
+  [s]
+  (f/parse timestamp-format s))
+
+(defn unparse-timestamp
+  [t]
+  (f/unparse timestamp-format t))


Dates test

Dates test

error: pathspec 'test/tick/alpha/api/dates_test.clj' did not match any file(s) known to git

--- test/tick/alpha/api/dates_test.clj
+++ test/tick/alpha/api/dates_test.clj
@@ -0,0 +1,54 @@
+;; Copyright © 2016-2018, JUXT LTD.
+
+(ns tick.alpha.api.dates-test
+  (:refer-clojure :exclude [dec < range <= min long int > extend - time / >= inc + max complement atom swap-vals! reset-vals! compare-and-set! reset! swap!])
+  (:require
+   [clojure.spec.alpha :as s]
+   [clojure.test :refer :all]
+   [tick.alpha.api :refer :all])
+  (:import [java.time Clock LocalTime LocalDateTime]))
+
+;; See doc/dates.adoc
+
+(deftest time-construction-test
+  (testing "(time)"
+    (is (instance? LocalTime (time))))
+  (testing "(time \"4pm\")"
+    (is (instance? LocalTime (time "4pm")))
+    (is (= "16:00" (str (time "4pm")))))
+  (testing "(midnight)"
+    (is (instance? LocalTime (midnight)))
+    (is (= "00:00" (str (midnight)))))
+  (testing "(noon)"
+    (is (instance? LocalTime (noon)))
+    (is (= "12:00" (str (noon))))))
+
+(deftest date-construction-test
+  (is (instance? LocalDateTime (noon (today))))
+  (with-clock (-> (date "2018-02-14") (at "10:00"))
+    (testing "(noon (today))"
+      (is (= "2018-02-14T12:00" (str (noon (today))))))
+    (testing "(noon (date))"
+      (is (= "2018-02-14T12:00" (str (noon (date))))))))
+
+;; TODO: Clock tests
+;; Create with a value for a fixed clock. Value can be a time or a zone
+
+(deftest clock-test
+  (testing "clock"
+    (with-clock (-> (date "2018-02-14") (at "10:00") (in "America/New_York"))
+      (testing "(clock) return type"
+        (is (instance? Clock (clock))))
+      (testing "Time shifting the clock back by 2 hours"
+        (is (= "2018-02-14T13:00:00Z" (str (instant (<< (clock) (hours 2)))))))))
+
+  (testing "Creating a clock with a zone, and returning that zone"
+    (is (= "America/New_York" (str (zone (clock (zone "America/New_York")))))))
+
+  (testing "Creation of clock with fixed instant"
+    (is (= "2017-10-31T16:00:00Z" (str (instant (clock "2017-10-31T16:00:00Z")))))))
+
+
+;; TODO: tick function
+
+;; TODO: Atomic clocks


Initial tests for new conneg

Initial tests for new conneg

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


Just using curve object's modulus rather than cooking up my own.

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/xcthulhu/clj-bitauth.git/'


add route test

add route test

error: pathspec 'pedestal-app/test/semtag_web/route_test.clj' did not match any file(s) known to git

--- pedestal-app/test/semtag_web/route_test.clj
+++ pedestal-app/test/semtag_web/route_test.clj
@@ -0,0 +1,38 @@
+(ns semtag-web.route-test
+  (:require [clojure.test :refer :all]
+            [semtag-web.route :refer :all]))
+
+(deftest url-for-tests
+  (testing "static route"
+    (is (= "#/types"
+           (url-for :types))))
+  (testing "dynamic route with params"
+    (swap! dynamic-screens assoc :search-query_css {:query "css"})
+    (is (= "#/search?query=css"
+           (url-for :search-query_css))))
+  (testing "dynamic route with keyword substitution"
+    (swap! dynamic-screens assoc :thing-id_felix {:id "felix"})
+    (is (= "#/thing/felix"
+           (url-for :thing-id_felix))))
+  (testing "dynamic route without dynamic-screens entry"
+    (is (= ""
+           (url-for :thing-id_jekyll)))))
+
+(deftest params-from-url-tests
+  (testing "with hash url"
+    (is (= {:id "dude"}
+         (params-from-url :thing "#/thing/dude"))))
+  (testing "with regular url"
+    (is (= {:id "dude"}
+         (params-from-url :thing "/thing/dude")))))
+
+(deftest url->screen-tests
+  (testing "static route"
+    (is (= :types (url->screen "#/types"))))
+  ;; fails without params
+  (testing "dynamic route with params"
+    (is (= :search-query_funny_type_regex
+           (url->screen "#/search" {:query "funny" :type "regex"}))))
+  (testing "dynamic route with keyword substitution"
+    (is (= :thing-id_feynman
+           (url->screen "#/thing/feynman")))))


+(def baby-language)

+(def baby-language)

error: pathspec 'src/babel/generate/lab.cljc' did not match any file(s) known to git

--- src/babel/generate/lab.cljc
+++ src/babel/generate/lab.cljc
@@ -0,0 +1,52 @@
+(ns babel.generate.lab
+  (:require [dag_unify.core
+             :as u :refer [strip-refs unify]]
+            [clojure.string :as string]))
+
+(def baby-language
+  {:grammar [(let [one (atom :top)
+                   two (atom :top)]
+               (unify {:phrasal true
+                       :head {:cat :top
+                              :phrasal false}
+                       :comp {:cat :top
+                              :phrasal false}}
+                      {:1 one :head one
+                       :2 two :comp two}))]
+   :lexicon
+   (into {} (for [[surface lexemes-for-surface]
+                  {"ba" [{:cat :ba}]
+                   "da" [{:cat :da}]
+                   "ga" [{:cat :ga}]
+                   "ma" [{:cat :ma}]}]
+              [surface (map (fn [lexeme]
+                              (merge lexeme {:surface surface}))
+                        lexemes-for-surface)]))})
+
+(defn morph [structure]
+  (cond (or (= :fail structure)
+            (nil? structure)
+            (string? structure)) structure
+
+        (u/get-in structure [:surface])
+        (morph (u/get-in structure [:surface]))
+
+        (and (not (nil? (u/get-in structure [:1])))
+             (not (nil? (u/get-in structure [:2]))))
+        (->
+         (->>
+          [(u/get-in structure [:1])
+           (u/get-in structure [:2])]
+          (map morph)
+          (string/join " "))
+         string/trim)
+
+        true "??"))
+
+(defn generate [spec]
+  (binding [babel.generate/grammar (:grammar baby-language)
+            babel.generate/lexicon (:lexicon baby-language)
+            babel.generate/index-fn (fn [spec]
+                                      (shuffle (flatten (vals (:lexicon baby-language)))))]
+    (babel.generate/generate :top baby-language)))
+


Initial AspectJ-specific SOOT relations.

error: pathspec 'EkekoAspectJ/src/damp/ekeko/aspectj/soot.clj' did not match any file(s) known to git

--- EkekoAspectJ/src/damp/ekeko/aspectj/soot.clj
+++ EkekoAspectJ/src/damp/ekeko/aspectj/soot.clj
@@ -0,0 +1,30 @@
+(ns
+    ^{:doc "Low-level AspectJ-specific Soot relations."
+    :author "Coen De Roover"}
+     damp.ekeko.aspectj.soot
+    (:refer-clojure :exclude [== type declare])
+    (:use [clojure.core.logic])
+    (:use [damp.ekeko logic])
+    (:require
+      [damp.ekeko.aspectj
+       [projectmodel :as projectmodel]
+       [xcut :as xcut]
+       [weaverworld :as world]]
+      [damp.ekeko.jdt [soot :as soot]]))
+
+
+;;todo: allow WholeProgramAnalysiModel to co-exist with AspectJModel
+
+;;todo: should check that model of advice is model of soot scene
+
+(defn
+  advice-sootmethod
+  [?advice ?soot]
+  (fresh [?model ?scene ?signature]
+         (soot/soot-model-scene ?model ?scene)
+         (soot/soot-method-signature ?soot ?signature)))
+
+
+(comment
+
+  (damp.ekeko/ekeko* [?method ?signature] (soot/soot-method-signature ?method ?signature)))


Remove aleph dependency

Remove aleph dependency

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


Updated dependencies

Updated dependencies

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


Version 111-SNAPSHOT

Version 111-SNAPSHOT


Version 0.1.0

Version 0.1.0

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


Project description

Project description

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/om-next-cross-platform-template.git/'


Version 112

Version 112


Added gpg key

Added gpg key

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/dignati/om-charts.git/'


Version 88-SNAPSHOT

Version 88-SNAPSHOT


project: pull-in latest core.async

project: pull-in latest core.async

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


Add first version

Add first version

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

--- probability.clj
+++ probability.clj
@@ -0,0 +1,50 @@
+(def  default-board-size 9) ; default-board-size x default-board-size
+(def  default-number-mines 10) ; default-board-size x default-board-size
+(def  default-number-samples 1000000) ; default-board-size x default-board-size
+
+(defn new-mine [board-size current-mines]
+  (let [mine-pos [(rand-int board-size), (rand-int board-size)]]
+    (if (contains? current-mines mine-pos)
+      (new-mine board-size current-mines)
+      mine-pos)))
+
+(defn generate-mines [board-size num-of-mines]
+  (loop [i num-of-mines mines #{}]
+    (if (> i 0)
+      (recur (dec i) (conj mines (new-mine board-size mines)))
+      mines)))
+
+(defn has-adjacent? [pos mines]
+  (let [x (pos 0) y (pos 1)]
+    (cond
+      (contains? mines [(+ x 1) y]) true
+      (contains? mines [(- x 1) y]) true
+      (contains? mines [x (+ y 1)]) true
+      (contains? mines [x (- y 1)]) true
+      (contains? mines [(+ x 1) (+ y 1)]) true
+      (contains? mines [(+ x 1) (- y 1)]) true
+      (contains? mines [(+ x 1) (+ y 1)]) true
+      (contains? mines [(- x 1) (- y 1)]) true
+      :else false)))
+
+(defn all-adjacents? [mines]
+  (every? #(has-adjacent? % mines) mines)
+)
+
+(defn random-var-function [mines]
+  (if (all-adjacents? mines)
+    1
+    0))
+
+(prn
+  (float
+    (/
+      (reduce
+        +
+        (map
+          random-var-function
+          (repeatedly default-number-samples (fn [] (generate-mines default-board-size default-number-mines)))))
+      default-number-samples
+    )
+  )
+)


daily update

daily update

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

--- src/csv_analyse/analyse.clj
+++ src/csv_analyse/analyse.clj
@@ -0,0 +1,37 @@
+(ns clojure-dominion.analyse
+  (:use clojure.pprint)
+  (:use clojure.java.io)
+  (:require [clojure.string :as str]))
+
+(defn file->lines [file-name]
+    (with-open [rdr (reader file-name)]
+               (reduce conj [] (line-seq rdr))))
+
+(defn line->entry-strings [line]
+    (->> line
+         (re-seq #"\[(.*?)\]")
+         (map second)))
+
+(defn entry-string->entry [entry-string]
+    (->> entry-string
+         (re-seq #"\"\"(.*?)\"\"")
+         (map second)
+         (zipmap [:count :avg-processing :channel-id :source-type :payment-type
+                  :psp-name :division :merchant :channel])))
+
+(defn calculate-total-time [entry]
+    (try (->> entry
+              (#(update-in % [:count] read-string))
+              (#(update-in % [:avg-processing] read-string))
+              (#(assoc % :total-time (* (:count %) (:avg-processing %)))))
+         (catch Exception ex {:total-time 0})))
+
+(->> (file->lines "/opt/data/tmp/top25_channels.csv")
+     (map line->entry-strings)
+     (mapcat (partial map entry-string->entry))
+     (map calculate-total-time)
+     (group-by :channel-id)
+     (mapcat (fn [[k v]] {k (apply + (map :total-time v))}))
+     (sort-by val >)
+     (take 20)
+     pprint)


update categories sub to pull from backend

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 incognito clojurescript fressian

add incognito clojurescript fressian

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

--- src/incognito/fressian.cljs
+++ src/incognito/fressian.cljs
@@ -0,0 +1,81 @@
+(ns incognito.fressian
+  (:require [incognito.base :refer [incognito-reader incognito-writer]]
+            [fress.api :refer [read-object write-tag write-object]]
+            [fress.reader :refer [IFressianReader readInt]]
+            [fress.writer :refer [IFressianWriter writeInt]]))
+
+(defn- record-reader [read-handlers reader]
+  (let [len (readInt reader)
+        tag (read-object reader)
+        val (->> (range len)
+                 (map (fn [_] (read-object reader)))
+                 (map vec)
+                 (into {}))]
+    (incognito-reader @read-handlers
+                      {:tag tag :value val})))
+
+(defn- record-writer [write-handlers writer record]
+  (let [{:keys [tag value]} (if (isa? (type record) incognito.base.IncognitoTaggedLiteral)
+                              (into {} record) ;; carry on as map
+                              (incognito-writer @write-handlers record))]
+    (write-tag writer "irecord" 2)
+    (writeInt writer (count value))
+    (write-object writer tag)
+    (doseq [e value]
+      (write-object writer e))))
+
+(defn- plist-reader [reader _ _]
+  (let [len (readInt reader)]
+    (->> (range len)
+         (map (fn [_] (read-object reader)))
+         reverse
+         (into '()))))
+
+(defn- plist-writer [writer plist]
+  (write-tag writer "plist" 2)
+  (writeInt writer (count plist))
+  (doseq [e plist]
+    (write-object writer e)))
+
+(defn- pvec-reader [reader _ _]
+  (let [len (readInt reader)]
+    (->> (range len)
+         (map (fn [_] (read-object reader)))
+         (into []))))
+
+(defn- pvec-writer [writer pvec]
+  (write-tag writer "pvec" 2)
+  (writeInt writer (count pvec))
+  (doseq [e pvec]
+    (write-object writer e)))
+
+(defn- set-reader [reader _ _]
+  (let [^List l (read-object reader)]
+        (into #{} l)))
+
+(defn incognito-read-handlers [read-handlers]
+  {"irecord" (partial record-reader read-handlers)
+   "plist"   plist-reader
+   "pvec"    pvec-reader
+   "set"     set-reader})
+
+(defn incognito-write-handlers [write-handlers]
+  {cljs.core/List             plist-writer
+   cljs.core/EmptyList        plist-writer
+   cljs.core/IRecord          (partial record-writer write-handlers)
+   cljs.core/LazySeq          plist-writer
+   cljs.core/PersistentVector pvec-writer})
+
+(comment
+
+  (defrecord Foo [a b])
+
+  (let [buffer         (fress.api/byte-stream)
+        read-handlers  (atom {'incognito.fressian.Foo map->Foo})
+        write-handlers (atom {'incognito.fressian.Foo (fn [foo] (println "foos") (assoc foo :c "donkey"))})
+        w              (fress.api/create-writer buffer :handlers (incognito-write-handlers write-handlers))]
+    (fress.api/write-object w #{4 2 3})
+    (fress.api/read buffer
+                          :handlers (incognito-read-handlers read-handlers)))
+
+  )


Add basic channel tests to clojurescript.

--- test/cats/monad/channel_spec.cljx
+++ test/cats/monad/channel_spec.cljx
@@ -45,6 +45,42 @@
       (t/is (= 3 (<!! r)))))
   )

+#+cljs
+(t/deftest channel-monad-tests
+  (t/testing "channel as functor"
+    (t/async done
+      (go
+        (let [ch (m/pure c/channel-monad 1)
+              rs (m/fmap inc ch)]
+          (t/is (= 2 (<! rs)))
+          (done)))))
+
+  (t/testing "channel as monad 1"
+    (t/async done
+      (go
+        (let [ch (m/pure c/channel-monad 1)
+              rs (m/>>= ch (fn [x] (m/return (inc x))))]
+          (t/is (= 3 (<! rs)))
+          (done)))))
+
+
+  (t/testing "channel as monad 2"
+    (t/async done
+      (go
+        (let [ch1 (chan 1)
+              ch2 (chan 1)
+              ch3 (chan 1)
+              r   (m/mlet [x ch1
+                           y ch2
+                           z ch3]
+                    (m/return (+ x y z)))]
+          (>! ch1 1)
+          (>! ch2 1)
+          (>! ch3 1)
+          (t/is (= 3 (<! r))))
+        (done))))
+)
+

 #+clj
 (def chaneither-m (either/either-transformer c/channel-monad))


Implemented Square Digits problem

Implemented Square Digits problem

error: pathspec 'src/clojush/problems/software/benchmarks_v2/square_digits.clj' did not match any file(s) known to git

--- src/clojush/problems/software/benchmarks_v2/square_digits.clj
+++ src/clojush/problems/software/benchmarks_v2/square_digits.clj
@@ -0,0 +1,168 @@
+;; square_digits.clj
+;;
+;; Tom Helmuth, thelmuth@hamilton.edu
+;;
+;; Problem inspired by: https://www.codewars.com/kata/546e2562b03326a88e000020
+
+(ns clojush.problems.software.benchmarks-v2.square-digits
+  (:use clojush.pushgp.pushgp
+        [clojush pushstate interpreter random util globals]
+        clojush.instructions.tag)
+  (:require [clojure.math.numeric-tower :as nt]))
+
+; Atom generators
+(def atom-generators
+  (make-proportional-atom-generators
+   (concat
+    (registered-for-stacks [:string :char :integer :boolean :exec])
+    (list (tag-instruction-erc [:string :char :integer :boolean :exec] 1000) ; tags
+          (tagged-instruction-erc 1000)))
+   (list 'in1) ; inputs
+   (list 0
+         1
+         2
+         (fn [] (- (lrand-int 201) 100)) ;Integer ERC
+         "") ; constants
+   {:proportion-inputs 0.15
+    :proportion-constants 0.05}))
+
+(def hard-coded-inputs
+  (list 0 1 2 3 4 5 7 9 10 12 16 24 35 46 57 68 79 80 92 98
+        100 185 231 372 408 794
+        321012
+        987654
+        999999
+        1000000))
+
+;; A list of data domains. Each domain is a vector containing
+;; a "set" of inputs and two integers representing how many cases from the set
+;; should be used as training and testing cases respectively. Each "set" of
+;; inputs is either a list or a function that, when called, will create a
+;; random element of the set.
+(def data-domains
+  [[hard-coded-inputs 30 0] ; fixed integers
+   [(fn []
+      (first (filter #(not (some #{%} hard-coded-inputs))
+                     (repeatedly #(lrand-int 999999))))) 170 2000] ; random integers, besides those in hard-coded inputs
+   ])
+
+(defn digits
+  "Gets list of digits of integer"
+  [x]
+  (if (zero? x)
+    '(0)
+    (loop [x x
+           result '()]
+      (if (zero? x)
+        result
+        (recur (quot x 10)
+               (conj result (mod x 10)))))))
+
+(defn solve-square-digits
+  "Solves the problem given the input."
+  [input]
+  (apply str
+         (map #(* % %)
+              (digits input))))
+
+; Helper function for error function
+(defn test-cases
+  "Takes a sequence of inputs and gives IO test cases of the form
+   [[input1 input2] output]."
+  [inputs]
+  (map (fn [in]
+         (vector in
+                 (solve-square-digits in)))
+       (sort inputs)))
+
+(defn make-error-function-from-cases
+  "Creates and returns the error function based on the train/test cases."
+  [train-cases test-cases]
+  (fn the-actual-error-function
+    ([individual]
+     (the-actual-error-function individual :train))
+    ([individual data-cases] ;; data-cases should be :train or :test
+     (the-actual-error-function individual data-cases false))
+    ([individual data-cases print-outputs]
+     (let [behavior (atom '())
+           errors (doall
+                   (for [[input1 correct-output] (case data-cases
+                                                   :train train-cases
+                                                   :test test-cases
+                                                   [])]
+                     (let [final-state (run-push (:program individual)
+                                                 (->> (make-push-state)
+                                                      (push-item input1 :input)))
+                           result (top-item :string final-state)]
+                       (when print-outputs
+                         (println (format "Correct output: %s\nProgram output: %s\n\n" correct-output (str result))))
+                         ; Record the behavior
+                       (swap! behavior conj result)
+                         ; Error is Levenshtein distance
+                       (if (string? result)
+                         (levenshtein-distance correct-output result)
+                         1000000) ; penalty for no return value
+                       )))]
+       (if (= data-cases :train)
+         (assoc individual :behaviors @behavior :errors errors)
+         (assoc individual :test-errors errors))))))
+
+(defn get-train-and-test
+  "Returns the train and test cases."
+  [data-domains]
+  (map test-cases
+       (test-and-train-data-from-domains data-domains)))
+
+; Define train and test cases
+(def train-and-test-cases
+  (get-train-and-test data-domains))
+
+(defn initial-report
+  [argmap]
+  (println "Train and test cases:")
+  (doseq [[i case] (map vector (range) (first train-and-test-cases))]
+    (println (format "Train Case: %3d | Input/Output: %s" i (str case))))
+  (doseq [[i case] (map vector (range) (second train-and-test-cases))]
+    (println (format "Test Case: %3d | Input/Output: %s" i (str case))))
+  (println ";;******************************"))
+
+(defn custom-report
+  "Custom generational report."
+  [best population generation error-function report-simplifications]
+  (let [best-test-errors (:test-errors (error-function best :test))
+        best-total-test-error (apply +' best-test-errors)]
+    (println ";;******************************")
+    (printf ";; -*- Find Pair problem report - generation %s\n" generation) (flush)
+    (println "Test total error for best:" best-total-test-error)
+    (println (format "Test mean error for best: %.5f" (double (/ best-total-test-error (count best-test-errors)))))
+    (when (zero? (:total-error best))
+      (doseq [[i error] (map vector
+                             (range)
+                             best-test-errors)]
+        (println (format "Test Case  %3d | Error: %s" i (str error)))))
+    (println ";;------------------------------")
+    (println "Outputs of best individual on training cases:")
+    (error-function best :train true)
+    (println ";;******************************"))) ;; To do validation, could have this function return an altered best individual
+       ;; with total-error > 0 if it had error of zero on train but not on validation
+       ;; set. Would need a third category of data cases, or a defined split of training cases.
+
+
+; Define the argmap
+(def argmap
+  {:error-function (make-error-function-from-cases (first train-and-test-cases)
+                                                   (second train-and-test-cases))
+   :atom-generators atom-generators
+   :max-points 2000
+   :max-genome-size-in-initial-program 250
+   :evalpush-limit 2000
+   :population-size 1000
+   :max-generations 300
+   :parent-selection :lexicase
+   :genetic-operator-probabilities {:uniform-addition-and-deletion 1.0}
+   :uniform-addition-and-deletion-rate 0.09
+   :problem-specific-report custom-report
+   :problem-specific-initial-report initial-report
+   :report-simplifications 0
+   :final-report-simplifications 5000
+   :max-error 1000000})


Add a defn-api that uses all the stages

Add a defn-api that uses all the stages

Closes #2

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

--- src/com/palletops/api_builder/api.clj
+++ src/com/palletops/api_builder/api.clj
@@ -0,0 +1,16 @@
+(ns com.palletops.api-builder.api-defn
+  "An API defn form that uses all stages"
+  (:require
+   [com.palletops.api-builder :refer [def-defn]]
+   [com.palletops.api-builder.stage :refer :all]
+   [com.palletops.api-builder.stage.log :refer :all]))
+
+
+;;; # API defn
+(def-defn defn-api
+  [(validate-errors (constantly true))
+   (validate-sig)
+   (add-sig-doc)
+   (log-scope)
+   (log-entry)
+   (log-exit)])