use same symbol checks in cljsdoc validator

--- src/main/cljs_api_gen/cljsdoc/validate.clj
+++ src/main/cljs_api_gen/cljsdoc/validate.clj
@@ -195,13 +195,17 @@
   (= (-> *result* :release :cljs-tag)
      (last @published-cljs-tags)))

+(defn symbol-check-pass?
+  "Determines if we should pass the symbol check."
+  [full-name]
+  (or (nil? *result*)               ;; ignore if no known symbols supplied
+      (not (using-latest-result?))  ;; possible for symbols to exist later, so ignore if not latest
+      (get-in *result* [:symbols full-name])))
+
 (defn symbol-unknown-error-msg
   [{:keys [full-name] :as doc}]
-  (let [pass? (or (nil? *result*) ;; ignore if no known symbols supplied
-                  (not (using-latest-result?)) ;; possible for symbols to exist later, so ignore if not latest
-                  (get-in *result* [:symbols full-name]))]
-    (when-not pass?
-      (str "This file is for an unknown symbol '" full-name "'."))))
+  (when-not (symbol-check-pass? full-name)
+    (str "This file is for an unknown symbol '" full-name "'.")))

 ;;--------------------------------------------------------------------------------
 ;; Validate Related Symbol
@@ -209,11 +213,8 @@

 (defn related-missing-error-msg*
   [full-name]
-  (let [pass? (or (nil? *result*) ;; ignore if no known symbols supplied
-                  (not (using-latest-result?)) ;; possible for symbols to exist later, so ignore if not latest
-                  (get-in *result* [:symbols full-name]))]
-    (when-not pass?
-      (str "Related symbol '" full-name "' is an unknown symbol."))))
+  (when-not (symbol-check-pass? full-name)
+    (str "Related symbol '" full-name "' is an unknown symbol.")))

 (defn related-missing-error-msg
   [{:keys [related] :as doc}]
@@ -227,7 +228,7 @@

 (defn ref-error
   [[whole-match full-name]]
-  (when-not (contains? (:symbols *result*) full-name)
+  (when-not (symbol-check-pass? full-name)
     (str "Unknown symbol reference: " full-name)))

 (defn reflink-missing-error-msg*


feat: cached jts (for gml)

feat: cached jts (for gml)

--- src/main/clojure/pdok/featured/feature.clj
+++ src/main/clojure/pdok/featured/feature.clj
@@ -1,6 +1,7 @@
 (ns pdok.featured.feature
   (:refer-clojure :exclude [type])
   (:require [clojure.string :as str]
+            [clojure.core.cache :as cache]
             [clojure.java.io :as io]
             [clojure.java.jdbc :as j]
             [pdok.postgres :as pg]
@@ -61,7 +62,7 @@
 (def gml3-parser (GML3Parser.))

 (defn gml3-as-jts [gml]
-  (.toJTSGeometry ^GML3Parser gml3-parser gml))
+  (locking gml3-parser (.toJTSGeometry ^GML3Parser gml3-parser gml)))

 (def wkt-writer (WKTWriter.))

@@ -83,9 +84,16 @@

 (defmulti as-jts (fn [obj] (lower-case (get obj "type"))))
 (defmethod as-jts :default [_] nil)
+
+(def gml->jts-cache (atom (cache/fifo-cache-factory {} :threshold 15000)))
 (defmethod as-jts "gml" [obj]
  (when-let [gml (get obj "gml")]
-  (gml3-as-jts gml)))
+   (if (cache/has? @gml->jts-cache gml)
+     (cache/lookup @gml->jts-cache gml)
+     (let [jts (gml3-as-jts gml)
+           _ (swap! gml->jts-cache #(cache/miss % gml jts))]
+       jts))))
+
 (defmethod as-jts "jts" [obj]
   (get obj "jts"))


CMR-2112 Fix crashing tests

CMR-2112 Fix crashing tests

--- system-int-test/test/cmr/system_int_test/ingest/ops_collections_translation_test.clj
+++ system-int-test/test/cmr/system_int_test/ingest/ops_collections_translation_test.clj
@@ -155,6 +155,19 @@
   (let [{:keys [metadata-format metadata concept-id]} record]
     (umm/parse-metadata context :collection metadata-format metadata {:apply-default? true})))

+(defn- validate-record-schemas
+  "Validate a record against the XML schema if applicable and UMM JSON schema. For records in umm-json
+  validate the json schema against the collection's schema version"
+  [record]
+  (let [format (:metadata-format record)
+        metadata (:metadata record)]
+    (if (= :umm-json (:format format))
+      (json-schema/validate-umm-json metadata :collection (:version format))
+      (do
+        (umm/validate-xml :collection format metadata)
+        (json-schema/validate-umm-json (umm-json/umm->json (:collection record)) :collection)))))
+
+
 (defn- get-collection-validation-errors
   "Collect the following collection validations:
    * Errors from translating from native XML to UMM-C
@@ -166,8 +179,7 @@
   (remove empty?
    (concat
      [(str (get-in record [:collection :_errors]))] ; Errors from translating to UMM
-     (umm/validate-xml :collection (:metadata-format record) (:metadata record))
-     (json-schema/validate-umm-json (umm-json/umm->json (:collection record)) :collection)
+     (validate-record-schemas record)
      (umm-validation/validate-collection record))))

 (defn- translate-and-validation-collection
@@ -270,7 +282,8 @@

 (comment
   ;; Translate and validate a specific collection by concept-id
-  (def record (get-collection "C1279109560-SCIOPS"))
+  (def record (get-collection "C1214604828-SCIOPS"))
   (translate-and-validation-collection record)
   (translate-record-to-umm record)
-  (:metadata-format record))
+  (:metadata-format record)
+  (:metadata record))


[3731] typo and grammar fixes to backup and data screens

Signed-off-by: Julien Eluard <c768e13f1ba4c3ebed2909a1fc1e4b50bb021a2f@gmail.com>

--- src/status_im/translations/en.cljs
+++ src/status_im/translations/en.cljs
@@ -44,10 +44,10 @@
    :other-accounts                       "Other accounts"
    :sign-you-in                          "Signing you in…"

-   :help-improve                         "Help improve Status \n by sharing usage data"
-   :help-improve-description             "We strive to collect only what we need to understand how and where we can improve Status"
-   :share-usage-data                     "Share usage data"
-   :dont-want-to-share                   "No, i don't want to share"
+   :help-improve                         "Help improve Status\nby sharing usage patterns"
+   :help-improve-description             "We collect anonymous data to help improve Status."
+   :share-usage-data                     "Share usage"
+   :dont-want-to-share                   "No, I don't want to share"

    ;;drawer
    :switch-users                         "Switch users"
@@ -58,9 +58,9 @@

    ;;home
    :home                                 "Home"
-   :no-recent-chats                      "There are no recent Chats or DApps here yet. Use the “Plus” button to see the list of Dapps or discover people to chat with."
+   :no-recent-chats                      "There are no recent Chats or DApps here yet. Tap the “Plus” button to see the list of Dapps or discover people to chat with."
    :welcome-to-status                    "Welcome to Status"
-   :welcome-to-status-description        "Here you can chat with people in a secure private chat, browse and interact with DApps. Use the “Plus” icon above to explore Status"
+   :welcome-to-status-description        "Here you can securely chat with people, or browse and interact with DApps. Tap the “Plus” icon to begin."

    ;;chat
    :is-typing                            "is typing"
@@ -135,22 +135,22 @@
    :backup-your-seed                     "Backup your Seed Phrase"

    ;;seed
-   :your-data-belongs-to-you             "Your Data and Funds belong to you. We can’t help get it back if you loose it"
-   :your-data-belongs-to-you-description "This means Status can’t help you get it back if you lose it. You are in charge of the secuty of all your data"
+   :your-data-belongs-to-you             "If you lose your seed phrase you lose your data and funds"
+   :your-data-belongs-to-you-description "Status can’t help you recover your account if you lose your seed phrase. You are in charge of the security of your data, and backing up your seed phrase is the best safeguard."
    :ok-continue                          "Ok, continue"
-   :your-seed-phrase                     "Your Seed Phrase"
-   :your-seed-phrase-description         "This is your seed phrase. You use it to prove that this is your wallet. You only get to see it once! Copy it on paper and keep it in a secure place. You need it when you loose or reinstall your wallet."
+   :your-seed-phrase                     "Your seed phrase"
+   :your-seed-phrase-description         "This is your seed phrase. You use it to prove that this is your wallet. You only get to see it once! Write it on paper and keep it in a secure place. You will need it if you lose or reinstall your wallet."
    :enter-word                           "Enter word"
-   :check-your-seed                      "Check your Seed Phrase"
+   :check-your-seed                      "Check your seed phrase"
    :wrong-word                           "Wrong word"
    :are-you-sure?                        "Are you sure?"
    :are-you-sure-description             "You will not be able to see the whole seed phrase again"
    :you-are-all-set                      "You’re all set!"
-   :you-are-all-set-description          "Now if you loose your phone you can restore your account and wallet using the Seed Phrase and password"
+   :you-are-all-set-description          "Now if you lose your phone you can restore your account and wallet using the seed phrase and password."
    :ok-got-it                            "Ok, got it"
    :backup-seed-phrase                   "Backup Seed Phrase"
    :step-i-of-n                          "Step {{step}} of {{number}}"
-   :word-n-description                   "In order to check if have backed up your seed phrase correctly, enter the word #{{number}} above"
+   :word-n-description                   "In order to check if you have backed up your seed phrase correctly, enter the word #{{number}} above."
    :word-n                               "Word #{{number}}"

    ;;make_photo


[#4551] fix error on fetching history for removed chat

--- src/status_im/transport/inbox.cljs
+++ src/status_im/transport/inbox.cljs
@@ -371,7 +371,10 @@
 (handlers/register-handler-fx
  :inbox/check-fetching
  (fn [{:keys [db now] :as cofx} [_ last-request chat-id]]
-   (when (:inbox/fetching? db)
+   (when (and (:inbox/fetching? db)
+              ;; if chat was removed before messages were fetched no need
+              ;; to proceed with further actions
+              (or (not chat-id) (contains? (:transport/chats db) chat-id)))
      (let [time-since-last-received (- now (:inbox/last-received db))]
        (if (> time-since-last-received fetching-timeout)
          (if chat-id


Sharps and flats aren't working, so I've removed them to get a fresh start.

--- src/overtunes/songs/canone_alla_quarta.clj
+++ src/overtunes/songs/canone_alla_quarta.clj
@@ -69,7 +69,8 @@
 (defn melody# [melody]
   (let [notes (update-all melody [:pitch :time] natural-seq)
         play-at #(at %1 (piano# %2))]
-    (dorun (map play-at (:time notes) (:pitch notes)))))
+    (dorun (map play-at (:time notes) (:pitch notes)))
+  notes))

 (defn update [k f] #(update-in % [k] f))
 (def mirror (update :pitch #(connect - %)))
@@ -77,20 +78,15 @@
 (defn transpose [interval] (update :pitch #(shift % interval)))
 (def canone-alla-quarta (reduce connect [(after 3) (transpose -3) mirror]))

-(defn sharps [notes] #(if (contains? notes %) (inc %) %))
-(defn flats [notes] #(if (contains? notes %) (dec %) %))
-
 (defn play# []
   (let [from-now #(translate % 0 (now))
         beat (from-now (bpm 100))
         with-beat (update :time (partial connect beat))
         in-key (update :pitch (partial connect g-major))
-        after-a-half (after 1/2)
-        with-sharps (update :pitch #(comp (sharps [12 22]) %))
-        with-flats (update :pitch #(comp (flats [37]) %))]
+        after-a-half (after 1/2)]
     (-> bass in-key with-beat melody#)
     (-> leader after-a-half canone-alla-quarta in-key with-beat melody#)
-    (-> leader after-a-half in-key with-sharps with-flats with-beat melody#)
+    (-> leader after-a-half in-key with-beat melody#)
     ))

 (play#)


Rewrote sums in terms of sum-n.

Rewrote sums in terms of sum-n.

--- src/overtunes/songs/canone_alla_quarta.clj
+++ src/overtunes/songs/canone_alla_quarta.clj
@@ -5,7 +5,7 @@

 (defn => [val & fs] (reduce #(apply %2 [%1]) val fs))
 (defn sum-n [series n] (reduce + (take n series)))
-(defn sums [series] (cons 0 (reductions + series)))
+(defn sums [series] (map (partial sum-n series) (range (count series))))
 (defn scale [intervals]
   #(if (not (neg? %))
      (sum-n (cycle intervals) %)


Resume output snapshots.

Resume output snapshots.

--- src/onyx/api.clj
+++ src/onyx/api.clj
@@ -274,6 +274,12 @@
                                              :task-id task-id
                                              :slot-migration :direct}))

+                       (= :output (:onyx/type task-map))
+                       (assoc :output (merge coordinates
+                                             {:mode :resume
+                                              :task-id task-id
+                                              :slot-migration :direct}))
+
                        (get task->windows task-id)
                        (assoc :windows (->> (get task->windows task-id)
                                             (map (fn [{:keys [window/id]}]


Revert "remove Allen"

Revert "remove Allen"

This reverts commit e1cedb08392751b41e744ccea1ceb148ac6d0f77.

Conflicts:
	src-cljs/frontend/components/about.cljs

--- frontend/components/about.cljs
+++ frontend/components/about.cljs
@@ -20,6 +20,15 @@
     :visible true
     :bio ["You might not know it by looking at him, but Paul is a wicked card shark. When he's not making his poker buddies cry, he seeks out mogul-laced ski trails to hurl himself down, and within the first five minutes of meeting him he'll probably tell you the story about how he mostly landed a backflip on his skis. Lest his ego get too big, though, we can always remind him of the time he failed at a YCombinator startup, and he'll go bury his emotions in the sweet sweet taste of artisan chocolate--or any chocolate, really.",
           "Paul's been interviewed by the Wall Street Journal, and one of his proudest achievements was giving a Google Tech Talk on compilers and programming languages. He wrote phc, an open source PHP compiler, while doing his PhD on compilers and static analysis in Dublin. After moving to the Bay Area, Paul worked on the Firefox Javascript engine, started Circle, and then wrote stefon, an asset pipeline for Clojure. Because it pains Paul to see so much time wasted due to inadequate developer tools, he approaches continuous integration from the perspective of developer productivity. He loves to focus on building the Circle product, but, as he'll tell you while he's walloping you at table tennis, he also has to take care of the business side of things, too."]}
+   {:name "Allen Rohner"
+    :img-path (stefon/asset-path "/img/outer/about/allen.png")
+    :visible true
+    :role "Founder"
+    :github "arohner"
+    :twitter "arohner"
+    :email "allen@circleci.com"
+    :bio ["Allen loves Ultimate Frisbee: he's played in the snow, on the beach, on Thanksgiving Day, New Year's Eve, and New Year's Day, and he regularly plays in 110 degree August heat. His future plans include the tacocopter, the burrito bomber, and the mosquito laser. When Allen's not coding, he spends his time making his own pizza dough and brewing his own beer. He'd make his own whiskey, too, if he wanted to wait 10 years for a drink.",
+          "Back in the day, Allen started work on his own self-hosting, native code lisp, and then the clouds parted and he discovered Clojure. Since then, he's become a Clojure contributor, and has commits in clojure.core, contrib, lein, ring, compojure, noir, and about a dozen more libraries. He finished SICP, and wrote Scriptjure, a Clojure to Javascript compiler, 2 years before ClojureScript. Other devs used his work as a basis for Stevedore, which he's happy to say is used in production every day at Circle. In addition to co-founding Circle as a means to bring Continuous Deployment to the masses, he looks forward to building tools that help debug test failures by anticipating common problems. He currently deploys six times a day, and more on weekends."]}
    {:name "David Lowe"
     :visible true
     :role "Backend Developer"


GAWB-23: Making the import/export buttons unavailable if in edit mode

--- src/cljs/org/broadinstitute/firecloud_ui/page/workspace/summary/attribute_editor.cljs
+++ src/cljs/org/broadinstitute/firecloud_ui/page/workspace/summary/attribute_editor.cljs
@@ -110,25 +110,26 @@
         (style/create-section-header
           [:div {}
            "Workspace Attributes"
-           [:span {:style {:fontSize "initial" :fontWeight "initial"}}
-            [:a {:style {:textDecoration "none" :marginLeft "1em"}
-                 :href (str (config/api-url-root) "/cookie-authed/workspaces/"
-                            (:namespace (:workspace-id props)) "/"
-                            (:name (:workspace-id props)) "/exportAttributesTSV")
-                 :onClick  #(utils/set-access-token-cookie (utils/get-access-token))
-                 :target "_blank"}
-             (str "Download Attributes")]
-            (when writer?
-              [comps/Button {:text "Import Attributes..."
-                             :style {:float "right" :marginTop -7}
-                             :onClick #(modal/push-modal
-                                        [modal/OKCancelForm
-                                         {:header "Import Attributes"
-                                          :show-cancel? false :ok-button {:text "Done" :onClick modal/pop-modal}
-                                          :content [:div {:style {:float "right" :width 720}}
-                                                    [import-data/Page (merge (select-keys props [:workspace-id])
-                                                                             {:reload (fn [] (modal/pop-modal) ((:request-refresh props)))}
-                                                                             {:import-type "workspace-attributes"})]]}])}])]])
+           (if-not editing?
+             [:span {:style {:fontSize "initial" :fontWeight "initial"}}
+              [:a {:style {:textDecoration "none" :marginLeft "1em"}
+                   :href (str (config/api-url-root) "/cookie-authed/workspaces/"
+                           (:namespace (:workspace-id props)) "/"
+                           (:name (:workspace-id props)) "/exportAttributesTSV")
+                   :onClick  #(utils/set-access-token-cookie (utils/get-access-token))
+                   :target "_blank"}
+               (str "Download Attributes")]
+              (when writer?
+                [comps/Button {:text "Import Attributes..."
+                               :style {:float "right" :marginTop -7}
+                               :onClick #(modal/push-modal
+                                           [modal/OKCancelForm
+                                            {:header "Import Attributes"
+                                             :show-cancel? false :ok-button {:text "Done" :onClick modal/pop-modal}
+                                             :content [:div {:style {:float "right" :width 720}}
+                                                       [import-data/Page (merge (select-keys props [:workspace-id])
+                                                                           {:reload (fn [] (modal/pop-modal) ((:request-refresh props)))}
+                                                                           {:import-type "workspace-attributes"})]]}])}])])])
         (style/create-paragraph
           [:div {}
            (if editing?


(TK-10) Fix test failures

(TK-10) Fix test failures

Fix test failures introduced by merging the two tests. Did so by
changing the calls to different versions of the same functions
so they would not have the same output.

--- test/clj/puppetlabs/trapperkeeper/services/webserver/jetty9_service_handlers_test.clj
+++ test/clj/puppetlabs/trapperkeeper/services/webserver/jetty9_service_handlers_test.clj
@@ -120,8 +120,10 @@
       jetty-plaintext-config
       (let [s                        (get-service app :WebserverService)
             path-context             "/ernie"
+            path-context2            "/gonzo"
             path-ring                "/bert"
             path-servlet             "/foo"
+            path-servlet2            "/misspiggy"
             path-war                 "/bar"
             path-proxy               "/baz"
             get-registered-endpoints (partial get-registered-endpoints s)
@@ -136,25 +138,28 @@
             war                      "helloWorld.war"
             target                   {:host "0.0.0.0"
                                       :port 9000
-                                      :path "/ernie"}]
+                                      :path "/ernie"}
+            target2                  {:host "localhost"
+                                      :port 10000
+                                      :path "/kermit"}]
         (add-context-handler dev-resources-dir path-context)
-        (add-context-handler dev-resources-dir path-context [])
+        (add-context-handler dev-resources-dir path-context2 [])
         (add-ring-handler ring-handler path-ring)
         (add-servlet-handler servlet path-servlet)
-        (add-servlet-handler servlet path-servlet {})
+        (add-servlet-handler servlet path-servlet2 {})
         (add-war-handler (str dev-resources-dir war) path-war)
         (add-proxy-route target path-proxy)
-        (add-proxy-route target path-proxy {})
+        (add-proxy-route target2 path-proxy {})
         (let [endpoints (get-registered-endpoints)]
           (is (= endpoints #{{:type :context :base-path dev-resources-dir
                               :endpoint path-context}
                              {:type :context :base-path dev-resources-dir
-                              :endpoint path-context}
+                              :endpoint path-context2}
                              {:type :ring :endpoint path-ring}
                              {:type :servlet :servlet (type servlet) :endpoint path-servlet}
-                             {:type :servlet :servlet (type servlet) :endpoint path-servlet}
+                             {:type :servlet :servlet (type servlet) :endpoint path-servlet2}
                              {:type :war :war (str dev-resources-dir war) :endpoint path-war}
                              {:type :proxy :target-host "0.0.0.0" :target-port 9000
                               :endpoint path-proxy :target-path "/ernie"}
                              {:type :proxy :target-host "localhost" :target-port 10000
-                              :endpoint path-proxy :target-path "/ernie"}})))))))+                              :endpoint path-proxy :target-path "/kermit"}})))))))


docstrings added

docstrings added

--- src/etaoin/api.clj
+++ src/etaoin/api.clj
@@ -538,7 +538,9 @@
 ;; mouse
 ;;

-(defmulti mouse-btn-down dispatch-driver)
+(defmulti mouse-btn-down
+  "Puts down a button of a virtual mouse."
+  dispatch-driver)

 (defmethods mouse-btn-down [:chrome :phantom :safari]
   [driver]
@@ -546,7 +548,9 @@
     [:session (:session @driver) :buttondown]
     nil _))

-(defmulti mouse-btn-up dispatch-driver)
+(defmulti mouse-btn-up
+  "Puts up a button of a virtual mouse."
+  dispatch-driver)

 (defmethods mouse-btn-up [:chrome :phantom :safari]
   [driver]
@@ -554,7 +558,10 @@
     [:session (:session @driver) :buttonup]
     nil _))

-(defmulti mouse-move-to dispatch-driver)
+(defmulti mouse-move-to
+  "Moves a virtual mouse pointer either to an element
+  or by `x` and `y` offset."
+  dispatch-driver)

 (defmethods mouse-move-to [:chrome :phantom :safari]
   ([driver q]
@@ -566,7 +573,9 @@
      [:session (:session @driver) :moveto]
      {:xoffset x :yoffset y} _)))

-(defmacro with-mouse-btn [driver & body]
+(defmacro with-mouse-btn
+  "Performs the body keeping mouse botton pressed."
+  [driver & body]
   `(do
      (mouse-btn-down ~driver)
      (try
@@ -574,7 +583,30 @@
        (finally
          (mouse-btn-up ~driver)))))

-(defn drag-and-drop [driver q-from q-to]
+(defn drag-and-drop
+  "Performs drag and drop operation as a sequence of the following steps:
+
+  1. moves mouse pointer to an element found with `q-from` query;
+  2. puts down mouse button;
+  3. moves mouse to an element found with `q-to` query;
+  4. puts up mouse button.
+
+  Arguments:
+
+  - `driver`: a driver instance,
+
+  - `q-from`: from what element to start dragging; any expression that
+  `query` function may accept;
+
+  - `q-to`: to what element to drag, a seach term.
+
+  Notes:
+
+  - does not work in Phantom.js since it does not have a virtual mouse API;
+
+  - does not work in Safari.
+"
+  [driver q-from q-to]
   (mouse-move-to driver q-from)
   (with-mouse-btn driver
     (mouse-move-to driver q-to)))
@@ -588,7 +620,9 @@
     [:session (:session @driver) :element el :click]
     nil _))

-(defn click [driver q]
+(defn click
+  "Clicks on an element (a link, button, etc)."
+  [driver q]
   (click* driver (query driver q)))

 (defmulti double-click* dispatch-driver)
@@ -599,7 +633,16 @@
     [:session (:session @driver) :element el :doubleclick]
     nil _))

-(defn double-click [driver q]
+(defn double-click
+  "Performs double click on an element.
+
+  Note:
+
+  the supported browsers are Chrome and Phantom.js. For Firefox and
+  Safari, your may try to simulate it as a `click, wait, click`
+  sequence.
+"
+  [driver q]
   (double-click* driver (query driver q)))

 ;;
@@ -660,7 +703,19 @@
 ;; element box
 ;;

-(defn get-element-box [driver q]
+(defn get-element-box
+  "Returns a bounding box for an element found with a query term.
+
+  The result is a map with the following keys:
+
+  - `:x1`: top left `x` coordinate;
+  - `:y1`: top left `y` coordinate;
+  - `:x2`: bottom right `x` coordinate;
+  - `:y2`: bottom right `y` coordinate;
+  - `:width`: width as a difference b/w `:x2` and `:x1`;
+  - `:height`: height as a difference b/w `:y2` and `:y1`.
+"
+  [driver q]
   (let [el (query driver q)
         {:keys [width height]} (get-element-size* driver el)
         {:keys [x y]} (get-element-location* driver el)]
@@ -671,7 +726,20 @@
      :width width
      :height height}))

-(defn intersects? [driver q1 q2]
+(defn intersects?
+  "Determines whether two elements intersects in geometry meaning.
+
+  The implementation compares bounding boxes for each element
+  analyzing their arrangement.
+
+  Arguments:
+
+  - `q1` and `q2` are query terms to find elements to check for
+  intersection.
+
+  Returns true or false.
+"
+  [driver q1 q2]
   (let [a (get-element-box driver q1)
         b (get-element-box driver q2)]
     (or (< (a :y1) (b :y2))
@@ -690,7 +758,27 @@
     resp
     (:value resp)))

-(defn get-element-attr [driver q name]
+(defn get-element-attr
+  "Returns an HTTP attribute of an element (class, id, href, etc).
+
+  Arguments:
+
+  - `driver`: a driver instance,
+
+  - `q`: a query term to find an element,
+
+  - `name`: either a string or a keyword with a name of an attribute.
+
+  Returns: a string with the attribute value, `nil` if no such
+  attribute for that element.
+
+  Example:
+
+  (def driver (firefox))
+  (get-element-attr driver {:tag :a} :class)
+  >> \"link link__external\"
+"
+  [driver q name]
   (get-element-attr* driver (query driver q) name))

 (defn get-element-attrs [driver q & names]


Remove .shadow-cljs cache from :clean-targets in simple example

Co-Authored-By: Thomas Heller <8aa6dfc21167f676c4daceadf90decc7d87844fc@gmail.com>

--- examples/simple/project.clj
+++ examples/simple/project.clj
@@ -10,7 +10,6 @@
   :plugins [[lein-shadow "0.1.5"]]

   :clean-targets ^{:protect false} [:target-path
-                                    ".shadow-cljs"
                                     "shadow-cljs.edn"
                                     "package.json"
                                     "package-lock.json"


[#160] string-reader opts into Erlang map

--- priv/clojure/core.clj
+++ priv/clojure/core.clj
@@ -3564,7 +3564,7 @@
   {:added "1.0"
    :static true}
   ([s] (clj_reader/read.e s))
-  ([opts s] (clj_reader/read.e s opts)))
+  ([opts s] (clj_reader/read.e s (clojerl.Map/to_erl_map.e opts))))

 (defn subvec
   "Returns a persistent vector of the items in vector from