Fix the doc strings for the `filterer` params in `rss` and `atom-feed`

--- src/io/perun.clj
+++ src/io/perun.clj
@@ -322,7 +322,7 @@
 (deftask rss
   "Generate RSS feed"
   [f filename    FILENAME    str  "generated RSS feed filename"
-   _ filterer    FILTER      code "predicate to use for selecting entries (default: `:content`)"
+   _ filterer    FILTER      code "predicate to use for selecting entries (default: `:include-rss`)"
    o out-dir     OUTDIR      str  "the output directory"
    t site-title  TITLE       str  "feed title"
    p description DESCRIPTION str  "feed description"
@@ -350,7 +350,7 @@
 (deftask atom-feed
   "Generate Atom feed"
   [f filename    FILENAME    str  "generated Atom feed filename"
-   _ filterer    FILTER      code "predicate to use for selecting entries (default: `:content`)"
+   _ filterer    FILTER      code "predicate to use for selecting entries (default: `:include-atom`)"
    o out-dir     OUTDIR      str  "the output directory"
    t site-title  TITLE       str  "feed title"
    s subtitle    SUBTITLE    str  "feed subtitle"


[#2417] Stop using read-string & eval

[#2417] Stop using read-string & eval

--- backend/src/akvo/lumen/lib/transformation/derive_category.clj
+++ backend/src/akvo/lumen/lib/transformation/derive_category.clj
@@ -36,11 +36,11 @@
     uncategorized-value
     (or
      (some (fn [[[a b :as x] [c d :as y] cat]]
-             (let [exp (read-string (format "(%s %s %s)" a v b))
-                   eval1 (eval exp)]
+             (let [exp (resolve (symbol a))
+                   eval1 (apply exp [v b])]
                (if y
-                 (let [exp2 (read-string (format "(%s %s %s)" c v d))
-                       eval1&2 (and eval1 (eval exp2))]
+                 (let [exp2 (resolve (symbol c))
+                       eval1&2 (and eval1 (apply exp2 [v d]))]
                    (when eval1&2 cat))
                  (when eval1 cat))))
            mappings)


Minor changes on uri parsing.

Minor changes on uri parsing.

--- src/continuo/util.clj
+++ src/continuo/util.clj
@@ -37,13 +37,13 @@
      (-> (.getQuery uri)
          (util/querystring->map)
          (keywordize-keys))
-     {:server-name host}
+     {:host host}
      (when-not (empty? userinfo)
        (let [[user password] (str/split userinfo ":")]
          {:username user
           :password password}))
      (when port
-       {:port-number port}))))
+       {:port port}))))

 (defn str->bytes
   "Convert string to java bytes array"


Revision of the drug-to-protein-target relation rule

Now modeled as a binding. Updated to work with current KB.

--- kabob-build/src/main/resources/edu/ucdenver/ccp/kabob/build/rules/temp/drugbank/drugbank_rules.clj
+++ kabob-build/src/main/resources/edu/ucdenver/ccp/kabob/build/rules/temp/drugbank/drugbank_rules.clj
@@ -1,99 +1,88 @@
-;;;; Rules to generate bio constructs from drugbank targets

-;; obo/INO_0000002 ;interaction
-;; obo/MI_0000 ;psi-mi "molecular interaction"
+`{:name "drugbank-drug-to-protein-target-relation"
+  :description "The DrugBank resources lists targets for many of the drugs that it catalogs.
+  When this rule was originally composed, of the 8,203 DrugBank records, 6,827 are annotated
+  with at least one drug target. Most of the targets are proteins (12,479 out of 12,704). This
+  rule generates bio-representations for the drug-target relationships cataloged by DrugBank
+  where the target is a protein. The DrugBank documentation defines target as 'A protein,
+  macromolecule, nucleic acid, or small molecule to which a given drug binds, resulting in an
+  alteration of the normal function of the bound molecule and a desirable therapeutic effect.
+  Drug targets are most commonly proteins such as enzymes, ion channels, and receptors.' We
+  therefore model the drug-target interaction as a binding using concepts from both the Gene
+  Ontology and the Molecular Interaction Ontology. Both the drug and target are modeled as
+  participants in the binding, with the drug also modeled as inhereing the CHEBI:drug role."
+  :head (
+         (?/interaction rdfs/subClassOf obo/MI_0407) ;direct interaction
+         (?/interaction rdfs/subClassOf obo/GO_0005488) ;binding

-;;TODO the restrictions need to be properly reified
+          ;; link the binding event to the target participant (protein in this case)
+         (?/r_target_participant rdf/type owl/Restriction)
+         (?/r_target_participant owl/onProperty obo/RO_0000057) ; has_participant
+         (?/r_target_participant owl/someValuesFrom ?/target_bioentity)

-`{:name "drugbank-gene-drug-relation"
-  ;; this need to be hashed and have proper classes
-  :head (;(?/gorgporv kiao/STANDIN_gene_drug ?/drug);)
-         ;(?/gorgporv kiao/STANDIN_drugbank_gene_drug ?/drug);)
-         (?/interaction rdfs/subClassOf obo/MI_0000) ;interaction
+          ;; link the binding event to the drug
+         (?/r_drug_participant rdf/type owl/Restriction)
+         (?/r_drug_participant owl/onProperty obo/RO_0000057) ; has_participant
+         (?/r_drug_participant owl/someValuesFrom ?/drug_bioentity)

-         ;;these two triples are redundant rdf macros
-         ;(?/interaction kbio/rsv_has_participant ?/gorgporv)
-         ;(?/interaction kbio/rsv_has_participant ?/drug)
-
-         (?/r1 rdf/type owl/Restriction)
-         (?/r1 owl/onProperty obo/RO_0000057) ; has_participant
-         (?/r1 owl/someValuesFrom ?/drug)
-
-         (?/r2 rdf/type owl/Restriction)
-         (?/r2 owl/onProperty obo/RO_0000057) ; has_participant
-         (?/r2 owl/someValuesFrom ?/gorgporv)
-
-         (?/r3 rdf/type owl/Restriction)
-         (?/r3 owl/onProperty obo/BFO_0000055) ; realizes
-         (?/r3 owl/someValuesFrom ?/inheres)
+          ;; this binding realizes the drug_role that inheres_in the drug
+         (?/r_realizes_drug_role rdf/type owl/Restriction)
+         (?/r_realizes_drug_role owl/onProperty obo/BFO_0000055) ; realizes
+         (?/r_realizes_drug_role owl/someValuesFrom ?/inheres)

          ;;create a new anonymous class that is CHEBI drug role
-         ;;   that inheres in this specific drug
+         ;;   that inheres_in in this specific drug
          ;;   so that it can be realized by the restriction above
-         (?/r4 rdf/type owl/Restriction)
-         (?/r4 owl/onProperty obo/RO_0000052) ;inheres_in
-         (?/r4 owl/someValuesFrom ?/drug)
-
-         (?/inheres rdfs/subClassOf obo/CHEBI_23888) ;drug role
-         (?/inheres rdfs/subClassOf ?/r4)
+         (?/r_inheres rdf/type owl/Restriction)
+         (?/r_inheres owl/onProperty obo/RO_0000052) ;inheres_in
+         (?/r_inheres owl/someValuesFrom ?/drug_bioentity)
+
+         (?/inheres rdfs/subClassOf obo/CHEBI_23888) ;drug (role)
+         (?/inheres rdfs/subClassOf ?/r_inheres)

          ;;make the interaction be necessarily part of these 3 restrictions
          ;;still need to add a sufficient definition
-         (?/interaction rdfs/subClassOf ?/r1)
-         (?/interaction rdfs/subClassOf ?/r2)
-         (?/interaction rdfs/subClassOf ?/r3))
-
+         (?/interaction rdfs/subClassOf  ?/r_target_participant)
+         (?/interaction rdfs/subClassOf ?/r_drug_participant)
+         (?/interaction rdfs/subClassOf ?/r_realizes_drug_role))

-;;iaodrugbank/DrugBankDrugRecord_drugBankIdDataField1
-;;iaodrugbank/DrugBankPartnerRecord_externalIdentifiersDataField1
-  ;;(?/partnerRec obo/BFO_0000051 ?/entityFV)
-
   :body
   (
-   ;; (_/fv0 kiao/hasTemplate iaodrugbank/DrugBankDrugRecord_drugBankIdDataField1)
-   ;; (_/fv0 obo/IAO_0000219 _/drugid)
-   ;; (_/record obo/BFO_0000051 _/fv0)
+    ;; each DrugBank record has an ID field. We use that
+    ;; ID to link to the drug bioentity
+    (_/id_field kiao/hasTemplate iaodrugbank/DrugBankDrugRecord_drugBankIdDataField1)
+    (_/id_field obo/IAO_0000219 _/drug_id)
+  	(_/drug_id obo/IAO_0000219 ?/drug_bioentity)

-   ;; (_/record obo/BFO_0000051 _/subrecord1)
-   ;; (_/subrecord1 obo/BFO_0000051 _/fv1)
-   ;; (_/fv1 kiao/hasTemplate iaodrugbank/DrugBankPartnerRecord_externalIdentifiersDataField1)
-   ;; (_/fv1 obo/IAO_0000219 _/externalid)
-
-   (_/fv1 kiao/hasTemplate iaodrugbank/DrugBankPartnerRecord_externalIdentifiersDataField1)
-   (_/fv1 obo/IAO_0000219 _/externalid)
-   (_/partnerRecord1 obo/BFO_0000051 _/fv1) ; has_part
-   (_/targetRecord1 obo/BFO_0000051 _/partnerRecord1) ; has_part
-   (_/record obo/BFO_0000051 _/targetRecord1) ; has_part
+    ;; the majority of DrugBank records link to a Target record.
+  	(_/base_record obo/BFO_0000051 _/id_field)
+  	(_/base_record obo/BFO_0000051 _/target_record)
+  	(_/target_record kiao/hasTemplate iaodrugbank/TargetSchema1)

-   (_/record obo/BFO_0000051 _/fv0) ; has_part
-   (_/fv0 kiao/hasTemplate iaodrugbank/DrugBankDrugRecord_drugBankIdDataField1)
-   (_/fv0 obo/IAO_0000219 _/drugid) ; denotes
+    ;; the vast majority of targets contain a polypeptide record which
+    ;; links to a protein bio-entity
+    ;; of 12,704 target records, all but 225 have an associated polypeptide record
+    ;; we should look into those 225 targets at some point as they are currently excluded
+    (_/target_record obo/BFO_0000051 _/polypeptide_record)
+    (_/polypeptide_record kiao/hasTemplate iaodrugbank/PolypeptideSchema1)
+    (_/polypeptide_record obo/BFO_0000051 _/polypeptide_id_field)
+    (_/polypeptide_id_field obo/IAO_0000219 _/protein_ice_id)
+    (_/protein_ice_id obo/IAO_0000219 ?/target_bioentity)
+  )

-   (_/drugid obo/IAO_0000219 ?/drug) ; denotes
+  :reify ([?/interaction {:ln (:sha-1 "interaction" ?/target_bioentity ?/drug_bioentity)
+                          :ns "kbio" :prefix "I_"}]
+          [?/r_target_participant {:ln (:restriction)
+                 :ns "kbio" :prefix "RESTR_"}]
+          [?/r_drug_participant {:ln (:restriction)
+                 :ns "kbio" :prefix "RESTR_"}]
+          [?/r_realizes_drug_role {:ln (:restriction)
+                 :ns "kbio" :prefix "RESTR_"}]
+          [?/r_inheres {:ln (:restriction)
+                 :ns "kbio" :prefix "RESTR_"}]
+          [?/inheres {:ln (:sha-1 "drugrole" ?/drug_bioentity)
+                          :ns "kbio" :prefix "D_"}])

-   (_/externalid obo/IAO_0000219 ?/bio) ; denotes
-   (?/bio [rdfs/subClassOf clojure.core/*] ?/gorgporv)
-   (?/gorgporv rdf/type kbio/GeneSpecificGorGPorVClass))
-
-
-  :reify ([?/interaction {:ln (:sha-1 "interaction" ?/bio ?/drug)
-                          :ns "kbio" :prefix "I_"}]
-          [?/r1 {:ln (:restriction)
-                 :ns "kbio" :prefix "R_"}]
-          [?/r2 {:ln (:restriction)
-                 :ns "kbio" :prefix "R_"}]
-          [?/r3 {:ln (:restriction)
-                 :ns "kbio" :prefix "R_"}]
-          [?/r4 {:ln (:restriction)
-                 :ns "kbio" :prefix "R_"}]
-          [?/inheres {:ln (:restriction)
-                      :ns "kbio" :prefix "R_"}])
-
-  :options {:magic-prefixes [["franzOption_clauseReorderer" "franz:identity"]]}
-  ;; :reify (?/interaction
-  ;;         ?/r1
-  ;;         ?/r2
-  ;;         ?/r3
-  ;;         ?/r4
-  ;;         ?/inheres)
+  :options {:magic-prefixes [["franzOption_clauseReorderer" "franz:identity"]
+                             ["franzOption_chunkProcessingAllowed" "franz:yes"]]}
   }


Renamed ISO MENDS extension to .iso_mends.

--- src/cmr/system_int_test/utils/search_util.clj
+++ src/cmr/system_int_test/utils/search_util.clj
@@ -79,8 +79,8 @@
    "application/xml" "xml"
    "application/echo10+xml" "echo10"
    "application/iso_prototype+xml" "iso_prototype"
-   "application/iso:smap+xml" "smap_iso"
-   "application/iso-mends+xml" "mends_iso"
+   "application/iso:smap+xml" "iso_smap"
+   "application/iso-mends+xml" "iso_mends"
    "application/iso19115+xml" "iso19115"
    "application/dif+xml" "dif"
    "text/csv" "csv"


Make closing the Stripe form work

Make closing the Stripe form work

--- frontend/stripe.cljs
+++ frontend/stripe.cljs
@@ -24,10 +24,10 @@
                     checkout-args
                     ;; XXX: check what happens on failure
                     {:token #(put! channel [:stripe-checkout-succeeded (utils/js->clj-kw %)])
-                     ;; XXX: remove this when Stripe gets back to us about `close` being fired when the
-                     ;;      form is submitted. Or come up with a workaround if they don't fix it.
-                     ;;:closed #(put! channel [:stripe-checkout-closed])
-                     })]
+                     ;; Stripe will fire both callbacks on successful submit. This makes sure that
+                     ;; the closed event fires last. The timeout by itself is enough, but we'll
+                     ;; add 300ms for good measure.
+                     :closed (fn [] (js/setTimeout #(put! channel [:stripe-checkout-closed]) 300))})]
     ((aget checkout "open") (clj->js args))))

 (defn checkout-loaded?


Update CIDER

Update CIDER

--- home/wasa/.lein/profiles.clj
+++ home/wasa/.lein/profiles.clj
@@ -1 +1,2 @@
-{:user {:plugins [[cider/cider-nrepl "0.7.0-SNAPSHOT"]]}}
+{:user {:plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]]
+        :dependencies [[org.clojure/tools.nrepl "0.2.10"]]}}


Improve performance on graph rendering

Improve performance on graph rendering

Factor out some common computations to allow the graph to render faster.
It now renders fast enough to support links on a physical device.


pass on lb-port to listener

pass on lb-port to listener


Exclude group-by from Clojure refer

Exclude group-by from Clojure refer


experimental code reverted

experimental code reverted

--- src/flatgui/paint.clj
+++ src/flatgui/paint.clj
@@ -397,5 +397,5 @@
       (apply concat
              [(conj id-path (:id container))]
              (for [[_ v] (:children container)] (get-paint-all-sequence (conj id-path (:id container)) v)))
-      (throw (IllegalStateException. "No ready for paint"))))
+     []))
   ([container] (get-paint-all-sequence [] container)))


Register upload page client-side schema

Register upload page client-side schema

--- src/braid/uploads_page/core.cljc
+++ src/braid/uploads_page/core.cljc
@@ -4,6 +4,7 @@
     #?@(:cljs
          [[cljs-uuid-utils.core :as uuid]
           [re-frame.core :refer [subscribe dispatch]]
+          [spec-tools.data-spec :as ds]
           [braid.core.client.routes :as routes]
           [braid.uploads-page.views.uploads-page-styles :refer [>uploads-page]]
           [braid.uploads-page.views.uploads-page :refer [uploads-page-view]]])))
@@ -30,10 +31,16 @@
           :route-fn routes/page-path
           :route-args {:page-id "uploads"}})

+       (core/register-state!
+         {::uploads {}}
+         {::uploads {uuid? (ds/maybe [{:id uuid?
+                                       :url string?
+                                       :thread-id uuid?}])}})
+
        (core/register-subs!
          {:braid.uploads-page/uploads
           (fn [db _]
-            (get-in db [:uploads (db :open-group-id)]))
+            (get-in db [::uploads (db :open-group-id)]))

           :braid.uploads-page/error
           (fn [db _]
@@ -42,7 +49,7 @@
        (core/register-events!
          {::store-group-uploads!
           (fn [{db :db} [_ group-id uploads]]
-            {:db (assoc-in db [:uploads group-id] uploads)})
+            {:db (assoc-in db [::uploads group-id] uploads)})

           :braid.uploads-page/get-group-uploads!
           (fn [{state :db} _]
@@ -61,7 +68,7 @@
           :braid.uploads-page/delete-upload
           (fn [{db :db} [_ group-id upload-id]]
             {:websocket-send (list [:braid.server/delete-upload upload-id])
-             :db (update-in db [:uploads group-id]
+             :db (update-in db [::uploads group-id]
                             (fn [uploads]
                               (remove
                                 (fn [upload]


cleaning up

cleaning up

--- src/frontend/cljs/alibi/activity_graphic.cljs
+++ src/frontend/cljs/alibi/activity_graphic.cljs
@@ -758,7 +758,6 @@
                          (filter #(= entry-id (:entry-id %)))
                          (first)
                          :comment)]
-        ;(log "mo %o %o" mouse-over-entry comment project-data)
         (om/build tooltip-component
                   {:top top
                    :records project-data


lein-release plugin: bumped version from 0.3.1 to 0.3.2-SNAPSHOT for next development cycle

--- backend/project.clj
+++ backend/project.clj
@@ -1,4 +1,4 @@
-(defproject lambdaui "0.3.1"
+(defproject lambdaui "0.3.2-SNAPSHOT"
   :description "LambdaCD-Plugin that provides a modern UI for your pipeline."
   :url "https://github.com/sroidl/lambda-ui"
   :license {:name "Apache License 2.0"


support swank-clojure 1.2 and 1.3

support swank-clojure 1.2 and 1.3

--- bake/bake/swank.clj
+++ bake/bake/swank.clj
@@ -7,11 +7,14 @@
 (def current-port (atom nil))
 (defn running? [] (not (nil? @current-port)))

-(if-ns (:use [swank.swank :only [start-repl]]
-             [swank.core.server :only [*connections*]])
+(if-ns (:require [swank.swank :as swank]
+                 [swank.core.server :as swank.server])
   (do
     (defn installed? [] true)
-    (defn num-connections [] (count @*connections*))
+    (defn num-connections []
+      (let [connections (or (ns-resolve 'swank.server '*connections*)
+                            (ns-resolve 'swank.server 'connections))]
+        (count @connections)))
     (defn start [host]
       (let [[host port] (if (.contains host ":") (.split host ":") ["localhost" host])
             port        (Integer/parseInt port)
@@ -22,7 +25,7 @@
             (fn [f] (start-thread #(with-context (current-context) (f))))))
         (binding [*out* writer
                   *err* (PrintWriter. writer)]
-          (start-repl port :host host))
+          (swank/start-repl port :host host))
         (if (.contains (.toString writer) "java.net.BindException")
           false
           (compare-and-set! current-port nil port)))))


Push test-case for slow behaviour

Push test-case for slow behaviour

--- src/aurora/btree.cljs
+++ src/aurora/btree.cljs
@@ -1024,3 +1024,33 @@
  )

 (enable-console-print!)
+
+(let [tree1 (tree 10)
+      _ (dotimes [i 100]
+          (.assoc! tree1 #js [i i]))
+      tree2 (tree 10)
+      _ (.assoc! tree2 #js [0 0])
+      _ (.assoc! tree2 #js [99 99])
+      s (solver 3
+                #js [(contains (iterator tree1))
+                     (contains (iterator tree2))]
+                #js [#js [0 1]
+                     #js [0 2]])
+      ]
+  (take-while identity (repeatedly #(.next s)))
+  )
+
+(let [tree1 (tree 10)
+      _ (dotimes [i 100]
+          (.assoc! tree1 #js [i i]))
+      tree2 (tree 10)
+      _ (.assoc! tree2 #js [0 0])
+      _ (.assoc! tree2 #js [99 99])
+      s (solver 3
+                #js [(contains (iterator tree1))
+                     (contains (iterator tree2))]
+                #js [#js [0 1]
+                     #js [1 2]])
+      ]
+  (take-while identity (repeatedly #(.next s)))
+  )


fix missing email subject

fix missing email subject

--- src/pc/email.clj
+++ src/pc/email.clj
@@ -109,6 +109,8 @@
         image-permission (permission-model/create-document-image-permission! doc)]
     (ses/send-message {:from (view/email-address "Precursor" "joinme")
                        :to (:cust/email grantee)
+                       :subject (str (view/format-inviter granter)
+                                     " invited you to a document on Precursor")
                        :text (str "Hey there,\nCome draw with me on Precursor: " (urls/doc (:db/id doc)))
                        :html (view/document-permission-grant-html (:db/id doc) image-permission)})))


Convert normal fn name.

Convert normal fn name.

--- src/cbfg/zgo/core.clj
+++ src/cbfg/zgo/core.clj
@@ -139,7 +139,7 @@
    "="     (make-cvt-infix "==")})

 (defn cvt-normal-fn [lvl scope name args]
-  [name "(" args ")"])
+  [(cvt-sym name) "(" args ")"])

 (defn cvt-expr [lvl scope expr]
   (cond


Fix merge conflict on :cost cost

Fix merge conflict on :cost cost

--- src/clj/game/core.clj
+++ src/clj/game/core.clj
@@ -851,7 +851,11 @@
                 (let [cost (steal-cost state side c)]
                   (if (pos? (count cost))
                     (optional-ability state :runner c (str "Pay " (costs-to-symbol cost) " to steal " name "?")
+<<<<<<< HEAD
                                       {:yes-ability {:cost cost
+=======
+                                      {:yes-ability {:cost
+>>>>>>> 8db3e973dc5876dbdad2587afb20b1bdc239a6e5
                                                      :effect (effect (system-msg (str "pays " (costs-to-symbol cost)
                                                                                " to steal " (:title c)))
                                                                      (resolve-steal c))}


check that subtype key exists on add-prop

--- src/clj/game/core.clj
+++ src/clj/game/core.clj
@@ -468,7 +468,8 @@
 (defn add-prop
   ([state side card key n] (add-prop state side card key n nil))
   ([state side card key n {:keys [placed] :as args}]
-   (let [updated-card (if (re-find #"Virus" (:subtype card))
+   (let [updated-card (if
+                        (and (contains? card :subtype) (re-find #"Virus" (:subtype card)))
                         (assoc card :added-virus-counter true)
                         card
                         )]


add proper tags

add proper tags

--- src/clj/hsm/views.clj
+++ src/clj/hsm/views.clj
@@ -35,6 +35,13 @@
 (defhtml panel
   [header & content]
     (panelx header "" ["panel-body"] content))
+
+(defn get-placement
+  [host]
+  (let [placement (s/replace host #"\." "")]
+    (if (= placement "pythonhackerscom")
+      placement
+      "hackersomecom")))

 (defhtml left-menu
   [host platform page]
@@ -56,7 +63,7 @@
     [:div.fb-like {:data-href (format "http://%s/top-%s-projects" host platform)}]

     [:hr]
-    [:script#_carbonads_js {:type "text/javascript" :src (format "//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=%s" (s/replace host #"\." "")) }]
+    [:script#_carbonads_js {:type "text/javascript" :src (format "//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=%s" (get-placement host)) }]
     ])

 (defhtml languages-pane
@@ -164,7 +171,7 @@
           [:div.col-lg-10.col-lg-offset-1
             [:p "Designed, built and made in Amsterdam with all the love by " [:a {:href "http://twitter.com/bahadircambel"} "@bcambel"]]
             [:p
-              "Running version  " [:a {:href (str "https://github.com/bcambel/hackersome/commit/" VERSION)} (str "@" SHORTVERSION)]]
+              website " running version  " [:a {:href (str "https://github.com/bcambel/hackersome/commit/" VERSION)} (str "@" SHORTVERSION)]]
             [:p "Code licensed under " [:a {:href "https://github.com/bcambel/hackersome/blob/development/LICENSE"} :MIT]]
             [:hr]
             (when-not is-dev?


Stop event propagation with history-reset 'onBlur' event.

--- src/cljs/svg/app.cljs
+++ src/cljs/svg/app.cljs
@@ -47,7 +47,10 @@
                                   (.-target)
                                   (.-value)
                                   (from-history db h))))
-                 :onBlur (fn [e] (reset! active false))
+                 :onBlur (fn [e]
+                           (do
+                             (reset! active false)
+                             (.stopPropagation e)))
                  }]]])))

 (defn click-count-component


Use real file not test one.

Use real file not test one.

--- src/clojars/maven.clj
+++ src/clojars/maven.clj
@@ -27,7 +27,7 @@
 (defn read-vec
   "Produces a vector of clojure data structures read from file."
   [file]
-  (with-open [rdr (PushbackReader. (ds/reader "/tmp/jarspec.clj"))]
+  (with-open [rdr (PushbackReader. (ds/reader file))]
    (loop [v []]
      (let [x (read rdr false ::end)]
        (if (not= x ::end)


added server task

added server task

--- src/meta/boot.clj
+++ src/meta/boot.clj
@@ -21,16 +21,37 @@
   []
   (impl/proto-impl *opts*))

-(boot/deftask develop
-  "Build project for local development."
+(boot/deftask build
+  "Setup project builds."
   []
   (comp (wf/sync-repo)
-        (ver/version)
-        (fs/feathers)
+        (ver/version
+          :develop true
+          :minor inc
+          :patch ver/zero
+          :pre-release ver/snapshot)
+        (fs/feathers)))
+
+(boot/deftask client
+  "Build project client."
+  []
+  (comp (hl/hoplon)
+        ))
+
+(boot/deftask server
+  "Build project server."
+  []
+  (comp (nj/nodejs)
+        (cljs/cljs)
+        ))
+
+(boot/deftask develop
+  "Build entire project for local development."
+  []
+  (comp (build)
         (task/watch)
-        (hl/hoplon)
-        (nj/nodejs)
-        (cljs/cljs)
+        (client)
+        (server)
         (task/target)))

 (def dev develop)


include title in html

include title in html

--- src/otto/html.clj
+++ src/otto/html.clj
@@ -41,16 +41,17 @@
     [:table.table.table-condensed
      [:thead
       [:tr
-       [:th.name        "Name"]
+       [:th.name "Name"]
        [:th.description "Description"]
-       [:th.language    "Language"]
-       [:th.date        "Date"]]]
+       [:th.language "Language"]
+       [:th.date "Date"]]]
      [:tbody (for [[_ repository] repositories]
                (repository-detail repository))]]))

 (defn organization-view
   [organizations organization repositories]
   (html5 [:head
+          [:title (format "[%s] Repositories" (:name organization))]
           (include-css "bootstrap.min.css" "otto.css")]
          [:body
           [:div.container-fluid


ns-unmap was needed instead of ns-unalias

--- src/runtime/q.clj
+++ src/runtime/q.clj
@@ -10,7 +10,7 @@

 (ns runtime.q
   ;(:use runtime.testengine :reload-all)
-  (:refer clojure.test :exclude [deftest is])
+  (:refer clojure.test );can actually avoid this due to new definition of defalias; :exclude [deftest is])
   (:require flatland.useful.ns)
   ;(:use clojure.tools.trace)
   ;(:use runtime.clazzez :reload-all)
@@ -20,15 +20,34 @@
 (defmacro defalias
   [dst src]
   `(do
-     (ns-unalias *ns* '~dst)
+     (ns-unmap *ns* '~dst) ;this should help with REPL while reloading, to avoid some error when already defined due to :use when :exclude didn't contain the newly defined one
      (flatland.useful.ns/defalias ~dst ~src)
      )
   )
+
+(deftest test_defalias ;this test doesn't seem to actually work as I'd wanted
+  (try
+    (let [
+          a (defalias pr clojure.core/pr) ;before
+          expect (eval '(var runtime.q/pr))
+          ]
+      (is (= a expect ))
+      )
+    (catch Throwable e
+      (do
+        (ns-unmap *ns* pr) ;after
+        (throw e)
+        )
+      )
+    )
+  )

 ;(def deftest clojure.test/deftest)
 ;(ns-unalias *ns* is)
 (defalias deftest clojure.test/deftest)
 (defalias is clojure.test/is)
+
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 ;(defn ax [] (println 1))


Simplified code to pass query around instead of component parts

--- src/cfpb/qu/query/validation.clj
+++ src/cfpb/qu/query/validation.clj
@@ -13,7 +13,7 @@
   (or (not (:errors query))
       (zero? (reduce + (map count (:errors query))))))

-(defn valid-field? [metadata slice field]
+(defn valid-field? [{:keys [metadata slice]} field]
   (let [identifier-regex-str (.pattern parser/identifier-regex)
         concept-regex (re-pattern (str "__(" identifier-regex-str ")\\.(" identifier-regex-str ")"))
         [concept property] (if-let [match (re-matches concept-regex field)]
@@ -38,19 +38,19 @@
              (fnil #(conj % message) (vector))))

 (defn validate-field
-  [query clause metadata slice field]
+  [query clause field]
   (let [field (name field)]
-    (if (valid-field? metadata slice field)
+    (if (valid-field? query field)
       query
       (add-error query clause (str "\"" field "\" is not a valid field.")))))

 (defn- validate-select-fields
-  [query metadata slice select]
+  [query select]
   (let [fields (map (comp name #(cond
                                  (:aggregation %) (second (:aggregation %))
                                  :default (:select %))) select)]
-    (reduce #(validate-field %1 :select metadata slice %2) query fields)))
+    (reduce #(validate-field %1 :select %2) query fields)))

 (defn- validate-select-no-aggregations-without-group
   [query select]
@@ -79,11 +79,11 @@
     query))

 (defn- validate-select
-  [query metadata slice]
+  [query]
   (try
     (let [select (select/parse (str (:select query)))]
       (-> query
-          (validate-select-fields metadata slice select)
+          (validate-select-fields select)
           (validate-select-no-aggregations-without-group select)
           (validate-select-no-non-aggregated-fields select)))
     (catch Exception e
@@ -95,16 +95,20 @@
     query
     (add-error query :group "You must have a select clause to use grouping.")))

+(defn- convert-group-to-mongo-form
+  [group]
+  (if (coll? group)
+    (str "__" (str/join "." (map name group)))
+    group))
+
 (defn- validate-group-fields
-  [query group metadata slice]
-  (let [group (map (fn [g] (if (coll? g)
-                             (str "__" (str/join "." (map name g)))
-                             g)) group)]
-    (reduce #(validate-field %1 :group metadata slice %2) query group)))
+  [query group]
+  (let [group (map convert-group-to-mongo-form group)]
+    (reduce #(validate-field %1 :group %2) query group)))

 (defn- validate-group-only-group-dimensions
-  [query group dimensions]
-  (let [dimensions (set dimensions)]
+  [{:keys [slicedef] :as query} group]
+  (let [dimensions (set (:dimensions slicedef))]
     (reduce
      (fn [query field]
        (let [field (name field)]
@@ -114,14 +118,14 @@
      query (map first-or-identity group))))

 (defn- validate-group
-  [query metadata slice dimensions]
+  [query]
   (if-let [group (:group query)]
     (try
       (let [group (parse parser/group-expr group)]
         (-> query
             validate-group-requires-select
-            (validate-group-fields group metadata slice)
-            (validate-group-only-group-dimensions group dimensions)))
+            (validate-group-fields group)
+            (validate-group-only-group-dimensions group)))
       (catch Exception e
         (log/error "Exception:" (class e) e)
         (add-error query :group "Could not parse this clause.")))
@@ -183,8 +187,8 @@
           dimensions (:dimensions slicedef)]
       (-> query
           (assoc :errors {})
-          (validate-select metadata slice)
-          (validate-group metadata slice dimensions)
+          validate-select
+          validate-group
           validate-where
           validate-order-by
           validate-limit


1. link-to 추가

1. link-to 추가

--- src/clj/cauca/component/rest.clj
+++ src/clj/cauca/component/rest.clj
@@ -25,7 +25,7 @@
     [:body
      [:h1 "CAUCA API"]
      [:ul
-      [:li "/api/courtauction"
+      [:li (link-to "/api/courtauction" "/api/courtauction")
        [:ul
         [:li "법원 경매 정보 리스트 조회"]
         [:li "method:get"]


change resource paths, add brepl setting

--- src/clj/dokkaa_builder/pages.clj
+++ src/clj/dokkaa_builder/pages.clj
@@ -8,8 +8,10 @@
   (page/html5
    [:head]
    [:body body]
-   (page/include-js "/js/app.js")
-   (page/include-css "/css/style.css")))
+   (page/include-js "/app.js")
+   (page/include-css "/style.css")
+   (when-let [repl (browser-connected-repl-js)]
+     [:script repl])))

 (defn index []
   (layout


fix whitespace

fix whitespace

--- src/cljs/clj_money/entities.cljs
+++ src/cljs/clj_money/entities.cljs
@@ -51,7 +51,7 @@
         (util/space)
         [:a.btn.btn-danger {:href "/entities"}
          [:span.glyphicon.glyphicon-ban-circle {:aria-hidden "true"}]
-         (util/space) "Cancel"] ]])))
+         (util/space) "Cancel"]]])))

 (defn find-entity
   [id]


Remove prn

Remove prn

--- src/cljs/clojuredocs/sticky.cljs
+++ src/cljs/clojuredocs/sticky.cljs
@@ -50,7 +50,6 @@
                     left-margin (computed-style $parent :margin-left)
                     right-margin (computed-style $parent :margin-right)
                     width (- width left-padding right-padding left-margin right-margin)]
-                (prn (- (offset-top $el) px-offset))
                 (swap! starting-offset (fn [v]
                                          (if v
                                            v


Allow save only if new hyphenation is different from suggestion

To enable that add some more local state to the
hyphenation-pattern-item-ui component to hold the value of a suggested
hyphenation.

--- src/cljs/hyphen_keeper/core.cljs
+++ src/cljs/hyphen_keeper/core.cljs
@@ -71,16 +71,23 @@
    :format :json))

 (defn lookup-hyphenation-pattern!
-  [spelling word]
-  (ajax/GET "/api/hyphenate"
-   :params {:word word :spelling spelling}
-   :handler (fn [hyphenated]
-              (do
-                (swap! app-state assoc :suggested-hyphenation hyphenated)
-                (swap! app-state assoc :hyphenation hyphenated)))
-   :error-handler (fn [details]
-                    (.warn js/console
-                           (str "Failed to lookup hyphenation patterns for word: " details)))))
+  "Fetch the hyphenation pattern from the server for given `spelling`
+  and `word`. If a `handler` is given invoke it on success. Otherwise
+  use a default handler which updates the `app-state` in
+  `:suggested-hyphenation` and `:hyphenation`."
+  ([spelling word]
+   (let [handler (fn [hyphenated]
+                   (do
+                     (swap! app-state assoc :suggested-hyphenation hyphenated)
+                     (swap! app-state assoc :hyphenation hyphenated)))]
+     (lookup-hyphenation-pattern! spelling word handler)))
+  ([spelling word handler]
+   (ajax/GET "/api/hyphenate"
+             :params {:word word :spelling spelling}
+             :handler handler
+             :error-handler (fn [details]
+                              (.warn js/console
+                                     (str "Failed to lookup hyphenation patterns for word: " details))))))

 (defn hyphenation-pattern-ui [{:keys [word hyphenation]}]
   [:tr
@@ -102,10 +109,15 @@
       [:span.glyphicon.glyphicon-trash {:aria-hidden true}] " Delete"]]]])

 (defn- hyphenation-pattern-edit-ui
-  [word new-hyphenation stop save]
+  [word new-hyphenation new-suggestion stop save]
   (let [valid? (hyphenation-valid? @new-hyphenation word)
-        klass (when-not valid? "has-error")
-        help-text (when-not valid? "The hyphenation is not valid")]
+        same-as-suggested? (= @new-hyphenation @new-suggestion)
+        klass (cond
+                (not valid?) "has-error"
+                same-as-suggested? "has-warning")
+        help-text (cond
+                    (not valid?) "The hyphenation is not valid"
+                    same-as-suggested? "The hyphenation is the same as the suggestion")]
     [:tr
      [:td word]
      [:td
@@ -126,7 +138,7 @@
       [:div.btn-group
        [:button.btn.btn-default
         {:on-click save
-         :disabled (when-not valid? "disabled")}
+         :disabled (when (or (not valid?) same-as-suggested?) "disabled")}
         [:span.glyphicon.glyphicon-ok {:aria-hidden true}] " Save"]
        [:button.btn.btn-default
         {:on-click stop}
@@ -134,18 +146,22 @@

 (defn hyphenation-pattern-item-ui [{:keys [hyphenation] :as pattern}]
   (let [editing (reagent/atom false)
-        new-hyphenation (reagent/atom hyphenation)]
+        new-hyphenation (reagent/atom hyphenation)
+        new-suggestion (reagent/atom "")]
     (fn [{:keys [word hyphenation] :as pattern}]
       (let [stop #(do (reset! new-hyphenation hyphenation)
                       (reset! editing false))
-            start #(reset! editing true)
+            start #(do (reset! editing true)
+                       (lookup-hyphenation-pattern!
+                        @spelling word
+                        (fn [hyphenation] (reset! new-suggestion hyphenation))))
             save #(do (when (hyphenation-valid? @new-hyphenation word)
                         (add-hyphenation-pattern! (assoc pattern :hyphenation @new-hyphenation)))
                       (reset! editing false))
             remove #(remove-hyphenation-pattern! pattern)]
         (if-not @editing
           [hyphenation-pattern-readonly-ui word hyphenation start remove]
-          [hyphenation-pattern-edit-ui word new-hyphenation stop save])))))
+          [hyphenation-pattern-edit-ui word new-hyphenation new-suggestion stop save])))))

 (defn word-ui []
   (let [label "Word"


Clean up

Clean up

--- src/cljs/whatishistory/core.cljs
+++ src/cljs/whatishistory/core.cljs
@@ -75,7 +75,6 @@

 (defn data-valid [defn-data frm-mode]
   (let [nil-fields (filterv #(nil? (second %)) defn-data)]
-    (js/console.log (count nil-fields))
     (if-not (> (count nil-fields) 0)
       true
       (do


renaming

renaming

--- src/clojure_fabric/chaincode.clj
+++ src/clojure_fabric/chaincode.clj
@@ -46,48 +46,48 @@
 (defonce qscc-chaincode-header-extension
   (grpc/make-chaincode-header-extention query-system-chaincode))

-;;; System chaincode map
-(defrecord SystemChaincodeParts [chaincode-id header-extension proposal-payload])
-(defonce system-chaincode-parts
+;;;
+(defrecord SystemChaincodeRequestParts [chaincode-id header-extension proposal-payload])
+(defonce system-chaincode-request-parts
   {:query-installed-chaincodes
-   (map->SystemChaincodeParts
+   (map->SystemChaincodeRequestParts
     {:chaincode-id lifecycle-system-chaincode
      :header-extension lscc-chaincode-header-extension
      :proposal-payload (grpc/make-proposal-payload lifecycle-system-chaincode
                                                    "queryinstalledchaincodes"
                                                    [])})
    :query-info
-   (map->SystemChaincodeParts
+   (map->SystemChaincodeRequestParts
     {:chaincode-id query-system-chaincode
      :header-extension qscc-chaincode-header-extension
      :proposal-payload (partial grpc/make-proposal-payload
                                 lifecycle-system-chaincode "GetChainInfo")})

    :query-block-by-hash
-   (map->SystemChaincodeParts
+   (map->SystemChaincodeRequestParts
     {:chaincode-id query-system-chaincode
      :header-extension qscc-chaincode-header-extension
      :proposal-payload (partial grpc/make-proposal-payload
                                 lifecycle-system-chaincode "GetBlockByHash")})

    :query-block
-   (map->SystemChaincodeParts
+   (map->SystemChaincodeRequestParts
     {:chaincode-id query-system-chaincode
      :header-extension qscc-chaincode-header-extension
      :proposal-payload (partial grpc/make-proposal-payload
                                 lifecycle-system-chaincode "GetBlockByNumber")})

    :query-transaction
-   (map->SystemChaincodeParts
+   (map->SystemChaincodeRequestParts
     {:chaincode-id query-system-chaincode
      :header-extension qscc-chaincode-header-extension
      :proposal-payload (partial grpc/make-proposal-payload
                                 lifecycle-system-chaincode "GetTransactionByID")})})

-(defn get-system-chaincode-parts
+(defn get-system-chaincode-request-parts
   [k & {:keys [args]}]
   (let [{:keys [chaincode-id header-extension proposal-payload] :as parts}
-        (system-chaincode-parts k)]
+        (system-chaincode-request-parts k)]
     (if (fn? proposal-payload)
       (assoc parts :proposal-payload (proposal-payload args))
       parts)))


Implement transaction event

Implement transaction event

--- src/clojure_fabric/event_hub.clj
+++ src/clojure_fabric/event_hub.clj
@@ -24,7 +24,7 @@
             Common$Envelope]
            [org.hyperledger.fabric.protos.peer EventsGrpc EventsPackage$Event
             EventsPackage$Interest EventsPackage$Register EventsPackage$Event$EventCase
-            EventsPackage$SignedEvent]))
+            EventsPackage$SignedEvent TransactionPackage$TxValidationCode]))

 ;; From NodeJs SDK
@@ -117,7 +117,7 @@

 (defonce default-sliding-buffer-size 32)
 ;; Block event - any block events
-(defonce block-event-channels (atom []))
+(defonce event-channels (atom []))
 ;; Transaction event - matching tx-id
 (defonce tx-id-event-channels (atom {}))
 ;; Chaincode event - matching chaincode-id
@@ -128,21 +128,94 @@
           [Common$BlockMetadataIndex/SIGNATURES_VALUE Common$BlockMetadataIndex/LAST_CONFIG_VALUE
            Common$BlockMetadataIndex/TRANSACTIONS_FILTER_VALUE Common$BlockMetadataIndex/ORDERER_VALUE]))

-(defn deliver-block-to-channels
+(defonce tx-validation-code-map
+  (zipmap [TransactionPackage$TxValidationCode/VALID_VALUE
+           TransactionPackage$TxValidationCode/NIL_ENVELOPE_VALUE
+           TransactionPackage$TxValidationCode/BAD_PAYLOAD_VALUE
+           TransactionPackage$TxValidationCode/BAD_COMMON_HEADER_VALUE
+           TransactionPackage$TxValidationCode/BAD_CREATOR_SIGNATURE_VALUE
+           TransactionPackage$TxValidationCode/INVALID_ENDORSER_TRANSACTION_VALUE
+           TransactionPackage$TxValidationCode/INVALID_CONFIG_TRANSACTION_VALUE
+           TransactionPackage$TxValidationCode/UNSUPPORTED_TX_PAYLOAD_VALUE
+           TransactionPackage$TxValidationCode/BAD_PROPOSAL_TXID_VALUE
+           TransactionPackage$TxValidationCode/DUPLICATE_TXID_VALUE
+           TransactionPackage$TxValidationCode/ENDORSEMENT_POLICY_FAILURE_VALUE
+           TransactionPackage$TxValidationCode/MVCC_READ_CONFLICT_VALUE
+           TransactionPackage$TxValidationCode/PHANTOM_READ_CONFLICT_VALUE
+           TransactionPackage$TxValidationCode/UNKNOWN_TX_TYPE_VALUE
+           TransactionPackage$TxValidationCode/TARGET_CHAIN_NOT_FOUND_VALUE
+           TransactionPackage$TxValidationCode/MARSHAL_TX_ERROR_VALUE
+           TransactionPackage$TxValidationCode/NIL_TXACTION_VALUE
+           TransactionPackage$TxValidationCode/EXPIRED_CHAINCODE_VALUE
+           TransactionPackage$TxValidationCode/CHAINCODE_VERSION_CONFLICT_VALUE
+           TransactionPackage$TxValidationCode/BAD_HEADER_EXTENSION_VALUE
+           TransactionPackage$TxValidationCode/BAD_CHANNEL_HEADER_VALUE
+           TransactionPackage$TxValidationCode/BAD_RESPONSE_PAYLOAD_VALUE
+           TransactionPackage$TxValidationCode/BAD_RWSET_VALUE
+           TransactionPackage$TxValidationCode/ILLEGAL_WRITESET_VALUE
+           TransactionPackage$TxValidationCode/INVALID_OTHER_REASON_VALUE]
+          [:valid
+           :nil-envelope
+           :bad-payload
+           :bad-common-header
+           :bad-creator-signature
+           :invalid-endorser-transaction
+           :invalid-config-transaction
+           :unsupported-tx-payload
+           :bad-proposal-txid
+           :duplicate-txid
+           :endorsement-policy-failure
+           :mvcc-read-conflict
+           :phantom-read-conflict
+           :unknown-tx-type
+           :target-chain-not-found
+           :marshal-tx-error
+           :nil-txaction
+           :expired-chaincode
+           :chaincode-version-conflict
+           :bad-header-extension
+           :bad-channel-header
+           :bad-response-payload
+           :bad-rwset
+           :illegal-writeset
+           :invalid-other-reason]))
+
+;; Block event is proto/Block
+(defrecord TxEvent [tx-id status])
+
+(defn tx-id->channel [tx-id]
+  :fixme)
+
+(defn deliver-block-events-to-channels
   [^Common$Block proto-block]
   (let [clj-block (proto/proto->clj proto-block {})]
-   (async/put! block-channel clj-block)
-
-   (let [tx-filter (-> (:metadata clj-block)
-                       (:metadata)
-                       (nth (block-metadata-index-map :transactions-filter)))]
-     (doseq [data (:data clj-block)]
-       (let [tx-id (-> (Common$Envelope/parseFrom ^bytes data)
-                       (proto/proto->clj {})
-                       (:payload)
-                       (:header)
-                       (:channel-header)
-                       (:tx-id))])))))
+    ;; 1. Block Event on all channels
+    (async/put! block-channel clj-block)
+    (doseq [[data code] (map list
+                             (:data clj-block)
+                             (-> (:metadata clj-block)
+                                 (:metadata)
+                                 (nth (block-metadata-index-map :transactions-filter))
+                                 (.toByteArray)))]
+      (let [payload (-> (Common$Envelope/parseFrom ^bytes data)
+                        (proto/proto->clj {})
+                        (:payload envelope))
+            channel-header (-> payload (:header) (:channel-header))]
+        ;; 2. Transaction Event with tx-id
+        (when-let [ch (tx-id->channel tx-id)]
+          (async/put! ch
+                      (make-TxEvent (:tx-id channel-header) code)))
+        ;; 3. Chaincode event
+        (when (= (:type channel-header) (proto/header-types :endorser-transaction))
+          (-> (:data payload)
+              ;; FIXME use toplevel prot->clj opts
+              ;; Add record for TransactionPackage$Transaction
+              (TransactionPackage$Transaction/parseFrom)
+              ;; YOU'RE HERE
+              ))
+        ))
+
+    ))


CMR-694: URL encoding native id.

CMR-694: URL encoding native id.

--- src/cmr/transmit/metadata_db.clj
+++ src/cmr/transmit/metadata_db.clj
@@ -6,6 +6,7 @@
             [cheshire.core :as cheshire]
             [clojure.walk :as walk]
             [cmr.system-trace.http :as ch]
+            [ring.util.codec :as codec]
             [cmr.transmit.connection :as conn]
             [cmr.common.log :refer (debug info warn error)]))

@@ -43,7 +44,8 @@
   "Return a distinct identifier for the given arguments."
   [context concept-type provider-id native-id]
   (let [conn (config/context->app-connection context :metadata-db)
-        request-url (str (conn/root-url conn) "/concept-id/" (name concept-type) "/" provider-id "/" native-id)
+        request-url (str (conn/root-url conn) "/concept-id/" (name concept-type) "/" provider-id "/"
+                         (codec/url-encode native-id))
         response (client/get request-url {:accept :json
                                           :headers (ch/context->http-headers context)
                                           :throw-exceptions false


cjl - Fix solution format

cjl - Fix solution format

--- src/icfp2015/core.clj
+++ src/icfp2015/core.clj
@@ -21,7 +21,7 @@
 (defn solve-game [game]
   { :problemId (:problemId game)
     :seed (:seed game)
-    :solution [""] })
+    :solution (apply str (repeat 3 "a")) })

 (def cli-options
   [["-f" "--file FILE" "Input filename"


add unpushed-commit to status view

add unpushed-commit to status view

--- src/leiningen/git.clj
+++ src/leiningen/git.clj
@@ -41,8 +41,8 @@
       {:status :added}
       {:status :failed})))

-(defn unpushed-commit []
-  (u/output-of (sh/sh "git" "diff" "origin/master..HEAD" "--name-only")))
+(defn unpushed-commit-changes []
+  (u/output-of (sh/sh "git" "diff" "origin/master..HEAD" "--name-only") " "))

 (defn reset-project! [project]
   (if (u/is-success? (sh/sh "git" "checkout" "."))
@@ -75,19 +75,22 @@
        :cause   (u/sub-str (u/error-of push-result " ") output-length)})))

 (defn check-and-push! [project]
-  (if (empty? (unpushed-commit))
+  (if (empty? (unpushed-commit-changes))
     {:project project :status :skipped :cause "Nothing to push on"}
     (if (= "y" (-> (str "\n* Are you sure to push on " project "? (y/n)")
                    (u/ask-user u/yes-or-no)))
       (push! project))))

 (defn status [project]
-  (let [status-result (sh/sh "git" "status" "--short")]
+  (let [status-result (sh/sh "git" "status" "--short")
+        unpushed-changes (unpushed-commit-changes)]
     (if (u/is-success? status-result)
-      {:project project
-       :status  (if (empty? (u/output-of status-result ""))
-                  :no-change
-                  (u/output-of status-result " "))}
+      {:project  project
+       :status   (if (empty? (u/output-of status-result ""))
+                   :no-change
+                   (u/output-of status-result " "))
+       :unpushed-commit-change (if (empty? unpushed-changes)
+                                 :no-change unpushed-changes)}
       {:project project :status (status-failed)})))

 (defn commit! [project commit-msg]


Handle more types of project metadata.

Handle more types of project metadata.

:url, :mailing-list, :mailing-lists, :licence, :license,
:licences, :licenses will now be used in pom.xml if found
in project.clj.

--- src/leiningen/pom.clj
+++ src/leiningen/pom.clj
@@ -4,7 +4,7 @@
         [clojure.contrib.properties :only [as-properties]])
   (:import [java.io StringWriter ByteArrayOutputStream]
            [org.apache.maven.model Build Model Parent Dependency
-            Exclusion Repository Scm]
+            Exclusion Repository Scm License MailingList]
            [org.apache.maven.project MavenProject]))

 (def #^{:doc "A notice to place at the bottom of generated files."} disclaimer
@@ -93,6 +93,26 @@
     (.setId id)
     (.setUrl url)))

+(defn make-license [{:keys [name url distribution comments]}]
+  (doto (License.)
+    (.setName name)
+    (.setUrl url)
+    (.setDistribution (and distribution (clojure.core/name distribution)))
+    (.setComments comments)))
+
+(defn make-mailing-list [{:keys [name archive other-archives
+                                 post subscribe unsubscribe]}]
+  (let [mailing-list (MailingList.)]
+    (doto mailing-list
+      (.setName name)
+      (.setArchive archive)
+      (.setPost post)
+      (.setSubscribe subscribe)
+      (.setUnsubscribe unsubscribe))
+    (doseq [other-archive other-archives]
+      (.addOtherArchive mailing-list other-archive))
+    mailing-list))
+
 (def default-repos {"central" "http://repo1.maven.org/maven2"
                     "clojure" "http://build.clojure.org/releases"
                     "clojure-snapshots" "http://build.clojure.org/snapshots"
@@ -109,7 +129,8 @@
                 (.setName (:name project))
                 (.setVersion (:version project))
                 (.setGroupId (:group project))
-                (.setDescription (:description project)))
+                (.setDescription (:description project))
+                (.setUrl (:url project)))
         build (doto (Build.)
                 (.setSourceDirectory (relative-path project :source-path))
                 (.setTestSourceDirectory (relative-path project :test-path)))]
@@ -120,6 +141,14 @@
       (.addRepository model (make-repository repo)))
     (when-let [scm (make-git-scm (file (:root project) ".git"))]
       (.setScm model scm))
+    (doseq [license (concat (keep #(% project)
+                                  [:licence :license])
+                            (:licences project)
+                            (:licenses project))]
+      (.addLicense model (make-license license)))
+    (doseq [mailing-list (concat (if-let [ml (:mailing-list project)] [ml] [])
+                                 (:mailing-lists project))]
+      (.addMailingList model (make-mailing-list mailing-list)))
     model))

 (defn make-pom


Add missing :gen-class directive

Add missing :gen-class directive

Signed-off-by: Daniel Borchmann <3d0f3b9ddcacec30c4008c5e030e6c13a478cb4f@algebra20.de>

--- src/main/clojure/conexp/main.clj
+++ src/main/clojure/conexp/main.clj
@@ -9,7 +9,8 @@
 (ns conexp.main
   "Main namespace for conexp-clj."
   (:require [clojure.tools.cli :as cli])
-  (:require [reply.main :as reply]))
+  (:require [reply.main :as reply])
+  (:gen-class))

 ;;;


Add initial streams support using reactive-streams abstraction.

--- src/futura/stream.clj
+++ src/futura/stream.clj
@@ -0,0 +1,108 @@
+(ns futura.stream
+  (:require [clojure.core.async :refer [put! take! chan <! >! go close! go-loop onto-chan]]
+            [futura.atomic :as atomic])
+  (:import org.reactivestreams.Publisher
+           org.reactivestreams.Subscriber
+           org.reactivestreams.Subscription))
+
+(defn- vec->subscription
+  [subscriber source xform]
+  (let [index (atomic/long 0)
+        completed (atomic/boolean false)
+        queue (agent nil)
+        length (count source)]
+    (letfn [(process [_ ^long n]
+              (when-not @completed
+                (loop [n n]
+                  (when (and (pos? n) (not @completed))
+                    (let [i (atomic/get-and-inc! index)]
+                      (.onNext subscriber (get source i))
+                      (when (= i (dec length))
+                        (.onComplete subscriber)
+                        (atomic/set! completed true)))
+                    (recur (dec n))))))]
+      (reify Subscription
+        (^void request [_ ^long n]
+          (when (atomic/compare-and-set! completed false false)
+            (send queue process n)))
+        (^void cancel [_]
+          (atomic/set! completed true))))))
+
+(defn- seq->subscription
+  [subscriber source xform]
+  (let [completed (atomic/boolean false)
+        queue (agent source)
+        length (count source)]
+    (letfn [(process [state ^long n]
+              (if @completed
+                state
+                (loop [n n state' state]
+                  (if (and (pos? n) (not @completed))
+                    (if-let [value (first state')]
+                      (do
+                        (.onNext subscriber value)
+                        (recur (dec n)
+                               (rest state')))
+                      (do
+                        (.onComplete subscriber)
+                        nil))
+                    state'))))]
+      (reify Subscription
+        (^void request [_ ^long n]
+          (when-not @completed
+            (send queue process n)))
+        (^void cancel [_]
+          (atomic/set! completed true))))))
+
+(defn- chan->subscription
+  [subscriber source xform]
+  (let [completed (atomic/boolean false)
+        requests (chan 256)]
+    (letfn [(pipeline [n]
+              (go-loop [n n]
+                (when (and (pos? n) (not @completed))
+                  (if-let [value (<! source)]
+                    (do
+                      (.onNext subscriber value)
+                      (recur (dec n)))
+                    (do
+                      (.onComplete subscriber)
+                      (atomic/set! completed true))))))]
+      (go-loop []
+        (when-let [n (<! requests)]
+          (when-not @completed
+            (<! (pipeline n))
+            (recur))))
+      (reify Subscription
+        (^void request [_ ^long n]
+          (when-not @completed
+            (put! requests n)))
+        (^void cancel [_]
+          (atomic/set! completed true)
+          (close! requests))))))
+
+(defmulti publisher
+  "A polymorphic publisher constructor."
+  (fn [source & [xform]]
+    (class source)))
+
+(defmethod publisher clojure.lang.IPersistentVector
+  [source & [xform]]
+  (reify Publisher
+    (^void subscribe [_ ^Subscriber subscriber]
+      (let [subscription (vec->subscription subscriber source xform)]
+        (.onSubscribe subscriber subscription)))))
+
+(defmethod publisher clojure.lang.ISeq
+  [source & [xform]]
+  (reify Publisher
+    (^void subscribe [_ ^Subscriber subscriber]
+      (let [subscription (seq->subscription subscriber source xform)]
+        (.onSubscribe subscriber subscription)))))
+
+(defmethod publisher clojure.core.async.impl.channels.ManyToManyChannel
+  [source & [xform]]
+  (reify Publisher
+    (^void subscribe [_ ^Subscriber subscriber]
+      (let [subscription (chan->subscription subscriber source xform)]
+        (.onSubscribe subscriber subscription)))))


Log printed bad key lookup

Log printed bad key lookup

--- src/onyx/peer/task_lifecycle.clj
+++ src/onyx/peer/task_lifecycle.clj
@@ -29,7 +29,7 @@
   (let [rets ((:onyx.core/compiled-start-task-fn event) event)]
     (when-not (:onyx.core/start-lifecycle? rets)
       (timbre/info (format "[%s / %s] Lifecycle chose not to start the task yet. Backing off and retrying..."
-                           (:onx.core/id rets) (:onyx.core/lifecycle-id rets))))
+                           (:onyx.core/id rets) (:onyx.core/lifecycle-id rets))))
     rets))

 (defn add-acker-id [peers m]


dont fail on null

dont fail on null

--- backend/src/lambdaui/core.clj
+++ backend/src/lambdaui/core.clj
@@ -27,8 +27,8 @@
 (defn create-config [pipeline]
   (let [config (get-in pipeline [:context :config :ui-config])
         name (or (:name config) "Pipeline")
-        location (or (-> :location config
-                         extract-location) "window.location")
+        location (or (extract-location (:location config))
+                     "window.location")
         path-prefix  (:path-prefix config)

         prefix (if path-prefix (str " + '" path-prefix "'") "")


Supress server middleware logging by default in dev

--- dev-src/braid/dev/core.clj
+++ dev-src/braid/dev/core.clj
@@ -13,6 +13,36 @@
    ;; the following namespaces are required for their mount components:
    [braid.core]
    [braid.dev.figwheel]))
+
+(defn- disable-ns-logging!
+  [ns-name]
+  (taoensso.timbre/swap-config!
+    (fn [c]
+      (if (map? (:ns-filter c))
+        (update-in c [:ns-filter :deny]
+                   (fnil conj #{})
+                   ns-name)
+        (update c :ns-filter
+                (fn [f] {:allow f :deny #{ns-name}}))))))
+
+(defn disable-request-logging!
+  []
+  (doseq [ns ["braid.core.server.middleware"
+              "braid.base.server.ws-handler"
+              "braid.base.server.cqrs"]]
+    (disable-ns-logging! ns)))
+
+(defn disable-startup-logging!
+  []
+  (doseq [ns ["braid.core.server.email-digest"
+              "braid.base.server.scheduler"
+              "braid.core.server.core"]]
+    (disable-ns-logging! ns)))
+
+(defn disable-seed-logging!
+  []
+  (doseq [seed-ns ["braid.chat.seed"]]
+    (disable-ns-logging! seed-ns)))

 (defn drop-db!
   "Drops the database (and also the database connection).
@@ -45,6 +75,7 @@
                          (assoc :aws/credentials-provider
                                 (constantly ((juxt :aws-access-key :aws-secret-key) env)))))
       (mount/start))
+  (disable-ns-logging! "braid.core.server.middleware")
   (when (zero? port)
     (mount/stop #'braid.base.conf/config)
     (mount/start #'braid.base.conf/config)))
@@ -53,33 +84,3 @@
   "Helper function for stopping all Braid components."
   []
   (mount/stop))
-
-(defn- disable-ns-logging!
-  [ns-name]
-  (taoensso.timbre/swap-config!
-    (fn [c]
-      (if (map? (:ns-filter c))
-        (update-in c [:ns-filter :deny]
-                   (fnil conj #{})
-                   ns-name)
-        (update c :ns-filter
-                (fn [f] {:allow f :deny #{ns-name}}))))))
-
-(defn disable-request-logging!
-  []
-  (doseq [ns ["braid.core.server.middleware"
-              "braid.base.server.ws-handler"
-              "braid.base.server.cqrs"]]
-    (disable-ns-logging! ns)))
-
-(defn disable-startup-logging!
-  []
-  (doseq [ns ["braid.core.server.email-digest"
-              "braid.base.server.scheduler"
-              "braid.core.server.core"]]
-    (disable-ns-logging! ns)))
-
-(defn disable-seed-logging!
-  []
-  (doseq [seed-ns ["braid.chat.seed"]]
-    (disable-ns-logging! seed-ns)))


universal link fix

universal link fix

fix for universal link not opening properly when app was closed with
back button, returning nil instead of the url

Signed-off-by: yenda <96f164ad4d9b2b0dacf8ebee2bb1eeb3aa69adf1@status.im>

--- src/status_im/utils/universal_links/core.cljs
+++ src/status_im/utils/universal_links/core.cljs
@@ -183,9 +183,13 @@
   and handles incoming url if the app has been started by clicking on a link"
   []
   (log/debug "universal-links: initializing")
-  (.. react/linking
-      (getInitialURL)
-      (then dispatch-url))
+  ;;NOTE: https://github.com/facebook/react-native/issues/15961
+  ;; workaround for getInitialURL returning null when opening the
+  ;; app from a universal link after closing it with the back button
+  (js/setTimeout #(.. react/linking
+                      (getInitialURL)
+                      (then dispatch-url))
+                 200)
   (.. react/linking
       (addEventListener "url" url-event-listener)))


Add link to new CLJS ticket

Add link to new CLJS ticket

--- src/test/clojure/clojure/test/check/test.cljc
+++ src/test/clojure/clojure/test/check/test.cljc
@@ -960,7 +960,8 @@
 ;; TCHECK-32 Regression
 ;; ---------------------------------------------------------------------------

-;; This gives a stack error in CLJS, don't know why
+;; This gives a stack error in CLJS, probably because of
+;; http://dev.clojure.org/jira/browse/CLJS-1594
 #?(:clj
    (defspec merge-is-idempotent-and-this-spec-doesn't-OOM 200
      (prop/for-all [m (gen/map gen/any gen/any)]


Update dependencies (backend).

Update dependencies (backend).

--- backend/project.clj
+++ backend/project.clj
@@ -11,12 +11,11 @@
   ;;            "-Djava.rmi.server.hostname=0.0.0.0"]
   :dependencies [[org.clojure/clojure "1.9.0-alpha14"]
                  [org.clojure/tools.logging "0.3.1"]
-                 [funcool/struct "1.0.0"]
                  [funcool/suricatta "1.3.1"]
-                 [funcool/promesa "1.7.0"]
-                 [funcool/catacumba "2.0.0-SNAPSHOT"]
-                 [funcool/cuerdas "2.0.2"]
-                 [funcool/datoteka "1.0.0-SNAPSHOT"]
+                 [funcool/promesa "1.8.0"]
+                 [funcool/catacumba "2.0.0"]
+                 [funcool/cuerdas "2.0.3"]
+                 [funcool/datoteka "1.0.0"]

                  [org.clojure/data.xml "0.1.0-beta2"]
                  [org.jsoup/jsoup "1.10.2"]
@@ -24,22 +23,22 @@
                  [hiccup "1.0.5"]
                  [org.im4java/im4java "1.4.0"]

-                 [org.slf4j/slf4j-simple "1.7.22"]
+                 [org.slf4j/slf4j-simple "1.7.23"]
                  [com.layerware/hugsql-core "0.4.7"
                   :exclusions [org.clojure/tools.reader]]
                  [niwinz/migrante "0.1.0"]

-                 [buddy/buddy-sign "1.4.0" :exclusions [org.clojure/tools.reader]]
+                 [buddy/buddy-sign "1.4.0"]
                  [buddy/buddy-hashers "1.2.0"]

                  [org.xerial.snappy/snappy-java "1.1.2.6"]
                  [com.github.spullara.mustache.java/compiler "0.9.4"]
-                 [org.postgresql/postgresql "9.4.1212"]
+                 [org.postgresql/postgresql "42.0.0"]
                  [org.quartz-scheduler/quartz "2.2.3"]
                  [org.quartz-scheduler/quartz-jobs "2.2.3"]
                  [commons-io/commons-io "2.5"]
-                 [com.draines/postal "2.0.2"]
+                 [com.draines/postal "2.0.2" :exclusions [commons-codec]]

                  [hikari-cp "1.7.5"]
                  [mount "0.1.11"]


more terse

more terse

--- src/nonaga/react.cljs
+++ src/nonaga/react.cljs
@@ -3,7 +3,7 @@
   (:require [nonaga.core :as n])
   (:use-macros [dommy.macros :only [sel1]]))

-(defn hex-coord->svg-coord [[hex-x hex-y]]
+(defn hex->svg [[hex-x hex-y]]
   (let [x (+ 20 (* 40 hex-x) (if (odd? hex-y) 20 0))
         y (+ 20 (* 40 hex-y))]
     [x y]))
@@ -17,14 +17,9 @@
            "strokeWidth" "7px"
            "key"         (str "ring:" x "," y)}))

-(defn draw-rings [coords]
-  (->> coords
-       (map hex-coord->svg-coord)
-       (map ring)))
-
 (def board
   (create-class
-    "render" #(svg {} (draw-rings (:rings n/initial-game)))))
+    "render" #(svg {} (map (comp ring hex->svg) (:rings n/initial-game)))))

 (defn start []
   (render-component (board) (sel1 :#content)))


more config into atom

more config into atom

--- src/om_pear/core.cljs
+++ src/om_pear/core.cljs
@@ -11,6 +11,7 @@
                    (clj->js [{:name "Bob Fleming" :address "230 Oak St., NJ USA"}
                           {:name "Rick Rearden" :address "91 Windings Way, Clement OK 28174"}])
                    :config (clj->js {:AllowColumnResize true :ShowCellBorder true :AllowAlternateRowHighlight true})
+                   :width 500 :height 150 :title "My Test Grid"
                    }))

 (defn ^:export om-pear [app-state owner]
@@ -19,8 +20,9 @@
                   (.setColumns g (:columns @mygrid))
                   (.setDataRows g (:data @mygrid))
                   (.setConfiguration g (:config @mygrid) )
-                  (.setWidth g 500)
-                  (.setHeight g 200)
+                  (.setWidth g (:width @mygrid))
+                  (.setHeight g (:height @mygrid))
+                  (.setTitle g (:title @mygrid))
                   (.render g (. js/document (getElementById "grid2")))
                   ;; (js/console.log g)
                   dom-ele)))


do not check running entry when entry is not started by bot

--- src/panpan/hestia.clj
+++ src/panpan/hestia.clj
@@ -3,6 +3,7 @@
     [clojure.string    :as str]
     [jubot.adapter     :as ja]
     [jubot.handler     :as jh]
+    [jubot.brain       :as jb]
     [jubot.scheduler   :as js]
     [panpan.util.match :refer :all]
     [panpan.toggl.api  :as toggl]))
@@ -16,6 +17,7 @@
 (def ^:const REST_PID "3141045")
 (def ^:const WARN_SEC (* 25 60)) ; 25 min
 (def ^:const REST_WARN_SEC (* 5 60)) ; 5 min
+(def ^:const RUNNING_KEY "toggl_running")

 (def ^:const MESSAGES ; {{{
@@ -85,6 +87,7 @@
     #"^(.+?).*(を)?(開始|始め|はじめ)"
     (matchfn [desc]
       (toggl/start-entry desc :pid (desc->pid desc))
+      (jb/set RUNNING_KEY "true")
       (->> MESSAGES :start-entry rand-nth (out "@" user " ")))
     #"^(再開|さいかい)"
     (matchfn []
@@ -95,10 +98,12 @@
     #"^(終了|終わった|おわった|おわた)"
     (matchfn []
       (when (toggl/stop-entry)
+        (jb/set RUNNING_KEY nil)
         (->> MESSAGES :stop-entry rand-nth (out "@" user " "))))
     #"^(神様|神さま).*(違い|違う|消して|けして)"
     (matchfn []
       (let [key (if (toggl/delete-entry) :delete-entry :no-entry-to-delete)]
+        (jb/set RUNNING_KEY nil)
         (->> MESSAGES
              key
              rand-nth
@@ -106,6 +111,7 @@
     #"^(神様|神さま).*(休憩|一休み)"
     (matchfn []
       (->> MESSAGES :start-rest rand-nth (out "@" user " "))
+      (jb/set RUNNING_KEY "true")
       (toggl/start-entry "休憩" :pid REST_PID)
       nil)

@@ -129,11 +135,12 @@
 (def hestia-schedule
   (js/schedules
     "0 /5 * * * * *"
-    #(when-let [{:keys [pid sec]} (toggl/get-running-entry)]
-       (cond
-         (and (= (str pid) REST_PID) (> sec REST_WARN_SEC))
-         (->> MESSAGES :rest-warn rand-nth (out "@uochan "))
+    #(when (jb/get RUNNING_KEY)
+       (when-let [{:keys [pid sec]} (toggl/get-running-entry)]
+         (cond
+           (and (= (str pid) REST_PID) (> sec REST_WARN_SEC))
+           (->> MESSAGES :rest-warn rand-nth (out "@uochan "))

-         (> sec WARN_SEC)
-         (->> MESSAGES :warn rand-nth (out "@uochan "))))
+           (> sec WARN_SEC)
+           (->> MESSAGES :warn rand-nth (out "@uochan ")))))
     ))


Improve wording and add more tips to the defscreen docstring

--- src/play_clj/core.clj
+++ src/play_clj/core.clj
@@ -138,10 +138,11 @@
         entities))

     ; input functions
+    ; Tip: use input-processor! to run these functions manually
     (defscreen my-screen
       :on-key-down ; a key was pressed
       (fn [screen entities]
-        (println (:key screen)) ; the code of the key (see key-code)
+        (println (:key screen)) ; the key that was pressed (see key-code)
         entities)
       :on-key-typed ; a key was typed
       (fn [screen entities]
@@ -149,7 +150,7 @@
         entities)
       :on-key-up ; a key was released
       (fn [screen entities]
-        (println (:key screen)) ; the code of the key (see key-code)
+        (println (:key screen)) ; the key that was released (see key-code)
         entities)
       :on-mouse-moved ; the mouse was moved without pressing any buttons
       (fn [screen entities]
@@ -165,7 +166,7 @@
         (println (:input-x screen)) ; the x position of the finger/mouse
         (println (:input-y screen)) ; the y position of the finger/mouse
         (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
         entities)
       :on-touch-dragged ; a finger or the mouse was dragged
       (fn [screen entities]
@@ -178,220 +179,225 @@
         (println (:input-x screen)) ; the x position of the finger/mouse
         (println (:input-y screen)) ; the y position of the finger/mouse
         (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
+        (println (:button screen)) ; the mouse button that was released (see button-code)
         entities))

     ; gesture functions
-    (defscreen my-screen
-      :on-fling ; the user dragged a finger over the screen and lifted it
+    ; Tip: use gesture-detector! to configure these functions and run them manually
+    (defscreen my-screen
+      :on-fling ; the user dragged over the screen and lifted
       (fn [screen entities]
         (println (:velocity-x screen)) ; the x-axis velocity (s)
         (println (:velocity-y screen)) ; the y-axis velocity (s)
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-long-press ; the user pressed
-      (fn [screen entities]
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-long-press ; the user pressed for a long time
+      (fn [screen entities]
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        entities)
+      :on-pan ; the user dragged a finger over the screen
+      (fn [screen entities]
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:delta-x screen)) ; the x-axis distance moved
+        (println (:delta-y screen)) ; the y-axis distance moved
+        entities)
+      :on-pan-stop ; the user is no longer panning
+      (fn [screen entities]
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-pinch ; the user performed a pinch zoom gesture
+      (fn [screen entities]
+        (println (:initial-pointer-1 screen)) ; the start position of finger 1 (see the x and y functions)
+        (println (:initial-pointer-2 screen)) ; the start position of finger 2 (see the x and y functions)
+        (println (:pointer-1 screen)) ; the end position of finger 1 (see the x and y functions)
+        (println (:pointer-2 screen)) ; the end position of finger 2 (see the x and y functions)
+        entities)
+      :on-tap ; the user tapped
+      (fn [screen entities]
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:count screen)) ; the number of taps
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-zoom ; the user performed a pinch zoom gesture
+      (fn [screen entities]
+        (println (:initial-distance screen)) ; the start distance between fingers
+        (println (:distance screen)) ; the end distance between fingers
+        entities))
+
+    ; 2D physics contact (for play-clj.g2d-physics)
+    ; Tip: use first-entity and second-entity to get the get the entities that are contacting
+    (defscreen my-screen
+      :on-begin-contact ; two bodies began to touch
+      (fn [screen entities]
+        (println (:contact screen)) ; the Contact - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/physics/box2d/Contact.html
+        entities)
+      :on-end-contact ; two bodies ceased to touch
+      (fn [screen entities]
+        (println (:contact screen)) ; the Contact - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/physics/box2d/Contact.html
+        entities))
+
+    ; 3D physics contact (for play-clj.g3d-physics)
+    ; Tip: use first-entity and second-entity to get the get the entities that are contacting
+    (defscreen my-screen
+      :on-begin-contact ; two bodies began to touch
+      (fn [screen entities]
+        (println (:first-body screen)) ; the first btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
+        (println (:second-body screen)) ; the second btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
+        entities)
+      :on-end-contact ; two bodies ceased to touch
+      (fn [screen entities]
+        (println (:first-body screen)) ; the first btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
+        (println (:second-body screen)) ; the second btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
+        entities))
+
+    ; ui input functions (for play-clj.ui)
+    ; Tip: use change-listener! and click-listener! to configure these functions and run them manually
+    (defscreen my-screen
+      :on-ui-changed ; the ui entity was changed
+      (fn [screen entities]
+        (println (:event screen)) ; the ChangeListener.ChangeEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/ChangeListener.ChangeEvent.html
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
+        entities)
+      :on-ui-clicked ; the ui entity was clicked
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        entities)
+      :on-ui-enter ; the finger/mouse moved over the ui entity
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities)
+      :on-ui-exit ; the finger/mouse moved out of the ui entity
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities)
+      :on-ui-touch-down ; the finger/mouse went down on the ui entity
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-ui-touch-dragged ; the finger/mouse moved anywhere
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities)
+      :on-ui-touch-up ; the finger/mouse went up anywhere
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        (println (:button screen)) ; the mouse button that was released (see button-code)
+        entities))
+
+    ; ui drag functions (for play-clj.ui)
+    ; Tip: use drag-listener! to configure these functions and run them manually
+    (defscreen my-screen
+      :on-ui-drag
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities)
+      :on-ui-drag-start
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities)
+      :on-ui-drag-stop
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:input-x screen)) ; the x position of the finger/mouse
+        (println (:input-y screen)) ; the y position of the finger/mouse
+        (println (:pointer screen)) ; the pointer for the event
+        entities))
+
+    ; ui focus functions (for play-clj.ui)
+    ; Tip: use focus-listener! to run these functions manually
+    (defscreen my-screen
+      :on-ui-keyboard-focus-changed
+      (fn [screen entities]
+        (println (:event screen)) ; the FocusListener.FocusEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/FocusListener.FocusEvent.html
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
+        (println (:focused? screen)) ; whether it is focused
+        entities)
+      :on-ui-scroll-focus-changed
+      (fn [screen entities]
+        (println (:event screen)) ; the FocusListener.FocusEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/FocusListener.FocusEvent.html
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
+        (println (:focused? screen)) ; whether it is focused
+        entities))
+
+    ; ui gesture functions (for play-clj.ui)
+    ; Tip: use actor-gesture-listener! to configure these functions and run them manually
+    (defscreen my-screen
+      :on-ui-fling ; the user dragged a finger over the screen and lifted it
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
+        (println (:velocity-x screen)) ; the x-axis velocity (s)
+        (println (:velocity-y screen)) ; the y-axis velocity (s)
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-ui-long-press ; the user pressed
+      (fn [screen entities]
+        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
         (println (:input-x screen)) ; the x position of the finger
         (println (:input-y screen)) ; the y position of the finger
         entities)
-      :on-pan ; the user dragged a finger over the screen
-      (fn [screen entities]
+      :on-ui-pan ; the user dragged a finger over the screen
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
         (println (:input-x screen)) ; the x position of the finger
         (println (:input-y screen)) ; the y position of the finger
         (println (:delta-x screen)) ; the x-axis distance moved
         (println (:delta-y screen)) ; the y-axis distance moved
         entities)
-      :on-pan-stop ; the user is no longer panning
-      (fn [screen entities]
+      :on-ui-pan-stop ; the user is no longer panning
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
         (println (:input-x screen)) ; the x position of the finger
         (println (:input-y screen)) ; the y position of the finger
         (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-pinch ; the user performed a pinch zoom gesture
-      (fn [screen entities]
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
+        entities)
+      :on-ui-pinch ; the user performed a pinch zoom gesture
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
         (println (:initial-pointer-1 screen)) ; the start position of finger 1 (see the x and y functions)
         (println (:initial-pointer-2 screen)) ; the start position of finger 2 (see the x and y functions)
         (println (:pointer-1 screen)) ; the end position of finger 1 (see the x and y functions)
         (println (:pointer-2 screen)) ; the end position of finger 2 (see the x and y functions)
         entities)
-      :on-tap ; the user tapped
-      (fn [screen entities]
+      :on-ui-tap ; the user tapped
+      (fn [screen entities]
+        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
         (println (:input-x screen)) ; the x position of the finger
         (println (:input-y screen)) ; the y position of the finger
         (println (:count screen)) ; the number of taps
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-zoom ; the user performed a pinch zoom gesture
-      (fn [screen entities]
-        (println (:initial-distance screen)) ; the start distance between fingers
-        (println (:distance screen)) ; the end distance between fingers
-        entities))
-
-    ; 2D physics contact (for play-clj.g2d-physics)
-    ; Tip: use first-entity and second-entity to get the get the entities that are contacting
-    (defscreen my-screen
-      :on-begin-contact ; two bodies began to touch
-      (fn [screen entities]
-        (println (:contact screen)) ; the Contact - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/physics/box2d/Contact.html
-        entities)
-      :on-end-contact ; two bodies ceased to touch
-      (fn [screen entities]
-        (println (:contact screen)) ; the Contact - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/physics/box2d/Contact.html
-        entities))
-
-    ; 3D physics contact (for play-clj.g3d-physics)
-    ; Tip: use first-entity and second-entity to get the get the entities that are contacting
-    (defscreen my-screen
-      :on-begin-contact ; two bodies began to touch
-      (fn [screen entities]
-        (println (:first-body screen)) ; the first btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
-        (println (:second-body screen)) ; the second btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
-        entities)
-      :on-end-contact ; two bodies ceased to touch
-      (fn [screen entities]
-        (println (:first-body screen)) ; the first btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
-        (println (:second-body screen)) ; the second btCollisionObject - http://bulletphysics.org/Bullet/BulletFull/classbtCollisionObject.html
-        entities))
-
-    ; ui input functions (for play-clj.ui)
-    (defscreen my-screen
-      :on-ui-changed ; the ui entity was changed
-      (fn [screen entities]
-        (println (:event screen)) ; the ChangeListener.ChangeEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/ChangeListener.ChangeEvent.html
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        entities)
-      :on-ui-clicked ; the ui entity was clicked
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        entities)
-      :on-ui-enter ; the finger/mouse moved over the ui entity
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities)
-      :on-ui-exit ; the finger/mouse moved out of the ui entity
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities)
-      :on-ui-touch-down ; the finger/mouse went down on the ui entity
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-ui-touch-dragged ; the finger/mouse moved anywhere
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities)
-      :on-ui-touch-up ; the finger/mouse went up anywhere
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities))
-
-    ; ui drag functions (for play-clj.ui)
-    (defscreen my-screen
-      :on-ui-drag
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities)
-      :on-ui-drag-start
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities)
-      :on-ui-drag-stop
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger/mouse
-        (println (:input-y screen)) ; the y position of the finger/mouse
-        (println (:pointer screen)) ; the pointer for the event
-        entities))
-
-    ; ui focus functions (for play-clj.ui)
-    (defscreen my-screen
-      :on-ui-keyboard-focus-changed
-      (fn [screen entities]
-        (println (:event screen)) ; the FocusListener.FocusEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/FocusListener.FocusEvent.html
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        (println (:focused? screen)) ; whether it is focused
-        entities)
-      :on-ui-scroll-focus-changed
-      (fn [screen entities]
-        (println (:event screen)) ; the FocusListener.FocusEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/FocusListener.FocusEvent.html
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        (println (:focused? screen)) ; whether it is focused
-        entities))
-
-    ; ui gesture functions (for play-clj.ui)
-    (defscreen my-screen
-      :on-ui-fling ; the user dragged a finger over the screen and lifted it
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:velocity-x screen)) ; the x-axis velocity (s)
-        (println (:velocity-y screen)) ; the y-axis velocity (s)
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-ui-long-press ; the user pressed
-      (fn [screen entities]
-        (println (:actor screen)) ; the Actor - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Actor.html
-        (println (:input-x screen)) ; the x position of the finger
-        (println (:input-y screen)) ; the y position of the finger
-        entities)
-      :on-ui-pan ; the user dragged a finger over the screen
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger
-        (println (:input-y screen)) ; the y position of the finger
-        (println (:delta-x screen)) ; the x-axis distance moved
-        (println (:delta-y screen)) ; the y-axis distance moved
-        entities)
-      :on-ui-pan-stop ; the user is no longer panning
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger
-        (println (:input-y screen)) ; the y position of the finger
-        (println (:pointer screen)) ; the pointer for the event
-        (println (:button screen)) ; the mouse button (see button-code)
-        entities)
-      :on-ui-pinch ; the user performed a pinch zoom gesture
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:initial-pointer-1 screen)) ; the start position of finger 1 (see the x and y functions)
-        (println (:initial-pointer-2 screen)) ; the start position of finger 2 (see the x and y functions)
-        (println (:pointer-1 screen)) ; the end position of finger 1 (see the x and y functions)
-        (println (:pointer-2 screen)) ; the end position of finger 2 (see the x and y functions)
-        entities)
-      :on-ui-tap ; the user tapped
-      (fn [screen entities]
-        (println (:event screen)) ; the InputEvent - http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputEvent.html
-        (println (:input-x screen)) ; the x position of the finger
-        (println (:input-y screen)) ; the y position of the finger
-        (println (:count screen)) ; the number of taps
-        (println (:button screen)) ; the mouse button (see button-code)
+        (println (:button screen)) ; the mouse button that was pressed (see button-code)
         entities)
       :on-ui-zoom ; the user performed a pinch zoom gesture
       (fn [screen entities]


Add execute-fn-on-gl! function

Add execute-fn-on-gl! function

--- src/play_clj/core.clj
+++ src/play_clj/core.clj
@@ -76,12 +76,15 @@
                                    (wrapper screen)
                                    (reset-changed! entities old-entities)
                                    (update-screen! @screen)))))
+        execute-fn-on-gl! (fn [& args]
+                            (on-gl (apply execute-fn! args)))
         update-fn! (fn [func args]
                      (doto (apply swap! screen func args)
                        update-screen!))]
     {:screen screen
      :entities entities
      :execute-fn! execute-fn!
+     :execute-fn-on-gl! execute-fn-on-gl!
      :update-fn! update-fn!
      :options options
      :show (fn []
@@ -92,6 +95,7 @@
              (update-fn! assoc
                          [:total-time 0
                           :execute-fn! execute-fn!
+                          :execute-fn-on-gl! execute-fn-on-gl!
                           :update-fn! update-fn!
                           :options options
                           :on-timer on-timer