From b245b9c890c8eec6bd653460d181302e72c2376d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Mar 2022 11:10:35 +0100 Subject: [PATCH 001/550] Add video by Daniel Amber [skip ci] --- README.md | 1 + doc/news.md | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index ec2444a2..3f11e7bf 100644 --- a/README.md +++ b/README.md @@ -312,6 +312,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea - [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller - [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý diff --git a/doc/news.md b/doc/news.md index bfd3b531..8ba49892 100644 --- a/doc/news.md +++ b/doc/news.md @@ -5,6 +5,14 @@ you have anything to add. Also see [#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on Twitter. + + ## 2021-12 - Releases: [0.6.8 - 0.7.3](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). From bd3adf029e97162cbc28ca141c68183382f156a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Wed, 16 Mar 2022 16:57:52 +0000 Subject: [PATCH 002/550] Add official bb compatible badge (#1212) [skip ci] --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3f11e7bf..9a31a69c 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,10 @@ Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list o A list of projects (scripts, libraries, pods and tools) known to work with babashka. +Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo! + +[![bb compatible](https://img.shields.io/badge/babashka-compatible-green?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNDcyIDE0NzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTk1LjkxMSAxMTkzLjg5QzExMTAuOTMgMTExMi4zOCAxMTg2IDk3OC4yMDYgMTE4NiA4MjYuNUMxMTg2IDU3Ny45NzIgMTAxNCAyNTQuNSA3MzYgMTEzQzQ2MC41IDI2MiAyODYgNTc3Ljk3MiAyODYgODI2LjVDMjg2IDk3OC4yMDYgMzYxLjA3IDExMTIuMzggNDc2LjA4OSAxMTkzLjg5QzQ3MS45ODMgMTE5NC40NCA0NjcuOTQ5IDExOTUuMTQgNDY0IDExOTZDMzc2LjYxMSAxMjE1LjA3IDI3MCAxMzU5LjA1IDI3MCAxMzU5LjA1SDUzNEM1ODAuOTcyIDEzNTkuMDUgNjI1LjYzMSAxMzQxLjQxIDY2MC45NTYgMTMyMS42MkM2NzguMTE1IDEzNDQuMzIgNzA1LjM0NCAxMzU5IDczNiAxMzU5Qzc2Ni42NTYgMTM1OSA3OTMuODg1IDEzNDQuMzIgODExLjA0NCAxMzIxLjYyQzg0Ni4zNjkgMTM0MS40MSA4OTEuMDI4IDEzNTkuMDUgOTM4IDEzNTkuMDVIMTIwMkMxMjAyIDEzNTkuMDUgMTA5NS4zOSAxMjE1LjA3IDEwMDggMTE5NkMxMDA0LjA1IDExOTUuMTQgMTAwMC4wMiAxMTk0LjQ0IDk5NS45MTEgMTE5My44OVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4KPGNpcmNsZSBjeD0iNzM1LjUiIGN5PSI4NTIuNSIgcj0iMzExLjUiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00NDMgNzUwLjQxN0M2NjIgNzY1Ljg2NiA3OTEuMzgyIDcxMi4zODggODgxIDU3OS44ODFDODgxIDU3OS44ODEgNzA4LjI5MyA1MjEuNjQ5IDYwMy4yNDQgNTc5Ljg4MUM0OTguNTUgNjM3LjkxNiA0NDMgNzUwLjQxNyA0NDMgNzUwLjQxN1oiIGZpbGw9IiNCNEI0QjQiLz4KPHBhdGggZD0iTTEwMzkuOTkgNzQ4LjI4MkM5MTQuODYyIDczNC43NDUgODAzLjI2NCA2OTQuMTM1IDc1MCA1NDFDNzUwIDU0MSA4NjAuNjMzIDU2Ni4yNzIgOTcyLjM1NSA2NjguMTAxQzEwODguMzkgNzczLjg1NyAxMDM5Ljk5IDc0OC4yODIgMTAzOS45OSA3NDguMjgyWiIgZmlsbD0iI0I0QjRCNCIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgc3Ryb2tlPSIjMEEwMDAwIiBzdHJva2Utd2lkdGg9IjQwIi8+CjxwYXRoIGQ9Ik03OTcgNzE5SDY3NEw3MDQgNzQ5VjgzOUM3MDguNSA4MDkuNSA3NjQuNSA4MDguNSA3NjcuNSA4MzlMNzc1IDc0OUw3OTcgNzE5WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTM1MS4xMTcgNzU5QzM1MS4xMTcgNzM2LjkwOSAzNjkuMDI2IDcxOSAzOTEuMTE3IDcxOUg2NzYuMDE4QzcwMC4yIDcxOSA3MTguODUyIDc0MC4yOTIgNzE1LjY3IDc2NC4yNjRMNjkwLjkxIDk1MC43NjRDNjg4LjI3IDk3MC42NDYgNjcxLjMxNCA5ODUuNSA2NTEuMjU4IDk4NS41SDM5MS4xMTdDMzY5LjAyNiA5ODUuNSAzNTEuMTE3IDk2Ny41OTEgMzUxLjExNyA5NDUuNVY3NTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNNzU2LjAxMiA3NjQuMjY3Qzc1Mi44MjggNzQwLjI5NCA3NzEuNDgxIDcxOSA3OTUuNjY0IDcxOUgxMDgwQzExMDIuMDkgNzE5IDExMjAgNzM2LjkwOSAxMTIwIDc1OVY5NDUuMDk2QzExMjAgOTY3LjE4NyAxMTAyLjA5IDk4NS4wOTYgMTA4MCA5ODUuMDk2SDgyMC4zODFDODAwLjMyNSA5ODUuMDk2IDc4My4zNyA5NzAuMjQ0IDc4MC43MjkgOTUwLjM2Mkw3NTYuMDEyIDc2NC4yNjdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTAyNCA5NTJWOTIxLjQ3SDEwMTMuNzFDMTAwNy4wMyA5MjEuNDcgMTAwMi41OCA5MTYuNzUyIDEwMDAuMzUgOTA5LjgxM0w5NTguMDY0IDc4Mi42OTdDOTU1LjI4MiA3NzQuNjQ5IDk1MS45NDQgNzY4LjgyIDk0Ny40OTIgNzY0LjM3OUM5MzkuMTQ2IDc1NS43NzUgOTI4LjI5NiA3NTMgOTE2LjA1NCA3NTNIOTAyLjdWNzg0LjkxOEg5MTEuNjAzQzkxOS4xMTUgNzg0LjkxOCA5MjQuOTU3IDc4Ny42OTMgOTI3LjQ2MSA3OTYuNTc1TDkzMy4zMDMgODE3LjExM0w4ODEgOTUySDkxOS4xMTVMOTUwLjU1MyA4NjMuMTg1TDk2Ny4yNDUgOTE2Ljc1MkM5NzMuNjQ0IDkzNy41NjggOTg0LjQ5NCA5NTIgMTAwOC45OCA5NTJIMTAyNFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OTAgOTUyVjkyMS40N0g1NzkuNzA2QzU3My4wMjkgOTIxLjQ3IDU2OC41NzggOTE2Ljc1MiA1NjYuMzUyIDkwOS44MTNMNTI0LjA2NCA3ODIuNjk3QzUyMS4yODIgNzc0LjY0OSA1MTcuOTQ0IDc2OC44MiA1MTMuNDkyIDc2NC4zNzlDNTA1LjE0NiA3NTUuNzc1IDQ5NC4yOTYgNzUzIDQ4Mi4wNTQgNzUzSDQ2OC43Vjc4NC45MThINDc3LjYwM0M0ODUuMTE1IDc4NC45MTggNDkwLjk1NyA3ODcuNjkzIDQ5My40NjEgNzk2LjU3NUw0OTkuMzAzIDgxNy4xMTNMNDQ3IDk1Mkg0ODUuMTE1TDUxNi41NTMgODYzLjE4NUw1MzMuMjQ1IDkxNi43NTJDNTM5LjY0NCA5MzcuNTY4IDU1MC40OTQgOTUyIDU3NC45NzcgOTUySDU5MFoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSI3NTIiIHkxPSIxMTMiIHgyPSI3NTIiIHkyPSIxMzU5LjUyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNFNDFGMjYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQjcwMDAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==)](https://babashka.org) + ## [Pods](https://github.com/babashka/babashka.pods) Pods are programs that can be used as a Clojure library by From 7bfab370771869ef9ddd23405a29618b7c306786 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 18 Mar 2022 19:35:44 +0100 Subject: [PATCH 003/550] Add specter tests --- CHANGELOG.md | 5 +- deps.edn | 3 +- doc/libraries.csv | 1 + test-resources/lib_tests/bb-tested-libs.edn | 1 + .../com/rpl/specter/cljs_test_helpers.clj | 13 + .../com/rpl/specter/cljs_test_runner.cljs | 7 + .../lib_tests/com/rpl/specter/core_test.cljc | 1704 +++++++++++++++++ .../com/rpl/specter/test_helpers.clj | 36 + .../com/rpl/specter/zipper_test.cljc | 122 ++ 9 files changed, 1887 insertions(+), 5 deletions(-) create mode 100644 test-resources/lib_tests/com/rpl/specter/cljs_test_helpers.clj create mode 100644 test-resources/lib_tests/com/rpl/specter/cljs_test_runner.cljs create mode 100644 test-resources/lib_tests/com/rpl/specter/core_test.cljc create mode 100644 test-resources/lib_tests/com/rpl/specter/test_helpers.clj create mode 100644 test-resources/lib_tests/com/rpl/specter/zipper_test.cljc diff --git a/CHANGELOG.md b/CHANGELOG.md index a4c9a92b..38ce5dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,9 @@ This release improves compatibility with several libraries: [loom](https://githu To use specter in babashka, use the following coordinates: ``` clojure -{:deps {com.rpl/specter {:git/url "https://github.com/borkdude/specter" - :git/sha "8ba809a2cd35d3b6f8c5287e6bd3b4e06e42f6dc"}}} +{:deps {com.rpl/specter {:mvn/version "1.1.4"}}} ``` -Hopefully the compatibility commit can be upstreamed back into specter at some point. - - Add `clojure.data.priority-map` as built-in library - this makes babashka compatible with [aysylu/loom](https://github.com/aysylu/loom) - Add part of `clojure.tools.reader.reader-types` to support [hugsql.core](https://www.hugsql.org) - [#1204](https://github.com/babashka/babashka/issues/1204) add property `babashka.config` to reflect `bb.edn` location ([@mknoszlig](https://github.com/mknoszlig)) diff --git a/deps.edn b/deps.edn index cd9e36f8..ab75d192 100644 --- a/deps.edn +++ b/deps.edn @@ -129,7 +129,8 @@ cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"} aysylu/loom {:mvn/version "1.0.2"} com.layerware/hugsql-core {:mvn/version "0.5.1"} - com.github.seancorfield/expectations {:mvn/version "2.0.157"}} + com.github.seancorfield/expectations {:mvn/version "2.0.157"} + com.rpl/specter {:mvn/version "1.1.4"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/doc/libraries.csv b/doc/libraries.csv index 021b0d81..c12c85e7 100644 --- a/doc/libraries.csv +++ b/doc/libraries.csv @@ -21,6 +21,7 @@ com.github.seancorfield/expectations,https://github.com/clojure-expectations/clo com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql com.grammarly/omniconf,https://github.com/grammarly/omniconf com.layerware/hugsql-core, +com.rpl/specter,https://github.com/redplanetlabs/specter com.stuartsierra/component,https://github.com/stuartsierra/component com.stuartsierra/dependency,https://github.com/stuartsierra/dependency com.wsscode/cljc-misc,https://github.com/wilkerlucio/cljc-misc diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 9297d2a2..bca25eba 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -111,4 +111,5 @@ aysylu/loom {:git-url "https://github.com/aysylu/loom", :test-namespaces (loom.test.network-simplex loom.test.label loom.test.alg-generic loom.test.compliance-tester loom.test.flow loom.test.alg loom.test.attr loom.test.graph loom.test.derived), :git-sha "d458f0c0dee9021983c64381b90a470f0178cc8e"} com.layerware/hugsql-core {:test-namespaces (hugsql.babashka-test)} com.github.seancorfield/expectations {:git-url "https://github.com/clojure-expectations/clojure-test", :test-namespaces (expectations.clojure.test-test), :git-sha "b30fefd97d9eb7d1f47e06956521f354cb926b03"} + com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"} } diff --git a/test-resources/lib_tests/com/rpl/specter/cljs_test_helpers.clj b/test-resources/lib_tests/com/rpl/specter/cljs_test_helpers.clj new file mode 100644 index 00000000..4986c823 --- /dev/null +++ b/test-resources/lib_tests/com/rpl/specter/cljs_test_helpers.clj @@ -0,0 +1,13 @@ +(ns com.rpl.specter.cljs-test-helpers) + +;; it seems like gen/bind and gen/return are a monad (hence the names) +(defmacro for-all+ [bindings & body] + (let [parts (partition 2 bindings) + vars (vec (map first parts)) + genned (reduce + (fn [curr [v code]] + `(clojure.test.check.generators/bind ~code (fn [~v] ~curr))) + `(clojure.test.check.generators/return ~vars) + (reverse parts))] + `(clojure.test.check.properties/for-all [~vars ~genned] + ~@body))) diff --git a/test-resources/lib_tests/com/rpl/specter/cljs_test_runner.cljs b/test-resources/lib_tests/com/rpl/specter/cljs_test_runner.cljs new file mode 100644 index 00000000..49c06c26 --- /dev/null +++ b/test-resources/lib_tests/com/rpl/specter/cljs_test_runner.cljs @@ -0,0 +1,7 @@ +(ns com.rpl.specter.cljs-test-runner + (:require [doo.runner :refer-macros [doo-tests]] + [com.rpl.specter.core-test] + [com.rpl.specter.zipper-test])) + +(doo-tests 'com.rpl.specter.core-test + 'com.rpl.specter.zipper-test) diff --git a/test-resources/lib_tests/com/rpl/specter/core_test.cljc b/test-resources/lib_tests/com/rpl/specter/core_test.cljc new file mode 100644 index 00000000..1ba123cd --- /dev/null +++ b/test-resources/lib_tests/com/rpl/specter/core_test.cljc @@ -0,0 +1,1704 @@ +(ns com.rpl.specter.core-test + #?(:cljs (:require-macros + [cljs.test :refer [is deftest]] + [clojure.test.check.clojure-test :refer [defspec]] + [com.rpl.specter.cljs-test-helpers :refer [for-all+]] + [com.rpl.specter.test-helpers :refer [ic-test]] + [com.rpl.specter + :refer [defprotocolpath defnav extend-protocolpath + nav declarepath providepath select select-one select-one! + select-first transform setval replace-in + select-any selected-any? collected? traverse + multi-transform path dynamicnav recursive-path + defdynamicnav traverse-all satisfies-protpath? end-fn + vtransform]])) + (:use + #?(:clj [clojure.test :only [deftest is]]) + #?(:clj [clojure.test.check.clojure-test :only [defspec]]) + #?(:clj [com.rpl.specter.test-helpers :only [for-all+ ic-test]]) + #?(:clj [com.rpl.specter + :only [defprotocolpath defnav extend-protocolpath + nav declarepath providepath select select-one select-one! + select-first transform setval replace-in + select-any selected-any? collected? traverse + multi-transform path dynamicnav recursive-path + defdynamicnav traverse-all satisfies-protpath? end-fn + vtransform]])) + + + + (:require #?(:clj [clojure.test.check.generators :as gen]) + #?(:clj [clojure.test.check.properties :as prop]) + #?(:cljs [clojure.test.check :as tc]) + #?(:cljs [clojure.test.check.generators :as gen]) + #?(:cljs [clojure.test.check.properties :as prop :include-macros true]) + [com.rpl.specter :as s] + [com.rpl.specter.transients :as t] + [clojure.set :as set])) + +;;TODO: +;; test walk, codewalk + +(defn limit-size [n {gen :gen}] + (gen/->Generator + (fn [rnd _size] + (gen rnd (if (< _size n) _size n))))) + +(defn gen-map-with-keys [key-gen val-gen & keys] + (gen/bind (gen/map key-gen val-gen) + (fn [m] + (gen/bind + (apply gen/hash-map (mapcat (fn [k] [k val-gen]) keys)) + (fn [m2] + (gen/return (merge m m2))))))) + +(defspec select-all-keyword-filter + (for-all+ + [kw gen/keyword + v (gen/vector (limit-size 5 + (gen-map-with-keys gen/keyword gen/int kw))) + pred (gen/elements [odd? even?])] + (= (select [s/ALL kw pred] v) + (->> v (map kw) (filter pred))))) + + +(defspec select-pos-extreme-pred + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [odd? even?]) + pos (gen/elements [[s/FIRST first] [s/LAST last]])] + (= (select-one [(s/filterer pred) (first pos)] v) + (->> v (filter pred) ((last pos)))))) + + +(defspec select-all-on-map + (for-all+ + [m (limit-size 5 (gen/map gen/keyword gen/int)) + p (gen/elements [s/MAP-VALS [s/ALL s/LAST]])] + (= (select p m) + (for [[k v] m] v)))) + + +(deftest select-one-test + (is (thrown? #?(:clj Exception :cljs js/Error) (select-one [s/ALL even?] [1 2 3 4]))) + (is (= 1 (select-one [s/ALL odd?] [2 4 1 6])))) + + +(deftest select-first-test + (is (= 7 (select-first [(s/filterer odd?) s/ALL #(> % 4)] [3 4 2 3 7 5 9 8]))) + (is (nil? (select-first [s/ALL even?] [1 3 5 9])))) + + +(defspec transform-all-on-map + (for-all+ + [m (limit-size 5 (gen/map gen/keyword gen/int)) + p (gen/elements [s/MAP-VALS [s/ALL s/LAST]])] + (= (transform p inc m) + (into {} (for [[k v] m] [k (inc v)]))))) + + +(defspec transform-all + (for-all+ + [v (gen/vector gen/int)] + (let [v2 (transform [s/ALL] inc v)] + (and (vector? v2) (= v2 (map inc v)))))) + + +(defspec transform-all-list + (for-all+ + [v (gen/list gen/int)] + (let [v2 (transform [s/ALL] inc v)] + (and (seq? v2) (= v2 (map inc v)))))) + + +(defspec transform-all-filter + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [odd? even?]) + action (gen/elements [inc dec])] + (let [v2 (transform [s/ALL pred] action v)] + (= v2 (map (fn [v] (if (pred v) (action v) v)) v))))) + + +(defspec transform-last + (for-all+ + [v (gen/not-empty (gen/vector gen/int)) + pred (gen/elements [inc dec])] + (let [v2 (transform [s/LAST] pred v)] + (= v2 (concat (butlast v) [(pred (last v))]))))) + + +(defspec transform-first + (for-all+ + [v (gen/not-empty (gen/vector gen/int)) + pred (gen/elements [inc dec])] + (let [v2 (transform [s/FIRST] pred v)] + (= v2 (concat [(pred (first v))] (rest v)))))) + + +(defspec transform-filterer-all-equivalency + (prop/for-all + [s (gen/vector gen/int) + target-type (gen/elements ['() []]) + pred (gen/elements [even? odd?]) + updater (gen/elements [inc dec])] + (let [v (into target-type s) + v2 (transform [(s/filterer pred) s/ALL] updater v) + v3 (transform [s/ALL pred] updater v)] + (and (= v2 v3) (= (type v2) (type v3)))))) + + +(defspec transform-with-context + (for-all+ + [kw1 gen/keyword + kw2 gen/keyword + m (limit-size 10 (gen-map-with-keys gen/keyword gen/int kw1 kw2)) + pred (gen/elements [odd? even?])] + (= (transform [(s/collect-one kw2) kw1 pred] + m) + (if (pred (kw1 m)) + (assoc m kw1 (+ (kw1 m) (kw2 m))) + m)))) + + +(defn differing-elements [v1 v2] + (->> (map vector v1 v2) + (map-indexed (fn [i [e1 e2]] + (if (not= e1 e2) + i))) + (filter identity))) + +(defspec transform-last-compound + (for-all+ + [pred (gen/elements [odd? even?]) + v (gen/such-that #(some pred %) (gen/vector gen/int))] + (let [v2 (transform [(s/filterer pred) s/LAST] inc v) + differing-elems (differing-elements v v2)] + (and (= (count v2) (count v)) + (= (count differing-elems) 1) + (every? (complement pred) (drop (first differing-elems) v2)))))) + + +;; max sizes prevent too much data from being generated and keeps test from taking forever +(defspec transform-keyword + (for-all+ + [k1 (limit-size 3 gen/keyword) + k2 (limit-size 3 gen/keyword) + m1 (limit-size 5 + (gen-map-with-keys + gen/keyword + (gen-map-with-keys gen/keyword gen/int k2) + k1)) + pred (gen/elements [inc dec])] + (let [m2 (transform [k1 k2] pred m1)] + (and (= (assoc-in m1 [k1 k2] nil) (assoc-in m2 [k1 k2] nil)) + (= (pred (get-in m1 [k1 k2])) (get-in m2 [k1 k2])))))) + + +(defspec replace-in-test + (for-all+ + [v (gen/vector gen/int)] + (let [res (->> v (map (fn [v] (if (even? v) (inc v) v)))) + user-ret (->> v + (filter even?) + (map (fn [v] [v v])) + (apply concat)) + user-ret (if (empty? user-ret) nil user-ret)] + (= (replace-in [s/ALL even?] (fn [v] [(inc v) [v v]]) v) + [res user-ret])))) + + +(defspec replace-in-custom-merge + (for-all+ + [v (gen/vector gen/int)] + (let [res (->> v (map (fn [v] (if (even? v) (inc v) v)))) + last-even (->> v (filter even?) last) + user-ret (if last-even {:a last-even})] + (= (replace-in [s/ALL even?] (fn [v] [(inc v) v]) v :merge-fn (fn [curr new] + (assoc curr :a new))) + [res user-ret])))) + + +(defspec srange-extremes-test + (for-all+ + [v (gen/vector gen/int) + v2 (gen/vector gen/int)] + (let [b (setval s/BEGINNING v2 v) + e (setval s/END v2 v)] + (and (= b (concat v2 v)) + (= e (concat v v2)))))) + + +(defspec srange-test + (for-all+ + [v (gen/vector gen/int) + b (gen/elements (-> v count inc range)) + e (gen/elements (range b (-> v count inc)))] + + (let [sv (subvec v b e) + predcount (fn [pred v] (->> v (filter pred) count)) + even-count (partial predcount even?) + odd-count (partial predcount odd?) + b (transform (s/srange b e) (fn [r] (filter odd? r)) v)] + (and (= (odd-count v) (odd-count b)) + (= (+ (even-count b) (even-count sv)) + (even-count v)))))) + + +(deftest structure-path-directly-test + (is (= 3 (select-one :b {:a 1 :b 3}))) + (is (= 5 (select-one (s/comp-paths :a :b) {:a {:b 5}})))) + + +(deftest atom-test + (let [v (transform s/ATOM inc (atom 1))] + (is (instance? #?(:clj clojure.lang.Atom :cljs cljs.core/Atom) v)) + (is (= 2 (select-one s/ATOM v) @v)))) + +(defspec view-test + (for-all+ + [i gen/int + afn (gen/elements [inc dec])] + (= (first (select (s/view afn) i)) + (afn i) + (transform (s/view afn) identity i)))) + + +(defspec must-test + (for-all+ + [k1 gen/int + k2 (gen/such-that #(not= k1 %) gen/int) + m (gen-map-with-keys gen/int gen/int k1) + op (gen/elements [inc dec])] + + (let [m (dissoc m k2)] + (and (= (transform (s/must k1) op m) + (transform (s/keypath k1) op m)) + (= (transform (s/must k2) op m) m) + (= (select (s/must k1) m) (select (s/keypath k1) m)) + (empty? (select (s/must k2) m)))))) + + +(defspec parser-test + (for-all+ + [i gen/int + afn (gen/elements [inc dec #(* % 2)]) + bfn (gen/elements [inc dec #(* % 2)]) + cfn (gen/elements [inc dec #(* % 2)])] + (and (= (select-one! (s/parser afn bfn) i) + (afn i)) + (= (transform (s/parser afn bfn) cfn i) + (-> i afn cfn bfn))))) + + +(deftest selected?-test + (is (= [[1 3 5] [2 :a] [7 11 4 2 :a] [10 1 :a] []] + (setval [s/ALL (s/selected? s/ALL even?) s/END] + [:a] + [[1 3 5] [2] [7 11 4 2] [10 1] []]))) + + (is (= [2 4] (select [s/ALL (s/selected? even?)] [1 2 3 4]))) + (is (= [1 3] (select [s/ALL (s/not-selected? even?)] [1 2 3 4])))) + + +(defspec identity-test + (for-all+ + [i gen/int + afn (gen/elements [inc dec])] + (and (= [i] (select nil i)) + (= (afn i) (transform nil afn i))))) + +(deftest nil-comp-test + (is (= [5] (select (com.rpl.specter.impl/comp-paths* nil) 5)))) + +(defspec putval-test + (for-all+ + [kw gen/keyword + m (limit-size 10 (gen-map-with-keys gen/keyword gen/int kw)) + c gen/int] + (= (transform [(s/putval c) kw] + m) + (transform [kw (s/putval c)] + m) + (assoc m kw (+ c (get m kw)))))) + + +(defspec empty-selector-test + (for-all+ + [v (gen/vector gen/int)] + (= [v] + (select [] v) + (select nil v) + (select (s/comp-paths) v) + (select (s/comp-paths nil) v) + (select [nil nil nil] v)))) + + +(defspec empty-selector-transform-test + (for-all+ + [kw gen/keyword + m (limit-size 10 (gen-map-with-keys gen/keyword gen/int kw))] + (and (= m + (transform nil identity m) + (transform [] identity m) + (transform (s/comp-paths []) identity m) + (transform (s/comp-paths nil nil) identity m)) + + (= (transform kw inc m) + (transform [nil kw] inc m) + (transform (s/comp-paths kw nil) inc m) + (transform (s/comp-paths nil kw nil) inc m))))) + + +(deftest compose-empty-comp-path-test + (let [m {:a 1}] + (is (= [1] + (select [:a (s/comp-paths)] m) + (select [(s/comp-paths) :a] m))))) + + +(defspec mixed-selector-test + (for-all+ + [k1 (limit-size 3 gen/keyword) + k2 (limit-size 3 gen/keyword) + m (limit-size 5 + (gen-map-with-keys + gen/keyword + (gen-map-with-keys gen/keyword gen/int k2) + k1))] + (= [(-> m k1 k2)] + (select [k1 (s/comp-paths k2)] m) + (select [(s/comp-paths k1) k2] m) + (select [(s/comp-paths k1 k2) nil] m) + (select [(s/comp-paths) k1 k2] m) + (select [k1 (s/comp-paths) k2] m)))) + + +(deftest cond-path-test + (is (= [4 2 6 8 10] + (select [s/ALL (s/cond-path even? [(s/view inc) (s/view inc)] + #(= 3 %) (s/view dec))] + [1 2 3 4 5 6 7 8]))) + (is (empty? (select (s/if-path odd? (s/view inc)) 2))) + (is (= [6 2 10 6 14] + (transform [(s/putval 2) + s/ALL + (s/if-path odd? [(s/view inc) (s/view inc)] (s/view dec))] + * + [1 2 3 4 5]))) + + (is (= 2 + (transform [(s/putval 2) + (s/if-path odd? (s/view inc))] + * + 2)))) + + +(defspec cond-path-selector-test + (for-all+ + [k1 (limit-size 3 gen/keyword) + k2 (limit-size 3 gen/keyword) + k3 (limit-size 3 gen/keyword) + m (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k1 + k2 + k3)) + pred (gen/elements [odd? even?])] + + (let [v1 (get m k1) + k (if (pred v1) k2 k3)] + (and + (= (transform (s/if-path [k1 pred] k2 k3) inc m) + (transform k inc m)) + (= (select (s/if-path [k1 pred] k2 k3) m) + (select k m)))))) + + +(deftest optimized-if-path-test + (is (= [-4 -2] (select [s/ALL (s/if-path [even? neg?] s/STAY)] + [1 2 -3 -4 0 -2]))) + (is (= [1 2 -3 4 0 2] (transform [s/ALL (s/if-path [even? neg?] s/STAY)] + - + [1 2 -3 -4 0 -2])))) + + +(defspec multi-path-test + (for-all+ + [k1 (limit-size 3 gen/keyword) + k2 (limit-size 3 gen/keyword) + m (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k1 + k2))] + + (= (transform (s/multi-path k1 k2) inc m) + (->> m + (transform k1 inc) + (transform k2 inc))))) + + +(deftest empty-pos-transform + (is (empty? (select s/FIRST []))) + (is (empty? (select s/LAST []))) + (is (= [] (transform s/FIRST inc []))) + (is (= [] (transform s/LAST inc [])))) + + +(defspec set-filter-test + (for-all+ + [k1 gen/keyword + k2 (gen/such-that #(not= k1 %) gen/keyword) + k3 (gen/such-that (complement #{k1 k2}) gen/keyword) + v (gen/vector (gen/elements [k1 k2 k3]))] + (= (filter #{k1 k2} v) (select [s/ALL #{k1 k2}] v)))) + + +(deftest nil-select-one-test + (is (= nil (select-one! s/ALL [nil]))) + (is (thrown? #?(:clj Exception :cljs js/Error) (select-one! s/ALL [])))) + + + +(defspec transformed-test + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [even? odd?]) + op (gen/elements [inc dec])] + (= (select-one (s/transformed [s/ALL pred] op) v) + (transform [s/ALL pred] op v)))) + + +(defspec basic-parameterized-composition-test + (for-all+ + [k1 (limit-size 3 gen/keyword) + k2 (limit-size 3 gen/keyword) + m1 (limit-size 5 + (gen-map-with-keys + gen/keyword + (gen-map-with-keys gen/keyword gen/int k2) + k1)) + pred (gen/elements [inc dec])] + (let [p (dynamicnav [a b] (path (s/keypath a) (s/keypath b)))] + (and + (= (s/compiled-select (p k1 k2) m1) (select [k1 k2] m1)) + (= (s/compiled-transform (p k1 k2) pred m1) (transform [k1 k2] pred m1)))))) + + +(defspec filterer-param-test + (for-all+ + [k gen/keyword + k2 gen/keyword + v (gen/vector + (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k + k2))) + + pred (gen/elements [odd? even?]) + updater (gen/elements [inc dec])] + (and + (= (select (s/filterer (s/keypath k) pred) v) + (select (s/filterer k pred) v)) + (= (transform [(s/filterer (s/keypath k) pred) s/ALL k2] + updater + v) + (transform [(s/filterer k pred) s/ALL k2] + updater + v))))) + + +(deftest nested-param-paths + (let [p (fn [a b c] + (path + (s/filterer (s/keypath a) + (s/selected? s/ALL + (s/keypath b) + (s/filterer (s/keypath c) even?) + s/ALL)))) + p2 (p :a :b :c) + p3 (s/filterer :a (s/selected? s/ALL :b (s/filterer :c even?) s/ALL)) + data [{:a [{:b [{:c 4 :d 5}]}]} + {:a [{:c 3}]} + {:a [{:b [{:c 7}] :e [1]}]}]] + + (is (= (select p2 data) + (select p3 data) + [[{:a [{:b [{:c 4 :d 5}]}]}]])))) + + + +(defspec subselect-nested-vectors + (for-all+ + [v1 (gen/vector + (gen/vector gen/int))] + (let [path (s/comp-paths (s/subselect s/ALL s/ALL)) + v2 (s/compiled-transform path reverse v1)] + (and + (= (s/compiled-select path v1) [(flatten v1)]) + (= (flatten v1) (reverse (flatten v2))) + (= (map count v1) (map count v2)))))) + +(defspec subselect-param-test + (for-all+ + [k gen/keyword + v (gen/vector + (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k)))] + (and + (= (s/compiled-select (s/subselect s/ALL (s/keypath k)) v) + [(map k v)]) + (let [v2 (s/compiled-transform (s/comp-paths (s/subselect s/ALL (s/keypath k))) + reverse + v)] + (and (= (map k v) (reverse (map k v2))) + (= (map #(dissoc % k) v) + (map #(dissoc % k) v2))))))) ; only key k was touched in any of the maps + + +(defspec param-multi-path-test + (for-all+ + [k1 gen/keyword + k2 gen/keyword + k3 gen/keyword + m (limit-size 5 + (gen-map-with-keys + gen/keyword + gen/int + k1 + k2 + k3)) + + pred1 (gen/elements [odd? even?]) + pred2 (gen/elements [odd? even?]) + updater (gen/elements [inc dec])] + + (let [paths [(path (s/multi-path [(s/keypath k1) pred1] [(s/keypath k2) pred2] k3)) + (path (s/multi-path [k1 pred1] [(s/keypath k2) pred2] (s/keypath k3))) + (path (s/multi-path [(s/keypath k1) pred1] [(s/keypath k2) pred2] (s/keypath k3))) + (s/multi-path [k1 pred1] [k2 pred2] k3) + (path (s/multi-path [k1 pred1] [(s/keypath k2) pred2] k3))]] + + (and + (apply = + (for [p paths] + (select p m))) + + (apply = + (for [p paths] + (transform p updater m))))))) + + +(defspec subset-test + (for-all+ + [s1 (gen/vector (limit-size 5 gen/keyword)) + s2 (gen/vector (limit-size 5 gen/keyword)) + s3 (gen/vector (limit-size 5 gen/int)) + s4 (gen/vector (limit-size 5 gen/keyword))] + (let [s1 (set s1) + s2 (set s1) + s3 (set s1) + s4 (set s1) + combined (set/union s1 s2) + ss (set/union s2 s3)] + (and + (= (transform (s/subset s3) identity combined) combined) + (= (setval (s/subset s3) #{} combined) (set/difference combined s2)) + (= (setval (s/subset s3) s4 combined) (-> combined (set/difference s2) (set/union s4))))))) + + +(deftest submap-test + (is (= [{:foo 1}] + (select [(s/submap [:foo :baz])] {:foo 1 :bar 2}))) + (is (= {:foo 1, :barry 1} + (setval [(s/submap [:bar])] {:barry 1} {:foo 1 :bar 2}))) + (is (= {:bar 1, :foo 2} + (transform [(s/submap [:foo :baz]) s/ALL s/LAST] inc {:foo 1 :bar 1}))) + (is (= {:a {:new 1} + :c {:new 1 + :old 1}} + (setval [s/ALL s/LAST (s/submap [])] {:new 1} {:a nil, :c {:old 1}})))) + +(deftest nil->val-test + (is (= {:a #{:b}} + (setval [:a s/NIL->SET (s/subset #{})] #{:b} nil))) + (is (= {:a #{:b :c :d}} + (setval [:a s/NIL->SET (s/subset #{})] #{:b} {:a #{:c :d}}))) + (is (= {:a [:b]} + (setval [:a s/NIL->VECTOR s/END] [:b] nil)))) + + +(defspec void-test + (for-all+ + [s1 (gen/vector (limit-size 5 gen/int))] + (and + (empty? (select s/STOP s1)) + (empty? (select [s/STOP s/ALL s/ALL s/ALL s/ALL] s1)) + (= s1 (transform s/STOP inc s1)) + (= s1 (transform [s/ALL s/STOP s/ALL] inc s1)) + (= (transform [s/ALL (s/cond-path even? nil odd? s/STOP)] inc s1) + (transform [s/ALL even?] inc s1))))) + + +(deftest stay-continue-tests + (is (= [[1 2 [:a :b]] [3 [:a :b]] [:a :b [:a :b]]] + (setval [(s/stay-then-continue s/ALL) s/END] [[:a :b]] [[1 2] [3]]))) + (is (= [[1 2 [:a :b]] [3 [:a :b]] [:a :b]] + (setval [(s/continue-then-stay s/ALL) s/END] [[:a :b]] [[1 2] [3]]))) + (is (= [[1 2 3] 1 3] + (select (s/stay-then-continue s/ALL odd?) [1 2 3]))) + (is (= [1 3 [1 2 3]] + (select (s/continue-then-stay s/ALL odd?) [1 2 3])))) + + + +(declarepath MyWalker) + +(providepath MyWalker + (s/if-path vector? + (s/if-path [s/FIRST #(= :abc %)] + (s/continue-then-stay s/ALL MyWalker) + [s/ALL MyWalker]))) + + +(deftest recursive-path-test + (is (= [9 1 10 3 1] + (select [MyWalker s/ALL number?] + [:bb [:aa 34 [:abc 10 [:ccc 9 8 [:abc 9 1]]]] [:abc 1 [:abc 3]]]))) + + (is (= [:bb [:aa 34 [:abc 11 [:ccc 9 8 [:abc 10 2]]]] [:abc 2 [:abc 4]]] + (transform [MyWalker s/ALL number?] inc + [:bb [:aa 34 [:abc 10 [:ccc 9 8 [:abc 9 1]]]] [:abc 1 [:abc 3]]])))) + + +(def map-key-walker + (recursive-path [akey] p + [s/ALL + (s/if-path [s/FIRST #(= % akey)] + s/LAST + [s/LAST p])])) + +(deftest recursive-params-path-test + (is (= #{1 2 3} (set (select (map-key-walker :aaa) + {:a {:aaa 3 :b {:c {:aaa 2} :aaa 1}}})))) + (is (= {:a {:aaa 4 :b {:c {:aaa 3} :aaa 2}}} + (transform (map-key-walker :aaa) inc + {:a {:aaa 3 :b {:c {:aaa 2} :aaa 1}}}))) + (is (= {:a {:c {:b "X"}}} + (setval (map-key-walker :b) "X" {:a {:c {:b {:d 1}}}})))) + + +(deftest recursive-params-composable-path-test + (let [p (fn [k k2] (path (s/keypath k) (map-key-walker k2)))] + (is (= [1] (select (p 1 :a) [{:a 3} {:a 1} {:a 2}]))))) + + +(deftest all-map-test + (is (= {3 3} (transform [s/ALL s/FIRST] inc {2 3}))) + (is (= {3 21 4 31} (transform [s/ALL s/ALL] inc {2 20 3 30})))) + + + +(def NestedHigherOrderWalker + (recursive-path [k] p + (s/if-path vector? + (s/if-path [s/FIRST #(= % k)] + (s/continue-then-stay s/ALL p) + [s/ALL p])))) + + +(deftest nested-higher-order-walker-test + (is (= [:q [:abc :I 3] [:ccc [:abc :I] [:abc :I "a" [:abc :I [:abc :I [:d]]]]]] + (setval [(NestedHigherOrderWalker :abc) (s/srange 1 1)] + [:I] + [:q [:abc 3] [:ccc [:abc] [:abc "a" [:abc [:abc [:d]]]]]])))) + + +#?(:clj + (deftest large-params-test + (let [path (apply com.rpl.specter.impl/comp-navs (for [i (range 25)] (s/keypath i))) + m (reduce + (fn [m k] + {k m}) + :a + (reverse (range 25)))] + (is (= :a (select-one path m)))))) + +;;TODO: there's a bug in clojurescript that won't allow +;; non function implementations of IFn to have more than 20 arguments + +#?(:clj + (do + (defprotocolpath AccountPath []) + (defrecord Account [funds]) + (defrecord User [account]) + (defrecord Family [accounts]) + (extend-protocolpath AccountPath User :account Family [:accounts s/ALL]))) + + +#?(:clj + (deftest protocolpath-basic-test + (let [data [(->User (->Account 30)) + (->User (->Account 50)) + (->Family [(->Account 51) (->Account 52)])]] + (is (= [30 50 51 52] + (select [s/ALL AccountPath :funds] data))) + (is (= [(->User (->Account 31)) + (->User (->Account 51)) + (->Family [(->Account 52) (->Account 53)])] + (transform [s/ALL AccountPath :funds] + inc + data)))))) + + +#?(:clj + (do + (defprotocolpath LabeledAccountPath [label]) + (defrecord LabeledUser [account]) + (defrecord LabeledFamily [accounts]) + (extend-protocolpath LabeledAccountPath + LabeledUser [:account (s/keypath label)] + LabeledFamily [:accounts (s/keypath label) s/ALL]))) + + +#?(:clj + (deftest protocolpath-params-test + (let [data [(->LabeledUser {:a (->Account 30)}) + (->LabeledUser {:a (->Account 50)}) + (->LabeledFamily {:a [(->Account 51) (->Account 52)]})]] + (is (= [30 50 51 52] + (select [s/ALL (LabeledAccountPath :a) :funds] data))) + (is (= [(->LabeledUser {:a (->Account 31)}) + (->LabeledUser {:a (->Account 51)}) + (->LabeledFamily {:a [(->Account 52) (->Account 53)]})] + (transform [s/ALL (LabeledAccountPath :a) :funds] + inc + data)))))) + + + +#?(:clj + (do + (defprotocolpath CustomWalker []) + (extend-protocolpath CustomWalker + Object nil + clojure.lang.PersistentHashMap [(s/keypath :a) CustomWalker] + clojure.lang.PersistentArrayMap [(s/keypath :a) CustomWalker] + clojure.lang.PersistentVector [s/ALL CustomWalker]))) + + +#?(:clj + (deftest mixed-rich-regular-protocolpath + (is (= [1 2 3 11 21 22 25] + (select [CustomWalker number?] [{:a [1 2 :c [3]]} [[[[[[11]]] 21 [22 :c 25]]]]]))) + (is (= [2 3 [[[4]] :b 0] {:a 4 :b 10}] + (transform [CustomWalker number?] inc [1 2 [[[3]] :b -1] {:a 3 :b 10}]))))) + + + +#?( + :clj + (defn make-queue [coll] + (reduce + #(conj %1 %2) + clojure.lang.PersistentQueue/EMPTY + coll)) + + :cljs + (defn make-queue [coll] + (reduce + #(conj %1 %2) + #queue [] + coll))) + + +(defspec transform-idempotency 50 + (for-all+ + [v1 (gen/vector gen/int) + l1 (gen/list gen/int) + m1 (gen/map gen/keyword gen/int)] + (let [s1 (set v1) + q1 (make-queue v1) + v2 (transform s/ALL identity v1) + m2 (transform s/ALL identity m1) + s2 (transform s/ALL identity s1) + l2 (transform s/ALL identity l1) + q2 (transform s/ALL identity q1)] + (and + (= v1 v2) + (= (type v1) (type v2)) + (= m1 m2) + (= (type m1) (type m2)) + (= s1 s2) + (= (type s1) (type s2)) + (= l1 l2) + (seq? l2) ; Transformed lists are only guaranteed to impelment ISeq + (= q1 q2) + (= (type q1) (type q2)))))) + +(defn ^:direct-nav double-str-keypath [s1 s2] + (path (s/keypath (str s1 s2)))) + +(defn ^:direct-nav some-keypath + ([] (s/keypath "a")) + ([k1] (s/keypath (str k1 "!"))) + ([k & args] (s/keypath "bbb"))) + +(deftest nav-constructor-test + ;; this also tests that the eval done by clj platform during inline + ;; caching rebinds to the correct namespace since this is run + ;; by clojure.test in a different namespace + (is (= 1 (select-one! (double-str-keypath "a" "b") {"ab" 1 "c" 2}))) + (is (= 1 (select-one! (some-keypath) {"a" 1 "a!" 2 "bbb" 3 "d" 4}))) + (is (= 2 (select-one! (some-keypath "a") {"a" 1 "a!" 2 "bbb" 3 "d" 4}))) + (is (= 3 (select-one! (some-keypath 1 2 3 4 5) {"a" 1 "a!" 2 "bbb" 3 "d" 4})))) + + +(def ^:dynamic *APATH* s/keypath) + +(deftest inline-caching-test + (ic-test + [k] + [s/ALL (s/must k)] + inc + [{:a 1} {:b 2 :c 3} {:a 7 :d -1}] + [[:a] [:b] [:c] [:d] [:e]]) + (ic-test + [] + [s/ALL #{4 5 11} #(> % 2) (fn [e] (< e 7))] + inc + (range 20) + []) + (ic-test + [v] + (if v :a :b) + inc + {:a 1 :b 2} + [[true] [false]]) + (ic-test + [v] + [s/ALL (double-str-keypath v (inc v))] + str + [{"12" :a "1011" :b} {"1011" :c}] + [[1] [10]]) + (ic-test + [k] + (*APATH* k) + str + {:a 1 :b 2} + [[:a] [:b] [:c]]) + + (binding [*APATH* s/must] + (ic-test + [k] + (*APATH* k) + inc + {:a 1 :b 2} + [[:a] [:b] [:c]])) + + (ic-test + [k k2] + [s/ALL (s/selected? (s/must k) #(> % 2)) (s/must k2)] + dec + [{:a 1 :b 2} {:a 10 :b 6} {:c 7 :b 8} {:c 1 :d 9} {:c 3 :d -1}] + [[:a :b] [:b :a] [:c :d] [:b :c]]) + + (ic-test + [] + [(s/transformed s/STAY inc)] + inc + 10 + []) + + + ;; verifying that these don't throw errors + (is (= 1 (select-any (if true :a :b) {:a 1}))) + (is (= 3 (select-any (*APATH* :a) {:a 3}))) + (is (= 2 (select-any [:a (identity even?)] {:a 2}))) + + (is (= [10 11] (select-one! [(s/putval 10) (s/transformed s/STAY #(inc %))] 10))) + + (is (= 2 (let [p :a] (select-one! [p even?] {:a 2})))) + + (is (= [{:a 2}] (let [p :a] (select [s/ALL (s/selected? p even?)] [{:a 2}]))))) + + + +(deftest nested-inline-caching-test + (is (= [[1]] + (let [a :b] + (select + (s/view + (fn [v] + (select [(s/keypath v) (s/keypath a)] + {:a {:b 1}}))) + :a))))) + + + +(defspec continuous-subseqs-filter-equivalence + (for-all+ + [aseq (gen/vector (gen/elements [1 2 3 :a :b :c 4 5 :d :e])) + pred (gen/elements [keyword? number?])] + (= (setval (s/continuous-subseqs pred) nil aseq) + (filter (complement pred) aseq)))) + + +(deftest continuous-subseqs-test + (is (= [1 "ab" 2 3 "c" 4 "def"] + (transform + (s/continuous-subseqs string?) + (fn [s] [(apply str s)]) + [1 "a" "b" 2 3 "c" 4 "d" "e" "f"]))) + + (is (= [[] [2] [4 6]] + (select + [(s/continuous-subseqs number?) (s/filterer even?)] + [1 "a" "b" 2 3 "c" 4 5 6 "d" "e" "f"])))) + + + +;; verifies that late binding of dynamic parameters works correctly +(deftest transformed-inline-caching + (dotimes [i 10] + (is (= [(inc i)] (select (s/transformed s/STAY #(+ % i)) 1))))) + + +;; test for issue #103 +(deftest nil->val-regression-test + (is (= false (transform (s/nil->val true) identity false))) + (is (= false (select-one! (s/nil->val true) false)))) + + +#?(:clj + (deftest all-map-entry + (let [e (transform s/ALL inc (first {1 3}))] + (is (instance? clojure.lang.MapEntry e)) + (is (= 2 (key e))) + (is (= 4 (val e)))))) + + +(deftest select-on-empty-vector + (is (= s/NONE (select-any s/ALL []))) + (is (nil? (select-first s/ALL []))) + (is (nil? (select-one s/ALL []))) + (is (= s/NONE (select-any s/FIRST []))) + (is (= s/NONE (select-any s/LAST []))) + (is (nil? (select-first s/FIRST []))) + (is (nil? (select-one s/FIRST []))) + (is (nil? (select-first s/LAST []))) + (is (nil? (select-one s/LAST [])))) + + +(defspec select-first-one-any-equivalency + (for-all+ + [aval gen/int + apred (gen/elements [even? odd?])] + (let [data [aval] + r1 (select-any [s/ALL (s/pred apred)] data) + r2 (select-first [s/ALL (s/pred apred)] data) + r3 (select-one [s/ALL (s/pred apred)] data) + r4 (first (select [s/ALL (s/pred apred)] data)) + r5 (select-any [s/FIRST (s/pred apred)] data) + r6 (select-any [s/LAST (s/pred apred)] data)] + + (or (and (= r1 s/NONE) (nil? r2) (nil? r3) (nil? r4) + (= r5 s/NONE) (= r6 s/NONE)) + (and (not= r1 s/NONE) (some? r1) (= r1 r2 r3 r4 r5 r6)))))) + + +(deftest select-any-static-fn + (is (= 2 (select-any even? 2))) + (is (= s/NONE (select-any odd? 2)))) + + +(deftest select-any-keywords + (is (= s/NONE (select-any [:a even?] {:a 1}))) + (is (= 2 (select-any [:a even?] {:a 2}))) + (is (= s/NONE (select-any [(s/keypath "a") even?] {"a" 1}))) + (is (= 2 (select-any [(s/keypath "a") even?] {"a" 2}))) + (is (= s/NONE (select-any (s/must :b) {:a 1 :c 3}))) + (is (= 2 (select-any (s/must :b) {:a 1 :b 2 :c 3}))) + (is (= s/NONE (select-any [(s/must :b) odd?] {:a 1 :b 2 :c 3})))) + + +(defspec select-any-ALL + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [even? odd?])] + (let [r1 (select [s/ALL pred] v) + r2 (select-any [s/ALL pred] v)] + (or (and (empty? r1) (= s/NONE r2)) + (contains? (set r1) r2))))) + + +(deftest select-any-beginning-end + (is (= [] (select-any s/BEGINNING [1 2 3]) (select-any s/END [1]))) + (is (= s/NONE (select-any [s/BEGINNING s/STOP] [1 2 3]) (select-any [s/END s/STOP] [2 3])))) + + +(deftest select-any-walker + (let [data [1 [2 3 4] [[6]]]] + (is (= s/NONE (select-any (s/walker keyword?) data))) + (is (= s/NONE (select-any [(s/walker number?) neg?] data))) + (is (#{1 3} (select-any [(s/walker number?) odd?] data))) + (is (#{2 4 6} (select-any [(s/walker number?) even?] data))))) + + +(defspec selected-any?-select-equivalence + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [even? odd?])] + (let [r1 (not (empty? (select [s/ALL pred] v))) + r2 (selected-any? [s/ALL pred] v)] + (= r1 r2)))) + + +(defn div-by-3? [v] + (= 0 (mod v 3))) + +(defspec selected?-filter-equivalence + (for-all+ + [v (gen/vector gen/int) + pred (gen/elements [even? odd?])] + (and + (= (select-any [s/ALL pred] v) + (select-any [s/ALL (s/selected? pred)] v)) + + (= (select-any [s/ALL pred div-by-3?] v) + (select-any [s/ALL (s/selected? pred) div-by-3?] v))))) + + + +(deftest multi-path-select-any-test + (is (= s/NONE (select-any (s/multi-path s/STOP s/STOP) 1))) + (is (= 1 (select-any (s/multi-path s/STAY s/STOP) 1) + (select-any (s/multi-path s/STOP s/STAY) 1) + (select-any (s/multi-path s/STOP s/STAY s/STOP) 1))) + + (is (= s/NONE (select-any [(s/multi-path s/STOP s/STAY) even?] 1)))) + + +(deftest if-path-select-any-test + (is (= s/NONE (select-any (s/if-path even? s/STAY) 1))) + (is (= 2 (select-any (s/if-path even? s/STAY s/STAY) 2))) + (is (= s/NONE (select-any [(s/if-path even? s/STAY s/STAY) odd?] 2))) + (is (= 2 (select-any (s/if-path odd? s/STOP s/STAY) 2))) + (is (= s/NONE (select-any [(s/if-path odd? s/STOP s/STAY) odd?] 2)))) + + +(defspec transient-vector-test + (for-all+ + [v (gen/vector (limit-size 5 gen/int))] + (every? identity + (for [[path transient-path f] + [[s/FIRST t/FIRST! (fnil inc 0)] ;; fnil in case vector is empty + [s/LAST t/LAST! (fnil inc 0)] + [(s/keypath 0) (t/keypath! 0) (fnil inc 0)] + [s/END t/END! #(conj % 1 2 3)]]] + (and (= (s/transform* path f v) + (persistent! (s/transform* transient-path f (transient v)))) + (= (s/select* path v) + (s/select* transient-path (transient v)))))))) + +(defspec transient-map-test + (for-all+ + [m (limit-size 5 (gen/not-empty (gen/map gen/keyword gen/int))) + new-key gen/keyword] + (let [existing-key (first (keys m))] + (every? identity + (for [[path transient-path f] + [[(s/keypath existing-key) (t/keypath! existing-key) inc] + [(s/keypath new-key) (t/keypath! new-key) (constantly 3)] + [(s/submap [existing-key new-key]) + (t/submap! [existing-key new-key]) + (constantly {new-key 1234})]]] + (and (= (s/transform* path f m) + (persistent! (s/transform* transient-path f (transient m)))) + (= (s/select* path m) + (s/select* transient-path (transient m))))))))) + +(defspec meta-test + (for-all+ + [v (gen/vector gen/int) + meta-map (limit-size 5 (gen/map gen/keyword gen/int))] + (= meta-map + (meta (setval s/META meta-map v)) + (first (select s/META (with-meta v meta-map))) + (first (select s/META (setval s/META meta-map v)))))) + + +(deftest beginning-end-all-first-last-on-nil + (is (= [2 3] (setval s/END [2 3] nil) (setval s/BEGINNING [2 3] nil))) + (is (nil? (setval s/FIRST :a nil))) + (is (nil? (setval s/LAST :a nil))) + (is (nil? (transform s/ALL inc nil))) + (is (empty? (select s/FIRST nil))) + (is (empty? (select s/LAST nil))) + (is (empty? (select s/ALL nil)))) + + +(deftest map-vals-nil + (is (= nil (transform s/MAP-VALS inc nil))) + (is (empty? (select s/MAP-VALS nil)))) + + +(defspec dispense-test + (for-all+ + [k1 gen/int + k2 gen/int + k3 gen/int + m (gen-map-with-keys gen/int gen/int k1 k2 k3)] + (= (select [(s/collect-one (s/keypath k1)) + (s/collect-one (s/keypath k2)) + s/DISPENSE + (s/collect-one (s/keypath k2)) + (s/keypath k3)] + m) + (select [(s/collect-one (s/keypath k2)) + (s/keypath k3)] + m)))) + + +(deftest collected?-test + (let [data {:active-id 1 :items [{:id 1 :name "a"} {:id 2 :name "b"}]}] + (is (= {:id 1 :name "a"} + (select-any [(s/collect-one :active-id) + :items + s/ALL + (s/collect-one :id) + (collected? [a i] (= a i)) + s/DISPENSE] + + data) + (select-any [(s/collect-one :active-id) + :items + s/ALL + (s/collect-one :id) + (collected? v (apply = v)) + s/DISPENSE] + + data)))) + + (let [data {:active 3 :items [{:id 1 :val 0} {:id 3 :val 11}]}] + (is (= (transform [:items s/ALL (s/selected? :id #(= % 3)) :val] inc data) + (transform [(s/collect-one :active) + :items + s/ALL + (s/collect-one :id) + (collected? [a i] (= a i)) + s/DISPENSE + :val] + inc + data))))) + + +(defspec traverse-test + (for-all+ + [v (gen/vector gen/int) + p (gen/elements [odd? even?]) + i gen/int] + (and + (= (reduce + (traverse [s/ALL p] v)) + (reduce + (filter p v))) + (= (reduce + i (traverse [s/ALL p] v)) + (reduce + i (filter p v)))))) + +(def KeyAccumWalker + (recursive-path [k] p + (s/if-path (s/must k) + s/STAY + [s/ALL (s/collect-one s/FIRST) s/LAST p]))) + + +(deftest recursive-if-path-select-vals-test + (let [data {"e1" {"e2" {"e1" {:template 1} "e2" {:template 2}}}}] + (is (= [["e1" "e2" "e1" {:template 1}] ["e1" "e2" "e2" {:template 2}]] + (select (KeyAccumWalker :template) data))) + (is (= {"e1" {"e2" {"e1" "e1e2e1" "e2" "e1e2e2"}}} + (transform (KeyAccumWalker :template) + (fn [& all] (apply str (butlast all))) + data))))) + + +(deftest multi-path-vals-test + (is (= {:a 1 :b 6 :c 3} + (transform [(s/multi-path (s/collect-one :a) (s/collect-one :c)) :b] + + + {:a 1 :b 2 :c 3}))) + (is (= [[1 2] [3 2]] + (select [(s/multi-path (s/collect-one :a) (s/collect-one :c)) :b] + {:a 1 :b 2 :c 3})))) + + +(deftest sorted-map-by-transform + (let [amap (sorted-map-by > 1 10 2 20 3 30)] + (is (= [3 2 1] (keys (transform s/MAP-VALS inc amap)))) + (is (= [3 2 1] (keys (transform [s/ALL s/LAST] inc amap)))))) + + +(deftest setval-vals-collection-test + (is (= 2 (setval s/VAL 2 :a)))) + +(defspec multi-transform-test + (for-all+ + [kw1 gen/keyword + kw2 gen/keyword + m (limit-size 5 (gen-map-with-keys gen/keyword gen/int kw1 kw2))] + (= (->> m (transform [(s/keypath kw1) s/VAL] +) (transform (s/keypath kw2) dec)) + (multi-transform + (s/multi-path [(s/keypath kw1) s/VAL (s/terminal +)] + [(s/keypath kw2) (s/terminal dec)]) + m)))) + + +(deftest multi-transform-overrun-error + (is (thrown? #?(:clj Exception :cljs js/Error) (multi-transform s/STAY 3)))) + + +(deftest terminal-val-test + (is (= 3 (multi-transform (s/terminal-val 3) 2))) + (is (= 3 (multi-transform [s/VAL (s/terminal-val 3)] 2)))) + + + +(deftest multi-path-order-test + (is (= 102 + (multi-transform + (s/multi-path + [odd? (s/terminal #(* 2 %))] + [even? (s/terminal-val 100)] + [#(= 100 %) (s/terminal inc)] + [#(= 101 %) (s/terminal inc)]) + 1)))) + + +(defdynamicnav ignorer [a] + s/STAY) + +(deftest dynamic-nav-ignores-dynamic-arg + (let [a 1] + (is (= 1 (select-any (ignorer a) 1))) + (is (= 1 (select-any (ignorer :a) 1))))) + + +(deftest nested-dynamic-nav + (let [data {:a {:a 1 :b 2} :b {:a 3 :b 4}} + afn (fn [a b] (select-any (s/selected? (s/must a) + (s/selected? (s/must b))) + data))] + (is (= data (afn :a :a))) + (is (= s/NONE (afn :a :c))) + (is (= data (afn :a :b))) + (is (= s/NONE (afn :c :a))) + (is (= data (afn :b :a))) + (is (= data (afn :b :b))))) + +(deftest duplicate-map-keys-test + (let [res (setval [s/ALL s/FIRST] "a" {:a 1 :b 2})] + (is (= {"a" 2} res)) + (is (= 1 (count res))))) + +(deftest inline-caching-vector-params-test + (is (= [10 [11]] (multi-transform (s/terminal-val [10 [11]]) :a)))) + +(defn eachnav-fn-test [akey data] + (select-any (s/keypath "a" akey) data)) + +(deftest eachnav-test + (let [data {"a" {"b" 1 "c" 2}}] + (is (= 1 (eachnav-fn-test "b" data))) + (is (= 2 (eachnav-fn-test "c" data))) + )) + +(deftest traversed-test + (is (= 10 (select-any (s/traversed s/ALL +) [1 2 3 4])))) + +(defn- predand= [pred v1 v2] + (and (pred v1) + (pred v2) + (= v1 v2))) + +(defn listlike? [v] + (or (list? v) (seq? v))) + +(deftest nthpath-test + (is (predand= vector? [1 2 -3 4] (transform (s/nthpath 2) - [1 2 3 4]))) + (is (predand= vector? [1 2 4] (setval (s/nthpath 2) s/NONE [1 2 3 4]))) + (is (predand= (complement vector?) '(1 -2 3 4) (transform (s/nthpath 1) - '(1 2 3 4)))) + (is (predand= (complement vector?) '(1 2 4) (setval (s/nthpath 2) s/NONE '(1 2 3 4)))) + (is (= [0 1 [2 4 4]] (transform (s/nthpath 2 1) inc [0 1 [2 3 4]]))) + ) + +(deftest remove-with-NONE-test + (is (predand= vector? [1 2 3] (setval [s/ALL nil?] s/NONE [1 2 nil 3 nil]))) + (is (predand= listlike? '(1 2 3) (setval [s/ALL nil?] s/NONE '(1 2 nil 3 nil)))) + (is (= {:b 2} (setval :a s/NONE {:a 1 :b 2}))) + (is (= {:b 2} (setval (s/must :a) s/NONE {:a 1 :b 2}))) + (is (predand= vector? [1 3] (setval (s/keypath 1) s/NONE [1 2 3]))) + ;; test with PersistentArrayMap + (is (= {:a 1 :c 3} (setval [s/MAP-VALS even?] s/NONE {:a 1 :b 2 :c 3 :d 4}))) + (is (= {:a 1 :c 3} (setval [s/ALL (s/selected? s/LAST even?)] s/NONE {:a 1 :b 2 :c 3 :d 4}))) + ;; test with PersistentHashMap + (let [m (into {} (for [i (range 500)] [i i]))] + (is (= (dissoc m 31) (setval [s/MAP-VALS #(= 31 %)] s/NONE m))) + (is (= (dissoc m 31) (setval [s/ALL (s/selected? s/LAST #(= 31 %))] s/NONE m))) + )) + +(deftest fresh-collected-test + (let [data [{:a 1 :b 2} {:a 3 :b 3}]] + (is (= [[{:a 1 :b 2} 2]] + (select [s/ALL + s/VAL + (s/with-fresh-collected + (s/collect-one :a) + (s/collected? [a] (= a 1))) + :b] + data))) + (is (= [{:a 1 :b 3} {:a 3 :b 3}] + (transform [s/ALL + s/VAL + (s/with-fresh-collected + (s/collect-one :a) + (s/collected? [a] (= a 1))) + :b] + (fn [m v] (+ (:a m) v)) + data + ))) + )) + +(deftest traverse-all-test + (is (= 3 + (transduce (comp (mapcat identity) + (traverse-all :a)) + (completing (fn [r i] (if (= i 4) (reduced r) (+ r i)))) + 0 + [[{:a 1}] [{:a 2}] [{:a 4}] [{:a 5}]]))) + (is (= 6 + (transduce (traverse-all [s/ALL :a]) + + + 0 + [[{:a 1} {:a 2}] [{:a 3}]] + ))) + (is (= [1 2] + (into [] (traverse-all :a) [{:a 1} {:a 2}]))) + ) + +(deftest early-terminate-traverse-test + (is (= 6 + (reduce + (completing (fn [r i] (if (> r 5) (reduced r) (+ r i)))) + 0 + (traverse [s/ALL s/ALL] + [[1 2] [3 4] [5]]))))) + +(deftest select-any-vals-test + (is (= [1 1] (select-any s/VAL 1)))) + +(deftest conditional-vals-test + (is (= 2 (select-any (s/with-fresh-collected + (s/collect-one (s/keypath 0)) + (s/if-path (collected? [n] (even? n)) + (s/keypath 1) + (s/keypath 2))) + [4 2 3]))) + (is (= [4 2 3] + (select-any (s/with-fresh-collected + (s/collect-one (s/keypath 0)) + (s/selected? (collected? [n] (even? n)))) + [4 2 3]))) + ) + +(deftest name-namespace-test + (is (= :a (setval s/NAME "a" :e))) + (is (= :a/b (setval s/NAME "b" :a/e))) + (is (= 'a (setval s/NAME "a" 'e))) + (is (= 'a/b (setval s/NAME "b" 'a/e))) + (is (= :a/e (setval s/NAMESPACE "a" :e))) + (is (= :a/e (setval s/NAMESPACE "a" :f/e))) + (is (= 'a/e (setval s/NAMESPACE "a" 'e))) + (is (= 'a/e (setval s/NAMESPACE "a" 'f/e))) + ) + +(deftest string-navigation-test + (is (= "ad" (setval (s/srange 1 3) "" "abcd"))) + (is (= "abcxd" (setval [(s/srange 1 3) s/END] "x" "abcd"))) + (is (= "bc" (select-any (s/srange 1 3) "abcd"))) + (is (= "ab" (setval s/END "b" "a"))) + (is (= "ba" (setval s/BEGINNING "b" "a"))) + (is (= "" (select-any s/BEGINNING "abc"))) + (is (= "" (select-any s/END "abc"))) + (is (= \a (select-any s/FIRST "abc"))) + (is (= \c (select-any s/LAST "abc"))) + (is (= "qbc" (setval s/FIRST \q "abc"))) + (is (= "abq" (setval s/LAST "q" "abc"))) + ) + +(deftest regex-navigation-test + ;; also test regexes as implicit navs + (is (= (select #"t" "test") ["t" "t"])) + (is (= (select [:a (s/regex-nav #"t")] {:a "test"}) ["t" "t"])) + (is (= (transform (s/regex-nav #"t") clojure.string/capitalize "test") "TesT")) + ;; also test regexes as implicit navs + (is (= (transform [:a #"t"] clojure.string/capitalize {:a "test"}) {:a "TesT"})) + (is (= (transform (s/regex-nav #"\s+\w") clojure.string/triml "Hello World!") "HelloWorld!")) + (is (= (setval (s/regex-nav #"t") "z" "test") "zesz")) + (is (= (setval [:a (s/regex-nav #"t")] "z" {:a "test"}) {:a "zesz"})) + (is (= (transform (s/regex-nav #"aa*") (fn [s] (-> s count str)) "aadt") "2dt")) + (is (= (transform (s/regex-nav #"[Aa]+") (fn [s] (apply str (take (count s) (repeat "@")))) "Amsterdam Aardvarks") "@msterd@m @@rdv@rks")) + (is (= (select [(s/regex-nav #"(\S+):\ (\d+)") (s/nthpath 2)] "Mary: 1st George: 2nd Arthur: 3rd") ["1" "2" "3"])) + (is (= (transform (s/subselect (s/regex-nav #"\d\w+")) reverse "Mary: 1st George: 2nd Arthur: 3rd") "Mary: 3rd George: 2nd Arthur: 1st")) + ) + +(deftest single-value-none-navigators-test + (is (predand= vector? [1 2 3] (setval s/AFTER-ELEM 3 [1 2]))) + (is (predand= listlike? '(1 2 3) (setval s/AFTER-ELEM 3 '(1 2)))) + (is (predand= listlike? '(1) (setval s/AFTER-ELEM 1 nil))) + (is (predand= vector? [3 1 2] (setval s/BEFORE-ELEM 3 [1 2]))) + (is (predand= listlike? '(3 1 2) (setval s/BEFORE-ELEM 3 '(1 2)))) + (is (predand= listlike? '(1) (setval s/BEFORE-ELEM 1 nil))) + (is (= #{1 2 3} (setval s/NONE-ELEM 3 #{1 2}))) + (is (= #{1} (setval s/NONE-ELEM 1 nil))) + ) + +(deftest subvec-test + (let [v (subvec [1] 0)] + (is (predand= vector? [2] (transform s/FIRST inc v))) + (is (predand= vector? [2] (transform s/LAST inc v))) + (is (predand= vector? [2] (transform s/ALL inc v))) + (is (predand= vector? [0 1] (setval s/BEGINNING [0] v))) + (is (predand= vector? [1 0] (setval s/END [0] v))) + (is (predand= vector? [0 1] (setval s/BEFORE-ELEM 0 v))) + (is (predand= vector? [1 0] (setval s/AFTER-ELEM 0 v))) + (is (predand= vector? [1 0] (setval (s/srange 1 1) [0] v))) + )) + +(defspec map-keys-all-first-equivalence-transform + (for-all+ + [m (limit-size 10 (gen/map gen/int gen/keyword))] + (= (transform s/MAP-KEYS inc m) + (transform [s/ALL s/FIRST] inc m ) + ))) + +(defspec map-keys-all-first-equivalence-select + (for-all+ + [m (limit-size 10 (gen/map gen/int gen/keyword))] + (= (select s/MAP-KEYS m) + (select [s/ALL s/FIRST] m) + ))) + +(defspec remove-first-vector + (for-all+ + [v (limit-size 10 (gen/not-empty (gen/vector gen/int)))] + (let [newv (setval s/FIRST s/NONE v)] + (and (= newv (vec (rest v))) + (vector? newv) + )))) + +(defspec remove-first-list + (for-all+ + [l (limit-size 10 (gen/not-empty (gen/list gen/int)))] + (let [newl (setval s/FIRST s/NONE l)] + (and (= newl (rest l)) + (listlike? newl) + )))) + +(defspec remove-last-vector + (for-all+ + [v (limit-size 10 (gen/not-empty (gen/vector gen/int)))] + (let [newv (setval s/LAST s/NONE v)] + (and (= newv (vec (butlast v))) + (vector? newv) + )))) + +(defspec remove-last-list + (for-all+ + [l (limit-size 10 (gen/not-empty (gen/list gen/int)))] + (let [newl (setval s/LAST s/NONE l) + bl (butlast l)] + (and (or (= newl bl) (and (nil? bl) (= '() newl))) + (seq? newl) + )))) + +(deftest remove-extreme-string + (is (= "b" (setval s/FIRST s/NONE "ab"))) + (is (= "a" (setval s/LAST s/NONE "ab"))) + ) + +(deftest nested-dynamic-arg-test + (let [foo (fn [v] (multi-transform (s/terminal-val [v]) nil))] + (is (= [1] (foo 1))) + (is (= [10] (foo 10))) + )) + +(deftest filterer-remove-test + (is (= [1 :a 3 5] (setval (s/filterer even?) [:a] [1 2 3 4 5]))) + (is (= [1 3 5] (setval (s/filterer even?) [] [1 2 3 4 5]))) + (is (= [1 3 5] (setval (s/filterer even?) nil [1 2 3 4 5]))) + ) + +(deftest helper-preds-test + (let [data [1 2 2 3 4 0]] + (is (= [2 2] (select [s/ALL (s/pred= 2)] data))) + (is (= [1 2 2 0] (select [s/ALL (s/pred< 3)] data))) + (is (= [1 2 2 3 0] (select [s/ALL (s/pred<= 3)] data))) + (is (= [4] (select [s/ALL (s/pred> 3)] data))) + (is (= [3 4] (select [s/ALL (s/pred>= 3)] data))) + )) + +(deftest map-key-test + (is (= {:c 3} (setval (s/map-key :a) :b {:c 3}))) + (is (= {:b 2} (setval (s/map-key :a) :b {:a 2}))) + (is (= {:b 2} (setval (s/map-key :a) :b {:a 2 :b 1}))) + (is (= {:b 2} (setval (s/map-key :a) s/NONE {:a 1 :b 2}))) + ) + +(deftest set-elem-test + (is (= #{:b :d} (setval (s/set-elem :a) :x #{:b :d}))) + (is (= #{:x :a} (setval (s/set-elem :b) :x #{:b :a}))) + (is (= #{:a} (setval (s/set-elem :b) :a #{:b :a}))) + (is (= #{:b} (setval (s/set-elem :a) s/NONE #{:a :b}))) + ) + +;; this function necessary to trigger the bug from happening +(defn inc2 [v] (inc v)) +(deftest dynamic-function-arg-test + (is (= {[2] 4} (let [a 1] (transform (s/keypath [(inc2 a)]) inc {[2] 3})))) + ) + +(defrecord FooW [a b]) + +(deftest walker-test + (is (= [1 2 3 4 5 6] (select (s/walker number?) [{1 2 :b '(3 :c 4)} 5 #{6 :d}]))) + (is (= [{:b '(:c)} #{:d}] (setval (s/walker number?) s/NONE [{:q 3 10 :l 1 2 :b '(3 :c 4)} 5 #{6 :d}]))) + (is (= [{:q 4 11 :l 2 3 :b '(4 :c 5)} 6 #{7 :d}] + (transform (s/walker number?) inc [{:q 3 10 :l 1 2 :b '(3 :c 4)} 5 #{6 :d}]))) + (let [f (->FooW 1 2)] + (is (= [[:a 1] [:b 2]] (select (s/walker (complement record?)) f))) + (is (= (assoc f :a! 1 :b! 2) (setval [(s/walker (complement record?)) s/FIRST s/NAME s/END] "!" f))) + (is (= (assoc f :b 1 :c 2) (transform [(s/walker (complement record?)) s/FIRST] (fn [k] (if (= :a k) :b :c)) f))) + )) + +(def MIDDLE + (s/comp-paths + (s/srange-dynamic + (fn [aseq] (long (/ (count aseq) 2))) + (end-fn [aseq s] (if (empty? aseq) 0 (inc s)))) + s/FIRST + )) + +(deftest srange-dynamic-test + (is (= 2 (select-any MIDDLE [1 2 3]))) + (is (identical? s/NONE (select-any MIDDLE []))) + (is (= 1 (select-any MIDDLE [1]))) + (is (= 2 (select-any MIDDLE [1 2]))) + (is (= [1 3 3] (transform MIDDLE inc [1 2 3]))) + ) + +(def ^:dynamic *dvar* :a) + +(defn dvar-tester [] + (select-any *dvar* {:a 1 :b 2})) + +(deftest dynamic-var-ic-test + (is (= 1 (dvar-tester))) + (is (= 2 (binding [*dvar* :b] (dvar-tester)))) + ) + +(deftest before-index-test + (let [data [1 2 3] + datal '(1 2 3) + data-str "abcdef"] + (is (predand= vector? [:a 1 2 3] (setval (s/before-index 0) :a data))) + (is (predand= vector? [1 2 3] (setval (s/before-index 1) s/NONE data))) + (is (predand= vector? [1 :a 2 3] (setval (s/before-index 1) :a data))) + (is (predand= vector? [1 2 3 :a] (setval (s/before-index 3) :a data))) + ; ensure inserting at index 0 in nil structure works, as in previous impl + (is (predand= listlike? '(:a) (setval (s/before-index 0) :a nil))) + (is (predand= listlike? '(:a 1 2 3) (setval (s/before-index 0) :a datal))) + (is (predand= listlike? '(1 :a 2 3) (setval (s/before-index 1) :a datal))) + (is (predand= listlike? '(1 2 3 :a) (setval (s/before-index 3) :a datal))) + (is (predand= string? "abcxdef" (setval (s/before-index 3) (char \x) data-str))) + )) + +(deftest index-nav-test + (let [data [1 2 3 4 5 6] + datal '(1 2 3 4 5 6)] + (is (predand= vector? [3 1 2 4 5 6] (setval (s/index-nav 2) 0 data))) + (is (predand= vector? [1 3 2 4 5 6] (setval (s/index-nav 2) 1 data))) + (is (predand= vector? [1 2 3 4 5 6] (setval (s/index-nav 2) 2 data))) + (is (predand= vector? [1 2 4 5 3 6] (setval (s/index-nav 2) 4 data))) + (is (predand= vector? [1 2 4 5 6 3] (setval (s/index-nav 2) 5 data))) + (is (predand= vector? [6 1 2 3 4 5] (setval (s/index-nav 5) 0 data))) + + (is (predand= listlike? '(3 1 2 4 5 6) (setval (s/index-nav 2) 0 datal))) + (is (predand= listlike? '(1 3 2 4 5 6) (setval (s/index-nav 2) 1 datal))) + (is (predand= listlike? '(1 2 3 4 5 6) (setval (s/index-nav 2) 2 datal))) + (is (predand= listlike? '(1 2 4 5 3 6) (setval (s/index-nav 2) 4 datal))) + (is (predand= listlike? '(1 2 4 5 6 3) (setval (s/index-nav 2) 5 datal))) + (is (predand= listlike? '(6 1 2 3 4 5) (setval (s/index-nav 5) 0 datal))) + )) + +(deftest indexed-vals-test + (let [data [:a :b :c :d :e]] + (is (= [[0 :a] [1 :b] [2 :c] [3 :d] [4 :e]] (select s/INDEXED-VALS data))) + (is (= [:e :d :c :b :a] (setval [s/INDEXED-VALS s/FIRST] 0 data))) + (is (= [:a :b :e :d :c] (setval [s/INDEXED-VALS s/FIRST] 2 data))) + (is (= [:b :a :d :c :e] (transform [s/INDEXED-VALS s/FIRST odd?] dec data))) + (is (= [:a :b :c :d :e] (transform [s/INDEXED-VALS s/FIRST odd?] inc data))) + (is (= [0 2 2 4] (transform [s/INDEXED-VALS s/LAST odd?] inc [0 1 2 3]))) + (is (= [0 1 2 3] (transform [s/INDEXED-VALS (s/collect-one s/LAST) s/FIRST] (fn [i _] i) [2 1 3 0]))) + (is (= [-1 0 1 2 3] (transform [(s/indexed-vals -1) (s/collect-one s/LAST) s/FIRST] (fn [i _] i) [3 -1 0 2 1]))) + (is (= [[1 :a] [2 :b] [3 :c]] (select (s/indexed-vals 1) [:a :b :c]))) + )) + +(deftest other-implicit-navs-test + (is (= 1 (select-any ["a" true \c 10 'd] {"a" {true {\c {10 {'d 1}}}}}))) + ) + +(deftest vterminal-test + (is (= {:a {:b [[1 2] 3]}} + (multi-transform [(s/putval 1) :a (s/putval 2) :b (s/vterminal (fn [vs v] [vs v]))] + {:a {:b 3}}))) + ) + +(deftest vtransform-test + (is (= {:a 6} (vtransform [:a (s/putval 2) (s/putval 3)] (fn [vs v] (+ v (reduce + vs))) {:a 1}))) + ) + +(deftest compact-test + (is (= {} (setval [:a (s/compact :b :c)] s/NONE {:a {:b {:c 1}}}))) + (is (= {:a {:d 2}} (setval [:a (s/compact :b :c)] s/NONE {:a {:b {:c 1} :d 2}}))) + (let [TREE-VALUES (recursive-path [] p (s/if-path vector? [(s/compact s/ALL) p] s/STAY)) + tree [1 [2 3] [] [4 [[5] [[6]]]]]] + (is (= [2 4 6] (select [TREE-VALUES even?] tree))) + (is (= [1 [3] [[[5]]]] (setval [TREE-VALUES even?] s/NONE tree))) + ) + (is (= [{:a [{:c 1}]}] + (setval [s/ALL (s/compact :a s/ALL :b)] + s/NONE + [{:a [{:b 3}]} + {:a [{:b 2 :c 1}]}]))) + ) + +(deftest class-constant-test + (let [f (fn [p] (fn [v] (str p (inc v))))] + (is (= (str #?(:clj String :cljs js/String) 2) + (multi-transform (s/terminal (f #?(:clj String :cljs js/String))) 1))) + )) + +#?(:clj + (do + (defprotocolpath FooPP) + (extend-protocolpath FooPP String s/STAY) + + (deftest satisfies-protpath-test + (is (satisfies-protpath? FooPP "a")) + (is (not (satisfies-protpath? FooPP 1))) + ))) diff --git a/test-resources/lib_tests/com/rpl/specter/test_helpers.clj b/test-resources/lib_tests/com/rpl/specter/test_helpers.clj new file mode 100644 index 00000000..be177fba --- /dev/null +++ b/test-resources/lib_tests/com/rpl/specter/test_helpers.clj @@ -0,0 +1,36 @@ +(ns com.rpl.specter.test-helpers + (:require [clojure.test.check + [generators :as gen] + [properties :as prop]] + [clojure.test]) + + (:use [com.rpl.specter :only [select transform]] + [com.rpl.specter :only [select* transform*]])) + + +;; it seems like gen/bind and gen/return are a monad (hence the names) +;; this is only for clj (cljs version in different file) +(defmacro for-all+ [bindings & body] + (let [parts (partition 2 bindings) + vars (vec (map first parts)) + genned (reduce + (fn [curr [v code]] + `(gen/bind ~code (fn [~v] ~curr))) + `(gen/return ~vars) + (reverse parts))] + `(prop/for-all [~vars ~genned] + ~@body))) + + +(defmacro ic-test [params-decl apath transform-fn data params] + (let [platform (if (contains? &env :locals) :cljs :clj) + is-sym (if (= platform :clj) 'clojure.test/is 'cljs.test/is)] + `(let [icfnsel# (fn [~@params-decl] (select ~apath ~data)) + icfntran# (fn [~@params-decl] (transform ~apath ~transform-fn ~data)) + regfnsel# (fn [~@params-decl] (select* ~apath ~data)) + regfntran# (fn [~@params-decl] (transform* ~apath ~transform-fn ~data)) + params# (if (empty? ~params) [[]] ~params)] + (dotimes [_# 3] + (doseq [ps# params#] + (~is-sym (= (apply icfnsel# ps#) (apply regfnsel# ps#))) + (~is-sym (= (apply icfntran# ps#) (apply regfntran# ps#)))))))) diff --git a/test-resources/lib_tests/com/rpl/specter/zipper_test.cljc b/test-resources/lib_tests/com/rpl/specter/zipper_test.cljc new file mode 100644 index 00000000..43c21c82 --- /dev/null +++ b/test-resources/lib_tests/com/rpl/specter/zipper_test.cljc @@ -0,0 +1,122 @@ +(ns com.rpl.specter.zipper-test + #?(:cljs (:require-macros + [cljs.test :refer [is deftest]] + [clojure.test.check.clojure-test :refer [defspec]] + [com.rpl.specter.cljs-test-helpers :refer [for-all+]] + [com.rpl.specter + :refer [declarepath providepath select select-one select-one! + select-first transform setval replace-in]])) + + (:use + #?(:clj [clojure.test :only [deftest is]]) + #?(:clj [clojure.test.check.clojure-test :only [defspec]]) + #?(:clj [com.rpl.specter.test-helpers :only [for-all+]]) + #?(:clj [com.rpl.specter + :only [declarepath providepath select select-one select-one! + select-first transform setval replace-in]])) + + (:require #?(:clj [clojure.test.check.generators :as gen]) + #?(:clj [clojure.test.check.properties :as prop]) + #?(:cljs [clojure.test.check :as tc]) + #?(:cljs [clojure.test.check.generators :as gen]) + #?(:cljs [clojure.test.check.properties :as prop :include-macros true]) + [com.rpl.specter :as s] + [com.rpl.specter.zipper :as z])) + +(defspec zipper-end-equivalency-test + (for-all+ + [v (gen/not-empty (gen/vector gen/int)) + i (gen/vector gen/int)] + (= (setval s/END i v) + (setval [z/VECTOR-ZIP z/DOWN z/RIGHTMOST z/INNER-RIGHT] i v)))) + + +(deftest zipper-multi-insert-test + (is (= [1 2 :a :b 3 :a :b 4] + (setval [z/VECTOR-ZIP + z/DOWN + z/RIGHT + z/RIGHT + (s/multi-path z/INNER-RIGHT z/INNER-LEFT)] + + [:a :b] + [1 2 3 4]) + + (setval [z/VECTOR-ZIP + z/DOWN + z/RIGHT + z/RIGHT + (s/multi-path z/INNER-LEFT z/INNER-RIGHT)] + + [:a :b] + [1 2 3 4])))) + + + + +(deftest zipper-down-up-test + (is (= [1 [2 3 5] 6] + (transform [z/VECTOR-ZIP + z/DOWN + z/RIGHT + z/DOWN + z/RIGHT + z/RIGHT + (s/multi-path + s/STAY + [z/UP z/RIGHT]) + z/NODE] + inc + [1 [2 3 4] 5])))) + + + + +(deftest next-terminate-test + (is (= [2 [3 4 [5]] 6] + (transform [z/VECTOR-ZIP z/NEXT-WALK z/NODE number?] + inc + [1 [2 3 [4]] 5]))) + (is (= [1 [3 [[]] 5]] + (setval [z/VECTOR-ZIP + z/NEXT-WALK + (s/selected? z/NODE number? even?) + z/NODE-SEQ] + [] + [1 2 [3 [[4]] 5] 6])))) + + + + +(deftest zipper-nav-stop-test + (is (= [1] + (transform [z/VECTOR-ZIP z/UP z/NODE] inc [1]))) + (is (= [1] + (transform [z/VECTOR-ZIP z/DOWN z/LEFT z/NODE] inc [1]))) + (is (= [1] + (transform [z/VECTOR-ZIP z/DOWN z/RIGHT z/NODE] inc [1]))) + (is (= [] + (transform [z/VECTOR-ZIP z/DOWN z/NODE] inc [])))) + + +(deftest find-first-test + (is (= [1 [3 [[4]] 5] 6] + (setval [z/VECTOR-ZIP + (z/find-first #(and (number? %) (even? %))) + z/NODE-SEQ] + + [] + [1 2 [3 [[4]] 5] 6])))) + + + +(deftest nodeseq-expand-test + (is (= [2 [2] [[4 4 4]] 4 4 4 6] + (transform [z/VECTOR-ZIP + z/NEXT-WALK + (s/selected? z/NODE number? odd?) + (s/collect-one z/NODE) + z/NODE-SEQ] + (fn [v _] + (repeat v (inc v))) + [1 [2] [[3]] 3 6])))) From 108665ebb945a7a4b1610747191c851c48260e05 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 18 Mar 2022 23:47:18 +0100 Subject: [PATCH 004/550] SCI: loop doesn't expand in fully qualified let --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 34a9f8a9..a002079b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 34a9f8a99e497b16553505d63c6daf04ebbaf068 +Subproject commit a002079b554c252e4346ac37a5c646817106db98 From c09ff9e61c3c9ff9baca6cf0fd8c38a36444e855 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 18 Mar 2022 23:49:17 +0100 Subject: [PATCH 005/550] Allow .indexOf on vector --- src/babashka/impl/classes.clj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index bfda0e17..23b38551 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -99,7 +99,9 @@ clojure.lang.Compiler {:fields [{:name "specials"}]} clojure.lang.PersistentHashMap - {:fields [{:name "EMPTY"}]}}) + {:fields [{:name "EMPTY"}]} + clojure.lang.PersistentVector + {:methods [{:name "indexOf"}]}}) (def custom-map (cond-> @@ -461,7 +463,6 @@ clojure.lang.PersistentStructMap clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeSet - clojure.lang.PersistentVector clojure.lang.Ratio clojure.lang.ReaderConditional clojure.lang.Repeat From dd6ca6e6231bde26304504552c018f88f0319c37 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 00:02:08 +0100 Subject: [PATCH 006/550] Fix and add reflections for vectors and maps --- resources/META-INF/babashka/deps.edn | 3 ++- src/babashka/impl/classes.clj | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index cd9e36f8..ab75d192 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -129,7 +129,8 @@ cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"} aysylu/loom {:mvn/version "1.0.2"} com.layerware/hugsql-core {:mvn/version "0.5.1"} - com.github.seancorfield/expectations {:mvn/version "2.0.157"}} + com.github.seancorfield/expectations {:mvn/version "2.0.157"} + com.rpl/specter {:mvn/version "1.1.4"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 23b38551..220d40d1 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -99,9 +99,13 @@ clojure.lang.Compiler {:fields [{:name "specials"}]} clojure.lang.PersistentHashMap - {:fields [{:name "EMPTY"}]} - clojure.lang.PersistentVector - {:methods [{:name "indexOf"}]}}) + {:fields [{:name "EMPTY"}] + :methods [{:name "valAt"}]} + clojure.lang.APersistentVector + {:methods [{:name "indexOf"}]} + clojure.lang.PersistentArrayMap + {:methods [{:name "valAt"}]} +}) (def custom-map (cond-> @@ -456,13 +460,13 @@ clojure.lang.LispReader$Resolver clojure.lang.Named clojure.lang.Keyword - clojure.lang.PersistentArrayMap clojure.lang.PersistentHashSet clojure.lang.PersistentList clojure.lang.PersistentQueue clojure.lang.PersistentStructMap clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeSet + clojure.lang.PersistentVector clojure.lang.Ratio clojure.lang.ReaderConditional clojure.lang.Repeat From 152234937c3328a39dec302f3cd72fd7af30e715 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 00:25:59 +0100 Subject: [PATCH 007/550] meander interop --- src/babashka/impl/classes.clj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 220d40d1..5e252aaf 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -99,12 +99,13 @@ clojure.lang.Compiler {:fields [{:name "specials"}]} clojure.lang.PersistentHashMap - {:fields [{:name "EMPTY"}] - :methods [{:name "valAt"}]} + {:fields [{:name "EMPTY"}]} clojure.lang.APersistentVector {:methods [{:name "indexOf"}]} - clojure.lang.PersistentArrayMap + clojure.lang.ILookup {:methods [{:name "valAt"}]} + clojure.lang.IPersistentMap + {:methods [{:name "without"}]} }) (def custom-map @@ -440,9 +441,7 @@ clojure.lang.IEditableCollection clojure.lang.IMapEntry clojure.lang.IMeta - clojure.lang.ILookup clojure.lang.IPersistentCollection - clojure.lang.IPersistentMap clojure.lang.IPersistentSet clojure.lang.IPersistentStack clojure.lang.IPersistentVector @@ -460,6 +459,7 @@ clojure.lang.LispReader$Resolver clojure.lang.Named clojure.lang.Keyword + clojure.lang.PersistentArrayMap clojure.lang.PersistentHashSet clojure.lang.PersistentList clojure.lang.PersistentQueue From ad8982d0c6eda073b5bb3d46de0605ceb838e414 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 10:14:01 +0100 Subject: [PATCH 008/550] meander: unchecked-dec + disjoin interop --- sci | 2 +- src/babashka/impl/classes.clj | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sci b/sci index a002079b..dac95919 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a002079b554c252e4346ac37a5c646817106db98 +Subproject commit dac959190fed5bbdfbaf31616d02cd70bd1a59b4 diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 5e252aaf..638901c1 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -106,6 +106,8 @@ {:methods [{:name "valAt"}]} clojure.lang.IPersistentMap {:methods [{:name "without"}]} + clojure.lang.IPersistentSet + {:methods [{:name "disjoin"}]} }) (def custom-map @@ -442,7 +444,6 @@ clojure.lang.IMapEntry clojure.lang.IMeta clojure.lang.IPersistentCollection - clojure.lang.IPersistentSet clojure.lang.IPersistentStack clojure.lang.IPersistentVector clojure.lang.IPersistentList From b395084d474a3eb9ac9f4922b65722e546b05911 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 10:27:45 +0100 Subject: [PATCH 009/550] meander: nth interop --- src/babashka/impl/classes.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 638901c1..cbfcb9dd 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -108,6 +108,8 @@ {:methods [{:name "without"}]} clojure.lang.IPersistentSet {:methods [{:name "disjoin"}]} + clojure.lang.IPersistentVector + {:methods [{:name "nth"}]} }) (def custom-map @@ -445,7 +447,6 @@ clojure.lang.IMeta clojure.lang.IPersistentCollection clojure.lang.IPersistentStack - clojure.lang.IPersistentVector clojure.lang.IPersistentList clojure.lang.IRecord clojure.lang.IReduce From fc0bb83ca247ecfc568ccc8c15d4302b89861b37 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 11:04:37 +0100 Subject: [PATCH 010/550] meander interop --- src/babashka/impl/classes.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index cbfcb9dd..b3d88c16 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -108,7 +108,7 @@ {:methods [{:name "without"}]} clojure.lang.IPersistentSet {:methods [{:name "disjoin"}]} - clojure.lang.IPersistentVector + clojure.lang.Indexed {:methods [{:name "nth"}]} }) @@ -454,8 +454,8 @@ clojure.lang.IKVReduce clojure.lang.IRef clojure.lang.ISeq + clojure.lang.IPersistentVector clojure.lang.ITransientVector - clojure.lang.Indexed clojure.lang.Iterate clojure.lang.LazySeq clojure.lang.LispReader$Resolver From 25a57b483ccb2604238ff082cd78ce5d8b52e213 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 11:34:20 +0100 Subject: [PATCH 011/550] meander: interop on Iterator --- src/babashka/impl/classes.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index b3d88c16..308b1332 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -110,6 +110,9 @@ {:methods [{:name "disjoin"}]} clojure.lang.Indexed {:methods [{:name "nth"}]} + java.util.Iterator + {:methods [{:name "hasNext"} + {:name "next"}]} }) (def custom-map @@ -482,7 +485,6 @@ java.util.concurrent.atomic.AtomicLong java.util.Collection java.util.List - java.util.Iterator java.util.Map$Entry ~@(when features/xml? ['clojure.data.xml.node.Element])] :custom ~custom-map}) From b4b22bfe70d88f0c6c87bac903a1f4f8c5cd2a7b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Mar 2022 22:32:09 +0100 Subject: [PATCH 012/550] SCI: add let* --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index dac95919..b833ad0f 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit dac959190fed5bbdfbaf31616d02cd70bd1a59b4 +Subproject commit b833ad0fcd4262ac8dab06e2d802e8091ac15cc2 From d8d0a50625fee0c05348b09f703b86b953b9babc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 22 Mar 2022 12:47:37 +0100 Subject: [PATCH 013/550] pods: declarative pods prep --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 538fc6f4..8f059da7 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 538fc6f4147badf3a457b3eb8f9f95dd3bc947b1 +Subproject commit 8f059da7e62f5c68a5e4ed2e878c53d3f77ef25a From b6a3a9cdf5cceee9b4b4ca8de07c6e34c0d9d367 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 22 Mar 2022 14:00:05 +0100 Subject: [PATCH 014/550] Revert "pods: declarative pods prep" This reverts commit d8d0a50625fee0c05348b09f703b86b953b9babc. --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 8f059da7..538fc6f4 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 8f059da7e62f5c68a5e4ed2e878c53d3f77ef25a +Subproject commit 538fc6f4147badf3a457b3eb8f9f95dd3bc947b1 From 6d353140965b2f122a85697dbeedbc7fbcb81b81 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 22 Mar 2022 14:00:41 +0100 Subject: [PATCH 015/550] Revert pods change --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 538fc6f4..5fbf1d7b 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 538fc6f4147badf3a457b3eb8f9f95dd3bc947b1 +Subproject commit 5fbf1d7b04ceb682c1375e109b7b7ee73e4371a1 From 6305f7450d4fd764e0441cbb677bc0c921776c1a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 22 Mar 2022 16:41:26 +0100 Subject: [PATCH 016/550] Add compatibility with GraalVM 22.1 (#1215) * do not init java net http classes at build time --- script/compile | 1 + src/babashka/impl/classes.clj | 220 ++++++++++++++++++---------------- src/babashka/main.clj | 2 +- 3 files changed, 119 insertions(+), 104 deletions(-) diff --git a/script/compile b/script/compile index 22ea8eec..42ab80c2 100755 --- a/script/compile +++ b/script/compile @@ -54,6 +54,7 @@ args=("-jar" "$BABASHKA_JAR" "--verbose" "--no-fallback" "--native-image-info" + # --trace-class-initialization=jdk.internal.net.http.common.DebugLogger,jdk.internal.net.http.websocket.WebSocketImpl,jdk.internal.net.http.common.Utils "$BABASHKA_XMX") BABASHKA_STATIC=${BABASHKA_STATIC:-} diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 308b1332..a774b805 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -113,7 +113,7 @@ java.util.Iterator {:methods [{:name "hasNext"} {:name "next"}]} -}) + }) (def custom-map (cond-> @@ -126,6 +126,52 @@ {:methods [{:name "getBundle" :parameterTypes ["java.lang.String","java.util.Locale","java.lang.ClassLoader"]}]}))) +(def java-net-http-classes + "These classes must be initialized at run time since GraalVM 22.1" + '[java.net.Authenticator + java.net.CookieHandler + java.net.CookieManager + java.net.CookieStore + java.net.CookiePolicy + java.net.HttpCookie + java.net.PasswordAuthentication + java.net.ProxySelector + java.net.http.HttpClient + java.net.http.HttpClient$Builder + java.net.http.HttpClient$Redirect + java.net.http.HttpClient$Version + java.net.http.HttpHeaders + java.net.http.HttpRequest + java.net.http.HttpRequest$BodyPublisher + java.net.http.HttpRequest$BodyPublishers + java.net.http.HttpRequest$Builder + java.net.http.HttpResponse + java.net.http.HttpResponse$BodyHandler + java.net.http.HttpResponse$BodyHandlers + java.net.http.HttpTimeoutException + java.net.http.WebSocket + java.net.http.WebSocket$Builder + java.net.http.WebSocket$Listener + java.security.cert.X509Certificate + javax.crypto.Mac + javax.crypto.spec.SecretKeySpec + javax.net.ssl.HostnameVerifier ;; clj-http-lite + javax.net.ssl.HttpsURLConnection ;; clj-http-lite + javax.net.ssl.KeyManagerFactory + javax.net.ssl.SSLContext + javax.net.ssl.SSLParameters + javax.net.ssl.SSLSession ;; clj-http-lite + javax.net.ssl.TrustManager + javax.net.ssl.TrustManagerFactory + javax.net.ssl.X509TrustManager + jdk.internal.net.http.HttpClientBuilderImpl + jdk.internal.net.http.HttpClientFacade + jdk.internal.net.http.HttpRequestBuilderImpl + jdk.internal.net.http.HttpResponseImpl + jdk.internal.net.http.common.MinimalFuture + jdk.internal.net.http.websocket.BuilderImpl + jdk.internal.net.http.websocket.WebSocketImpl]) + (def classes `{:all [clojure.lang.ArityException clojure.lang.BigInt @@ -225,51 +271,6 @@ ;; java.net.URL, see below java.net.URLEncoder java.net.URLDecoder - ;; java.net.http - ~@(when features/java-net-http? - '[java.net.Authenticator - java.net.CookieHandler - java.net.CookieManager - java.net.CookieStore - java.net.CookiePolicy - java.net.HttpCookie - java.net.PasswordAuthentication - java.net.ProxySelector - java.net.http.HttpClient - java.net.http.HttpClient$Builder - java.net.http.HttpClient$Redirect - java.net.http.HttpClient$Version - java.net.http.HttpHeaders - java.net.http.HttpRequest - java.net.http.HttpRequest$BodyPublisher - java.net.http.HttpRequest$BodyPublishers - java.net.http.HttpRequest$Builder - java.net.http.HttpResponse - java.net.http.HttpResponse$BodyHandler - java.net.http.HttpResponse$BodyHandlers - java.net.http.HttpTimeoutException - java.net.http.WebSocket - java.net.http.WebSocket$Builder - java.net.http.WebSocket$Listener - java.security.cert.X509Certificate - javax.crypto.Mac - javax.crypto.spec.SecretKeySpec - javax.net.ssl.HostnameVerifier ;; clj-http-lite - javax.net.ssl.HttpsURLConnection ;; clj-http-lite - javax.net.ssl.KeyManagerFactory - javax.net.ssl.SSLContext - javax.net.ssl.SSLParameters - javax.net.ssl.SSLSession ;; clj-http-lite - javax.net.ssl.TrustManager - javax.net.ssl.TrustManagerFactory - javax.net.ssl.X509TrustManager - jdk.internal.net.http.HttpClientBuilderImpl - jdk.internal.net.http.HttpClientFacade - jdk.internal.net.http.HttpRequestBuilderImpl - jdk.internal.net.http.HttpResponseImpl - jdk.internal.net.http.common.MinimalFuture - jdk.internal.net.http.websocket.BuilderImpl - jdk.internal.net.http.websocket.WebSocketImpl]) ~@(when features/java-nio? '[java.nio.ByteBuffer java.nio.ByteOrder @@ -499,63 +500,74 @@ m (apply hash-map (for [c classes c [(list 'quote c) c]] - c))] - (assoc m :public-class - (fn [v] - (cond (instance? java.lang.Process v) - java.lang.Process - (instance? java.lang.ProcessHandle v) - java.lang.ProcessHandle - (instance? java.lang.ProcessHandle$Info v) - java.lang.ProcessHandle$Info - ;; added for calling .put on .environment from ProcessBuilder - (instance? java.util.Map v) - java.util.Map - ;; added for issue #239 regarding clj-http-lite - ;; can potentially be removed due to fix for #1061 - (instance? java.io.ByteArrayOutputStream v) - java.io.ByteArrayOutputStream - (instance? java.security.MessageDigest v) - java.security.MessageDigest - ;; streams - (instance? java.io.InputStream v) - java.io.InputStream - (instance? java.io.OutputStream v) - java.io.OutputStream - ;; java nio - (instance? java.nio.file.Path v) - java.nio.file.Path - (instance? java.nio.file.FileSystem v) - java.nio.file.FileSystem - (instance? java.nio.file.PathMatcher v) - java.nio.file.PathMatcher - (instance? java.util.stream.BaseStream v) - java.util.stream.BaseStream - (instance? java.nio.ByteBuffer v) - java.nio.ByteBuffer - (instance? java.nio.charset.Charset v) - java.nio.charset.Charset - (instance? java.nio.charset.CharsetEncoder v) - java.nio.charset.CharsetEncoder - (instance? java.nio.CharBuffer v) - java.nio.CharBuffer - (instance? java.nio.channels.FileChannel v) - java.nio.channels.FileChannel - (instance? java.net.CookieStore v) - java.net.CookieStore - ;; this makes interop on reified classes work - ;; see java_net_http_test/interop-test - (instance? sci.impl.types.IReified v) - (first (t/getInterfaces v)) - ;; fix for #1061 - (instance? java.io.Closeable v) - java.io.Closeable - (instance? java.nio.file.attribute.BasicFileAttributes v) - java.nio.file.attribute.BasicFileAttributes - ;; keep commas for merge friendliness - ,,,))))) + c)) + m (assoc m :public-class + (fn [v] + (cond (instance? java.lang.Process v) + java.lang.Process + (instance? java.lang.ProcessHandle v) + java.lang.ProcessHandle + (instance? java.lang.ProcessHandle$Info v) + java.lang.ProcessHandle$Info + ;; added for calling .put on .environment from ProcessBuilder + (instance? java.util.Map v) + java.util.Map + ;; added for issue #239 regarding clj-http-lite + ;; can potentially be removed due to fix for #1061 + (instance? java.io.ByteArrayOutputStream v) + java.io.ByteArrayOutputStream + (instance? java.security.MessageDigest v) + java.security.MessageDigest + ;; streams + (instance? java.io.InputStream v) + java.io.InputStream + (instance? java.io.OutputStream v) + java.io.OutputStream + ;; java nio + (instance? java.nio.file.Path v) + java.nio.file.Path + (instance? java.nio.file.FileSystem v) + java.nio.file.FileSystem + (instance? java.nio.file.PathMatcher v) + java.nio.file.PathMatcher + (instance? java.util.stream.BaseStream v) + java.util.stream.BaseStream + (instance? java.nio.ByteBuffer v) + java.nio.ByteBuffer + (instance? java.nio.charset.Charset v) + java.nio.charset.Charset + (instance? java.nio.charset.CharsetEncoder v) + java.nio.charset.CharsetEncoder + (instance? java.nio.CharBuffer v) + java.nio.CharBuffer + (instance? java.nio.channels.FileChannel v) + java.nio.channels.FileChannel + (instance? java.net.CookieStore v) + java.net.CookieStore + ;; this makes interop on reified classes work + ;; see java_net_http_test/interop-test + (instance? sci.impl.types.IReified v) + (first (t/getInterfaces v)) + ;; fix for #1061 + (instance? java.io.Closeable v) + java.io.Closeable + (instance? java.nio.file.attribute.BasicFileAttributes v) + java.nio.file.attribute.BasicFileAttributes + ;; keep commas for merge friendliness + ,,,)))] + m)) -(def class-map (gen-class-map)) + +(def class-map* + "This contains mapping of symbol to class of all classes that are allowed to be initialized at build time." + (gen-class-map)) + +(def class-map + "A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1" + (delay (persistent! (reduce (fn [acc c] + (assoc! acc c (Class/forName (str c)))) + (transient class-map*) (when features/java-net-http? + java-net-http-classes))))) (def imports '{Appendable java.lang.Appendable @@ -602,7 +614,9 @@ }) (defn reflection-file-entries [] - (let [entries (vec (for [c (sort (:all classes)) + (let [entries (vec (for [c (sort (concat (:all classes) + (when features/java-net-http? + java-net-http-classes))) :let [class-name (str c)]] {:name class-name :allPublicMethods true diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 6a3cf951..41176cdc 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -777,7 +777,7 @@ Use bb run --help to show this help output. 'load-file (sci-namespaces/core-var 'load-file load-file*)))) :env env :features #{:bb :clj} - :classes classes/class-map + :classes @classes/class-map :imports classes/imports :load-fn load-fn :uberscript uberscript From 8d1de7285e044c273de7d0bd65addaf6875a2d7a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 12:27:37 +0100 Subject: [PATCH 017/550] Update pods lib --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 5fbf1d7b..f2cfdff8 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 5fbf1d7b04ceb682c1375e109b7b7ee73e4371a1 +Subproject commit f2cfdff8998ca8bae116ff9d8a60f2b7a2d0da3e From 1e72562c9a4da0c1536fb05b35d0d4ca2840cbab Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 13:09:22 +0100 Subject: [PATCH 018/550] Bump SCI --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index b833ad0f..9a6e9128 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit b833ad0fcd4262ac8dab06e2d802e8091ac15cc2 +Subproject commit 9a6e9128624eb102fbcf8005e23bdb91595b6ed4 From e83ef7a69fdc7c4112704f7709ab5dca1711288e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 15:12:15 +0100 Subject: [PATCH 019/550] Bump timbre --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index ab75d192..89ee0888 100644 --- a/deps.edn +++ b/deps.edn @@ -40,7 +40,7 @@ hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} selmer/selmer {:mvn/version "1.12.44"} - com.taoensso/timbre {:mvn/version "5.1.2"} + com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"}} :aliases {:babashka/dev diff --git a/project.clj b/project.clj index dbeff965..0f2cc751 100644 --- a/project.clj +++ b/project.clj @@ -62,7 +62,7 @@ :feature/selmer {:source-paths ["feature-selmer"] :dependencies [[selmer/selmer "1.12.44"]]} :feature/logging {:source-paths ["feature-logging"] - :dependencies [[com.taoensso/timbre "5.1.2"] + :dependencies [[com.taoensso/timbre "5.2.1"] [org.clojure/tools.logging "1.1.0"]]} :feature/priority-map {:source-paths ["feature-priority-map"] :dependencies [[org.clojure/data.priority-map "1.1.0"]]} From 68bed0723c452f1d09c22a823f413ac13895e3ac Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 17:01:17 +0100 Subject: [PATCH 020/550] Update pods --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index f2cfdff8..842ff347 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit f2cfdff8998ca8bae116ff9d8a60f2b7a2d0da3e +Subproject commit 842ff347391adabece623e4fb3f30297c848acdc From e6022867996540f0afa2844caa57a6e9b3c903e1 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Wed, 23 Mar 2022 10:08:59 -0600 Subject: [PATCH 021/550] feat #863: Load pods from bb.edn (#1205) Co-authored-by: Michiel Borkent --- .circleci/config.yml | 8 ++++---- CHANGELOG.md | 7 +++++++ README.md | 2 +- deps.edn | 16 ++++++++++------ resources/META-INF/babashka/deps.edn | 16 ++++++++++------ src/babashka/impl/pods.clj | 28 ++++++++++++++++++++++++++-- src/babashka/main.clj | 7 +++++++ test-resources/pod | 11 +++++++++++ test-resources/pod.clj | 3 ++- test-resources/pod_tests/bootleg.clj | 7 +++++++ test-resources/pod_tests/local.clj | 5 +++++ test/babashka/bb_edn_test.clj | 14 ++++++++++++++ test/babashka/test_utils.clj | 4 ++-- 13 files changed, 106 insertions(+), 22 deletions(-) create mode 100755 test-resources/pod create mode 100644 test-resources/pod_tests/bootleg.clj create mode 100644 test-resources/pod_tests/local.clj diff --git a/.circleci/config.yml b/.circleci/config.yml index aac22a89..2c2c1bd5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,7 +14,7 @@ commands: jobs: jvm: docker: - - image: circleci/clojure:openjdk-11-lein-2.9.6-bullseye + - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye working_directory: ~/repo environment: LEIN_ROOT: "true" @@ -68,7 +68,7 @@ jobs: key: v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }} linux: docker: - - image: circleci/clojure:openjdk-11-lein-2.9.6-bullseye + - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye working_directory: ~/repo environment: LEIN_ROOT: "true" @@ -134,7 +134,7 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-static: docker: - - image: circleci/clojure:openjdk-11-lein-2.9.6-bullseye + - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye working_directory: ~/repo environment: LEIN_ROOT: "true" @@ -422,7 +422,7 @@ jobs: deploy: resource_class: large docker: - - image: circleci/clojure:lein-2.9.6 + - image: circleci/clojure:lein-2.9.8 working_directory: ~/repo environment: LEIN_ROOT: "true" diff --git a/CHANGELOG.md b/CHANGELOG.md index 38ce5dde..ffa5b0aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## 0.8.0 (TBD) + +### New + +- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required + - See [updated pod library docs for details](TODO: link) + ## 0.7.8 (2022-03-13) This release improves compatibility with several libraries: [loom](https://github.com/aysylu/loom), [hugsql.core](https://www.hugsql.org) and [specter](https://github.com/redplanetlabs/specter)! diff --git a/README.md b/README.md index 9a31a69c..083863c7 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,7 @@ Have a library that is already compatible or has recently been made compatible? Pods are programs that can be used as a Clojure library by babashka. Documentation is available in the [pod library -repo](https://github.com/babashka/babashka.pods). +repo](https://github.com/babashka/pods). A list of available pods can be found [here](doc/projects.md#pods). diff --git a/deps.edn b/deps.edn index 89ee0888..442bedd7 100644 --- a/deps.edn +++ b/deps.edn @@ -10,6 +10,7 @@ "feature-selmer" "feature-logging" "feature-priority-map" + "feature-jdbc" "pods/src" "babashka.nrepl/src" "depstar/src" "process/src" @@ -137,9 +138,12 @@ {:extra-deps {clj-nvd/clj-nvd {:git/url "https://github.com/miikka/clj-nvd.git" :sha "f2ec98699e057a379baf170cb49cf7ad76874a70"}} :main-opts ["-m" "clj-nvd.core"]} - :test ;; added by neil - {:extra-paths ["test"] - :extra-deps {io.github.cognitect-labs/test-runner - {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} - :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test}}} + :test + {:extra-paths ["test"] + :extra-deps {io.github.cognitect-labs/test-runner + {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test} + :test-pod + {:extra-paths ["test-resources"] + :main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}} diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index ab75d192..949c5ec3 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -10,6 +10,7 @@ "feature-selmer" "feature-logging" "feature-priority-map" + "feature-jdbc" "pods/src" "babashka.nrepl/src" "depstar/src" "process/src" @@ -137,9 +138,12 @@ {:extra-deps {clj-nvd/clj-nvd {:git/url "https://github.com/miikka/clj-nvd.git" :sha "f2ec98699e057a379baf170cb49cf7ad76874a70"}} :main-opts ["-m" "clj-nvd.core"]} - :test ;; added by neil - {:extra-paths ["test"] - :extra-deps {io.github.cognitect-labs/test-runner - {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} - :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test}}} + :test + {:extra-paths ["test"] + :extra-deps {io.github.cognitect-labs/test-runner + {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + :main-opts ["-m" "cognitect.test-runner"] + :exec-fn cognitect.test-runner.api/test} + :test-pod + {:extra-paths ["test-resources"] + :main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}} diff --git a/src/babashka/impl/pods.clj b/src/babashka/impl/pods.clj index 92e671a2..37923471 100644 --- a/src/babashka/impl/pods.clj +++ b/src/babashka/impl/pods.clj @@ -1,13 +1,37 @@ (ns babashka.impl.pods {:no-doc true} (:refer-clojure :exclude [read]) - (:require [babashka.impl.common :refer [ctx]] + (:require [babashka.impl.common :refer [ctx bb-edn]] [babashka.pods.sci :as pods] - [sci.core :as sci])) + [sci.core :as sci] + [clojure.java.io :as io])) (defn load-pod [& args] (apply pods/load-pod @ctx args)) +(defn load-pods-metadata [pods-map] + (reduce-kv + (fn [pod-namespaces pod-spec coord] + (merge pod-namespaces + (condp #(contains? %2 %1) coord + :version + (pods/load-pod-metadata pod-spec + (merge {:cache true} + (select-keys coord [:version :cache]))) + + :path + (pods/load-pod-metadata (-> @bb-edn :file io/file) + pod-spec + (merge {:cache true} + (select-keys coord [:path :cache]))) + + (throw (IllegalArgumentException. + (str (-> coord keys first) + " is not a supported pod coordinate type. " + "Use :version for registry-hosted pods or :local/root " + "for pods on your local filesystem.")))))) + {} pods-map)) + (def podns (sci/create-ns 'babashka.pods nil)) (def pods-namespace diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 41176cdc..9aa73460 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -690,6 +690,8 @@ Use bb run --help to show this help output. (def env (atom {})) +(def pod-namespaces (volatile! {})) + (defn exec [cli-opts] (binding [*unrestricted* true] (sci/binding [core/warn-on-reflection @core/warn-on-reflection @@ -755,6 +757,8 @@ Use bb run --help to show this help output. :expressions [(:source res)]}) {}) res)))) + (when-let [pod (get @pod-namespaces namespace)] + (pods/load-pod (:pod-spec pod) (:opts pod))) (case namespace clojure.spec.alpha (binding [*out* *err*] @@ -787,6 +791,9 @@ Use bb run --help to show this help output. opts (addons/future opts) sci-ctx (sci/init opts) _ (vreset! common/ctx sci-ctx) + _ (when-let [pods (:pods @common/bb-edn)] + (let [pod-metadata (pods/load-pods-metadata pods)] + (vreset! pod-namespaces pod-metadata))) preloads (some-> (System/getenv "BABASHKA_PRELOADS") (str/trim)) [expressions exit-code] (cond expressions [expressions nil] diff --git a/test-resources/pod b/test-resources/pod new file mode 100755 index 00000000..3dbc993f --- /dev/null +++ b/test-resources/pod @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +dir=$(dirname "$0") + +export BABASHKA_POD=true + +if [[ $BABASHKA_TEST_ENV == "native" ]]; then + exec "${dir}"/../bb "${dir}"/pod.clj +else + exec clojure -M:test-pod +fi diff --git a/test-resources/pod.clj b/test-resources/pod.clj index cd57ea17..53394b75 100644 --- a/test-resources/pod.clj +++ b/test-resources/pod.clj @@ -125,7 +125,8 @@ :shutdown (System/exit 0)))))))) (let [cli-args (set *command-line-args*)] - (if (contains? cli-args "--run-as-pod") + (if (or (= "true" (System/getenv "BABASHKA_POD")) + (contains? cli-args "--run-as-pod")) (do (debug "running pod with cli args" cli-args) (run-pod cli-args)) (let [native? (contains? cli-args "--native") diff --git a/test-resources/pod_tests/bootleg.clj b/test-resources/pod_tests/bootleg.clj new file mode 100644 index 00000000..e8312442 --- /dev/null +++ b/test-resources/pod_tests/bootleg.clj @@ -0,0 +1,7 @@ +(ns pod-tests.bootleg + (:require [pod.retrogradeorbit.bootleg.utils :as utils])) + +(defn -main [& args] + (-> [:div + [:p "Test"]] + (utils/convert-to :html))) diff --git a/test-resources/pod_tests/local.clj b/test-resources/pod_tests/local.clj new file mode 100644 index 00000000..f564bc12 --- /dev/null +++ b/test-resources/pod_tests/local.clj @@ -0,0 +1,5 @@ +(ns pod-tests.local + (:require [pod.test-pod :as pod])) + +(defn -main [& args] + (println (pod/add-sync 40 2))) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 66fda96b..69a3a7a7 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -425,3 +425,17 @@ even more stuff here\" c {:depends [a b] :task [a b]}}}) (is (= ["[a 1]" "[b 2]" "[c [1 2]]"] (str/split-lines (test-utils/bb nil "run" "c")))))) + +(deftest pod-from-registry-test + (when (= "amd64" (System/getProperty "os.arch")) ; TODO: Build bootleg for aarch64 too or use a different pod + (test-utils/with-config + (pr-str '{:paths ["test-resources"] + :pods {retrogradeorbit/bootleg {:version "0.1.9"}}}) + (is (= "\"

Test

\"\n" + (test-utils/bb nil "-m" "pod-tests.bootleg")))))) + +(deftest ^:skip-windows local-pod-test + (test-utils/with-config + (pr-str '{:paths ["test-resources"] + :pods {pod/test-pod {:path "test-resources/pod"}}}) + (is (= "42\n" (test-utils/bb nil "-m" "pod-tests.local"))))) diff --git a/test/babashka/test_utils.clj b/test/babashka/test_utils.clj index d9c24cd1..9a856a96 100644 --- a/test/babashka/test_utils.clj +++ b/test/babashka/test_utils.clj @@ -81,8 +81,8 @@ (do (println (str os)) (throw (ex-info (str es) - {:stdout (str os) - :stderr (str es)})))))) + {:stdout (str os) + :stderr (str es)})))))) (finally (when (string? input-or-opts) (vars/bindRoot sci/in *in*)) (vars/bindRoot sci/out *out*) From c3cae225412100b436ca75e48b1364eafb8455e4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 19:33:49 +0100 Subject: [PATCH 022/550] pods: Rosetta2 fallback --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 842ff347..e075b13b 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 842ff347391adabece623e4fb3f30297c848acdc +Subproject commit e075b13bfe3666a73f82c12817bdf5f1d6c692e3 From 1ad93077c1f672ac8014f5aa2495fd1d3ba761f8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 23 Mar 2022 23:48:09 +0100 Subject: [PATCH 023/550] fix #1216: fix core.async alts example with polyfill --- CHANGELOG.md | 4 ++++ src/babashka/impl/clojure/core/async.clj | 2 +- test/babashka/async_test.clj | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffa5b0aa..a4471202 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ A preview of the next release can be installed from - [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required - See [updated pod library docs for details](TODO: link) +### Enhanced + +- [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill + ## 0.7.8 (2022-03-13) This release improves compatibility with several libraries: [loom](https://github.com/aysylu/loom), [hugsql.core](https://www.hugsql.org) and [specter](https://github.com/redplanetlabs/specter)! diff --git a/src/babashka/impl/clojure/core/async.clj b/src/babashka/impl/clojure/core/async.clj index f6d87959..f7112f67 100644 --- a/src/babashka/impl/clojure/core/async.clj +++ b/src/babashka/impl/clojure/core/async.clj @@ -46,7 +46,6 @@ '!! (copy-var async/>!! core-async-namespace) 'admix (copy-var async/admix core-async-namespace) - 'alts! (copy-var async/alts! core-async-namespace) 'alts!! (copy-var async/alts!! core-async-namespace) 'alt!! (macrofy 'alt!! alt!! core-async-namespace) 'buffer (copy-var async/buffer core-async-namespace) @@ -107,6 +106,7 @@ '! (copy-var async/>!! core-async-namespace) 'alt! (macrofy 'alt! alt!! core-async-namespace) + 'alts! (copy-var async/alts!! core-async-namespace) 'go-loop (macrofy 'go-loop go-loop core-async-namespace)}) (def async-protocols-ns (vars/->SciNamespace 'clojure.core.async.impl.protocols nil)) diff --git a/test/babashka/async_test.clj b/test/babashka/async_test.clj index f2be1a35..7fd1050c 100644 --- a/test/babashka/async_test.clj +++ b/test/babashka/async_test.clj @@ -33,3 +33,12 @@ (is (number? (edn/read-string (test-utils/bb nil " (def ^:dynamic x 0) (binding [x 10] (async/ Date: Wed, 23 Mar 2022 23:50:54 +0100 Subject: [PATCH 024/550] Bump Clojure to 1.11 --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 442bedd7..f7dd245d 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0-beta1"}, + :deps {org.clojure/clojure {:mvn/version "1.11.0"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index 0f2cc751..ad60d125 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.0-beta1"] + :dependencies [[org.clojure/clojure "1.11.0"] [borkdude/edamame "0.0.19"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From 41703971b1455f958022bd386e7869190ec28230 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 24 Mar 2022 21:46:17 +0100 Subject: [PATCH 025/550] SCI 0.3.4 --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 9a6e9128..d2ec7057 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 9a6e9128624eb102fbcf8005e23bdb91595b6ed4 +Subproject commit d2ec705766b19ef5a85c88506e3c8edfe1c8c36c From 586b2234aadfe42b8b8a4f78a013f3c4fefc91bc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 25 Mar 2022 11:51:22 +0100 Subject: [PATCH 026/550] SCI --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index d2ec7057..2e7dd0d1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit d2ec705766b19ef5a85c88506e3c8edfe1c8c36c +Subproject commit 2e7dd0d1bc23f4d158ea592adf23dac971d4d8d4 From 72ae6638422c542055dda8fc068f995cbfd9f61f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 25 Mar 2022 12:06:55 +0100 Subject: [PATCH 027/550] fix #1220: add reflection on java.util.concurrent.Future --- CHANGELOG.md | 1 + resources/META-INF/babashka/deps.edn | 4 ++-- src/babashka/impl/classes.clj | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4471202..4e787834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ A preview of the next release can be installed from ### Enhanced - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill +- [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future ## 0.7.8 (2022-03-13) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 949c5ec3..f7dd245d 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0-beta1"}, + :deps {org.clojure/clojure {:mvn/version "1.11.0"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} @@ -41,7 +41,7 @@ hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} selmer/selmer {:mvn/version "1.12.44"} - com.taoensso/timbre {:mvn/version "5.1.2"} + com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"}} :aliases {:babashka/dev diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index a774b805..892c7623 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -386,6 +386,7 @@ java.util.Set java.util.StringTokenizer java.util.UUID + java.util.concurrent.Future java.util.concurrent.CompletableFuture java.util.concurrent.Executors java.util.concurrent.TimeUnit @@ -553,6 +554,8 @@ java.io.Closeable (instance? java.nio.file.attribute.BasicFileAttributes v) java.nio.file.attribute.BasicFileAttributes + (instance? java.util.concurrent.Future v) + java.util.concurrent.Future ;; keep commas for merge friendliness ,,,)))] m)) From 81a1fd4c862276e6e84bda711f94653566502516 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 26 Mar 2022 22:45:49 +0100 Subject: [PATCH 028/550] Support sun.misc.Signal handlers (#1221) --- src/babashka/impl/classes.clj | 2 ++ src/babashka/impl/proxy.clj | 7 ++++++- src/babashka/impl/reify.clj | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 892c7623..684a2081 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -404,6 +404,8 @@ java.util.zip.ZipEntry java.util.zip.ZipException java.util.zip.ZipFile + sun.misc.Signal + sun.misc.SignalHandler ~(symbol "[B") ~(symbol "[I") ~(symbol "[Ljava.lang.Object;") diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index b4341d06..079e47fb 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -72,7 +72,12 @@ ["javax.net.ssl.HostnameVerifier" #{}] (proxy [javax.net.ssl.HostnameVerifier] [] - (verify [host-name session] ((method-or-bust methods 'verify) this host-name session)))))) + (verify [host-name session] ((method-or-bust methods 'verify) this host-name session))) + + ["sun.misc.SignalHandler" #{}] + (proxy [sun.misc.SignalHandler] [] + (handle [sig] + ((method-or-bust methods 'handle) this sig)))))) (defn class-sym [c] (symbol (class-name c))) diff --git a/src/babashka/impl/reify.clj b/src/babashka/impl/reify.clj index f9f5895a..fa3fff55 100644 --- a/src/babashka/impl/reify.clj +++ b/src/babashka/impl/reify.clj @@ -183,4 +183,7 @@ resolveAlias [[this sym]] resolveVar [[this sym]]} + sun.misc.SignalHandler + {handle [[this signal]]} + })) From cd013227d5bb441890b31e3ae2977815ca6b6eb1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 12:04:50 +0200 Subject: [PATCH 029/550] Revert "Support sun.misc.Signal handlers (#1221)" Shutdown code should be handled with a shutdown hook This reverts commit 81a1fd4c862276e6e84bda711f94653566502516. --- src/babashka/impl/classes.clj | 2 -- src/babashka/impl/proxy.clj | 7 +------ src/babashka/impl/reify.clj | 3 --- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 684a2081..892c7623 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -404,8 +404,6 @@ java.util.zip.ZipEntry java.util.zip.ZipException java.util.zip.ZipFile - sun.misc.Signal - sun.misc.SignalHandler ~(symbol "[B") ~(symbol "[I") ~(symbol "[Ljava.lang.Object;") diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index 079e47fb..b4341d06 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -72,12 +72,7 @@ ["javax.net.ssl.HostnameVerifier" #{}] (proxy [javax.net.ssl.HostnameVerifier] [] - (verify [host-name session] ((method-or-bust methods 'verify) this host-name session))) - - ["sun.misc.SignalHandler" #{}] - (proxy [sun.misc.SignalHandler] [] - (handle [sig] - ((method-or-bust methods 'handle) this sig)))))) + (verify [host-name session] ((method-or-bust methods 'verify) this host-name session)))))) (defn class-sym [c] (symbol (class-name c))) diff --git a/src/babashka/impl/reify.clj b/src/babashka/impl/reify.clj index fa3fff55..f9f5895a 100644 --- a/src/babashka/impl/reify.clj +++ b/src/babashka/impl/reify.clj @@ -183,7 +183,4 @@ resolveAlias [[this sym]] resolveVar [[this sym]]} - sun.misc.SignalHandler - {handle [[this signal]]} - })) From ba582d14a2396f4321dc411ab0701d60a4fd6e39 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 12:06:34 +0200 Subject: [PATCH 030/550] process: pprinting --- process | 2 +- src/babashka/impl/process.clj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/process b/process index 5db9560e..e46a5f3e 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 5db9560eab698f9773537acb0167f38d6fd0d322 +Subproject commit e46a5f3e42321b3ecfda960b7b248a888b44aa3b diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 28aef471..55d001f1 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -1,6 +1,7 @@ (ns babashka.impl.process {:no-doc true} (:require [babashka.process :as process] + [babashka.process.pprint] ;; defines simple-dispatch for []printing processes [sci.core :as sci :refer [copy-var]])) (def tns (sci/create-ns 'babashka.process nil)) From c0007e55c44eb6ccc8ad87f603a9e38af74e8cc0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 12:21:04 +0200 Subject: [PATCH 031/550] Revert "process: pprinting" This reverts commit ba582d14a2396f4321dc411ab0701d60a4fd6e39. --- process | 2 +- src/babashka/impl/process.clj | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/process b/process index e46a5f3e..5db9560e 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit e46a5f3e42321b3ecfda960b7b248a888b44aa3b +Subproject commit 5db9560eab698f9773537acb0167f38d6fd0d322 diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 55d001f1..28aef471 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -1,7 +1,6 @@ (ns babashka.impl.process {:no-doc true} (:require [babashka.process :as process] - [babashka.process.pprint] ;; defines simple-dispatch for []printing processes [sci.core :as sci :refer [copy-var]])) (def tns (sci/create-ns 'babashka.process nil)) From 6c568d62d41741dc4392179c8b0968f2c59e8197 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 16:27:44 +0200 Subject: [PATCH 032/550] Process: fix for pprint --- process | 2 +- src/babashka/impl/process.clj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/process b/process index 5db9560e..3c1e4f93 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 5db9560eab698f9773537acb0167f38d6fd0d322 +Subproject commit 3c1e4f9337a57eab65128e5ec5910a840b13810f diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 28aef471..7a457196 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -1,6 +1,7 @@ (ns babashka.impl.process {:no-doc true} (:require [babashka.process :as process] + [babashka.process.pprint] [sci.core :as sci :refer [copy-var]])) (def tns (sci/create-ns 'babashka.process nil)) From d786a5a9b2c7970aa8530d507b5a45f1a66492c7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 17:01:13 +0200 Subject: [PATCH 033/550] process pprint --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 3c1e4f93..8e3486b5 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 3c1e4f9337a57eab65128e5ec5910a840b13810f +Subproject commit 8e3486b5bd301bd9bb1c3584112f55863b25d19d From 3bb54ee5e0c4a5871ad32c28620744d1ad5a1e5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Mar 2022 17:02:10 +0200 Subject: [PATCH 034/550] fix process pprint --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 8e3486b5..8d72f209 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 8e3486b5bd301bd9bb1c3584112f55863b25d19d +Subproject commit 8d72f2097a1dc49b81a52af6733b8beb836efbdc From b29a419bd0834fe614512c8b59242b9ef2885b89 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 28 Mar 2022 17:03:24 +0200 Subject: [PATCH 035/550] deps.clj --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index cee6e47d..c948c2f5 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit cee6e47de8b59c6386704be0c82c0a1d74c9722c +Subproject commit c948c2f5c1e240c0e0ea4201877695f729ee309e From c7428da21602bae9e71d6ca4436a932ef97c1a76 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 28 Mar 2022 17:14:09 +0200 Subject: [PATCH 036/550] Fix musl --- script/setup-musl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/setup-musl b/script/setup-musl index 3a042d3b..9415de9e 100755 --- a/script/setup-musl +++ b/script/setup-musl @@ -19,12 +19,12 @@ fi apt-get update -y && apt-get install musl-tools -y -ZLIB_VERSION="1.2.11" +ZLIB_VERSION="1.2.12" +ZLIB_SHA256="91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9" -curl -O -sL "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" +curl -O -sL --fail --show-error "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" -echo "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 zlib-${ZLIB_VERSION}.tar.gz" | - sha256sum --check +echo "${ZLIB_SHA256} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum --check tar xf "zlib-${ZLIB_VERSION}.tar.gz" arch=${BABASHKA_ARCH:-"x86_64"} From bef6d99740a2b707cd63cdfe54a82eccc174fbf6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 28 Mar 2022 17:53:55 +0200 Subject: [PATCH 037/550] Revert "Fix musl" This reverts commit c7428da21602bae9e71d6ca4436a932ef97c1a76. --- script/setup-musl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/setup-musl b/script/setup-musl index 9415de9e..3a042d3b 100755 --- a/script/setup-musl +++ b/script/setup-musl @@ -19,12 +19,12 @@ fi apt-get update -y && apt-get install musl-tools -y -ZLIB_VERSION="1.2.12" -ZLIB_SHA256="91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9" +ZLIB_VERSION="1.2.11" -curl -O -sL --fail --show-error "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" +curl -O -sL "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" -echo "${ZLIB_SHA256} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum --check +echo "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 zlib-${ZLIB_VERSION}.tar.gz" | + sha256sum --check tar xf "zlib-${ZLIB_VERSION}.tar.gz" arch=${BABASHKA_ARCH:-"x86_64"} From bffc4bf00c9adec077f538fbc203f0f0620c8b5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 28 Mar 2022 17:55:04 +0200 Subject: [PATCH 038/550] Use old musl --- script/setup-musl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/setup-musl b/script/setup-musl index 3a042d3b..6de3a11c 100755 --- a/script/setup-musl +++ b/script/setup-musl @@ -21,7 +21,7 @@ apt-get update -y && apt-get install musl-tools -y ZLIB_VERSION="1.2.11" -curl -O -sL "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" +curl -O -sL "https://www.zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" echo "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 zlib-${ZLIB_VERSION}.tar.gz" | sha256sum --check From a4a8ce53066b6643d846591bc3497fd16d40a215 Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Mon, 28 Mar 2022 17:07:42 +0100 Subject: [PATCH 039/550] Unbump zlib to version 1.2.11 (#1222) The newer 1.2.12 version is breaking the tests. The older version is not available in the main download path, however it is still available in the archive. --- script/setup-musl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/script/setup-musl b/script/setup-musl index 6de3a11c..ad055064 100755 --- a/script/setup-musl +++ b/script/setup-musl @@ -20,11 +20,12 @@ fi apt-get update -y && apt-get install musl-tools -y ZLIB_VERSION="1.2.11" +ZLIB_SHA256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" -curl -O -sL "https://www.zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" +# stable archive path +curl -O -sL --fail --show-error "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" -echo "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 zlib-${ZLIB_VERSION}.tar.gz" | - sha256sum --check +echo "${ZLIB_SHA256} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum --check tar xf "zlib-${ZLIB_VERSION}.tar.gz" arch=${BABASHKA_ARCH:-"x86_64"} From bee5a88d16e7c363babeb2025c9271d25acf6ea0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 31 Mar 2022 09:45:54 +0200 Subject: [PATCH 040/550] Update fs: which improvements --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 2bf527f7..f421d50c 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 2bf527f797d69b3f14247940958e0d7b509f3ce2 +Subproject commit f421d50c1e48c14dd5be61daadab85be2f8e956b From 4d24cdca2a48de3ee94cc0a4983fad7cf082762f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 31 Mar 2022 10:00:16 +0200 Subject: [PATCH 041/550] Proxy support for PipedInputStream and PipedOutputStream * Spire requires proxy support for java.io.PipedInputStream and java.io.PipedOutputStream * proxy support for java.io.PipedInputStream and java.io.PipedOutputStream * proxy tests for PipedInputStream and PipedOutputStream Co-authored-by: Crispin Wellington --- CHANGELOG.md | 4 +++ src/babashka/impl/classes.clj | 1 + src/babashka/impl/proxy.clj | 22 +++++++++++++++- test/babashka/proxy_test.clj | 48 +++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e787834..3f3619a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ A preview of the next release can be installed from - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill - [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future +## 0.7.9-SNAPSHOT + +- [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. + ## 0.7.8 (2022-03-13) This release improves compatibility with several libraries: [loom](https://github.com/aysylu/loom), [hugsql.core](https://www.hugsql.org) and [specter](https://github.com/redplanetlabs/specter)! diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 892c7623..fe84adb1 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -383,6 +383,7 @@ java.util.NoSuchElementException java.util.Optional java.util.Properties + ;; java.util.Scanner java.util.Set java.util.StringTokenizer java.util.UUID diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index b4341d06..1c0018d4 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -72,7 +72,27 @@ ["javax.net.ssl.HostnameVerifier" #{}] (proxy [javax.net.ssl.HostnameVerifier] [] - (verify [host-name session] ((method-or-bust methods 'verify) this host-name session)))))) + (verify [host-name session] ((method-or-bust methods 'verify) this host-name session))) + + ["java.io.PipedInputStream" #{}] + (proxy [java.io.PipedInputStream] [] + (available [] ((method-or-bust methods 'available) this)) + (close [] ((method-or-bust methods 'close) this)) + (read + ([] + ((method-or-bust methods 'read) this)) + ([b off len] + ((method-or-bust methods 'read) this b off len))) + (receive [b] ((method-or-bust methods 'receive) this b))) + + ["java.io.PipedOutputStream" #{}] + (proxy [java.io.PipedOutputStream] [] + (close [] ((method-or-bust methods 'close) this)) + (connect [snk] ((method-or-bust methods 'connect) this snk)) + (flush [] ((method-or-bust methods 'flush) this)) + (write + ([b] ((method-or-bust methods 'write) this b)) + ([b off len] ((method-or-bust methods 'write) this b off len))))))) (defn class-sym [c] (symbol (class-name c))) diff --git a/test/babashka/proxy_test.clj b/test/babashka/proxy_test.clj index 496f6449..109f15e0 100644 --- a/test/babashka/proxy_test.clj +++ b/test/babashka/proxy_test.clj @@ -78,3 +78,51 @@ true false] (bb (with-out-str (clojure.pprint/pprint code)))))) + +(deftest PipedInputStream-PipedOutputStream-proxy-test + (is (= {:available 1 + :read-result -1 + :byte-read 10 + :array-read '(0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0) + :instance? true} + (bb (with-out-str + (clojure.pprint/pprint + '(let [ins (proxy [java.io.PipedInputStream] [] + (available [] 1) + (close [] nil) + (read + ([] 10) + ([byte-arr off len] + (aset byte-arr off (byte 10)) + -1)) + (receive [b] + nil)) + arr (byte-array 16) + ] + {:available (.available ins) + :read-result (.read ins arr 6 2) + :byte-read (.read ins) + :array-read (seq arr) + :instance? (instance? java.io.PipedInputStream ins)})))))) + + (is (= {:instance? true + :arr '(1 2 3 4 5 0 0 0) + :arr2 '(10)} + (bb (with-out-str + (clojure.pprint/pprint + '(let [arr (byte-array 8) + arr2 (byte-array 1) + outs (proxy [java.io.PipedOutputStream] [] + (close [] nil) + (connect [sink] nil) + (flush [] nil) + (write + ([b] (aset arr2 0 (byte b))) + ([byte-arr off len] + (doseq [n (range len)] + (aset arr n (aget byte-arr (+ off n)))))))] + (.write outs (int 10)) + (.write outs (byte-array [0 0 0 1 2 3 4 5 0 0 0]) 3 5) + {:instance? (instance? java.io.PipedOutputStream outs) + :arr (seq arr) + :arr2 (seq arr2)}))))))) From ff54332977175d2cd5b0d39e2e881f994e2efd68 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 31 Mar 2022 12:07:35 +0200 Subject: [PATCH 042/550] Make java.util.Scanner available --- src/babashka/impl/classes.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index fe84adb1..d9b08b00 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -383,7 +383,7 @@ java.util.NoSuchElementException java.util.Optional java.util.Properties - ;; java.util.Scanner + java.util.Scanner java.util.Set java.util.StringTokenizer java.util.UUID From 1cf914ad1ce2145b1bd69ae7175246c0a58c3837 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Apr 2022 18:22:56 +0200 Subject: [PATCH 043/550] Bump Selmer --- deps.edn | 2 +- feature-spec-alpha/babashka/impl/spec.clj | 9 ++++----- project.clj | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/deps.edn b/deps.edn index f7dd245d..d4e67e14 100644 --- a/deps.edn +++ b/deps.edn @@ -40,7 +40,7 @@ org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} - selmer/selmer {:mvn/version "1.12.44"} + selmer/selmer {:mvn/version "1.12.50"} com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"}} diff --git a/feature-spec-alpha/babashka/impl/spec.clj b/feature-spec-alpha/babashka/impl/spec.clj index 7e01d189..7d69f125 100644 --- a/feature-spec-alpha/babashka/impl/spec.clj +++ b/feature-spec-alpha/babashka/impl/spec.clj @@ -4,12 +4,11 @@ [babashka.impl.clojure.spec.gen.alpha :as gen] [babashka.impl.clojure.spec.test.alpha :as test] [clojure.core :as c] - [sci.core :as sci :refer [copy-var]] - [sci.impl.vars :as vars])) + [sci.core :as sci :refer [copy-var]])) -(def sns (vars/->SciNamespace 'clojure.spec.alpha nil)) -(def tns (vars/->SciNamespace 'clojure.spec.test.alpha nil)) -(def gns (vars/->SciNamespace 'clojure.spec.gen.alpha nil)) +(def sns (sci/create-ns 'clojure.spec.alpha nil)) +(def tns (sci/create-ns 'clojure.spec.test.alpha nil)) +(def gns (sci/create-ns 'clojure.spec.gen.alpha nil)) (defn- ns-qualify "Qualify symbol s by resolving it or using the current *ns*." diff --git a/project.clj b/project.clj index ad60d125..cdc3c290 100644 --- a/project.clj +++ b/project.clj @@ -60,7 +60,7 @@ :feature/test-check {:source-paths ["feature-test-check"]} :feature/spec-alpha {:source-paths ["feature-spec-alpha"]} :feature/selmer {:source-paths ["feature-selmer"] - :dependencies [[selmer/selmer "1.12.44"]]} + :dependencies [[selmer/selmer "1.12.50"]]} :feature/logging {:source-paths ["feature-logging"] :dependencies [[com.taoensso/timbre "5.2.1"] [org.clojure/tools.logging "1.1.0"]]} From 963bd7957a77f42bf1de1625e5c3bb19ace72107 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Sat, 2 Apr 2022 08:51:08 -0600 Subject: [PATCH 044/550] Feature: declarative pods support in uberjars (#1217) * Store bb.edn in uberjar & load when run from there * Sync resources deps.edn w/ root * Throw error if --config arg doesn't exist ...instead of silently falling back on ./bb.edn * Fix jar file arg parsing Moving all arg parsing up above bb.edn ingestion made tasks turn into files to load. But this is a chicken-and-egg problem w/ uberjars b/c the bb.edn is inside the jar file, so we need that first. So I extracted the file parsing out into its own fn and put the full arg parsing back where it was after ingesting bb.edn. * Fix local pod key in error message * Ensure resources dir exists when copying bb.edn into it * Copy bb.edn to temp dir when building uberjar ..and add that dir to the classpath for the jar * Only put :pods in uberjar bb.edn * Small readability fix * Add ret val type hints for classpath/resource Got a reflection warning on one of my calls * Add a test for uberjars with bb.edn-declared pods * Only run uberjar-with-pods-test on amd64 for now --- src/babashka/impl/classpath.clj | 17 +++++----- src/babashka/impl/pods.clj | 2 +- src/babashka/main.clj | 60 ++++++++++++++++++++++----------- test/babashka/uberjar_test.clj | 37 ++++++++++++++++---- 4 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/babashka/impl/classpath.clj b/src/babashka/impl/classpath.clj index cd223e1f..1506b80e 100644 --- a/src/babashka/impl/classpath.clj +++ b/src/babashka/impl/classpath.clj @@ -5,7 +5,8 @@ [clojure.java.io :as io] [clojure.string :as str] [sci.core :as sci]) - (:import [java.util.jar JarFile Manifest])) + (:import [java.util.jar JarFile Manifest] + (java.net URL))) (set! *warn-on-reflection* true) @@ -106,11 +107,11 @@ [] (:cp @cp-state)) -(defn resource [path] - (when-let [st @cp-state] - (let [loader (:loader st)] - (if (str/starts-with? path "/") nil ;; non-relative paths always return nil - (getResource loader [path] true))))) +(defn resource + (^URL [path] (when-let [st @cp-state] (resource (:loader st) path))) + (^URL [loader path] + (if (str/starts-with? path "/") nil ;; non-relative paths always return nil + (getResource loader [path] true)))) (def cns (sci/create-ns 'babashka.classpath nil)) @@ -126,5 +127,5 @@ (def cp "src:feature-xml:feature-core-async:feature-yaml:feature-csv:feature-transit:feature-java-time:feature-java-nio:sci/src:babashka.curl/src:babashka.pods/src:resources:sci/resources:/Users/borkdude/.m2/repository/com/cognitect/transit-java/1.0.343/transit-java-1.0.343.jar:/Users/borkdude/.m2/repository/org/clojure/clojure/1.10.2-alpha1/clojure-1.10.2-alpha1.jar:/Users/borkdude/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer/1.0.0/tools.analyzer-1.0.0.jar:/Users/borkdude/.m2/repository/org/clojure/tools.logging/0.6.0/tools.logging-0.6.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.jar:/Users/borkdude/.m2/repository/org/clojure/spec.alpha/0.2.187/spec.alpha-0.2.187.jar:/Users/borkdude/.m2/repository/org/clojure/tools.cli/1.0.194/tools.cli-1.0.194.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer.jvm/1.0.0/tools.analyzer.jvm-1.0.0.jar:/Users/borkdude/.m2/repository/borkdude/graal.locking/0.0.2/graal.locking-0.0.2.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.10.2/jackson-dataformat-cbor-2.10.2.jar:/Users/borkdude/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar:/Users/borkdude/.m2/repository/org/flatland/ordered/1.5.9/ordered-1.5.9.jar:/Users/borkdude/.m2/repository/org/postgresql/postgresql/42.2.12/postgresql-42.2.12.jar:/Users/borkdude/.m2/repository/fipp/fipp/0.6.22/fipp-0.6.22.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar:/Users/borkdude/.m2/repository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar:/Users/borkdude/.m2/repository/org/ow2/asm/asm/5.2/asm-5.2.jar:/Users/borkdude/.gitlibs/libs/clj-commons/conch/9aa7724e925cb8bf163e0b62486dd420b84e5f0b/src:/Users/borkdude/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/Users/borkdude/.m2/repository/seancorfield/next.jdbc/1.0.424/next.jdbc-1.0.424.jar:/Users/borkdude/.m2/repository/org/clojure/data.xml/0.2.0-alpha6/data.xml-0.2.0-alpha6.jar:/Users/borkdude/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar:/Users/borkdude/.m2/repository/borkdude/edamame/0.0.11-alpha.9/edamame-0.0.11-alpha.9.jar:/Users/borkdude/.m2/repository/org/clojure/data.csv/1.0.0/data.csv-1.0.0.jar:/Users/borkdude/.m2/repository/com/cognitect/transit-clj/1.0.324/transit-clj-1.0.324.jar:/Users/borkdude/.m2/repository/clj-commons/clj-yaml/0.7.1/clj-yaml-0.7.1.jar:/Users/borkdude/.m2/repository/org/clojure/core.rrb-vector/0.1.1/core.rrb-vector-0.1.1.jar:/Users/borkdude/.m2/repository/persistent-sorted-set/persistent-sorted-set/0.1.2/persistent-sorted-set-0.1.2.jar:/Users/borkdude/.m2/repository/cheshire/cheshire/5.10.0/cheshire-5.10.0.jar:/Users/borkdude/.m2/repository/tigris/tigris/0.1.2/tigris-0.1.2.jar:/Users/borkdude/.m2/repository/org/clojure/tools.reader/1.3.2/tools.reader-1.3.2.jar:/Users/borkdude/.m2/repository/datascript/datascript/0.18.11/datascript-0.18.11.jar:/Users/borkdude/.m2/repository/org/hsqldb/hsqldb/2.4.0/hsqldb-2.4.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.memoize/0.8.2/core.memoize-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.priority-map/0.0.7/data.priority-map-0.0.7.jar:/Users/borkdude/.m2/repository/org/clojure/java.data/1.0.64/java.data-1.0.64.jar:/Users/borkdude/.m2/repository/borkdude/sci.impl.reflector/0.0.1/sci.impl.reflector-0.0.1.jar:/Users/borkdude/.m2/repository/nrepl/bencode/1.1.0/bencode-1.1.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.cache/0.8.2/core.cache-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/core.async/1.1.587/core.async-1.1.587.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.10.2/jackson-dataformat-smile-2.10.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.codec/0.1.0/data.codec-0.1.0.jar:/Users/borkdude/.m2/repository/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar") (def l (loader cp)) (source-for-namespace l 'babashka.impl.cheshire nil) - (time (:file (source-for-namespace l 'cheshire.core nil))) ;; 20ms -> 2.25ms - ) + (time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms + diff --git a/src/babashka/impl/pods.clj b/src/babashka/impl/pods.clj index 37923471..fb07c087 100644 --- a/src/babashka/impl/pods.clj +++ b/src/babashka/impl/pods.clj @@ -28,7 +28,7 @@ (throw (IllegalArgumentException. (str (-> coord keys first) " is not a supported pod coordinate type. " - "Use :version for registry-hosted pods or :local/root " + "Use :version for registry-hosted pods or :path " "for pods on your local filesystem.")))))) {} pods-map)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 9aa73460..b957d0c3 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -663,6 +663,15 @@ Use bb run --help to show this help output. [options opts-map]) [options opts-map]))) +(defn parse-file-opt + [options opts-map] + (let [opt (first options) + opts-key (if (str/ends-with? opt ".jar") + :jar :file)] + (assoc opts-map + opts-key opt + :command-line-args (next options)))) + (defn parse-opts ([options] (parse-opts options nil)) ([options opts-map] @@ -672,19 +681,18 @@ Use bb run --help to show this help output. ;; FILE > TASK > SUBCOMMAND (cond (.isFile (io/file opt)) - (if (str/ends-with? opt ".jar") - (assoc opts-map - :jar opt - :command-line-args (next options)) - (assoc opts-map - :file opt - :command-line-args (next options))) + (if (or (:file opts-map) (:jar opts-map)) + opts-map ; we've already parsed the file opt + (parse-file-opt options opts-map)) + (contains? tasks opt) (assoc opts-map :run opt :command-line-args (next options)) + (command? opt) (recur (cons (str "--" opt) (next options)) opts-map) + :else (parse-args options opts-map)))))) @@ -920,11 +928,19 @@ Use bb run --help to show this help output. (spit uberscript-out expression :append true))) (when uberjar (if-let [cp (cp/get-classpath)] - (uberjar/run {:dest uberjar - :jar :uber - :classpath cp - :main-class main - :verbose debug}) + (let [uber-params {:dest uberjar + :jar :uber + :classpath cp + :main-class main + :verbose debug}] + (if-let [bb-edn-pods (:pods @common/bb-edn)] + (fs/with-temp-dir [bb-edn-dir {}] + (let [bb-edn-resource (fs/file bb-edn-dir "bb.edn")] + (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) + (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] + (uberjar/run (assoc uber-params + :classpath cp-with-bb-edn))))) + (uberjar/run uber-params))) (throw (Exception. "The uberjar task needs a classpath.")))) exit-code)))) @@ -939,17 +955,21 @@ Use bb run --help to show this help output. (defn main [& args] (let [[args global-opts] (parse-global-opts args) + {:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile) + (parse-file-opt args global-opts)) config (:config global-opts) - bb-edn-file (or config - "bb.edn") - bb-edn (when (fs/exists? bb-edn-file) - (System/setProperty "babashka.config" - (.getAbsolutePath (io/file bb-edn-file))) + abs-path #(-> % io/file .getAbsolutePath) + bb-edn-file (cond + config (when (fs/exists? config) (abs-path config)) + jar (some-> jar cp/loader (cp/resource "bb.edn") .toString) + :else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) + bb-edn (when bb-edn-file + (System/setProperty "babashka.config" bb-edn-file) (let [raw-string (slurp bb-edn-file) edn (edn/read-string raw-string) edn (assoc edn - :raw raw-string - :file bb-edn-file) + :raw raw-string + :file bb-edn-file) edn (if-let [deps-root (or (:deps-root global-opts) (some-> config fs/parent))] (assoc edn :deps-root deps-root) @@ -961,7 +981,7 @@ Use bb run --help to show this help output. (binding [*out* *err*] (println (str "WARNING: this project requires babashka " min-bb-version " or newer, but you have: " version))))) - (exec (parse-opts args global-opts)))) + (exec (parse-opts args (merge global-opts file-opt))))) (def musl? "Captured at compile time, to know if we are running inside a diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 66d94a13..fe2ed56a 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -3,14 +3,21 @@ [babashka.main :as main] [babashka.test-utils :as tu] [clojure.string :as str] - [clojure.test :as t :refer [deftest is testing]])) + [clojure.test :as t :refer [deftest is testing]] + [babashka.fs :as fs] + [clojure.edn :as edn]) + (:import (java.util.jar JarFile) + (java.io File InputStreamReader PushbackReader))) + +(defn jar-entries [jar] + (with-open [jar-file (JarFile. jar)] + (doall (enumeration-seq (.entries jar-file))))) (defn count-entries [jar] - (with-open [jar-file (java.util.jar.JarFile. jar)] - (count (map #_prn - identity - (enumeration-seq - (.entries jar-file)))))) + (-> jar jar-entries count)) + +(defn get-entry [^File jar entry-name] + (-> jar JarFile. (.getEntry entry-name))) (deftest uberjar-test (testing "uberjar with --main" @@ -54,6 +61,24 @@ ;; Only a manifest entry is added (is (< (count-entries path) 3))))) +(deftest uberjar-with-pods-test + (testing "jar contains bb.edn w/ only :pods when bb.edn has :pods" + (when (= "amd64" (System/getProperty "os.arch")) ; TODO: Build bootleg for aarch64 too or use a different pod + (let [tmp-file (java.io.File/createTempFile "uber" ".jar") + path (.getPath tmp-file)] + (.deleteOnExit tmp-file) + (let [config {:paths ["test-resources/babashka/uberjar/src"] + :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} + :pods '{retrogradeorbit/bootleg {:version "0.1.9"} + pod/test-pod {:path "test-resources/pod"}}}] + (tu/with-config config + (tu/bb nil "uberjar" path "-m" "my.main-main") + (let [bb-edn-entry (get-entry tmp-file "bb.edn") + bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) + InputStreamReader. PushbackReader. edn/read)] + (is (= #{:pods} (-> bb-edn keys set))) + (is (= (:pods config) (:pods bb-edn)))))))))) + (deftest throw-on-empty-classpath ;; this test fails the windows native test in CI (when-not main/windows? From ea4c4eae77909948d477e9cef70e3ade4d93d5de Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 17:09:34 +0200 Subject: [PATCH 045/550] windows fix --- test/babashka/uberjar_test.clj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index fe2ed56a..4c9ab5de 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -1,13 +1,13 @@ (ns babashka.uberjar-test (:require - [babashka.main :as main] - [babashka.test-utils :as tu] - [clojure.string :as str] - [clojure.test :as t :refer [deftest is testing]] - [babashka.fs :as fs] - [clojure.edn :as edn]) - (:import (java.util.jar JarFile) - (java.io File InputStreamReader PushbackReader))) + [babashka.fs :as fs] + [babashka.main :as main] + [babashka.test-utils :as tu] + [clojure.edn :as edn] + [clojure.string :as str] + [clojure.test :as t :refer [deftest is testing]]) + (:import (java.io File InputStreamReader PushbackReader) + (java.util.jar JarFile))) (defn jar-entries [jar] (with-open [jar-file (JarFile. jar)] @@ -69,8 +69,8 @@ (.deleteOnExit tmp-file) (let [config {:paths ["test-resources/babashka/uberjar/src"] :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} - :pods '{retrogradeorbit/bootleg {:version "0.1.9"} - pod/test-pod {:path "test-resources/pod"}}}] + :pods (cond-> '{retrogradeorbit/bootleg {:version "0.1.9"} + (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"})})}] (tu/with-config config (tu/bb nil "uberjar" path "-m" "my.main-main") (let [bb-edn-entry (get-entry tmp-file "bb.edn") From 7af93adf15d11fd31144f051c9ce49af6a4269ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 17:47:27 +0200 Subject: [PATCH 046/550] Fix test --- .../babashka/uberjar/src/my/main_pod.clj | 5 ++++ test/babashka/uberjar_test.clj | 30 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 test-resources/babashka/uberjar/src/my/main_pod.clj diff --git a/test-resources/babashka/uberjar/src/my/main_pod.clj b/test-resources/babashka/uberjar/src/my/main_pod.clj new file mode 100644 index 00000000..a3a0e46f --- /dev/null +++ b/test-resources/babashka/uberjar/src/my/main_pod.clj @@ -0,0 +1,5 @@ +(ns my.main-pod + (:require [pod.babashka.go-sqlite3 :as sqlite])) + +(defn -main [& _args] + (sqlite/query ":memory:" ["SELECT 1 + 2 as sum"])) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 4c9ab5de..4dd24d37 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -63,21 +63,21 @@ (deftest uberjar-with-pods-test (testing "jar contains bb.edn w/ only :pods when bb.edn has :pods" - (when (= "amd64" (System/getProperty "os.arch")) ; TODO: Build bootleg for aarch64 too or use a different pod - (let [tmp-file (java.io.File/createTempFile "uber" ".jar") - path (.getPath tmp-file)] - (.deleteOnExit tmp-file) - (let [config {:paths ["test-resources/babashka/uberjar/src"] - :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} - :pods (cond-> '{retrogradeorbit/bootleg {:version "0.1.9"} - (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"})})}] - (tu/with-config config - (tu/bb nil "uberjar" path "-m" "my.main-main") - (let [bb-edn-entry (get-entry tmp-file "bb.edn") - bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) - InputStreamReader. PushbackReader. edn/read)] - (is (= #{:pods} (-> bb-edn keys set))) - (is (= (:pods config) (:pods bb-edn)))))))))) + (let [tmp-file (java.io.File/createTempFile "uber" ".jar") + path (.getPath tmp-file)] + (.deleteOnExit tmp-file) + (let [config {:paths ["test-resources/babashka/uberjar/src"] + :deps '{local/deps {:local/root "test-resources/babashka/uberjar"}} + :pods (cond-> '{org.babashka/go-sqlite3 {:version "0.1.0"}} + (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"}))}] + (tu/with-config config + (tu/bb nil "uberjar" path "-m" "my.main-pod") + (let [bb-edn-entry (get-entry tmp-file "bb.edn") + bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) + InputStreamReader. PushbackReader. edn/read)] + (is (= #{:pods} (-> bb-edn keys set))) + (is (= (:pods config) (:pods bb-edn)))) + (is (str/includes? (tu/bb nil "--jar" path) "3"))))))) (deftest throw-on-empty-classpath ;; this test fails the windows native test in CI From e81ef4aac07860024fe3da4d345c0821fe628ea8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 2 Apr 2022 23:41:04 +0200 Subject: [PATCH 047/550] Declarative pod support for uberscript (#1227) --- src/babashka/main.clj | 43 +++++++++++-------- .../babashka/uberscript/src/my/main_pod.clj | 6 +++ .../uberscript/src/my/other_ns_with_pod.clj | 2 + test/babashka/uberscript_test.clj | 12 +++++- 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 test-resources/babashka/uberscript/src/my/main_pod.clj create mode 100644 test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj diff --git a/src/babashka/main.clj b/src/babashka/main.clj index b957d0c3..e1714279 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -52,11 +52,11 @@ [hf.depstar.uberjar :as uberjar] [sci.addons :as addons] [sci.core :as sci] + [sci.impl.io :as sio] [sci.impl.namespaces :as sci-namespaces] [sci.impl.types :as sci-types] [sci.impl.unrestrict :refer [*unrestricted*]] - [sci.impl.vars :as vars] - [sci.impl.io :as sio]) + [sci.impl.vars :as vars]) (:gen-class)) (def windows? @@ -669,8 +669,8 @@ Use bb run --help to show this help output. opts-key (if (str/ends-with? opt ".jar") :jar :file)] (assoc opts-map - opts-key opt - :command-line-args (next options)))) + opts-key opt + :command-line-args (next options)))) (defn parse-opts ([options] (parse-opts options nil)) @@ -765,16 +765,25 @@ Use bb run --help to show this help output. :expressions [(:source res)]}) {}) res)))) - (when-let [pod (get @pod-namespaces namespace)] - (pods/load-pod (:pod-spec pod) (:opts pod))) - (case namespace - clojure.spec.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) - clojure.core.specs.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) - nil))) + (if-let [pod (get @pod-namespaces namespace)] + (if uberscript + (do + (swap! uberscript-sources conj + (format + "(babashka.pods/load-pod '%s \"%s\" '%s)\n" + (:pod-spec pod) (:version (:opts pod)) + (dissoc (:opts pod) + :version :metadata))) + {}) + (pods/load-pod (:pod-spec pod) (:opts pod))) + (case namespace + clojure.spec.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) + clojure.core.specs.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) + nil)))) main (if (and jar (not main)) (when-let [res (cp/getResource (cp/loader jar) @@ -939,7 +948,7 @@ Use bb run --help to show this help output. (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] (uberjar/run (assoc uber-params - :classpath cp-with-bb-edn))))) + :classpath cp-with-bb-edn))))) (uberjar/run uber-params))) (throw (Exception. "The uberjar task needs a classpath.")))) exit-code)))) @@ -968,8 +977,8 @@ Use bb run --help to show this help output. (let [raw-string (slurp bb-edn-file) edn (edn/read-string raw-string) edn (assoc edn - :raw raw-string - :file bb-edn-file) + :raw raw-string + :file bb-edn-file) edn (if-let [deps-root (or (:deps-root global-opts) (some-> config fs/parent))] (assoc edn :deps-root deps-root) diff --git a/test-resources/babashka/uberscript/src/my/main_pod.clj b/test-resources/babashka/uberscript/src/my/main_pod.clj new file mode 100644 index 00000000..139b5e48 --- /dev/null +++ b/test-resources/babashka/uberscript/src/my/main_pod.clj @@ -0,0 +1,6 @@ +(ns my.main-pod + (:require [my.other-ns-with-pod] + [pod.babashka.go-sqlite3 :as sqlite])) + +(defn -main [& _args] + (sqlite/query ":memory:" ["SELECT 1 + 2 as sum"])) diff --git a/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj b/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj new file mode 100644 index 00000000..b8f061ba --- /dev/null +++ b/test-resources/babashka/uberscript/src/my/other_ns_with_pod.clj @@ -0,0 +1,2 @@ +(ns my.other-ns-with-pod + (:require [pod.babashka.go-sqlite3])) diff --git a/test/babashka/uberscript_test.clj b/test/babashka/uberscript_test.clj index 4fbc1af8..9a111b18 100644 --- a/test/babashka/uberscript_test.clj +++ b/test/babashka/uberscript_test.clj @@ -1,7 +1,8 @@ (ns babashka.uberscript-test (:require [babashka.test-utils :as tu] - [clojure.test :as t :refer [deftest is]])) + [clojure.test :as t :refer [deftest is]] + [clojure.string :as str])) (deftest basic-test (let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")] @@ -23,3 +24,12 @@ (is (= ":clojure.string/foo\ntrue\n(\"1\" \"2\" \"3\" \"4\")\n" (tu/bb nil "--file" (.getPath tmp-file) "1" "2" "3" "4")))))) +(deftest pods-test + (let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")] + (.deleteOnExit tmp-file) + (tu/with-config (pr-str '{:paths ["test-resources/babashka/uberscript/src"] + :pods {org.babashka/go-sqlite3 {:version "0.1.0"}}}) + (is (empty? (tu/bb nil "uberscript" (.getPath tmp-file) "-m" "my.main-pod"))) + (is (= 1 (count (re-seq #"load-pod 'org.babashka/go-sqlite3" + (str/join (str/split-lines (slurp tmp-file)))))))) + (is (str/includes? (tu/bb nil "--file" (.getPath tmp-file)) "3")))) From f09e085c75b749ce60139eafc760641ec74f6723 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 13:35:53 +0200 Subject: [PATCH 048/550] Move bb.edn in uberjar to META-INF --- sci | 2 +- src/babashka/main.clj | 7 ++++--- test/babashka/uberjar_test.clj | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sci b/sci index 2e7dd0d1..4e6d8e21 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 2e7dd0d1bc23f4d158ea592adf23dac971d4d8d4 +Subproject commit 4e6d8e215a379e3c1a36e39dce43148c8ab0915b diff --git a/src/babashka/main.clj b/src/babashka/main.clj index e1714279..41575a6e 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -944,9 +944,10 @@ Use bb run --help to show this help output. :verbose debug}] (if-let [bb-edn-pods (:pods @common/bb-edn)] (fs/with-temp-dir [bb-edn-dir {}] - (let [bb-edn-resource (fs/file bb-edn-dir "bb.edn")] + (let [bb-edn-resource (fs/file bb-edn-dir "META-INF" "bb.edn")] + (fs/create-dirs (fs/parent bb-edn-resource)) (->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource)) - (let [cp-with-bb-edn (str cp cp/path-sep bb-edn-dir)] + (let [cp-with-bb-edn (str bb-edn-dir cp/path-sep cp)] (uberjar/run (assoc uber-params :classpath cp-with-bb-edn))))) (uberjar/run uber-params))) @@ -970,7 +971,7 @@ Use bb run --help to show this help output. abs-path #(-> % io/file .getAbsolutePath) bb-edn-file (cond config (when (fs/exists? config) (abs-path config)) - jar (some-> jar cp/loader (cp/resource "bb.edn") .toString) + jar (some-> jar cp/loader (cp/resource "META-INF/bb.edn") .toString) :else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) bb-edn (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file) diff --git a/test/babashka/uberjar_test.clj b/test/babashka/uberjar_test.clj index 4dd24d37..4476f45a 100644 --- a/test/babashka/uberjar_test.clj +++ b/test/babashka/uberjar_test.clj @@ -72,7 +72,7 @@ (not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"}))}] (tu/with-config config (tu/bb nil "uberjar" path "-m" "my.main-pod") - (let [bb-edn-entry (get-entry tmp-file "bb.edn") + (let [bb-edn-entry (get-entry tmp-file "META-INF/bb.edn") bb-edn (-> path JarFile. (.getInputStream bb-edn-entry) InputStreamReader. PushbackReader. edn/read)] (is (= #{:pods} (-> bb-edn keys set))) From 10638685549205926489ac325721261c301819d4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:11:03 +0200 Subject: [PATCH 049/550] fix #1211: return exit code 130 on sigint --- CHANGELOG.md | 1 + src/babashka/impl/sigint_handler.clj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f3619a5..eda6e86c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ A preview of the next release can be installed from - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill - [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future +- [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint ## 0.7.9-SNAPSHOT diff --git a/src/babashka/impl/sigint_handler.clj b/src/babashka/impl/sigint_handler.clj index 508e01b2..49903518 100644 --- a/src/babashka/impl/sigint_handler.clj +++ b/src/babashka/impl/sigint_handler.clj @@ -12,4 +12,4 @@ (reify SignalHandler (handle [_ _] ;; This is needed to run shutdown hooks on interrupt, System/exit triggers those - (System/exit 0)))))) + (System/exit 130)))))) From 76a57500afb9e71d549807a4de72b2bb2eb6a7d9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:45:13 +0200 Subject: [PATCH 050/550] bb.curl: fix: last set-cookie headers on a page overwrites the ones before --- CHANGELOG.md | 4 +--- babashka.curl | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eda6e86c..b6c57f74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,10 +17,8 @@ A preview of the next release can be installed from - [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill - [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - -## 0.7.9-SNAPSHOT - - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. +- [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before ## 0.7.8 (2022-03-13) diff --git a/babashka.curl b/babashka.curl index 3d3d117e..8a27e606 160000 --- a/babashka.curl +++ b/babashka.curl @@ -1 +1 @@ -Subproject commit 3d3d117ea0f8a143a06e3cace92e4e8b6a5782df +Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178 From 7f7b66aeaf7aeccd5dc5fedede49131bb23919e6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:55:10 +0200 Subject: [PATCH 051/550] CHANGELOG [skip ci] --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6c57f74..c4aeee3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,17 @@ A preview of the next release can be installed from - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. - [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before +- #1216: fix `core.async` alts example with polyfill +- SCI: support `let*` special form +- Add compatibility with GraalVM 22.1 +- Bump timbre +- Bump Clojure to 1.11.1 +- Pods: support Rosetta2 fallback +- Process: fix for pprint +- Fs: improvement for which: do not match on local paths +- Proxy support for PipedInputStream and PipedOutputStream +- Expose `java.util.Scanner` for interop +- Bump Selmer ## 0.7.8 (2022-03-13) From fabb945f8ccf3c604210b860536ca1a3f4df4383 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 14:58:32 +0200 Subject: [PATCH 052/550] Bump Clojure --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index d4e67e14..9d5e752b 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0"}, + :deps {org.clojure/clojure {:mvn/version "1.11.1"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index cdc3c290..43ef8762 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.0"] + :dependencies [[org.clojure/clojure "1.11.1"] [borkdude/edamame "0.0.19"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From f1adb99eff5b251174348656e3a5485edbf4add1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 15:06:22 +0200 Subject: [PATCH 053/550] Revert "Bump Clojure" This reverts commit fabb945f8ccf3c604210b860536ca1a3f4df4383. --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 9d5e752b..d4e67e14 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.1"}, + :deps {org.clojure/clojure {:mvn/version "1.11.0"}, borkdude/sci {:local/root "sci"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index 43ef8762..cdc3c290 100644 --- a/project.clj +++ b/project.clj @@ -17,7 +17,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.1"] + :dependencies [[org.clojure/clojure "1.11.0"] [borkdude/edamame "0.0.19"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From 5959ba99ecf55b8a4dae0335cbef36d85450e946 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 15:06:37 +0200 Subject: [PATCH 054/550] CHANGELOG [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4aeee3c..16f03588 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ A preview of the next release can be installed from - SCI: support `let*` special form - Add compatibility with GraalVM 22.1 - Bump timbre -- Bump Clojure to 1.11.1 +- Bump Clojure to 1.11.0 - Pods: support Rosetta2 fallback - Process: fix for pprint - Fs: improvement for which: do not match on local paths From 4886fe48aef6d6f5b430b8fcddca27b1ed897d49 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Sun, 3 Apr 2022 12:28:00 -0600 Subject: [PATCH 055/550] Link to declarative pods docs in changelog (#1228) [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16f03588..35466867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ A preview of the next release can be installed from ### New - [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required - - See [updated pod library docs for details](TODO: link) + - See [updated pod library docs for details](https://github.com/babashka/pods#in-a-babashka-project) ### Enhanced From f1db01aede431747fbaafc52af4ee9592d7e4cf1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 21:34:29 +0200 Subject: [PATCH 056/550] Add ->Eduction --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 4e6d8e21..9b5f8eb8 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 4e6d8e215a379e3c1a36e39dce43148c8ab0915b +Subproject commit 9b5f8eb83d859fe4f7f098aa242e70809b43be15 From db9a8ff10caa217669d76f527c86a3b71d46f501 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Apr 2022 21:38:56 +0200 Subject: [PATCH 057/550] Add unchecked math --- src/babashka/impl/clojure/core.clj | 2 ++ src/babashka/main.clj | 1 + 2 files changed, 3 insertions(+) diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index ece78db3..aafdee3b 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -31,6 +31,7 @@ (def command-line-args (core-dynamic-var '*command-line-args*)) (def warn-on-reflection (core-dynamic-var '*warn-on-reflection* false)) (def compile-files (core-dynamic-var '*compile-files* false)) +(def unchecked-math (core-dynamic-var '*unchecked-math* false)) (def math-context (core-dynamic-var '*math-context*)) (defn read+string @@ -169,6 +170,7 @@ '*command-line-args* command-line-args '*warn-on-reflection* warn-on-reflection '*compile-files* compile-files + '*unchecked-math* unchecked-math '*math-context* math-context 'with-precision (sci/copy-var with-precision clojure-core-ns) '-with-precision (sci/copy-var -with-precision clojure-core-ns) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 41575a6e..c33473ae 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -703,6 +703,7 @@ Use bb run --help to show this help output. (defn exec [cli-opts] (binding [*unrestricted* true] (sci/binding [core/warn-on-reflection @core/warn-on-reflection + core/unchecked-math @core/unchecked-math core/data-readers @core/data-readers sci/ns @sci/ns] (let [{version-opt :version From b102a4ae0efd4e774c9566d22e1dfe7707295cdc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Apr 2022 13:52:36 +0200 Subject: [PATCH 058/550] Upgrade tests to hugsql 0.5.3 --- deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index d4e67e14..87b85470 100644 --- a/deps.edn +++ b/deps.edn @@ -129,7 +129,7 @@ clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"} cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"} aysylu/loom {:mvn/version "1.0.2"} - com.layerware/hugsql-core {:mvn/version "0.5.1"} + com.layerware/hugsql-core {:mvn/version "0.5.3"} com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.rpl/specter {:mvn/version "1.1.4"}} :classpath-overrides {org.clojure/clojure nil From 3b9cd12931ee6dcad134487c81027bc9075086a4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Apr 2022 16:18:36 +0200 Subject: [PATCH 059/550] v0.8.0 --- CHANGELOG.md | 7 ++++--- resources/BABASHKA_VERSION | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35466867..052e49ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,11 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## 0.8.0 (TBD) +## 0.8.0 ### New -- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required - - See [updated pod library docs for details](https://github.com/babashka/pods#in-a-babashka-project) +- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required. See [updated pod library docs for details](https://github.com/babashka/pods#in-a-babashka-project) and the entry in the [babashka book](https://book.babashka.org/#_pods_in_bb_edn) for details. ### Enhanced @@ -30,6 +29,8 @@ A preview of the next release can be installed from - Proxy support for PipedInputStream and PipedOutputStream - Expose `java.util.Scanner` for interop - Bump Selmer +- Add `->Eduction` +- Add `*unchecked-math` for compatibility ## 0.7.8 (2022-03-13) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 6287e3f0..a3df0a69 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.7.9-SNAPSHOT \ No newline at end of file +0.8.0 From 9b19642039c7c0b2b65cca37aef759c15f71ae78 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Apr 2022 16:19:35 +0200 Subject: [PATCH 060/550] CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 052e49ae..3c35cbe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ A preview of the next release can be installed from ### New -- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required. See [updated pod library docs for details](https://github.com/babashka/pods#in-a-babashka-project) and the entry in the [babashka book](https://book.babashka.org/#_pods_in_bb_edn) for details. +- [#863](https://github.com/babashka/babashka/issues/863): allow pods to be declared in `bb.edn` and load them when required. See [pod library docs](https://github.com/babashka/pods#in-a-babashka-project) and the entry in the [babashka book](https://book.babashka.org/#_pods_in_bb_edn) for details. ### Enhanced From d4b9f5ed103660629c191fb5e8a601d53a93174e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Apr 2022 16:22:45 +0200 Subject: [PATCH 061/550] CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c35cbe8..1ed4f2ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## 0.8.0 +## 0.8.0 (2022-04-04) ### New From 60df83b6295630d4dcdc90e1a565532b256083fc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Apr 2022 16:39:45 +0200 Subject: [PATCH 062/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index f83dbb32..a3df0a69 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.7.8 \ No newline at end of file +0.8.0 diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index a3df0a69..f89ae9b1 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.0 +0.8.1-SNAPSHOT \ No newline at end of file From d2278835f1935cd53548022a636f60d5282e0d23 Mon Sep 17 00:00:00 2001 From: Stel Abrego Date: Tue, 5 Apr 2022 02:03:39 -0700 Subject: [PATCH 063/550] Fix #1041: Improve error message when regex literal in EDN config (#1230) * Improve error message when regex literal in EDN config (#1041) Regex literal syntax (example: #"^foo") is not allowed in EDN. With the ability to write tasks in the config file, users may mistakenly try to include regex literals. This patch improves the error message by informing the user that literal regex syntax is not allowed and recommends using re-pattern instead. * Update changelog * Fixup main.clj * Fixup changelog --- CHANGELOG.md | 4 ++++ src/babashka/main.clj | 9 ++++++++- test/babashka/bb_edn_test.clj | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ed4f2ba..6fe55d00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## 0.8.1 (TBD) + +- [#1041](https://github.com/babashka/babashka/issues/1041): Improve error message when regex literal in EDN config + ## 0.8.0 (2022-04-04) ### New diff --git a/src/babashka/main.clj b/src/babashka/main.clj index c33473ae..268985a0 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -964,6 +964,13 @@ Use bb run --help to show this help output. (and (= minor-current minor-min) (>= patch-current patch-min))))))) +(defn load-edn [string] + (try (edn/read-string string) + (catch java.lang.RuntimeException e + (if (re-find #"No dispatch macro for: \"" (.getMessage e)) + (throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {})) + (throw e))))) + (defn main [& args] (let [[args global-opts] (parse-global-opts args) {:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile) @@ -977,7 +984,7 @@ Use bb run --help to show this help output. bb-edn (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file) (let [raw-string (slurp bb-edn-file) - edn (edn/read-string raw-string) + edn (load-edn raw-string) edn (assoc edn :raw raw-string :file bb-edn-file) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 69a3a7a7..30a9bac2 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -200,6 +200,12 @@ (is (thrown-with-msg? Exception #"Cyclic task: b" (bb "run" "b"))))) + (testing "friendly regex literal error handling" + (test-utils/with-config + "{:tasks {something (clojure.string/split \"1-2\" #\"-\")}}" + (is (thrown-with-msg? + Exception #"Invalid regex literal" + (bb "run" "something"))))) (testing "doc" (test-utils/with-config '{:tasks {b {:doc "Beautiful docstring"}}} (let [s (test-utils/bb nil "doc" "b")] From 211757d5a428abda21acb39e1159e3c41484ec7e Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Tue, 5 Apr 2022 03:04:38 -0600 Subject: [PATCH 064/550] Add prepare subcommand (#1229) * Add prepare subcommand Downloads deps & pods, caches pod metadata, and then exits * Add prepare subcommand to CHANGELOG Co-authored-by: Michiel Borkent --- CHANGELOG.md | 4 +++- src/babashka/main.clj | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fe55d00..f41af96c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## 0.8.1 (TBD) +======= +## Unreleased +- Add `prepare` subcommand to download deps & pods and cache pod metadata - [#1041](https://github.com/babashka/babashka/issues/1041): Improve error message when regex literal in EDN config ## 0.8.0 (2022-04-04) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 268985a0..55958dee 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -115,7 +115,8 @@ "socket-repl" "nrepl-server" "describe" - "print-deps") true + "print-deps" + "prepare") true false)) (defn print-error [& msgs] @@ -175,6 +176,7 @@ Packaging: uberscript [eval-opt] Collect all required namespaces from the classpath into a single file. Accepts additional eval opts, like `-m`. uberjar [eval-opt] Similar to uberscript but creates jar file. + prepare Download deps & pods defined in bb.edn and cache their metadata. Only an optimization, this will happen on demand when needed. In- and output flags (only to be used with -e one-liners): @@ -621,6 +623,10 @@ Use bb run --help to show this help output. :command-line-args (next options)) ("--print-deps") (parse-print-deps-opts opts-map (next options)) + ("--prepare") + (let [options (next options)] + (recur (next options) + (assoc opts-map :prepare true))) ;; fallback (if (and opts-map (some opts-map [:file :jar :socket-repl :expressions :main :run])) @@ -715,7 +721,7 @@ Use bb run --help to show this help output. :main :uberscript :describe? :jar :uberjar :clojure :doc :run :list-tasks - :print-deps]} + :print-deps :prepare]} cli-opts _ (when debug (vreset! common/debug true)) _ (do ;; set properties @@ -883,6 +889,7 @@ Use bb run --help to show this help output. uberjar [nil 0] list-tasks [(tasks/list-tasks sci-ctx) 0] print-deps [(print-deps/print-deps (:print-deps-format cli-opts)) 0] + prepare [nil 0] uberscript [nil (do (uberscript/uberscript {:ctx sci-ctx :expressions expressions}) From 6eff4cc7381d41e820dafe0f9bde5ab30c8deeda Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 5 Apr 2022 11:15:02 +0200 Subject: [PATCH 065/550] Add missing methods on iterator --- src/babashka/impl/reify.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/reify.clj b/src/babashka/impl/reify.clj index f9f5895a..a776651b 100644 --- a/src/babashka/impl/reify.clj +++ b/src/babashka/impl/reify.clj @@ -161,7 +161,9 @@ java.util.Iterator {hasNext [[this]] - next [[this]]} + next [[this]] + remove [[this]] + forEachRemaining [[this action]]} java.util.function.Function {apply [[this t]]} From f3526d80a4b327f2e961f300b59f3454d996349c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 6 Apr 2022 19:36:45 +0200 Subject: [PATCH 066/550] SCI: fix name metadata on vars --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 9b5f8eb8..64545c0f 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 9b5f8eb83d859fe4f7f098aa242e70809b43be15 +Subproject commit 64545c0f254d25c872086a17afa604ac802b5ee1 From 60a3e864493367ba1a5e0484f492ec1f5fa5a1bd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 6 Apr 2022 21:22:10 +0200 Subject: [PATCH 067/550] Added Fluree to companies [skip ci] --- doc/companies.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/companies.md b/doc/companies.md index ea76a3eb..b068313a 100644 --- a/doc/companies.md +++ b/doc/companies.md @@ -61,6 +61,7 @@ Sponsoring via [Cognitect](https://www.cognitect.com/). - [Datil](https://datil.com/) - [Deon Digital](https://www.deondigital.com/) - [Fluent](https://fluent.to/) +- [Fluree](https://flur.ee/) - [Hi](https://www.hi.group/) - [Juxt](https://www.juxt.pro/) - [Latacora](https://www.latacora.com/) From 3d0befb52b81f0b16b3a43530a98a77808081e4d Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 7 Apr 2022 08:02:06 -0400 Subject: [PATCH 068/550] update some SciVar names (metadata-wise) to align with babashka name (#1236) * update SciVar names to align with the symbols in the namespace maps * make test using a bb script more consistent with others * update changelog --- CHANGELOG.md | 1 + feature-hiccup/babashka/impl/hiccup.clj | 4 ++-- .../babashka/impl/httpkit_client.clj | 2 +- src/babashka/impl/clojure/core/async.clj | 6 +++--- src/babashka/impl/clojure/test.clj | 4 ++-- src/babashka/impl/deps.clj | 2 +- src/babashka/impl/tasks.clj | 2 +- test/babashka/main_test.clj | 4 ++++ test/babashka/scripts/check_var_names.bb | 14 ++++++++++++++ 9 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 test/babashka/scripts/check_var_names.bb diff --git a/CHANGELOG.md b/CHANGELOG.md index f41af96c..c3acf501 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ A preview of the next release can be installed from - Add `prepare` subcommand to download deps & pods and cache pod metadata - [#1041](https://github.com/babashka/babashka/issues/1041): Improve error message when regex literal in EDN config +- [#1223](https://github.com/babashka/babashka/issues/1223): Ensure that var metadata (specifically `:name`) aligns with the var's symbol (which in turn ensures that `doc` will print the var's name) ## 0.8.0 (2022-04-04) diff --git a/feature-hiccup/babashka/impl/hiccup.clj b/feature-hiccup/babashka/impl/hiccup.clj index 7263fb88..d2903b06 100644 --- a/feature-hiccup/babashka/impl/hiccup.clj +++ b/feature-hiccup/babashka/impl/hiccup.clj @@ -52,10 +52,10 @@ util/raw-string) (def hiccup-namespace - {'html (copy-var html-1 hns)}) + {'html (copy-var html-1 hns {:name 'html})}) (def hiccup2-namespace - {'html (copy-var html-2 hns2)}) + {'html (copy-var html-2 hns2 {:name 'html})}) (def html-mode (copy-var util/*html-mode* uns)) (def escape-strings? (copy-var util/*escape-strings?* uns)) diff --git a/feature-httpkit-client/babashka/impl/httpkit_client.clj b/feature-httpkit-client/babashka/impl/httpkit_client.clj index bb3e10ea..f51ccaf8 100644 --- a/feature-httpkit-client/babashka/impl/httpkit_client.clj +++ b/feature-httpkit-client/babashka/impl/httpkit_client.clj @@ -76,4 +76,4 @@ (def sni-client-namespace {'ssl-configurer (copy-var sni-client/ssl-configurer sns) - 'default-client (sci/new-var 'sni-client sni-client {:ns sns})}) + 'default-client (sci/new-var 'default-client sni-client {:ns sns})}) diff --git a/src/babashka/impl/clojure/core/async.clj b/src/babashka/impl/clojure/core/async.clj index f7112f67..d530af64 100644 --- a/src/babashka/impl/clojure/core/async.clj +++ b/src/babashka/impl/clojure/core/async.clj @@ -103,10 +103,10 @@ 'untap-all (copy-var async/untap-all core-async-namespace) ;; polyfill 'go (macrofy 'go thread core-async-namespace) - '! (copy-var async/>!! core-async-namespace) + '! (copy-var async/>!! core-async-namespace {:name '>!}) 'alt! (macrofy 'alt! alt!! core-async-namespace) - 'alts! (copy-var async/alts!! core-async-namespace) + 'alts! (copy-var async/alts!! core-async-namespace {:name 'alts!}) 'go-loop (macrofy 'go-loop go-loop core-async-namespace)}) (def async-protocols-ns (vars/->SciNamespace 'clojure.core.async.impl.protocols nil)) diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index 0053e289..98d736d8 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -332,7 +332,7 @@ :added "1.1"} report-impl :type) -(def report (sci/copy-var report-impl tns)) +(def report (sci/copy-var report-impl tns {:name 'report})) (defn do-report "Add file and line information to a test result and call report. @@ -722,7 +722,7 @@ :expected nil, :actual e}))) (do-report {:type :end-test-var, :var v})))) -(def test-var (sci/copy-var test-var-impl tns)) +(def test-var (sci/copy-var test-var-impl tns {:name 'test-var})) (defn test-vars "Groups vars by their namespace and runs test-vars on them with diff --git a/src/babashka/impl/deps.clj b/src/babashka/impl/deps.clj index 735ec477..3224ebce 100644 --- a/src/babashka/impl/deps.clj +++ b/src/babashka/impl/deps.clj @@ -101,4 +101,4 @@ 'clojure (sci/copy-var bdeps/clojure dns) 'merge-deps (sci/copy-var merge-deps dns) ;; undocumented - 'merge-defaults (sci/copy-var merge-default-deps dns)}) + 'merge-defaults (sci/copy-var merge-default-deps dns {:name 'merge-defaults})}) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 2b376f0d..478e3671 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -20,7 +20,7 @@ ;; (def task-name (sci/new-dynamic-var '*-task-name* nil {:ns sci-ns})) (def task (sci/new-dynamic-var '*task* nil {:ns sci-ns})) (def current-task (sci/new-var 'current-task (fn [] @task) {:ns sci-ns})) -(def state (sci/new-var 'state (atom {}) {:ns sci-ns})) +(def state (sci/new-var 'current-state (atom {}) {:ns sci-ns})) (defn log-info [& strs] (let [log-level @log-level] diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 976d2644..661e7db4 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -825,6 +825,10 @@ true"))) (is (= :f (bb nil "(first (into-array [:f]))"))) (is (= :f (bb nil "(first (first (into-array [(into-array [:f])])))")))) +(deftest var-names-test + (testing "for all public vars, ns/symbol from ns map matches metadata" + (is (empty? (bb nil (.getPath (io/file "test" "babashka" "scripts" "check_var_names.bb"))))))) + ;;;; Scratch (comment diff --git a/test/babashka/scripts/check_var_names.bb b/test/babashka/scripts/check_var_names.bb new file mode 100644 index 00000000..a689cb05 --- /dev/null +++ b/test/babashka/scripts/check_var_names.bb @@ -0,0 +1,14 @@ +(require '[clojure.string :as str]) +(let [ns-maps (->> (all-ns) + (map (fn [nmspc] [(ns-name nmspc) (ns-publics nmspc)])) + (into {})) ; a map of { ns-name {symbol var, ...}} + ns-maps (update ns-maps 'user #(dissoc % '*input*))] ; *input* is a special case that we'll skip over + (->> + (for [[ns-nm _] ns-maps + [sym vr] (ns-maps ns-nm) + :let [{var-meta-ns :ns, var-meta-name :name} (meta vr) + var-meta-ns-name (some-> var-meta-ns ns-name)]] + ; build a seq of maps containing the ns/symbol from the ns and the ns/symbol from the var's metadata + {:actual-ns ns-nm :actual-ns-symbol sym :var-meta-ns var-meta-ns-name :var-meta-name var-meta-name}) + ; and remove the matches + (remove #(and (= (:actual-ns %) (:var-meta-ns %)) (= (:actual-ns-symbol %) (:var-meta-name %)))))) From 52448f75972d5ee5443ceeaf6a4c88fbca84fe20 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Tue, 12 Apr 2022 20:53:15 +0200 Subject: [PATCH 069/550] [#556] Add server-status to org.httpkit.server (#1238) --- feature-httpkit-server/babashka/impl/httpkit_server.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/feature-httpkit-server/babashka/impl/httpkit_server.clj b/feature-httpkit-server/babashka/impl/httpkit_server.clj index f7e1935c..42608208 100644 --- a/feature-httpkit-server/babashka/impl/httpkit_server.clj +++ b/feature-httpkit-server/babashka/impl/httpkit_server.clj @@ -8,6 +8,7 @@ {:obj sns 'server-stop! (copy-var server/server-stop! sns) 'server-port (copy-var server/server-port sns) + 'server-status (copy-var server/server-status sns) 'run-server (copy-var server/run-server sns) 'sec-websocket-accept (copy-var server/sec-websocket-accept sns) 'websocket-handshake-check (copy-var server/websocket-handshake-check sns) From d8db9eee639398e0a0dfb2d4d1ebd5328b3d3eb7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 14 Apr 2022 18:14:31 +0200 Subject: [PATCH 070/550] fix #1231: missing methods in reify should fall back to default interface methods (#1240) --- .gitignore | 3 + deps.edn | 7 +- project.clj | 8 +- reify/.dir-locals.el | 2 + reify/build.clj | 50 +++++ reify/build/reify2.clj | 188 ++++++++++++++++++ reify/deps.edn | 13 ++ reify/src/babashka/impl/reify2.clj | 79 ++++++++ reify/src/babashka/impl/reify2/interfaces.clj | 30 +++ resources/META-INF/babashka/deps.edn | 11 +- sci | 2 +- src/babashka/impl/classes.clj | 2 + src/babashka/impl/print_deps.clj | 1 + src/babashka/main.clj | 2 +- test/babashka/reify_test.clj | 17 ++ 15 files changed, 405 insertions(+), 10 deletions(-) create mode 100644 reify/.dir-locals.el create mode 100644 reify/build.clj create mode 100644 reify/build/reify2.clj create mode 100644 reify/deps.edn create mode 100644 reify/src/babashka/impl/reify2.clj create mode 100644 reify/src/babashka/impl/reify2/interfaces.clj diff --git a/.gitignore b/.gitignore index fb29f608..284c61e2 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ org_babashka*.h .envrc .lsp bb.build_artifacts.txt +target +.nrepl-port +.DS_Store diff --git a/deps.edn b/deps.edn index 87b85470..cf6f65fb 100644 --- a/deps.edn +++ b/deps.edn @@ -17,7 +17,9 @@ "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.0"}, - borkdude/sci {:local/root "sci"} + org.babashka/sci {:local/root "sci"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.0"} + org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} babashka/babashka.core {:local/root "babashka.core"} @@ -43,7 +45,8 @@ selmer/selmer {:mvn/version "1.12.50"} com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} - org.clojure/data.priority-map {:mvn/version "1.1.0"}} + org.clojure/data.priority-map {:mvn/version "1.1.0"} + insn/insn {:mvn/version "0.5.2"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index cdc3c290..95df34c5 100644 --- a/project.clj +++ b/project.clj @@ -10,7 +10,8 @@ :source-paths ["src" "sci/src" "babashka.curl/src" "fs/src" "pods/src" "babashka.core/src" "babashka.nrepl/src" "depstar/src" "process/src" - "deps.clj/src" "deps.clj/resources"] + "deps.clj/src" "deps.clj/resources" + "reify/src"] ;; for debugging Reflector.java code: ;; :java-source-paths ["sci/reflector/src-java"] :java-source-paths ["src-java"] @@ -24,10 +25,13 @@ [cheshire "5.10.2"] [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] + [org.babashka/sci.impl.types "0.0.2"] + [org.babashka/babashka.impl.reify "0.1.0"] [org.clojure/core.async "1.5.648"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] - [rewrite-clj/rewrite-clj "1.0.699-alpha"]] + [rewrite-clj/rewrite-clj "1.0.699-alpha"] + [insn/insn "0.5.2"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] diff --git a/reify/.dir-locals.el b/reify/.dir-locals.el new file mode 100644 index 00000000..85a2d84d --- /dev/null +++ b/reify/.dir-locals.el @@ -0,0 +1,2 @@ +((nil + (cider-clojure-cli-global-options . "-A:test:build"))) diff --git a/reify/build.clj b/reify/build.clj new file mode 100644 index 00000000..3b59ff57 --- /dev/null +++ b/reify/build.clj @@ -0,0 +1,50 @@ +(ns build + (:require [build.reify2 :as reify2] + [clojure.tools.build.api :as b])) + +(def lib 'org.babashka/babashka.impl.reify) +(def version "0.1.0") +(def class-dir "target/classes") +(def basis (b/create-basis {:project "deps.edn"})) +(def jar-file (format "target/%s-%s.jar" (name lib) version)) + +(defn clean [_] + (b/delete {:path "target"})) + +(defn gen-classes [_] + (reify2/gen-classes nil)) + +(defn jar [_] + (gen-classes nil) + (b/write-pom {:class-dir class-dir + :lib lib + :version version + :basis basis + :src-dirs ["src"]}) + (b/copy-dir {:src-dirs ["src"] + :target-dir class-dir}) + (b/jar {:class-dir class-dir + :jar-file jar-file})) + +(defn install [_] + (jar nil) + (b/install {:basis basis + :lib lib + :version version + :jar-file jar-file + :class-dir class-dir})) + +(defn deploy [opts] + (jar opts) + ((requiring-resolve 'deps-deploy.deps-deploy/deploy) + (merge {:installer :remote + :artifact jar-file + :pom-file (b/pom-path {:lib lib :class-dir class-dir})} + opts)) + opts) + +;;;; Scratch + +(comment + (gen-classes nil) + ) diff --git a/reify/build/reify2.clj b/reify/build/reify2.clj new file mode 100644 index 00000000..4dcc9f35 --- /dev/null +++ b/reify/build/reify2.clj @@ -0,0 +1,188 @@ +(ns build.reify2 + {:no-doc true} + (:require [babashka.impl.reify2.interfaces :refer [interfaces]] + [insn.core :as insn])) + +(set! *warn-on-reflection* false) + +(defn set-symbol! [s] + [[:aconst-null] + [:ldc s] + [:invokestatic clojure.lang.Symbol "intern" [String String clojure.lang.Symbol]] + [:putstatic :this (str "_sym_" s) clojure.lang.Symbol]]) + +(defn return [desc] + (case (last desc) + :void [:return] + (:boolean :int) [:ireturn] + [:areturn])) + +(defn loads [desc cast?] + (let [desc (butlast desc)] + (vec + (mapcat (fn [i e] + (case e + :boolean [[:iload i] + (when cast? [:invokestatic Boolean "valueOf" [:boolean Boolean]])] + :int [[:iload i] + (when cast? [:invokestatic Integer "valueOf" [:int Integer]])] + [[:aload i]])) + (range 1 (inc (count desc))) + desc)))) + +(defn emit-method [class meth desc default] + (let [args (dec (count desc))] + [[[:aload 0] + [:getfield :this "_methods" java.util.Map] + [:getstatic :this (str "_sym_" meth) clojure.lang.Symbol] + [:invokeinterface java.util.Map "get" [Object Object]] + [:checkcast clojure.lang.IFn] + [:astore (inc args)] + [:aload (inc args)] + [:ifnull :fallback] + [:aload (inc args)] + ;; load this, always the first argument of IFn + [:aload 0]] + ;; load remaining args + (loads desc true) + [[:invokeinterface clojure.lang.IFn "invoke" (vec (repeat (inc (count desc)) Object))] + (let [ret-type* (last desc) + ret-type (if (class? ret-type*) + (.getName ^Class ret-type*) + ret-type*)] + (case ret-type + :void [:pop] + :boolean [[:checkcast Boolean] + [:invokevirtual Boolean "booleanValue"]] + :int [[:checkcast Integer] + [:invokevirtual Integer "intValue"]] + "java.lang.Object" nil + (when (class? ret-type*) + [[:checkcast ret-type*]]))) + (return desc) + [:mark :fallback]] + (if default + [[[:aload 0]] + (loads desc false) + [[:invokespecial class meth desc true] + (return desc)]] + [[:new java.lang.UnsupportedOperationException] + [:dup] + [:ldc (format "No implementation of method found: %s %s" meth desc)] + [:invokespecial java.lang.UnsupportedOperationException :init [String :void]] + [:athrow]])])) + +(defn interface-data [^Class interface methods] + (let [class-sym (symbol (.getName interface)) + method-names (distinct (map :name methods))] + {:name (symbol (str "babashka.impl." (.getName interface))) + :version 1.8 + :interfaces [class-sym + 'sci.impl.types.IReified + 'clojure.lang.IMeta + 'clojure.lang.IObj] + :flags [:super :public] + :fields (into [{:flags #{:private}, + :name "_methods" :type java.util.Map} + {:flags #{:private}, + :name "_interfaces" :type Object} + {:flags #{:private}, + :name "_protocols" :type Object} + {:flags #{:private}, + :name "_meta" :type clojure.lang.IPersistentMap}] + (for [name method-names] + {:flags #{:private :static}, + :name (str "_sym_" name) :type clojure.lang.Symbol})) + :methods (into [{:name :clinit + :emit (reduce into + [] + (conj + (mapv set-symbol! method-names) + [[:return]]))} + {:name :init + :desc [:void] + :emit [[:aload 0] + [:invokespecial :super :init [:void]] + [:return]]} + {:name :init + :desc [java.util.Map Object Object :void] + :emit [[:aload 0] + [:invokespecial :super :init [:void]] + [:aload 0] + [:aload 1] + [:putfield :this "_methods" java.util.Map] + [:aload 0] + [:aload 2] + [:putfield :this "_interfaces" Object] + [:aload 0] + [:aload 3] + [:putfield :this "_protocols" Object] + [:return]]} + {:name :meta + :desc [clojure.lang.IPersistentMap] + :emit [[:aload 0] + [:getfield :this "_meta" clojure.lang.IPersistentMap] + [:areturn]]} + {:name :withMeta + :desc [clojure.lang.IPersistentMap clojure.lang.IObj] + :emit [[:aload 0] + [:aload 1] + [:putfield :this "_meta" clojure.lang.IPersistentMap] + [:aload 0] + [:areturn]]} + {:name :getInterfaces + :desc [Object] + :emit [[:aload 0] + [:getfield :this "_interfaces" Object] + [:areturn]]} + {:name :getMethods + :desc [Object] + :emit [[:aload 0] + [:getfield :this "_methods" java.util.Map] + [:areturn]]} + {:name :getProtocols + :desc [Object] + :emit [[:aload 0] + [:getfield :this "_protocols" Object] + [:areturn]]}] + (for [{:keys [name desc default]} methods] + {:flags #{:public}, :name name + :desc desc + :emit (emit-method interface name desc default)} + ))})) + +(set! *warn-on-reflection* true) + +(defn type->kw [type] + (condp = type + Void/TYPE :void + Boolean/TYPE :boolean + Integer/TYPE :int + type)) + +(defn class->methods [^Class clazz] + (let [meths (.getMethods clazz) + meths (mapv bean meths) + ;; TODO: fix problems with clojure.lang.IFn, special cased for now + ;; The problem is that the 20-arity (highest one) could not be reified + ;; meths (filter #(<= (:parameterCount %) 19) meths) + meths (mapv (fn [{:keys [name + parameterTypes + returnType + default]}] + (let [ret-type (type->kw returnType)] + {:name name + :desc (conj (mapv type->kw parameterTypes) ret-type) + :default default})) + meths)] + (distinct meths))) + +(let [i clojure.lang.IFn] + (insn/define (insn/visit (interface-data i (class->methods i))))) + +(def reified (babashka.impl.clojure.lang.IFn. {'invoke (fn [& _args] :yep)} {} {})) + +(defn gen-classes [_] + (doseq [i interfaces] + (insn/write (doto (insn/visit (interface-data i (class->methods i))) + insn/define) "target/classes"))) diff --git a/reify/deps.edn b/reify/deps.edn new file mode 100644 index 00000000..35a3c915 --- /dev/null +++ b/reify/deps.edn @@ -0,0 +1,13 @@ +{:deps {org.babashka/sci.impl.types {:mvn/version "0.0.2"}} + :aliases + {:build ;; added by neil + {:paths ["." "build" "src"] + :deps {io.github.clojure/tools.build {:git/tag "v0.8.1" :git/sha "7d40500"} + slipset/deps-deploy {:mvn/version "0.2.0"} + org.babashka/sci.impl.types {:mvn/version "0.0.2"} + ;; insn/insn {:mvn/version "0.5.3"} + insn/insn { + :git/sha "f85da286d429b507480f8527b12ce3e1e0e17296" + :git/url "https://github.com/phronmophobic/insn" + }} + :ns-default build}}} diff --git a/reify/src/babashka/impl/reify2.clj b/reify/src/babashka/impl/reify2.clj new file mode 100644 index 00000000..ec2636c2 --- /dev/null +++ b/reify/src/babashka/impl/reify2.clj @@ -0,0 +1,79 @@ +(ns babashka.impl.reify2 + (:require [babashka.impl.reify2.interfaces :refer [interfaces]])) + +(set! *warn-on-reflection* false) + +(defn method-or-bust [methods k] + (or (get methods k) + (throw (UnsupportedOperationException. "Method not implemented: " k)))) + +(defn reify-ifn [m] + (let [methods (:methods m) + invoke-fn (or (get methods 'invoke) + (fn [& _args] + (throw (UnsupportedOperationException. "Method not implemented: invoke")))) + apply-fn (or (get methods 'applyTo) + (fn [& _args] + (throw (UnsupportedOperationException. "Method not implemented: applyTo"))))] + (reify + sci.impl.types.IReified + (getMethods [_] (:methods m)) + (getInterfaces [_] (:interfaces m)) + (getProtocols [_] (:protocols m)) + clojure.lang.IFn + (invoke [this] (invoke-fn this)) + (invoke [this a0] (invoke-fn this a0)) + (invoke [this a0 a1] (invoke-fn this a0 a1)) + (invoke [this a0 a1 a2] (invoke-fn this a0 a1 a2)) + (invoke [this a0 a1 a2 a3] (invoke-fn this a0 a1 a2 a3)) + (invoke [this a0 a1 a2 a3 a4] (invoke-fn this a0 a1 a2 a3 a4)) + (invoke [this a0 a1 a2 a3 a4 a5] (invoke-fn this a0 a1 a2 a3 a4 a5)) + (invoke [this a0 a1 a2 a3 a4 a5 a6] (invoke-fn this a0 a1 a2 a3 a4 a5 a6)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19)) + (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20)) + (applyTo [this arglist] (apply-fn this arglist))))) + +(defmacro gen-reify-fn [] + `(fn [~'m] + (if (empty? (:interfaces ~'m)) + (reify + sci.impl.types.IReified + (getMethods [_] (:methods ~'m)) + (getInterfaces [_] (:interfaces ~'m)) + (getProtocols [_] (:protocols ~'m))) + (case (.getName ~(with-meta `(first (:interfaces ~'m)) + {:tag 'Class})) + "java.lang.Object" + (reify + java.lang.Object + (toString [~'this] + ((method-or-bust (:methods ~'m) (quote ~'toString)) ~'this)) + sci.impl.types.IReified + (getMethods [_] (:methods ~'m)) + (getInterfaces [_] (:interfaces ~'m)) + (getProtocols [_] (:protocols ~'m))) + ~@(mapcat identity + (cons + ["clojure.lang.IFn" + `(reify-ifn ~'m)] + (for [i interfaces] + (let [in (.getName ^Class i)] + [in + `(new ~(symbol (str "babashka.impl." in)) + (:methods ~'m) + (:interfaces ~'m) + (:protocols ~'m))])))))))) + +(def reify-fn (gen-reify-fn)) diff --git a/reify/src/babashka/impl/reify2/interfaces.clj b/reify/src/babashka/impl/reify2/interfaces.clj new file mode 100644 index 00000000..db5d5297 --- /dev/null +++ b/reify/src/babashka/impl/reify2/interfaces.clj @@ -0,0 +1,30 @@ +(ns babashka.impl.reify2.interfaces) + +(def interfaces [java.nio.file.FileVisitor + java.io.FileFilter + java.io.FilenameFilter + clojure.lang.Associative + clojure.lang.ILookup + java.util.Map$Entry + ;; TODO: fix problems with clojure.lang.IFn, special cased for now + ;; The problem is that the 20-arity (highest one) could not be reified + ;; clojure.lang.IFn + clojure.lang.IPersistentCollection + clojure.lang.IReduce + clojure.lang.IReduceInit + clojure.lang.IKVReduce + clojure.lang.Indexed + clojure.lang.IPersistentMap + clojure.lang.IPersistentStack + clojure.lang.Reversible + clojure.lang.Seqable + java.lang.Iterable + java.net.http.WebSocket$Listener + java.util.Iterator + java.util.function.Consumer + java.util.function.Function + java.util.function.Predicate + java.util.function.Supplier + java.lang.Comparable + javax.net.ssl.X509TrustManager + clojure.lang.LispReader$Resolver]) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index f7dd245d..aea05d5b 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -17,7 +17,9 @@ "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.0"}, - borkdude/sci {:local/root "sci"} + org.babashka/sci {:local/root "sci"} + org.babashka/babashka.impl.reify {:mvn/version "0.0.7"} + org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} babashka/babashka.core {:local/root "babashka.core"} @@ -40,10 +42,11 @@ org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} - selmer/selmer {:mvn/version "1.12.44"} + selmer/selmer {:mvn/version "1.12.50"} com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} - org.clojure/data.priority-map {:mvn/version "1.1.0"}} + org.clojure/data.priority-map {:mvn/version "1.1.0"} + insn/insn {:mvn/version "0.5.2"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile @@ -129,7 +132,7 @@ clojure-msgpack/clojure-msgpack {:mvn/version "1.2.1"} cli-matic/cli-matic {:git/url "https://github.com/l3nz/cli-matic.git", :git/sha "9cd53ba7336363e3d06650dbad413b6f8b06e471"} aysylu/loom {:mvn/version "1.0.2"} - com.layerware/hugsql-core {:mvn/version "0.5.1"} + com.layerware/hugsql-core {:mvn/version "0.5.3"} com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.rpl/specter {:mvn/version "1.1.4"}} :classpath-overrides {org.clojure/clojure nil diff --git a/sci b/sci index 64545c0f..c44c2b1c 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 64545c0f254d25c872086a17afa604ac802b5ee1 +Subproject commit c44c2b1c801c09987e0051834070509066785377 diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index d9b08b00..2ffffefe 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -391,7 +391,9 @@ java.util.concurrent.CompletableFuture java.util.concurrent.Executors java.util.concurrent.TimeUnit + java.util.function.Consumer java.util.function.Function + java.util.function.Predicate java.util.function.Supplier java.util.zip.Inflater java.util.zip.InflaterInputStream diff --git a/src/babashka/impl/print_deps.clj b/src/babashka/impl/print_deps.clj index e11703b5..45e2b3f8 100644 --- a/src/babashka/impl/print_deps.clj +++ b/src/babashka/impl/print_deps.clj @@ -20,6 +20,7 @@ :git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"}) deps (dissoc deps 'borkdude/sci + 'org.babashka/sci 'borkdude/graal.locking 'org.postgresql/postgresql 'babashka/clojure-lanterna diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 55958dee..7d68aff6 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -35,7 +35,7 @@ [babashka.impl.process :refer [process-namespace]] [babashka.impl.protocols :refer [protocols-namespace]] [babashka.impl.proxy :refer [proxy-fn]] - [babashka.impl.reify :refer [reify-fn]] + [babashka.impl.reify2 :refer [reify-fn]] [babashka.impl.repl :as repl] [babashka.impl.rewrite-clj :as rewrite] [babashka.impl.server :refer [clojure-core-server-namespace]] diff --git a/test/babashka/reify_test.clj b/test/babashka/reify_test.clj index 72624c65..be7b553b 100644 --- a/test/babashka/reify_test.clj +++ b/test/babashka/reify_test.clj @@ -57,6 +57,11 @@ (def m (reify Object (toString [_] (str :foo)))) (str m) +")))) + (testing "toString + protocol" + (is (= ":dude1:dude2" + (bb nil " +(defprotocol Dude (dude [_])) (def obj (reify Object (toString [_] (str :dude1)) Dude (dude [_] :dude2))) (str (str obj) (dude obj)) ")))) (testing "Hashcode still works when only overriding toString" (is (number? @@ -97,3 +102,15 @@ [x y] (bb nil prog)] (is (pos? x)) (is (zero? y)))) + +(deftest reify-default-method-test + (let [prog '(do (def iter (let [coll [:a :b :c] idx (volatile! -1)] + (reify java.util.Iterator (hasNext [_] (< @idx 2)) + (next [_] (nth coll (vswap! idx inc)))))) + (def res (volatile! [])) + (vswap! res conj (.hasNext iter)) + (vswap! res conj (.next iter)) + (.forEachRemaining + iter (reify java.util.function.Consumer (accept [_ x] (vswap! res conj x)))) + (= [true :a :b :c] @res))] + (is (true? (bb nil prog))))) From b5a4e0a170f36b3f6e7a014c2da206dc89b38b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Thu, 14 Apr 2022 22:35:19 +0100 Subject: [PATCH 071/550] First pass at bash cleanup (#1239) --- .circleci/config.yml | 16 +++++-- .circleci/script/docker | 61 ------------------------ .circleci/script/docker.clj | 94 +++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 66 deletions(-) delete mode 100755 .circleci/script/docker create mode 100644 .circleci/script/docker.clj diff --git a/.circleci/config.yml b/.circleci/config.yml index 2c2c1bd5..3f75c431 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,7 @@ commands: command: | docker run --privileged --rm tonistiigi/binfmt --install all docker buildx create --name ci-builder --use + jobs: jvm: docker: @@ -213,7 +214,6 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64: machine: - enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -281,7 +281,6 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64-static: machine: - enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -448,14 +447,22 @@ jobs: image: ubuntu-2004:202111-01 steps: - checkout + - run: + name: "Pull Submodules" + command: | + git submodule init + git submodule update - setup-docker-buildx - attach_workspace: at: /tmp + - run: + name: Build uberjar + command: script/uberjar - run: name: Build Docker image environment: PLATFORM: linux/amd64,linux/arm64 - command: .circleci/script/docker + command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj workflows: version: 2 @@ -478,8 +485,7 @@ workflows: - docker: filters: branches: - only: - - master + only: master requires: - linux - linux-static diff --git a/.circleci/script/docker b/.circleci/script/docker deleted file mode 100755 index f16447b6..00000000 --- a/.circleci/script/docker +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash - -set -eo pipefail - -image_name="babashka/babashka" -image_tag=$(cat resources/BABASHKA_VERSION) -platform=${PLATFORM:-"linux/amd64"} -latest_tag="latest" -label_args=("--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" - "--label" "org.opencontainers.image.title=Babashka" - "--label" "org.opencontainers.image.created=$(date -Iseconds)" - "--label" "org.opencontainers.image.url=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.documentation=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.source=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.revision=${CIRCLE_SHA1}" - "--label" "org.opencontainers.image.ref.name=${CIRCLE_TAG}:${CIRCLE_BRANCH}" - "--label" "org.opencontainers.image.version=${image_tag}") - -if [[ $image_tag =~ SNAPSHOT$ ]]; then - echo "This is a snapshot version" - snapshot="true" -else - echo "This is a non-snapshot version" - snapshot="false" -fi - -if [ -z "$CIRCLE_PULL_REQUEST" ] && [ "$CIRCLE_BRANCH" = "master" ]; then - echo "Building & pushing $platform Docker image(s) $image_name:$image_tag" - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USER" --password-stdin - IFS=',' read -r -a platforms <<< "$platform" - for p in "${platforms[@]}"; do - tarball_platform=${p//\//-} - if [[ $tarball_platform == "linux-arm64" ]]; then tarball_platform="linux-aarch64"; fi - mkdir -p $p - tar zxvf "/tmp/release/babashka-${image_tag}-${tarball_platform}.tar.gz" -C $p - # this overwrites, but this is to work around having built the uberjar/metabom multiple times - cp "/tmp/release/${tarball_platform}-metabom.jar" ./metabom.jar - done - docker buildx build -t "$image_name:$image_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . - if [[ $snapshot == "false" ]]; then - echo "Building & pushing $platform Docker image(s) $image_name:$latest_tag" - docker buildx build -t "$image_name:$latest_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . - fi - for p in "${platforms[@]}"; do - rm -rf $p - done - - # build alpine image for linux-amd64 only (no upstream arm64 support yet) - tar zxvf "/tmp/release/babashka-${image_tag}-linux-amd64-static.tar.gz" - echo "Building & pushing Docker image $image_name:$image_tag-alpine" - docker buildx build -t "$image_name:$image_tag-alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . - - if [[ $snapshot == "false" ]]; then - echo "Building & pushing Docker image $image_name:alpine" - docker buildx build -t "$image_name:alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . - fi -else - echo "Not publishing Docker image" -fi - -exit 0; diff --git a/.circleci/script/docker.clj b/.circleci/script/docker.clj new file mode 100644 index 00000000..975c5277 --- /dev/null +++ b/.circleci/script/docker.clj @@ -0,0 +1,94 @@ +(require '[clojure.string :as s] + '[babashka.process :as proc] + '[babashka.fs :as fs]) +(import '[java.time Instant]) + +(defn read-env + ([k] + (read-env k nil)) + ([k default] + (or (System/getenv k) + default))) + +(def image-name "babashka/babashka") + +(def image-tag (slurp "resources/BABASHKA_VERSION")) + +(def latest-tag "latest") + +(def platforms (read-env "PLATFORM" "linux/amd64")) + +(def circle-repository-url (read-env "CIRCLE_REPOSITORY_URL")) + +(def label-args + ["--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" + "--label" "org.opencontainers.image.title=Babashka" + "--label" (str "org.opencontainers.image.created=" (Instant/now)) + "--label" (str "org.opencontainers.image.url=" circle-repository-url) + "--label" (str "org.opencontainers.image.documentation=" circle-repository-url) + "--label" (str "org.opencontainers.image.source=" circle-repository-url) + "--label" (str "org.opencontainers.image.revision=" (read-env "CIRCLE_SHA1")) + "--label" + (format "org.opencontainers.image.ref.name=%s:%s" + (read-env "CIRCLE_TAG") + (read-env "CIRCLE_BRANCH")) + "--label" (str "org.opencontainers.image.version=" image-tag)]) + +(def snapshot (= "SNAPSHOT" image-tag)) + +(defn exec + [cmd] + (-> cmd + (proc/process {:out :inherit :err :inherit}) + (proc/check))) + +(defn docker-login + [username password] + (exec ["docker" "login" "-u" username "-p" password])) + +(defn build-push + [image-tag platform docker-file] + (println (format "Building and pushing %s Docker image(s) %s:%s" + platform + image-name + image-tag)) + (let [base-cmd ["docker" "buildx" "build" + "-t" (str image-name ":" image-tag) + "--platform" platform + "--push" + "-f" docker-file]] + (exec (concat base-cmd label-args ["."])))) + +(defn build-push-images + [] + (doseq [platform (s/split platforms #",")] + (let [tarball-platform (s/replace platform #"\/" "-") + tarball-platform (if (= "linux-arm64") + "linux-aarch64" + tarball-platform) + tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz" + image-tag + tarball-platform)] + (fs/create-dirs platform) + (exec ["tar" "zxvf" tarball-path "-C" platform]) + ; this overwrites, but this is to work around having built the uberjar/metabom multiple times + (fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true})) + (build-push image-tag platform "Dockerfile.ci") + (when-not snapshot + (build-push latest-tag platform "Dockerfile.ci")))) + +(defn build-push-alpine-images + "Build alpine image for linux-amd64 only (no upstream arm64 support yet)" + [] + (exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")]) + (build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine") + (when-not snapshot + (build-push "alpine" "linux/amd64" "Dockerfile.alpine"))) + +(when (= *file* (System/getProperty "babashka.file")) + (if snapshot + (println "This is a snapshot version") + (println "This is a non-snapshot version")) + (docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS")) + (build-push-images) + (build-push-alpine-images)) From 83963116b06a262e3dd854309bca9cf9e155a753 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 11:25:42 +0200 Subject: [PATCH 072/550] SCI: fix destructuring in protocol impl --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index c44c2b1c..6b6d3f81 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c44c2b1c801c09987e0051834070509066785377 +Subproject commit 6b6d3f818950fc3ec2fd6d8c59be7a636c6b494b From 23a97233adda912837b2d4f74918635ac774b82a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 11:38:31 +0200 Subject: [PATCH 073/550] SCI: support *print-dup* --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 6b6d3f81..39f552d7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6b6d3f818950fc3ec2fd6d8c59be7a636c6b494b +Subproject commit 39f552d716ded4866c54cd61e89a8c3bd4c99fdb From 1c03d742358dc1f8925005f52e0a8da2a596d89c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 11:43:41 +0200 Subject: [PATCH 074/550] fs: type hints on arg vecs --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index f421d50c..dc73460e 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit f421d50c1e48c14dd5be61daadab85be2f8e956b +Subproject commit dc73460e63ff10c701c353227f2689b3d7c33a43 From ae7792634fa6a47283aa7f731fe4692f228dbcd5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 11:48:40 +0200 Subject: [PATCH 075/550] Process: arg vec type hints --- process | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process b/process index 8d72f209..1eebafc6 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 8d72f2097a1dc49b81a52af6733b8beb836efbdc +Subproject commit 1eebafc696e9bac7538c296d5a7c1fde977ad523 diff --git a/sci b/sci index 39f552d7..2af989d0 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 39f552d716ded4866c54cd61e89a8c3bd4c99fdb +Subproject commit 2af989d0eb80741b026fd2355442033b05a3b181 From d830e8f57621d8efd8777f9706b81aeaf8ba8ddb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 13:27:29 +0200 Subject: [PATCH 076/550] Revert "First pass at bash cleanup (#1239)" This reverts commit b5a4e0a170f36b3f6e7a014c2da206dc89b38b79. --- .circleci/config.yml | 16 ++----- .circleci/script/docker | 61 ++++++++++++++++++++++++ .circleci/script/docker.clj | 94 ------------------------------------- 3 files changed, 66 insertions(+), 105 deletions(-) create mode 100755 .circleci/script/docker delete mode 100644 .circleci/script/docker.clj diff --git a/.circleci/config.yml b/.circleci/config.yml index 3f75c431..2c2c1bd5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,7 +11,6 @@ commands: command: | docker run --privileged --rm tonistiigi/binfmt --install all docker buildx create --name ci-builder --use - jobs: jvm: docker: @@ -214,6 +213,7 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64: machine: + enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -281,6 +281,7 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64-static: machine: + enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -447,22 +448,14 @@ jobs: image: ubuntu-2004:202111-01 steps: - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - setup-docker-buildx - attach_workspace: at: /tmp - - run: - name: Build uberjar - command: script/uberjar - run: name: Build Docker image environment: PLATFORM: linux/amd64,linux/arm64 - command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj + command: .circleci/script/docker workflows: version: 2 @@ -485,7 +478,8 @@ workflows: - docker: filters: branches: - only: master + only: + - master requires: - linux - linux-static diff --git a/.circleci/script/docker b/.circleci/script/docker new file mode 100755 index 00000000..f16447b6 --- /dev/null +++ b/.circleci/script/docker @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +set -eo pipefail + +image_name="babashka/babashka" +image_tag=$(cat resources/BABASHKA_VERSION) +platform=${PLATFORM:-"linux/amd64"} +latest_tag="latest" +label_args=("--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" + "--label" "org.opencontainers.image.title=Babashka" + "--label" "org.opencontainers.image.created=$(date -Iseconds)" + "--label" "org.opencontainers.image.url=${CIRCLE_REPOSITORY_URL}" + "--label" "org.opencontainers.image.documentation=${CIRCLE_REPOSITORY_URL}" + "--label" "org.opencontainers.image.source=${CIRCLE_REPOSITORY_URL}" + "--label" "org.opencontainers.image.revision=${CIRCLE_SHA1}" + "--label" "org.opencontainers.image.ref.name=${CIRCLE_TAG}:${CIRCLE_BRANCH}" + "--label" "org.opencontainers.image.version=${image_tag}") + +if [[ $image_tag =~ SNAPSHOT$ ]]; then + echo "This is a snapshot version" + snapshot="true" +else + echo "This is a non-snapshot version" + snapshot="false" +fi + +if [ -z "$CIRCLE_PULL_REQUEST" ] && [ "$CIRCLE_BRANCH" = "master" ]; then + echo "Building & pushing $platform Docker image(s) $image_name:$image_tag" + echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USER" --password-stdin + IFS=',' read -r -a platforms <<< "$platform" + for p in "${platforms[@]}"; do + tarball_platform=${p//\//-} + if [[ $tarball_platform == "linux-arm64" ]]; then tarball_platform="linux-aarch64"; fi + mkdir -p $p + tar zxvf "/tmp/release/babashka-${image_tag}-${tarball_platform}.tar.gz" -C $p + # this overwrites, but this is to work around having built the uberjar/metabom multiple times + cp "/tmp/release/${tarball_platform}-metabom.jar" ./metabom.jar + done + docker buildx build -t "$image_name:$image_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . + if [[ $snapshot == "false" ]]; then + echo "Building & pushing $platform Docker image(s) $image_name:$latest_tag" + docker buildx build -t "$image_name:$latest_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . + fi + for p in "${platforms[@]}"; do + rm -rf $p + done + + # build alpine image for linux-amd64 only (no upstream arm64 support yet) + tar zxvf "/tmp/release/babashka-${image_tag}-linux-amd64-static.tar.gz" + echo "Building & pushing Docker image $image_name:$image_tag-alpine" + docker buildx build -t "$image_name:$image_tag-alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . + + if [[ $snapshot == "false" ]]; then + echo "Building & pushing Docker image $image_name:alpine" + docker buildx build -t "$image_name:alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . + fi +else + echo "Not publishing Docker image" +fi + +exit 0; diff --git a/.circleci/script/docker.clj b/.circleci/script/docker.clj deleted file mode 100644 index 975c5277..00000000 --- a/.circleci/script/docker.clj +++ /dev/null @@ -1,94 +0,0 @@ -(require '[clojure.string :as s] - '[babashka.process :as proc] - '[babashka.fs :as fs]) -(import '[java.time Instant]) - -(defn read-env - ([k] - (read-env k nil)) - ([k default] - (or (System/getenv k) - default))) - -(def image-name "babashka/babashka") - -(def image-tag (slurp "resources/BABASHKA_VERSION")) - -(def latest-tag "latest") - -(def platforms (read-env "PLATFORM" "linux/amd64")) - -(def circle-repository-url (read-env "CIRCLE_REPOSITORY_URL")) - -(def label-args - ["--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" - "--label" "org.opencontainers.image.title=Babashka" - "--label" (str "org.opencontainers.image.created=" (Instant/now)) - "--label" (str "org.opencontainers.image.url=" circle-repository-url) - "--label" (str "org.opencontainers.image.documentation=" circle-repository-url) - "--label" (str "org.opencontainers.image.source=" circle-repository-url) - "--label" (str "org.opencontainers.image.revision=" (read-env "CIRCLE_SHA1")) - "--label" - (format "org.opencontainers.image.ref.name=%s:%s" - (read-env "CIRCLE_TAG") - (read-env "CIRCLE_BRANCH")) - "--label" (str "org.opencontainers.image.version=" image-tag)]) - -(def snapshot (= "SNAPSHOT" image-tag)) - -(defn exec - [cmd] - (-> cmd - (proc/process {:out :inherit :err :inherit}) - (proc/check))) - -(defn docker-login - [username password] - (exec ["docker" "login" "-u" username "-p" password])) - -(defn build-push - [image-tag platform docker-file] - (println (format "Building and pushing %s Docker image(s) %s:%s" - platform - image-name - image-tag)) - (let [base-cmd ["docker" "buildx" "build" - "-t" (str image-name ":" image-tag) - "--platform" platform - "--push" - "-f" docker-file]] - (exec (concat base-cmd label-args ["."])))) - -(defn build-push-images - [] - (doseq [platform (s/split platforms #",")] - (let [tarball-platform (s/replace platform #"\/" "-") - tarball-platform (if (= "linux-arm64") - "linux-aarch64" - tarball-platform) - tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz" - image-tag - tarball-platform)] - (fs/create-dirs platform) - (exec ["tar" "zxvf" tarball-path "-C" platform]) - ; this overwrites, but this is to work around having built the uberjar/metabom multiple times - (fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true})) - (build-push image-tag platform "Dockerfile.ci") - (when-not snapshot - (build-push latest-tag platform "Dockerfile.ci")))) - -(defn build-push-alpine-images - "Build alpine image for linux-amd64 only (no upstream arm64 support yet)" - [] - (exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")]) - (build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine") - (when-not snapshot - (build-push "alpine" "linux/amd64" "Dockerfile.alpine"))) - -(when (= *file* (System/getProperty "babashka.file")) - (if snapshot - (println "This is a snapshot version") - (println "This is a non-snapshot version")) - (docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS")) - (build-push-images) - (build-push-alpine-images)) From d7f180cdbe84605b42abd982bc5293d7ce488b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Fri, 15 Apr 2022 18:20:52 +0100 Subject: [PATCH 077/550] Bash -> Clojure: Take 2 (#1243) * Bash -> Clojure: Take 2 * Apply better naming * Temp disable circle branch filter * Pass platforms correctly to buildx * Rename platforms, better checks * Add circle and script guards for branch and PR * Fix guard --- .circleci/config.yml | 18 ++++--- .circleci/script/docker | 61 ----------------------- .circleci/script/docker.clj | 98 +++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 67 deletions(-) delete mode 100755 .circleci/script/docker create mode 100644 .circleci/script/docker.clj diff --git a/.circleci/config.yml b/.circleci/config.yml index 2c2c1bd5..ced804a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,7 @@ commands: command: | docker run --privileged --rm tonistiigi/binfmt --install all docker buildx create --name ci-builder --use + jobs: jvm: docker: @@ -213,7 +214,6 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64: machine: - enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -281,7 +281,6 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64-static: machine: - enabled: true image: ubuntu-2004:202101-01 resource_class: arm.large working_directory: ~/repo @@ -448,14 +447,22 @@ jobs: image: ubuntu-2004:202111-01 steps: - checkout + - run: + name: "Pull Submodules" + command: | + git submodule init + git submodule update - setup-docker-buildx - attach_workspace: at: /tmp + - run: + name: Build uberjar + command: script/uberjar - run: name: Build Docker image environment: - PLATFORM: linux/amd64,linux/arm64 - command: .circleci/script/docker + PLATFORMS: linux/amd64,linux/arm64 + command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj workflows: version: 2 @@ -478,8 +485,7 @@ workflows: - docker: filters: branches: - only: - - master + only: master requires: - linux - linux-static diff --git a/.circleci/script/docker b/.circleci/script/docker deleted file mode 100755 index f16447b6..00000000 --- a/.circleci/script/docker +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash - -set -eo pipefail - -image_name="babashka/babashka" -image_tag=$(cat resources/BABASHKA_VERSION) -platform=${PLATFORM:-"linux/amd64"} -latest_tag="latest" -label_args=("--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" - "--label" "org.opencontainers.image.title=Babashka" - "--label" "org.opencontainers.image.created=$(date -Iseconds)" - "--label" "org.opencontainers.image.url=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.documentation=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.source=${CIRCLE_REPOSITORY_URL}" - "--label" "org.opencontainers.image.revision=${CIRCLE_SHA1}" - "--label" "org.opencontainers.image.ref.name=${CIRCLE_TAG}:${CIRCLE_BRANCH}" - "--label" "org.opencontainers.image.version=${image_tag}") - -if [[ $image_tag =~ SNAPSHOT$ ]]; then - echo "This is a snapshot version" - snapshot="true" -else - echo "This is a non-snapshot version" - snapshot="false" -fi - -if [ -z "$CIRCLE_PULL_REQUEST" ] && [ "$CIRCLE_BRANCH" = "master" ]; then - echo "Building & pushing $platform Docker image(s) $image_name:$image_tag" - echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USER" --password-stdin - IFS=',' read -r -a platforms <<< "$platform" - for p in "${platforms[@]}"; do - tarball_platform=${p//\//-} - if [[ $tarball_platform == "linux-arm64" ]]; then tarball_platform="linux-aarch64"; fi - mkdir -p $p - tar zxvf "/tmp/release/babashka-${image_tag}-${tarball_platform}.tar.gz" -C $p - # this overwrites, but this is to work around having built the uberjar/metabom multiple times - cp "/tmp/release/${tarball_platform}-metabom.jar" ./metabom.jar - done - docker buildx build -t "$image_name:$image_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . - if [[ $snapshot == "false" ]]; then - echo "Building & pushing $platform Docker image(s) $image_name:$latest_tag" - docker buildx build -t "$image_name:$latest_tag" --platform "$platform" "${label_args[@]}" --push -f Dockerfile.ci . - fi - for p in "${platforms[@]}"; do - rm -rf $p - done - - # build alpine image for linux-amd64 only (no upstream arm64 support yet) - tar zxvf "/tmp/release/babashka-${image_tag}-linux-amd64-static.tar.gz" - echo "Building & pushing Docker image $image_name:$image_tag-alpine" - docker buildx build -t "$image_name:$image_tag-alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . - - if [[ $snapshot == "false" ]]; then - echo "Building & pushing Docker image $image_name:alpine" - docker buildx build -t "$image_name:alpine" --platform=linux/amd64 "${label_args[@]}" --push -f Dockerfile.alpine . - fi -else - echo "Not publishing Docker image" -fi - -exit 0; diff --git a/.circleci/script/docker.clj b/.circleci/script/docker.clj new file mode 100644 index 00000000..a884c893 --- /dev/null +++ b/.circleci/script/docker.clj @@ -0,0 +1,98 @@ +(require '[clojure.string :as str] + '[babashka.process :as proc] + '[babashka.fs :as fs]) +(import '[java.time Instant]) + +(defn read-env + ([k] + (read-env k nil)) + ([k default] + (or (System/getenv k) + default))) + +(def image-name "babashka/babashka") + +(def image-tag (slurp "resources/BABASHKA_VERSION")) + +(def latest-tag "latest") + +(def platforms (read-env "PLATFORMS" "linux/amd64")) + +(def circle-repository-url (read-env "CIRCLE_REPOSITORY_URL")) + +(def label-args + ["--label" "'org.opencontainers.image.description=Native, fast starting Clojure interpreter for scripting'" + "--label" "org.opencontainers.image.title=Babashka" + "--label" (str "org.opencontainers.image.created=" (Instant/now)) + "--label" (str "org.opencontainers.image.url=" circle-repository-url) + "--label" (str "org.opencontainers.image.documentation=" circle-repository-url) + "--label" (str "org.opencontainers.image.source=" circle-repository-url) + "--label" (str "org.opencontainers.image.revision=" (read-env "CIRCLE_SHA1")) + "--label" + (format "org.opencontainers.image.ref.name=%s:%s" + (read-env "CIRCLE_TAG") + (read-env "CIRCLE_BRANCH")) + "--label" (str "org.opencontainers.image.version=" image-tag)]) + +(def snapshot? (str/includes? image-tag "SNAPSHOT")) + +(defn exec + [cmd] + (-> cmd + (proc/process {:out :inherit :err :inherit}) + (proc/check))) + +(defn docker-login + [username password] + (exec ["docker" "login" "-u" username "-p" password])) + +(defn build-push + [image-tag platform docker-file] + (println (format "Building and pushing %s Docker image(s) %s:%s" + platform + image-name + image-tag)) + (let [base-cmd ["docker" "buildx" "build" + "-t" (str image-name ":" image-tag) + "--platform" platform + "--push" + "-f" docker-file]] + (exec (concat base-cmd label-args ["."])))) + +(defn build-push-images + [] + (doseq [platform (str/split platforms #",")] + (let [tarball-platform (str/replace platform #"\/" "-") + tarball-platform (if (= "linux-arm64" tarball-platform) + "linux-aarch64" + tarball-platform) + tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz" + image-tag + tarball-platform)] + (fs/create-dirs platform) + (exec ["tar" "zxvf" tarball-path "-C" platform]) + ; this overwrites, but this is to work around having built the uberjar/metabom multiple times + (fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true}))) + (build-push image-tag platforms "Dockerfile.ci") + (when-not snapshot? + (build-push latest-tag platforms "Dockerfile.ci"))) + +(defn build-push-alpine-images + "Build alpine image for linux-amd64 only (no upstream arm64 support yet)" + [] + (exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")]) + (build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine") + (when-not snapshot? + (build-push "alpine" "linux/amd64" "Dockerfile.alpine"))) + +(when (= *file* (System/getProperty "babashka.file")) + (if (and (nil? (read-env "CIRCLE_PULL_REQUEST")) + (= "master" (read-env "CIRCLE_BRANCH"))) + (do + (if snapshot? + (println "This is a snapshot version") + (println "This is a non-snapshot version")) + (docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS")) + (build-push-images) + (build-push-alpine-images)) + (println "Not publishing docker image(s)."))) From 917713f24f59bfe2e02696066acce9469148aaa2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 20:48:15 +0200 Subject: [PATCH 078/550] README [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 083863c7..5dd50e32 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea - [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller From 1ee298a411b7843695c57c9c74c17d5d5b8584c2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 21:15:27 +0200 Subject: [PATCH 079/550] v0.8.1 --- resources/BABASHKA_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index f89ae9b1..c18d72be 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.1-SNAPSHOT \ No newline at end of file +0.8.1 \ No newline at end of file From e3a6dbacb315e8e2beb56bcc5ab50f40d07122b2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Apr 2022 21:42:04 +0200 Subject: [PATCH 080/550] Version bump --- CHANGELOG.md | 9 ++++++--- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3acf501..2b66671a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,15 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -======= -## Unreleased +## 0.8.1 (2022-04-15) - Add `prepare` subcommand to download deps & pods and cache pod metadata - [#1041](https://github.com/babashka/babashka/issues/1041): Improve error message when regex literal in EDN config - [#1223](https://github.com/babashka/babashka/issues/1223): Ensure that var metadata (specifically `:name`) aligns with the var's symbol (which in turn ensures that `doc` will print the var's name) +- [#556](https://github.com/babashka/babashka/issues/556) Add server-status to org.httpkit.server +- [#1231](https://github.com/babashka/babashka/issues/1231): missing methods in `reify` should fall back to default interface methods +- Fix destructuring in defrecord protocol impls +- Support `*print-dup*` ## 0.8.0 (2022-04-04) @@ -25,7 +28,7 @@ A preview of the next release can be installed from - [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint - [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`. - [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before -- #1216: fix `core.async` alts example with polyfill +- [#1216](https://github.com/babashka/babashka/issues/1216): fix `core.async` alts example with polyfill - SCI: support `let*` special form - Add compatibility with GraalVM 22.1 - Bump timbre diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index a3df0a69..c18d72be 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.8.0 +0.8.1 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index c18d72be..d541f39b 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.1 \ No newline at end of file +0.8.2-SNAPSHOT \ No newline at end of file From 4bfe0eec89a85b09f6ac9393797955f1016fc044 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 16 Apr 2022 11:36:06 +0200 Subject: [PATCH 081/550] Convey print-length to pprint and allow set! --- CHANGELOG.md | 4 ++++ src/babashka/impl/pprint.clj | 3 ++- src/babashka/main.clj | 3 ++- test/babashka/pprint_test.clj | 12 ++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/babashka/pprint_test.clj diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b66671a..7f73b686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +- Convey `*print-length*` to pprint and allow `set!` + ## 0.8.1 (2022-04-15) - Add `prepare` subcommand to download deps & pods and cache pod metadata diff --git a/src/babashka/impl/pprint.clj b/src/babashka/impl/pprint.clj index 8047638b..bbc8df71 100644 --- a/src/babashka/impl/pprint.clj +++ b/src/babashka/impl/pprint.clj @@ -95,7 +95,8 @@ pprint/*print-pprint-dispatch* @print-pprint-dispatch pprint/*print-miser-width* @print-miser-width *print-meta* @sci/print-meta - *print-readably* @sci/print-readably] + *print-readably* @sci/print-readably + *print-length* @sci/print-length] (pprint/pprint s writer)))) (defn cl-format diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 7d68aff6..add257f6 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -711,7 +711,8 @@ Use bb run --help to show this help output. (sci/binding [core/warn-on-reflection @core/warn-on-reflection core/unchecked-math @core/unchecked-math core/data-readers @core/data-readers - sci/ns @sci/ns] + sci/ns @sci/ns + sci/print-length @sci/print-length] (let [{version-opt :version :keys [:shell-in :edn-in :shell-out :edn-out :help :file :command-line-args diff --git a/test/babashka/pprint_test.clj b/test/babashka/pprint_test.clj new file mode 100644 index 00000000..4679db46 --- /dev/null +++ b/test/babashka/pprint_test.clj @@ -0,0 +1,12 @@ +(ns babashka.pprint-test + (:require + [babashka.test-utils :as test-utils] + [clojure.string :as str] + [clojure.test :as test :refer [deftest is]])) + +(defn bb [& args] + (str/trim (apply test-utils/bb (map str args)))) + +(deftest print-length-test + (is (= "(0 1 2 3 4 5 6 7 8 9 ...)" + (bb "-e" "(set! *print-length* 10) (clojure.pprint/pprint (range 20))")))) From 8bdb2a21da7ea2202e1c00aec2571292ab6f5792 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 16 Apr 2022 12:44:49 +0200 Subject: [PATCH 082/550] babashka.nrepl: support pprint length --- babashka.nrepl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/babashka.nrepl b/babashka.nrepl index d3fce671..156ef6bf 160000 --- a/babashka.nrepl +++ b/babashka.nrepl @@ -1 +1 @@ -Subproject commit d3fce67198b042707f01d841c032f841cc57ab7f +Subproject commit 156ef6bfa59ba4a14ba6c69d1681fd7c2988a36d From 1f7dba35c9ed53867a79da9e432a1c5f49526844 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 17 Apr 2022 00:34:23 +0200 Subject: [PATCH 083/550] Bump SCI --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 2af989d0..a91f90ee 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 2af989d0eb80741b026fd2355442033b05a3b181 +Subproject commit a91f90eefc2466ed21a3bf4322d13a10de7f231d From 1113037b51733466faceda72d98dab5c1513a6e1 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 17 Apr 2022 14:11:33 -0400 Subject: [PATCH 084/550] add Clarktown lib tests (#1247) * add lib tests for clarktown * add clarktown to library list * make code block test agnostic to line separator --- deps.edn | 3 +- doc/libraries.csv | 1 + doc/projects.md | 6 +- test-resources/lib_tests/bb-tested-libs.edn | 1 + test-resources/lib_tests/clarktown/core.md | 93 +++++++++++++++++++ .../lib_tests/clarktown/core_result.html | 69 ++++++++++++++ .../lib_tests/clarktown/core_test.clj | 15 +++ .../lib_tests/clarktown/parsers/bold_test.clj | 18 ++++ .../lib_tests/clarktown/parsers/code_block.md | 41 ++++++++ .../parsers/code_block_no_language.md | 41 ++++++++ .../code_block_no_language_result.html | 39 ++++++++ .../clarktown/parsers/code_block_result.html | 39 ++++++++ .../clarktown/parsers/code_block_test.clj | 18 ++++ .../clarktown/parsers/empty_block_test.clj | 14 +++ .../clarktown/parsers/heading_block_test.clj | 44 +++++++++ .../parsers/horizontal_line_block_test.clj | 21 +++++ .../clarktown/parsers/inline_code_test.clj | 14 +++ .../clarktown/parsers/italic_test.clj | 18 ++++ .../clarktown/parsers/link_and_image_test.clj | 23 +++++ .../clarktown/parsers/quote_block_test.clj | 15 +++ .../clarktown/parsers/strikethrough_test.clj | 14 +++ 21 files changed, 545 insertions(+), 2 deletions(-) create mode 100644 test-resources/lib_tests/clarktown/core.md create mode 100644 test-resources/lib_tests/clarktown/core_result.html create mode 100644 test-resources/lib_tests/clarktown/core_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/bold_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/code_block.md create mode 100644 test-resources/lib_tests/clarktown/parsers/code_block_no_language.md create mode 100644 test-resources/lib_tests/clarktown/parsers/code_block_no_language_result.html create mode 100644 test-resources/lib_tests/clarktown/parsers/code_block_result.html create mode 100644 test-resources/lib_tests/clarktown/parsers/code_block_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/empty_block_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/heading_block_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/horizontal_line_block_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/inline_code_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/italic_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/link_and_image_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/quote_block_test.clj create mode 100644 test-resources/lib_tests/clarktown/parsers/strikethrough_test.clj diff --git a/deps.edn b/deps.edn index cf6f65fb..29f6b7b7 100644 --- a/deps.edn +++ b/deps.edn @@ -134,7 +134,8 @@ aysylu/loom {:mvn/version "1.0.2"} com.layerware/hugsql-core {:mvn/version "0.5.3"} com.github.seancorfield/expectations {:mvn/version "2.0.157"} - com.rpl/specter {:mvn/version "1.1.4"}} + com.rpl/specter {:mvn/version "1.1.4"} + com.github.askonomm/clarktown {:mvn/version "1.1.2"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/doc/libraries.csv b/doc/libraries.csv index c12c85e7..b568ad77 100644 --- a/doc/libraries.csv +++ b/doc/libraries.csv @@ -17,6 +17,7 @@ clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors com.exoscale/lingo,https://github.com/exoscale/lingo +com.github.askonomm/clarktown,https://github.com/askonomm/clarktown com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql com.grammarly/omniconf,https://github.com/grammarly/omniconf diff --git a/doc/projects.md b/doc/projects.md index d136ed88..463e5857 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -808,6 +808,10 @@ Ahead-of-time function scheduler. Compatible with babashka 0.7.7+. Graph library for Clojure. Compatible with babashka 0.7.8+. +### [Clarktown](https://github.com/askonomm/clarktown) + +An extensible and modular zero-dependency, pure-Clojure Markdown parser. + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can @@ -875,7 +879,7 @@ A babashka script to obtain covid-19 related information. ### [bb-spotify](https://github.com/kolharsam/bb-spotify) -Contol your spotify player using babashka. +Control your spotify player using babashka. ### [lambdaisland/open-source](https://github.com/lambdaisland/open-source) diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index bca25eba..60c502de 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -112,4 +112,5 @@ com.layerware/hugsql-core {:test-namespaces (hugsql.babashka-test)} com.github.seancorfield/expectations {:git-url "https://github.com/clojure-expectations/clojure-test", :test-namespaces (expectations.clojure.test-test), :git-sha "b30fefd97d9eb7d1f47e06956521f354cb926b03"} com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"} + com.github.askonomm/clarktown {:git-url "https://github.com/askonomm/clarktown", :test-namespaces (clarktown.core-test clarktown.parsers.horizontal-line-block-test clarktown.parsers.italic-test clarktown.parsers.link-and-image-test clarktown.parsers.empty-block-test clarktown.parsers.inline-code-test clarktown.parsers.heading-block-test clarktown.parsers.bold-test clarktown.parsers.quote-block-test clarktown.parsers.code-block-test clarktown.parsers.strikethrough-test), :git-sha "059bfa7bd9bfdde0c75646bf1dfc20d23da8a02c"} } diff --git a/test-resources/lib_tests/clarktown/core.md b/test-resources/lib_tests/clarktown/core.md new file mode 100644 index 00000000..6a5b2f17 --- /dev/null +++ b/test-resources/lib_tests/clarktown/core.md @@ -0,0 +1,93 @@ +Lorem ipsum dolor **sit** amet. Lorem ipsum *dolor* _sit_ __amet__. + +There's a [link here](https://example.com/that_has_things?!???!#in-it). + +1. List item +2. Another list item + 1. Sub list item + 2. Another sub list item + 1. Sub sub list item + 3. Continuing sub list item +3. Continuing list item + +```javascript +// Detect horizontal line block +function isHorizontalLineBlock(block) { + return block === "***"; +} + +// Render horizontal line block +function horizontalLineBlock(block) { + return `
`; +} + +// Compose an array of parsers +const parsers = [{ + matcher: isHorizontalLineBlock, + renderers: [horizontalLineBlock] +}]; + +// And finally, our parser itself +function markdownToHTML(markdown) { + // Create blocks + const blocks = content.split(/\n\n/); + + // Parse blocks + const parsedBlocks = blocks.map((block) => { + // Let's find a parser that has a matcher that matches + const parser = parsers.find((parser) => parser.matcher(block)); + + // If match was found, let's run our renderers over `block` + if (parser) { + for (const renderer of match.renderers) { + block = renderer(block); + } + } + + return block; + }); + + // And at last, join the blocks together for one big block. + return parsedBlocks.join(""); +} +``` + +- Test 123 +- Test 223 + - Test 334 + 1. Test test + +This is ___bold italic text___ and ***this is also***. *What about italic text that **has bold text***? + +## Hi there, world! + +* List item +* Another list ~~item~~ + * Sub list item + * Another sub list item + * Sub sub list item + * Continuing sub list item +* Continuing list item + +*** + +* List item +* Another list item + * Sub list item + * Another sub list item + 1. Sub sub list item + 2. Continuing sub list item +* Continuing list item + +This is a H1 heading with settext +================================= + +And this is a H2 heading with settext +------------------------------------- + +Testing paragraph right before a code block +``` +code goes here +``` +# Heading goes here +Paragraph right after heading diff --git a/test-resources/lib_tests/clarktown/core_result.html b/test-resources/lib_tests/clarktown/core_result.html new file mode 100644 index 00000000..d604bf58 --- /dev/null +++ b/test-resources/lib_tests/clarktown/core_result.html @@ -0,0 +1,69 @@ +

Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.

+ +

There's a link here.

+ +
  1. List item
  2. Another list item
    1. Sub list item
    2. Another sub list item
      1. Sub sub list item
    3. Continuing sub list item
  3. Continuing list item
+ +
// Detect horizontal line block
+function isHorizontalLineBlock(block) {
+  return block === "***";
+}
+
+// Render horizontal line block
+function horizontalLineBlock(block) {
+  return `<hr>`;
+}
+
+// Compose an array of parsers
+const parsers = [{
+  matcher: isHorizontalLineBlock,
+  renderers: [horizontalLineBlock]
+}];
+
+// And finally, our parser itself
+function markdownToHTML(markdown) {
+  // Create blocks
+  const blocks = content.split(/\n\n/);
+
+  // Parse blocks
+  const parsedBlocks = blocks.map((block) => {
+    // Let's find a parser that has a matcher that matches
+    const parser = parsers.find((parser) => parser.matcher(block));
+
+    // If match was found, let's run our renderers over `block`
+    if (parser) {
+      for (const renderer of match.renderers) {
+        block = renderer(block);
+      }
+    }
+
+    return block;
+  });
+
+  // And at last, join the blocks together for one big block.
+  return parsedBlocks.join("");
+}
+ +
  • Test 123
  • Test 223
    • Test 334
      1. Test test
+ +

This is bold italic text and this is also. What about italic text that has bold text?

+ +

Hi there, world!

+ +
  • List item
  • Another list item
    • Sub list item
    • Another sub list item
      • Sub sub list item
      • Continuing sub list item
  • Continuing list item
+ +
+ +
  • List item
  • Another list item
    • Sub list item
    • Another sub list item
      1. Sub sub list item
      2. Continuing sub list item
  • Continuing list item
+ +

This is a H1 heading with settext

+ +

And this is a H2 heading with settext

+ +

Testing paragraph right before a code block

+ +
code goes here
+ +

Heading goes here

+ +

Paragraph right after heading

diff --git a/test-resources/lib_tests/clarktown/core_test.clj b/test-resources/lib_tests/clarktown/core_test.clj new file mode 100644 index 00000000..86ca1765 --- /dev/null +++ b/test-resources/lib_tests/clarktown/core_test.clj @@ -0,0 +1,15 @@ +(ns clarktown.core-test + (:require + ;; BB-TEST-PATCH: require clojure.string for split-lines patch below + [clojure.string :as str] + [clojure.test :refer [deftest testing is]] + [clojure.java.io :as io] + [clarktown.core :as core])) + + +(deftest overall-test + (testing "Overall" + ;; BB-TEST-PATCH: library uses hard-coded \n, so using split-lines for platform-agnostic testing + ;; BB-TEST-PATCH: change file paths to match bb folder structure (and copy resource files) + (is (= (str/split-lines (core/render (slurp (io/file (io/resource "clarktown/core.md"))))) + (str/split-lines (slurp (io/file (io/resource "clarktown/core_result.html")))))))) diff --git a/test-resources/lib_tests/clarktown/parsers/bold_test.clj b/test-resources/lib_tests/clarktown/parsers/bold_test.clj new file mode 100644 index 00000000..a082d418 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/bold_test.clj @@ -0,0 +1,18 @@ +(ns clarktown.parsers.bold-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.bold :as bold])) + + +(deftest bold-test + (testing "Creating bold text with two surrounding asterisk characters" + (is (= "This is bold." + (bold/render "**This is bold.**" nil)))) + + (testing "Creating bold text with two surrounding underscore characters" + (is (= "This is bold." + (bold/render "__This is bold.__" nil)))) + + (testing "Creating bold text with both underscores and asterisks mixed" + (is (= "Hi, my name is John, what is your name?" + (bold/render "Hi, my name is **John**, what is __your name?__" nil))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/code_block.md b/test-resources/lib_tests/clarktown/parsers/code_block.md new file mode 100644 index 00000000..8e6f863f --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/code_block.md @@ -0,0 +1,41 @@ +```javascript +// Detect horizontal line block +function isHorizontalLineBlock(block) { + return block === "***"; +} + +// Render horizontal line block +function horizontalLineBlock(block) { + return `
`; +} + +// Compose an array of parsers +const parsers = [{ + matcher: isHorizontalLineBlock, + renderers: [horizontalLineBlock] +}]; + +// And finally, our parser itself +function markdownToHTML(markdown) { + // Create blocks + const blocks = content.split(/\n\n/); + + // Parse blocks + const parsedBlocks = blocks.map((block) => { + // Let's find a parser that has a matcher that matches + const parser = parsers.find((parser) => parser.matcher(block)); + + // If match was found, let's run our renderers over `block` + if (parser) { + for (const renderer of match.renderers) { + block = renderer(block); + } + } + + return block; + }); + + // And at last, join the blocks together for one big block. + return parsedBlocks.join(""); +} +``` \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/code_block_no_language.md b/test-resources/lib_tests/clarktown/parsers/code_block_no_language.md new file mode 100644 index 00000000..dbba1f11 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/code_block_no_language.md @@ -0,0 +1,41 @@ +``` +// Detect horizontal line block +function isHorizontalLineBlock(block) { + return block === "***"; +} + +// Render horizontal line block +function horizontalLineBlock(block) { + return `
`; +} + +// Compose an array of parsers +const parsers = [{ + matcher: isHorizontalLineBlock, + renderers: [horizontalLineBlock] +}]; + +// And finally, our parser itself +function markdownToHTML(markdown) { + // Create blocks + const blocks = content.split(/\n\n/); + + // Parse blocks + const parsedBlocks = blocks.map((block) => { + // Let's find a parser that has a matcher that matches + const parser = parsers.find((parser) => parser.matcher(block)); + + // If match was found, let's run our renderers over `block` + if (parser) { + for (const renderer of match.renderers) { + block = renderer(block); + } + } + + return block; + }); + + // And at last, join the blocks together for one big block. + return parsedBlocks.join(""); +} +``` \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/code_block_no_language_result.html b/test-resources/lib_tests/clarktown/parsers/code_block_no_language_result.html new file mode 100644 index 00000000..0512d3eb --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/code_block_no_language_result.html @@ -0,0 +1,39 @@ +
// Detect horizontal line block
+function isHorizontalLineBlock(block) {
+  return block === "***";
+}
+
+// Render horizontal line block
+function horizontalLineBlock(block) {
+  return `<hr>`;
+}
+
+// Compose an array of parsers
+const parsers = [{
+  matcher: isHorizontalLineBlock,
+  renderers: [horizontalLineBlock]
+}];
+
+// And finally, our parser itself
+function markdownToHTML(markdown) {
+  // Create blocks
+  const blocks = content.split(/\n\n/);
+
+  // Parse blocks
+  const parsedBlocks = blocks.map((block) => {
+    // Let's find a parser that has a matcher that matches
+    const parser = parsers.find((parser) => parser.matcher(block));
+
+    // If match was found, let's run our renderers over `block`
+    if (parser) {
+      for (const renderer of match.renderers) {
+        block = renderer(block);
+      }
+    }
+
+    return block;
+  });
+
+  // And at last, join the blocks together for one big block.
+  return parsedBlocks.join("");
+}
\ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/code_block_result.html b/test-resources/lib_tests/clarktown/parsers/code_block_result.html new file mode 100644 index 00000000..21b92144 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/code_block_result.html @@ -0,0 +1,39 @@ +
// Detect horizontal line block
+function isHorizontalLineBlock(block) {
+  return block === "***";
+}
+
+// Render horizontal line block
+function horizontalLineBlock(block) {
+  return `<hr>`;
+}
+
+// Compose an array of parsers
+const parsers = [{
+  matcher: isHorizontalLineBlock,
+  renderers: [horizontalLineBlock]
+}];
+
+// And finally, our parser itself
+function markdownToHTML(markdown) {
+  // Create blocks
+  const blocks = content.split(/\n\n/);
+
+  // Parse blocks
+  const parsedBlocks = blocks.map((block) => {
+    // Let's find a parser that has a matcher that matches
+    const parser = parsers.find((parser) => parser.matcher(block));
+
+    // If match was found, let's run our renderers over `block`
+    if (parser) {
+      for (const renderer of match.renderers) {
+        block = renderer(block);
+      }
+    }
+
+    return block;
+  });
+
+  // And at last, join the blocks together for one big block.
+  return parsedBlocks.join("");
+}
\ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/code_block_test.clj b/test-resources/lib_tests/clarktown/parsers/code_block_test.clj new file mode 100644 index 00000000..b965e5fa --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/code_block_test.clj @@ -0,0 +1,18 @@ +(ns clarktown.parsers.code-block-test + (:require + ;; require clojure.string to accomodate line break hack below + [clojure.string :as str] + [clojure.test :refer [deftest testing is]] + [clojure.java.io :as io] + [clarktown.parsers.code-block :as code-block])) + +;; BB-TEST-PATCH: change paths to match folder structure (and copy resource files) +;; BB-TEST-PATCH: use split-lines to make tests platform-agnostic +(deftest code-block-test + (testing "Code block with language specification" + (is (= (str/split-lines (slurp (io/file (io/resource "clarktown/parsers/code_block_result.html")))) + (str/split-lines (code-block/render (slurp (io/file (io/resource "clarktown/parsers/code_block.md"))) nil))))) + + (testing "Code block with NO language specification" + (is (= (str/split-lines (slurp (io/file (io/resource "clarktown/parsers/code_block_no_language_result.html")))) + (str/split-lines (code-block/render (slurp (io/file (io/resource "clarktown/parsers/code_block_no_language.md"))) nil)))))) diff --git a/test-resources/lib_tests/clarktown/parsers/empty_block_test.clj b/test-resources/lib_tests/clarktown/parsers/empty_block_test.clj new file mode 100644 index 00000000..a8d89c48 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/empty_block_test.clj @@ -0,0 +1,14 @@ +(ns clarktown.parsers.empty-block-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.empty-block :as empty-block])) + + +(deftest empty-block-test + (testing "Rendering an empty block" + (is (= (empty-block/render "" nil) + ""))) + + (testing "Checking an empty block" + (is (true? (empty-block/is? ""))) + (is (true? (empty-block/is? " "))))) diff --git a/test-resources/lib_tests/clarktown/parsers/heading_block_test.clj b/test-resources/lib_tests/clarktown/parsers/heading_block_test.clj new file mode 100644 index 00000000..9bfff4fd --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/heading_block_test.clj @@ -0,0 +1,44 @@ +(ns clarktown.parsers.heading-block-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.heading-block :as heading-block])) + + +(deftest hashbang-heading-test + (testing "Hashbang heading block that's a H1" + (is (= "

This is a heading block.

" + (heading-block/render "# This is a heading block." nil)))) + + (testing "Hashbang heading block that's a H2" + (is (= "

This is a heading block.

" + (heading-block/render "## This is a heading block." nil)))) + + (testing "Hashbang heading block that's a H3" + (is (= "

This is a heading block.

" + (heading-block/render "### This is a heading block." nil)))) + + (testing "Hashbang heading block that's a H4" + (is (= "

This is a heading block.

" + (heading-block/render "#### This is a heading block." nil)))) + + (testing "Hashbang heading block that's a H5" + (is (= "
This is a heading block.
" + (heading-block/render "##### This is a heading block." nil))))) + + +(deftest settext-heading-text + (testing "Settext heading block that's a H1" + (is (= "

This is a heading block.

" + (heading-block/render "This is a heading block.\n=========" nil)))) + + (testing "Settext heading block that's a H1 spanning multiple lines" + (is (= "

This is a \nheading block spanning multiple lines.

" + (heading-block/render "This is a \nheading block spanning multiple lines.\n========" nil)))) + + (testing "Settext heading block that's a H2" + (is (= "

This is a heading block.

" + (heading-block/render "This is a heading block.\n---------" nil)))) + + (testing "Settext heading block that's a H2 spanning multiple lines" + (is (= "

This is a \nheading block spanning multiple lines.

" + (heading-block/render "This is a \nheading block spanning multiple lines.\n--------" nil))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/horizontal_line_block_test.clj b/test-resources/lib_tests/clarktown/parsers/horizontal_line_block_test.clj new file mode 100644 index 00000000..21617b6c --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/horizontal_line_block_test.clj @@ -0,0 +1,21 @@ +(ns clarktown.parsers.horizontal-line-block-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.horizontal-line-block :as horizontal-line-block])) + + +(deftest horizontal-line-block-test + (testing "Creating a horizontal line" + (is (= "
" + (horizontal-line-block/render "***" nil))) + + (is (= "
" + (horizontal-line-block/render "---" nil)))) + + (testing "Is a horizontal line block" + (is (true? (horizontal-line-block/is? "***"))) + (is (true? (horizontal-line-block/is? " ***"))) + (is (false? (horizontal-line-block/is? "Test *** 123"))) + (is (true? (horizontal-line-block/is? "---"))) + (is (true? (horizontal-line-block/is? " ---"))) + (is (false? (horizontal-line-block/is? "Test --- 123"))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/inline_code_test.clj b/test-resources/lib_tests/clarktown/parsers/inline_code_test.clj new file mode 100644 index 00000000..028c4b7d --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/inline_code_test.clj @@ -0,0 +1,14 @@ +(ns clarktown.parsers.inline-code-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.inline-code :as inline-code])) + + +(deftest inline-code-test + (testing "Creating inline code text" + (is (= "This is inline code." + (inline-code/render "`This is inline code.`" nil)))) + + (testing "Creating inline-code text in the middle of regular text" + (is (= "This is regular text, mixed with some inline code., and it's great." + (inline-code/render "This is regular text, mixed with `some inline code.`, and it's great." nil))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/italic_test.clj b/test-resources/lib_tests/clarktown/parsers/italic_test.clj new file mode 100644 index 00000000..8ab13698 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/italic_test.clj @@ -0,0 +1,18 @@ +(ns clarktown.parsers.italic-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.italic :as italic])) + + +(deftest italic-test + (testing "Creating italic text with one surrounding asterisk character" + (is (= "This is italic." + (italic/render "*This is italic.*" nil)))) + + (testing "Creating italic text with one surrounding underscore character" + (is (= "This is italic." + (italic/render "_This is italic._" nil)))) + + (testing "Creating italic text with both underscores and asterisks mixed" + (is (= "Hi, my name is John, what is your name?" + (italic/render "Hi, my name is *John*, what is _your name?_" nil))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/link_and_image_test.clj b/test-resources/lib_tests/clarktown/parsers/link_and_image_test.clj new file mode 100644 index 00000000..348a8f90 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/link_and_image_test.clj @@ -0,0 +1,23 @@ +(ns clarktown.parsers.link-and-image-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.link-and-image :as link-and-image])) + + +(deftest link-test + (testing "Creating a link" + (is (= (link-and-image/render "[This is a link](https://example.com)" nil) + "This is a link")) + + (is (= (link-and-image/render "[This-is-a-link](https://example.com)" nil) + "This-is-a-link")) + + (is (= (link-and-image/render "[x] [label](link)" nil) + "[x] label")) + + (is (= (link-and-image/render "[ ] [label](link)" nil) + "[ ] label"))) + + (testing "Creating an image" + (is (= (link-and-image/render "![This is an image](https://example.com)" nil) + "\"This")))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/quote_block_test.clj b/test-resources/lib_tests/clarktown/parsers/quote_block_test.clj new file mode 100644 index 00000000..94553cf1 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/quote_block_test.clj @@ -0,0 +1,15 @@ +(ns clarktown.parsers.quote-block-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.quote-block :as quote-block])) + + +(deftest quote-block-block-test + (testing "Creating a quote block line" + (is (= (quote-block/render "> First line\n> second line" nil) + "
First line\nsecond line
"))) + + (testing "Checking a quote block" + (is (true? (quote-block/is? "> Test"))) + (is (true? (quote-block/is? " > Test"))) + (is (true? (quote-block/is? ">"))))) \ No newline at end of file diff --git a/test-resources/lib_tests/clarktown/parsers/strikethrough_test.clj b/test-resources/lib_tests/clarktown/parsers/strikethrough_test.clj new file mode 100644 index 00000000..fdf61888 --- /dev/null +++ b/test-resources/lib_tests/clarktown/parsers/strikethrough_test.clj @@ -0,0 +1,14 @@ +(ns clarktown.parsers.strikethrough-test + (:require + [clojure.test :refer [deftest testing is]] + [clarktown.parsers.strikethrough :as strikethrough])) + + +(deftest strikethrough-test + (testing "Creating strikethrough text" + (is (= (strikethrough/render "~~This is strikethrough text.~~" nil) + "This is strikethrough text."))) + + (testing "Creating strikethrough text mixed with regular text" + (is (= (strikethrough/render "Some other text, ~~This is strikethrough text.~~ And more text." nil) + "Some other text, This is strikethrough text. And more text.")))) \ No newline at end of file From b92af69d1d943762ce3c9db6879727d0033798d3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 23 Apr 2022 11:29:06 +0200 Subject: [PATCH 085/550] SCI: support invoking field, without dash --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index a91f90ee..94e5145e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a91f90eefc2466ed21a3bf4322d13a10de7f231d +Subproject commit 94e5145ea245aa7cd4863bc1e63997cb9dcd9b64 From 24f124d955171d7beca85c680e5e4236a17ac41e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 23 Apr 2022 11:35:49 +0200 Subject: [PATCH 086/550] fix #1237: add tests for numeric tower --- deps.edn | 3 +- doc/libraries.csv | 1 + script/{add-libtest.clj => add_libtest.clj} | 6 +- test-resources/lib_tests/bb-tested-libs.edn | 1 + .../clojure/math/test_numeric_tower.clj | 129 ++++++++++++++++++ 5 files changed, 136 insertions(+), 4 deletions(-) rename script/{add-libtest.clj => add_libtest.clj} (99%) create mode 100644 test-resources/lib_tests/clojure/math/test_numeric_tower.clj diff --git a/deps.edn b/deps.edn index 29f6b7b7..0a30b667 100644 --- a/deps.edn +++ b/deps.edn @@ -135,7 +135,8 @@ com.layerware/hugsql-core {:mvn/version "0.5.3"} com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.rpl/specter {:mvn/version "1.1.4"} - com.github.askonomm/clarktown {:mvn/version "1.1.2"}} + com.github.askonomm/clarktown {:mvn/version "1.1.2"} + org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/doc/libraries.csv b/doc/libraries.csv index b568ad77..b6d89c55 100644 --- a/doc/libraries.csv +++ b/doc/libraries.csv @@ -74,6 +74,7 @@ org.clojure/data.generators,https://github.com/clojure/data.generators org.clojure/data.json,https://github.com/clojure/data.json org.clojure/data.zip,https://github.com/clojure/data.zip org.clojure/math.combinatorics,https://github.com/clojure/math.combinatorics +org.clojure/math.numeric-tower,https://github.com/clojure/math.numeric-tower org.clojure/test.check,https://github.com/clojure/test.check org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs org.clojure/tools.namespace,https://github.com/babashka/tools.namespace diff --git a/script/add-libtest.clj b/script/add_libtest.clj similarity index 99% rename from script/add-libtest.clj rename to script/add_libtest.clj index 9eeea5f2..dd968c1e 100755 --- a/script/add-libtest.clj +++ b/script/add_libtest.clj @@ -11,11 +11,11 @@ (:require [babashka.deps :as deps] [babashka.fs :as fs] [babashka.tasks :refer [shell]] - [org.httpkit.client :as http] - [clojure.string :as str] + [clojure.edn :as edn] [clojure.java.io :as io] + [clojure.string :as str] [clojure.tools.cli :as cli] - [clojure.edn :as edn])) + [org.httpkit.client :as http])) (deps/add-deps '{:deps {org.clojure/tools.gitlibs {:mvn/version "2.4.172"} borkdude/rewrite-edn {:mvn/version "0.1.0"} diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 60c502de..9cd8076e 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -113,4 +113,5 @@ com.github.seancorfield/expectations {:git-url "https://github.com/clojure-expectations/clojure-test", :test-namespaces (expectations.clojure.test-test), :git-sha "b30fefd97d9eb7d1f47e06956521f354cb926b03"} com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"} com.github.askonomm/clarktown {:git-url "https://github.com/askonomm/clarktown", :test-namespaces (clarktown.core-test clarktown.parsers.horizontal-line-block-test clarktown.parsers.italic-test clarktown.parsers.link-and-image-test clarktown.parsers.empty-block-test clarktown.parsers.inline-code-test clarktown.parsers.heading-block-test clarktown.parsers.bold-test clarktown.parsers.quote-block-test clarktown.parsers.code-block-test clarktown.parsers.strikethrough-test), :git-sha "059bfa7bd9bfdde0c75646bf1dfc20d23da8a02c"} + org.clojure/math.numeric-tower {:git-url "https://github.com/clojure/math.numeric-tower", :test-namespaces (clojure.math.test-numeric-tower), :git-sha "97827be66f35feebc3c89ba81c546fef4adc7947"} } diff --git a/test-resources/lib_tests/clojure/math/test_numeric_tower.clj b/test-resources/lib_tests/clojure/math/test_numeric_tower.clj new file mode 100644 index 00000000..ba0ba266 --- /dev/null +++ b/test-resources/lib_tests/clojure/math/test_numeric_tower.clj @@ -0,0 +1,129 @@ +(ns clojure.math.test-numeric-tower + (:use clojure.test + clojure.math.numeric-tower)) + +(deftest test-expt + (are [x y] (= x y) + (expt 2 3) 8 + (expt (expt 2 16) 2) (expt 2 32) + (expt 4/3 2) 16/9 + (expt 2 -10) 1/1024 + (expt 0.5M 2) 0.25M + (expt 5 4.2) (Math/pow 5 4.2) + (expt 5.3 4) (Math/pow 5.3 4) + (expt 5.3 4) (Math/pow 5.3 4) + (expt 2 0) 1 + (expt (java.math.BigInteger. "4") 0) (java.math.BigInteger. "1") + (expt 4M 0) 1M + (expt 8M 1) 8M + (expt 16M 16) 18446744073709551616M)) + +(when-available clojure.lang.BigInt + (deftest test-expt-bigint + (are [x y] (= x y) + (expt (bigint 4) 0) (bigint 1)))) + +(deftest test-abs + (are [x y] (= x y) + (abs -2) 2 + (abs 0) 0 + (abs 5) 5 + (abs 123456789123456789) 123456789123456789 + (abs -123456789123456789) 123456789123456789 + (abs 5/3) 5/3 + (abs -4/3) 4/3 + (abs 4.3M) 4.3M + (abs -4.3M) 4.3M + (abs 2.8) 2.8 + (abs -2.8) 2.8)) + +(deftest test-gcd + (are [x y] (= x y) + (gcd 4 3) 1 + (gcd 24 12) 12 + (gcd 24 27) 3 + (gcd 1 0) 1 + (gcd 0 1) 1 + (gcd 0 0) 0) + (is (thrown? IllegalArgumentException (gcd nil 0))) + (is (thrown? IllegalArgumentException (gcd 0 nil))) + (is (thrown? IllegalArgumentException (gcd 7.0 0)))) + +(deftest test-lcm + (are [x y] (= x y) + (lcm 2 3) 6 + (lcm 3 2) 6 + (lcm -2 3) 6 + (lcm 2 -3) 6 + (lcm -2 -3) 6 + (lcm 4 10) 20 + (lcm 1 0) 0 + (lcm 0 1) 0 + (lcm 0 0) 0) + (is (thrown? IllegalArgumentException (lcm nil 0))) + (is (thrown? IllegalArgumentException (lcm 0 nil))) + (is (thrown? IllegalArgumentException (lcm 7.0 0)))) + +(deftest test-floor + (are [x y] (== x y) + (floor 6) 6 + (floor -6) -6 + (floor 123456789123456789) 123456789123456789 + (floor -123456789123456789) -123456789123456789 + (floor 4/3) 1 + (floor -4/3) -2 + (floor 4.3M) 4 + (floor -4.3M) -5 + (floor 4.3) 4.0 + (floor -4.3) -5.0)) + +(deftest test-ceil + (are [x y] (== x y) + (ceil 6) 6 + (ceil -6) -6 + (ceil 123456789123456789) 123456789123456789 + (ceil -123456789123456789) -123456789123456789 + (ceil 4/3) 2 + (ceil -4/3) -1 + (ceil 4.3M) 5 + (ceil -4.3M) -4 + (ceil 4.3) 5.0 + (ceil -4.3) -4.0)) + +(deftest test-round + (are [x y] (== x y) + (round 6) 6 + (round -6) -6 + (round 123456789123456789) 123456789123456789 + (round -123456789123456789) -123456789123456789 + (round 4/3) 1 + (round 5/3) 2 + (round 5/2) 3 + (round -4/3) -1 + (round -5/3) -2 + (round -5/2) -2 + (round 4.3M) 4 + (round 4.7M) 5 + (round -4.3M) -4 + (round -4.7M) -5 + (round 4.5M) 5 + (round -4.5M) -4 + (round 4.3) 4 + (round 4.7) 5 + (round -4.3) -4 + (round -4.7) -5 + (round 4.5) 5 + (round -4.5) -4)) + +(deftest test-sqrt + (are [x y] (= x y) + (sqrt 9) 3 + (sqrt 16/9) 4/3 + (sqrt 0.25M) 0.5M + (sqrt 2) (Math/sqrt 2))) + +(deftest test-exact-integer-sqrt + (are [x y] (= x y) + (exact-integer-sqrt 15) [3 6] + (exact-integer-sqrt (inc (expt 2 32))) [(expt 2 16) 1] + (exact-integer-sqrt 1000000000000) [1000000 0])) From 9727cabaf3499c7129657cb91b097c92152fe144 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 23 Apr 2022 12:02:11 +0200 Subject: [PATCH 087/550] Add fields for reflection --- src/babashka/impl/classes.clj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 2ffffefe..adee9d89 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -110,6 +110,9 @@ {:methods [{:name "disjoin"}]} clojure.lang.Indexed {:methods [{:name "nth"}]} + clojure.lang.Ratio + {:fields [{:name "numerator"} + {:name "denominator"}]} java.util.Iterator {:methods [{:name "hasNext"} {:name "next"}]} From c83786593af3964eb5c0e80a7e76fa79f553b729 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 25 Apr 2022 22:51:59 +0200 Subject: [PATCH 088/550] Upgrade deps.clj --- deps.clj | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.clj b/deps.clj index c948c2f5..bac83566 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit c948c2f5c1e240c0e0ea4201877695f729ee309e +Subproject commit bac835661adbcd06b07ce2c408bb3e4911a48c28 diff --git a/sci b/sci index 94e5145e..03819bad 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 94e5145ea245aa7cd4863bc1e63997cb9dcd9b64 +Subproject commit 03819bad08547a426c041e4031010f4ef75dfc0b From fc7df082b7ca574888b553b4653a95a583b47d8f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 26 Apr 2022 16:27:49 +0200 Subject: [PATCH 089/550] Bump to newest graalvm (#1250) --- .circleci/config.yml | 30 +++++++-------- .github/workflows/build.yml | 72 +++++++++++++++++------------------ Dockerfile | 2 +- appveyor.yml | 6 +-- doc/build.md | 8 ++-- doc/dev.md | 2 +- script/bump_graal_version.clj | 4 +- 7 files changed, 62 insertions(+), 62 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ced804a9..f255a7d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,8 +73,8 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.0.0.2" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2 + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 BABASHKA_PLATFORM: linux # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -124,7 +124,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-22.0.0.2 + - ~/graalvm-ce-java11-22.1.0 key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -139,8 +139,8 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.0.0.2" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2 + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 BABASHKA_PLATFORM: linux # used in release script BABASHKA_TEST_ENV: native BABASHKA_STATIC: "true" @@ -203,7 +203,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-22.0.0.2 + - ~/graalvm-ce-java11-22.1.0 key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -219,8 +219,8 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.0.0.2" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2 + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 BABASHKA_PLATFORM: linux # used in release script BABASHKA_ARCH: aarch64 BABASHKA_TEST_ENV: native @@ -270,7 +270,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-22.0.0.2 + - ~/graalvm-ce-java11-22.1.0 key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -286,8 +286,8 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.0.0.2" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.0.0.2 + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 BABASHKA_PLATFORM: linux # used in release script BABASHKA_ARCH: aarch64 BABASHKA_TEST_ENV: native @@ -347,7 +347,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-22.0.0.2 + - ~/graalvm-ce-java11-22.1.0 key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -361,8 +361,8 @@ jobs: xcode: "12.0.0" environment: MACOSX_DEPLOYMENT_TARGET: 10.13 # 10.12 is EOL - GRAALVM_VERSION: "22.0.0.2" - GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.0.0.2/Contents/Home + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home BABASHKA_PLATFORM: macos # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -409,7 +409,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-22.0.0.2/Contents/Home + - ~/graalvm-ce-java11-22.1.0/Contents/Home key: mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57b20f95..800be951 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,17 +45,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-22.0.0.2 - key: ${{ runner.os }}-graalvm-22.0.0.2 + path: ~/graalvm-ce-java11-22.1.0 + key: ${{ runner.os }}-graalvm-22.1.0 restore-keys: | - ${{ runner.os }}-graalvm-22.0.0.2 + ${{ runner.os }}-graalvm-22.1.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz + if ! [ -d graalvm-ce-java11-22.1.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz fi - name: Fetch deps @@ -65,18 +65,18 @@ jobs: - name: Run tests run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" script/test - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" sudo script/install-clojure script/run_lib_tests - name: Build uberjar run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" script/uberjar - name: Babashka version @@ -119,17 +119,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-22.0.0.2 - key: ${{ runner.os }}-graalvm-22.0.0.2 + path: ~/graalvm-ce-java11-22.1.0 + key: ${{ runner.os }}-graalvm-22.1.0 restore-keys: | - ${{ runner.os }}-graalvm-22.0.0.2 + ${{ runner.os }}-graalvm-22.1.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz + if ! [ -d graalvm-ce-java11-22.1.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz fi - name: Babashka version @@ -142,12 +142,12 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" script/compile - name: Test binary run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" BABASHKA_TEST_ENV=native script/test - name: Install clojure @@ -156,7 +156,7 @@ jobs: - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" BABASHKA_TEST_ENV=native script/run_lib_tests - name: Upload artifact @@ -194,17 +194,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-22.0.0.2 - key: ${{ runner.os }}-graalvm-22.0.0.2 + path: ~/graalvm-ce-java11-22.1.0 + key: ${{ runner.os }}-graalvm-22.1.0 restore-keys: | - ${{ runner.os }}-graalvm-22.0.0.2 + ${{ runner.os }}-graalvm-22.1.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.0.0.2.tar.gz + if ! [ -d graalvm-ce-java11-22.1.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz fi - name: Babashka version @@ -217,14 +217,14 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" export BABASHKA_STATIC=true script/compile - name: Test binary run: | ./bb '(+ 1 2 3)' - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" BABASHKA_TEST_ENV=native script/test - name: Install clojure @@ -233,7 +233,7 @@ jobs: - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" BABASHKA_TEST_ENV=native script/run_lib_tests - name: Upload artifact @@ -262,17 +262,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-22.0.0.2 - key: ${{ runner.os }}-graalvm-22.0.0.2 + path: ~/graalvm-ce-java11-22.1.0 + key: ${{ runner.os }}-graalvm-22.1.0 restore-keys: | - ${{ runner.os }}-graalvm-22.0.0.2 + ${{ runner.os }}-graalvm-22.1.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-22.0.0.2 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-darwin-amd64-22.0.0.2.tar.gz - tar xzf graalvm-ce-java11-darwin-amd64-22.0.0.2.tar.gz + if ! [ -d graalvm-ce-java11-22.1.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-darwin-amd64-22.1.0.tar.gz + tar xzf graalvm-ce-java11-darwin-amd64-22.1.0.tar.gz fi - name: Babashka version @@ -285,18 +285,18 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" script/compile - name: Test binary run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" sudo script/install-leiningen BABASHKA_TEST_ENV=native script/test - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.0.0.2/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" sudo script/install-clojure BABASHKA_TEST_ENV=native script/run_lib_tests diff --git a/Dockerfile b/Dockerfile index 8ffb784f..ec7e78e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN apt update RUN apt install --no-install-recommends -yy build-essential zlib1g-dev WORKDIR "/opt" -ENV GRAALVM_VERSION="22.0.0.2" +ENV GRAALVM_VERSION="22.1.0" ARG TARGETARCH ENV BABASHKA_ARCH=${TARGETARCH} ENV GRAALVM_ARCH=${TARGETARCH} diff --git a/appveyor.yml b/appveyor.yml index b9e771c4..b6c774cf 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,8 +7,8 @@ image: Visual Studio 2017 clone_folder: C:\projects\babashka environment: - GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.0.0.2 - JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.0.0.2 + GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0 + JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0 BABASHKA_XMX: "-J-Xmx5g" cache: @@ -33,7 +33,7 @@ clone_script: build_script: - cmd: >- - powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.0.0.2/graalvm-ce-java11-windows-amd64-22.0.0.2.zip', 'graalvm.zip') }" + powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-windows-amd64-22.1.0.zip', 'graalvm.zip') }" powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }" diff --git a/doc/build.md b/doc/build.md index 5571fa02..ad1ebb44 100644 --- a/doc/build.md +++ b/doc/build.md @@ -3,24 +3,24 @@ ## Prerequisites - Install [lein](https://leiningen.org/) for producing uberjars -- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.0.0.2*. +- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.1.0*. - For Windows, installing Visual Studio 2019 with the "Desktop development with C++" workload is recommended. - Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.0.0.2/Contents/Home + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0/Contents/Home ``` On linux: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.0.0.2 + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0 ``` On Windows, from the [Visual Studio 2019 x64 Native Tools Command Prompt](https://github.com/oracle/graal/issues/2116#issuecomment-590470806) or `cmd.exe` (not Powershell): ``` - set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.0.0.2 + set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.1.0 ``` If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using: ``` diff --git a/doc/dev.md b/doc/dev.md index 7d4155f7..6c012426 100644 --- a/doc/dev.md +++ b/doc/dev.md @@ -37,7 +37,7 @@ reasons: ## Requirements -You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.0.0.2. +You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.1.0. ## Clone repository diff --git a/script/bump_graal_version.clj b/script/bump_graal_version.clj index 29fa58f6..a9cb051a 100755 --- a/script/bump_graal_version.clj +++ b/script/bump_graal_version.clj @@ -51,9 +51,9 @@ ;; OR ;; ;; We could have them as environment variables -(def current-graal-version "21.3.0") +(def current-graal-version "22.0.0.2") (def current-java-version "java11") -(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0" "21.0.0" "21.1.0" "21.2.0" "21.3.0" "22.0.0.2"]) +(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0" "21.0.0" "21.1.0" "21.2.0" "21.3.0" "22.0.0.2" "22.1.0"]) (def valid-java-bumps ["java8" "java11"]) (def cl-options From 1ef90f98ef9e1303f71099a60a6815e5d07f1ca8 Mon Sep 17 00:00:00 2001 From: Brett Rowberry Date: Thu, 28 Apr 2022 06:21:54 -0400 Subject: [PATCH 090/550] Update README.md (#1251) [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dd50e32..adda7812 100644 --- a/README.md +++ b/README.md @@ -366,7 +366,7 @@ binary, these evaluation criteria are considered: - The library cannot be interpreted by with babashka using `--classpath`. - The functionality can't be met by shelling out to another CLI or can't be written as a small layer over an existing CLI (like `babashka.curl`) instead. -- The library cannot be implemented a +- The library cannot be implemented as a [pod](https://github.com/babashka/babashka.pods). If not all of the criteria are met, but adding a feature is still useful to a From b93198c9653bc8cf8409218ef6ec64b2fdceb506 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 30 Apr 2022 11:46:36 +0200 Subject: [PATCH 091/550] Compatibility with fipp and puget (#1253) See brandonbloom/fipp#81 --- deps.edn | 4 +++- feature-rrb-vector/babashka/impl/rrb_vector.clj | 7 +++++++ project.clj | 3 +++ script/compile | 1 + script/uberjar | 7 +++++++ script/uberjar.bat | 6 ++++++ src/babashka/impl/classes.clj | 7 ++++++- src/babashka/impl/features.clj | 4 ++++ src/babashka/main.clj | 9 ++++++--- 9 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 feature-rrb-vector/babashka/impl/rrb_vector.clj diff --git a/deps.edn b/deps.edn index 0a30b667..a645274c 100644 --- a/deps.edn +++ b/deps.edn @@ -10,6 +10,7 @@ "feature-selmer" "feature-logging" "feature-priority-map" + "feature-rrb-vector" "feature-jdbc" "pods/src" "babashka.nrepl/src" @@ -46,7 +47,8 @@ com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} - insn/insn {:mvn/version "0.5.2"}} + insn/insn {:mvn/version "0.5.2"} + org.clojure/core.rrb-vector {:mvn/version "0.1.2"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/feature-rrb-vector/babashka/impl/rrb_vector.clj b/feature-rrb-vector/babashka/impl/rrb_vector.clj new file mode 100644 index 00000000..955e5d7b --- /dev/null +++ b/feature-rrb-vector/babashka/impl/rrb_vector.clj @@ -0,0 +1,7 @@ +(ns babashka.impl.rrb-vector + (:require [clojure.core.rrb-vector :as rrb] + [sci.core :as sci])) + +(def rrbns (sci/create-ns 'clojure.core.rrb-vector)) + +(def rrb-vector-namespace {'catvec (sci/copy-var rrb/catvec rrbns)}) diff --git a/project.clj b/project.clj index 95df34c5..4373c91a 100644 --- a/project.clj +++ b/project.clj @@ -70,6 +70,8 @@ [org.clojure/tools.logging "1.1.0"]]} :feature/priority-map {:source-paths ["feature-priority-map"] :dependencies [[org.clojure/data.priority-map "1.1.0"]]} + :feature/rrb-vector {:source-paths ["feature-rrb-vector"] + :dependencies [[org.clojure/core.rrb-vector "0.1.2"]]} :test [:feature/xml :feature/lanterna :feature/yaml @@ -87,6 +89,7 @@ :feature/selmer :feature/logging :feature/priority-map + :feature/rrb-vector {:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"] [com.opentable.components/otj-pg-embedded "0.13.3"]]}] :uberjar {:global-vars {*assert* false} diff --git a/script/compile b/script/compile index 42ab80c2..5e2de169 100755 --- a/script/compile +++ b/script/compile @@ -105,6 +105,7 @@ then export BABASHKA_FEATURE_SELMER="${BABASHKA_FEATURE_SELMER:-false}" export BABASHKA_FEATURE_LOGGING="${BABASHKA_FEATURE_LOGGING:-false}" export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}" + export BABASHKA_FEATURE_RRB_VECTOR="${BABASHKA_FEATURE_RRB_VECTOR:-false}" fi "$GRAALVM_HOME/bin/native-image" "${args[@]}" diff --git a/script/uberjar b/script/uberjar index 880aba4e..5bc24c98 100755 --- a/script/uberjar +++ b/script/uberjar @@ -168,6 +168,13 @@ else BABASHKA_LEIN_PROFILES+=",-feature/priority-map" fi +if [ "$BABASHKA_FEATURE_RRB_VECTOR" != "false" ] +then + BABASHKA_LEIN_PROFILES+=",+feature/rrb-vector" +else + BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector" +fi + cp deps.edn resources/META-INF/babashka/deps.edn if [ -z "$BABASHKA_JAR" ]; then diff --git a/script/uberjar.bat b/script/uberjar.bat index 2ae3beb6..65cdd182 100755 --- a/script/uberjar.bat +++ b/script/uberjar.bat @@ -130,6 +130,12 @@ set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,+feature/priority-map set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,-feature/priority-map ) +if not "%BABASHKA_FEATURE_RRB_VECTOR%"=="false" ( +set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,+feature/rrb-vector +) else ( +set BABASHKA_LEIN_PROFILES=%BABASHKA_LEIN_PROFILES%,-feature/rrb-vector +) + call lein with-profiles %BABASHKA_LEIN_PROFILES% bb "(+ 1 2 3)" call lein with-profiles %BABASHKA_LEIN_PROFILES%,+reflection,-uberjar do run diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index adee9d89..885e068f 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -116,7 +116,8 @@ java.util.Iterator {:methods [{:name "hasNext"} {:name "next"}]} - }) + java.util.TimeZone + {:methods [{:name "getTimeZone"}]}}) (def custom-map (cond-> @@ -439,6 +440,7 @@ ;; list above and then everything reachable via the public class will be ;; visible in the native image. :instance-checks [clojure.lang.AFn + clojure.lang.Agent clojure.lang.AMapEntry ;; for proxy clojure.lang.APersistentMap ;; for proxy clojure.lang.APersistentSet @@ -489,6 +491,8 @@ clojure.lang.Sequential clojure.lang.Seqable clojure.lang.Volatile + java.lang.ExceptionInInitializerError + java.sql.Timestamp java.util.concurrent.atomic.AtomicInteger java.util.concurrent.atomic.AtomicLong java.util.Collection @@ -594,6 +598,7 @@ Comparable java.lang.Comparable Double java.lang.Double Exception java.lang.Exception + ExceptionInInitializerError java.lang.ExceptionInInitializerError IndexOutOfBoundsException java.lang.IndexOutOfBoundsException IllegalArgumentException java.lang.IllegalArgumentException IllegalStateException java.lang.IllegalStateException diff --git a/src/babashka/impl/features.clj b/src/babashka/impl/features.clj index 00eaa26e..271cf136 100644 --- a/src/babashka/impl/features.clj +++ b/src/babashka/impl/features.clj @@ -17,6 +17,7 @@ (def selmer? (not= "false" (System/getenv "BABASHKA_FEATURE_SELMER"))) (def logging? (not= "false" (System/getenv "BABASHKA_FEATURE_LOGGING"))) (def priority-map? (not= "false" (System/getenv "BABASHKA_FEATURE_PRIORITY_MAP"))) +(def rrb-vector? (not= "false" (System/getenv "BABASHKA_FEATURE_RRB_VECTOR"))) ;; excluded by default (def jdbc? (= "true" (System/getenv "BABASHKA_FEATURE_JDBC"))) @@ -76,3 +77,6 @@ (when priority-map? (require '[babashka.impl.priority-map])) + +(when rrb-vector? + (require '[babashka.impl.rrb-vector])) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index add257f6..f90ed560 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -256,7 +256,8 @@ Use bb run --help to show this help output. :feature/spec-alpha %s :feature/selmer %s :feature/logging %s - :feature/priority-map %s}") + :feature/priority-map %s + :feature/rrb-vector %s}") version features/csv? features/java-nio? @@ -276,7 +277,8 @@ Use bb run --help to show this help output. features/spec-alpha? features/selmer? features/logging? - features/priority-map?))) + features/priority-map? + features/rrb-vector?))) (defn read-file [file] (let [f (io/file file)] @@ -442,7 +444,8 @@ Use bb run --help to show this help output. 'clojure.tools.logging.readable @(resolve 'babashka.impl.logging/tools-logging-readable-namespace)) features/priority-map? (assoc 'clojure.data.priority-map - @(resolve 'babashka.impl.priority-map/priority-map-namespace)))) + @(resolve 'babashka.impl.priority-map/priority-map-namespace)) + features/rrb-vector? (assoc 'clojure.core.rrb-vector @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace)))) (def edn-readers (cond-> {} features/yaml? From 226d5c597679ca9765274f9bea75e5b037a793be Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 30 Apr 2022 11:59:57 +0200 Subject: [PATCH 092/550] fix #1233: don't print error to stdout in prepl --- src/babashka/impl/clojure/core/server.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/babashka/impl/clojure/core/server.clj b/src/babashka/impl/clojure/core/server.clj index 6211d7a5..ab24645a 100644 --- a/src/babashka/impl/clojure/core/server.clj +++ b/src/babashka/impl/clojure/core/server.clj @@ -219,7 +219,6 @@ :form s}) true))) (catch Throwable ex - (prn (ex-message ex)) (set! *e ex) (out-fn {:tag :ret :val (ex->data ex (or (-> ex ex-data :clojure.error/phase) :execution)) :ns (str (.name *ns*)) :form s From 085fffd95b6cb569ee1df99532805b904aa9626d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 30 Apr 2022 12:03:01 +0200 Subject: [PATCH 093/550] fix #1252: update docs for m1 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index adda7812..0621b10f 100644 --- a/README.md +++ b/README.md @@ -153,10 +153,10 @@ Install: brew install borkdude/brew/babashka -On macOS with an M1 processor: + - softwareupdate --install-rosetta - arch -x86_64 brew install borkdude/brew/babashka + + Upgrade: From 22e56ce779108e492e9f0df9f797eb5bc2a41ac0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 30 Apr 2022 20:49:42 +0200 Subject: [PATCH 094/550] Read-eval --- sci | 2 +- src/babashka/main.clj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sci b/sci index 03819bad..04d3657d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 03819bad08547a426c041e4031010f4ef75dfc0b +Subproject commit 04d3657d7d14f8ebd07ba5a6957fed90e283bfd9 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index f90ed560..5bef8dec 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -84,6 +84,7 @@ (sci/alter-var-root sci/in (constantly *in*)) (sci/alter-var-root sci/out (constantly *out*)) (sci/alter-var-root sci/err (constantly *err*)) +(sci/alter-var-root sci/read-eval (constantly *read-eval*)) (set! *warn-on-reflection* true) ;; To detect problems when generating the image, run: From fbc5b69ab152fba74c41c44d2e8861f5129b8ff9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 1 May 2022 20:38:56 +0200 Subject: [PATCH 095/550] Update process with pre-start-fn --- process | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process b/process index 1eebafc6..5b5ae0b4 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 1eebafc696e9bac7538c296d5a7c1fde977ad523 +Subproject commit 5b5ae0b4c4ddfe46b7d52941e5b53b7b046deeff diff --git a/sci b/sci index 04d3657d..1dc44b30 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 04d3657d7d14f8ebd07ba5a6957fed90e283bfd9 +Subproject commit 1dc44b30044e387c0069bc051a511d6fc889f3f1 From 7f0fd86d8ba41cf96125b00103051aa722a851b1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 1 May 2022 20:52:12 +0200 Subject: [PATCH 096/550] Fix default aliases --- src/babashka/main.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 5bef8dec..cd858415 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -314,7 +314,9 @@ Use bb run --help to show this help output. (def aliases (cond-> - '{tools.cli clojure.tools.cli + '{str clojure.string + set clojure.set + tools.cli clojure.tools.cli edn clojure.edn wait babashka.wait signal babashka.signal From e65f86a39d9a954a219536391bf88d09ecde24ce Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 2 May 2022 13:45:02 +0200 Subject: [PATCH 097/550] Update fs --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index dc73460e..7adcefeb 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit dc73460e63ff10c701c353227f2689b3d7c33a43 +Subproject commit 7adcefeb773bd786408cdc788582f145f79626a6 diff --git a/sci b/sci index 1dc44b30..12ef1bf6 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1dc44b30044e387c0069bc051a511d6fc889f3f1 +Subproject commit 12ef1bf6246370d9b02791c9794e5deee790d9a9 From 41dcc9239a15d95f055dfc0d8af33242c1a12e4f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 3 May 2022 16:47:43 +0200 Subject: [PATCH 098/550] Use into as catvec replacement for now --- script/compile | 1 - script/uberjar | 2 +- src/babashka/impl/features.clj | 2 +- src/babashka/main.clj | 8 +++++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/script/compile b/script/compile index 5e2de169..42ab80c2 100755 --- a/script/compile +++ b/script/compile @@ -105,7 +105,6 @@ then export BABASHKA_FEATURE_SELMER="${BABASHKA_FEATURE_SELMER:-false}" export BABASHKA_FEATURE_LOGGING="${BABASHKA_FEATURE_LOGGING:-false}" export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}" - export BABASHKA_FEATURE_RRB_VECTOR="${BABASHKA_FEATURE_RRB_VECTOR:-false}" fi "$GRAALVM_HOME/bin/native-image" "${args[@]}" diff --git a/script/uberjar b/script/uberjar index 5bc24c98..56414ace 100755 --- a/script/uberjar +++ b/script/uberjar @@ -168,7 +168,7 @@ else BABASHKA_LEIN_PROFILES+=",-feature/priority-map" fi -if [ "$BABASHKA_FEATURE_RRB_VECTOR" != "false" ] +if [ "$BABASHKA_FEATURE_RRB_VECTOR" = "true" ] then BABASHKA_LEIN_PROFILES+=",+feature/rrb-vector" else diff --git a/src/babashka/impl/features.clj b/src/babashka/impl/features.clj index 271cf136..7639997c 100644 --- a/src/babashka/impl/features.clj +++ b/src/babashka/impl/features.clj @@ -17,7 +17,6 @@ (def selmer? (not= "false" (System/getenv "BABASHKA_FEATURE_SELMER"))) (def logging? (not= "false" (System/getenv "BABASHKA_FEATURE_LOGGING"))) (def priority-map? (not= "false" (System/getenv "BABASHKA_FEATURE_PRIORITY_MAP"))) -(def rrb-vector? (not= "false" (System/getenv "BABASHKA_FEATURE_RRB_VECTOR"))) ;; excluded by default (def jdbc? (= "true" (System/getenv "BABASHKA_FEATURE_JDBC"))) @@ -28,6 +27,7 @@ (def datascript? (= "true" (System/getenv "BABASHKA_FEATURE_DATASCRIPT"))) (def lanterna? (= "true" (System/getenv "BABASHKA_FEATURE_LANTERNA"))) (def spec-alpha? (= "true" (System/getenv "BABASHKA_FEATURE_SPEC_ALPHA"))) +(def rrb-vector? (= "true" (System/getenv "BABASHKA_FEATURE_RRB_VECTOR"))) (when xml? (require '[babashka.impl.xml])) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index cd858415..deac45ee 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -387,7 +387,10 @@ Use bb run --help to show this help output. 'rewrite-clj.paredit rewrite/paredit-namespace 'rewrite-clj.parser rewrite/parser-namespace 'rewrite-clj.zip rewrite/zip-namespace - 'rewrite-clj.zip.subedit rewrite/subedit-namespace} + 'rewrite-clj.zip.subedit rewrite/subedit-namespace + 'clojure.core.rrb-vector (if features/rrb-vector? + @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace) + {'catvec (sci/copy-var into (sci/create-ns 'clojure.core.rrb-vector))})} features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) @@ -447,8 +450,7 @@ Use bb run --help to show this help output. 'clojure.tools.logging.readable @(resolve 'babashka.impl.logging/tools-logging-readable-namespace)) features/priority-map? (assoc 'clojure.data.priority-map - @(resolve 'babashka.impl.priority-map/priority-map-namespace)) - features/rrb-vector? (assoc 'clojure.core.rrb-vector @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace)))) + @(resolve 'babashka.impl.priority-map/priority-map-namespace)))) (def edn-readers (cond-> {} features/yaml? From c34109d8281a4044a8587f9a62abfe2c73d4d72a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 3 May 2022 16:59:31 +0200 Subject: [PATCH 099/550] Fix tests --- src/babashka/main.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index deac45ee..5c82eea4 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -390,7 +390,9 @@ Use bb run --help to show this help output. 'rewrite-clj.zip.subedit rewrite/subedit-namespace 'clojure.core.rrb-vector (if features/rrb-vector? @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace) - {'catvec (sci/copy-var into (sci/create-ns 'clojure.core.rrb-vector))})} + {'catvec (sci/copy-var into + (sci/create-ns 'clojure.core.rrb-vector) + {:name 'catvec})})} features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) From 45df5bcc8f48bf4fb5ce5e28b679718f1550898d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 3 May 2022 23:20:36 +0200 Subject: [PATCH 100/550] Fix catvec polyfill --- src/babashka/main.clj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 5c82eea4..33241615 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -257,8 +257,7 @@ Use bb run --help to show this help output. :feature/spec-alpha %s :feature/selmer %s :feature/logging %s - :feature/priority-map %s - :feature/rrb-vector %s}") + :feature/priority-map %s}") version features/csv? features/java-nio? @@ -278,8 +277,7 @@ Use bb run --help to show this help output. features/spec-alpha? features/selmer? features/logging? - features/priority-map? - features/rrb-vector?))) + features/priority-map?))) (defn read-file [file] (let [f (io/file file)] @@ -340,6 +338,9 @@ Use bb run --help to show this help output. (def clojure-main-ns (sci/create-ns 'clojure.main)) +(defn catvec [& xs] + (reduce into [] xs)) + (def namespaces (cond-> {'user {'*input* (reify @@ -390,9 +391,8 @@ Use bb run --help to show this help output. 'rewrite-clj.zip.subedit rewrite/subedit-namespace 'clojure.core.rrb-vector (if features/rrb-vector? @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace) - {'catvec (sci/copy-var into - (sci/create-ns 'clojure.core.rrb-vector) - {:name 'catvec})})} + {'catvec (sci/copy-var catvec + (sci/create-ns 'clojure.core.rrb-vector))})} features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) From 8338afb066cca37512aa6c797dd3c6a37b08ef72 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 3 May 2022 23:44:47 +0200 Subject: [PATCH 101/550] slightly faster --- src/babashka/main.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 33241615..a9609562 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -339,7 +339,7 @@ Use bb run --help to show this help output. (def clojure-main-ns (sci/create-ns 'clojure.main)) (defn catvec [& xs] - (reduce into [] xs)) + (into [] cat xs)) (def namespaces (cond-> From b4dfb91fd3ae14ce0c29f9b112126200814b9620 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 4 May 2022 15:02:30 +0200 Subject: [PATCH 102/550] Expose edamame, fixes #549 and #1258 (#1259) --- project.clj | 2 +- sci | 2 +- src/babashka/impl/edamame.clj | 7 +++++++ src/babashka/main.clj | 10 +++++++--- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 src/babashka/impl/edamame.clj diff --git a/project.clj b/project.clj index 4373c91a..c299173a 100644 --- a/project.clj +++ b/project.clj @@ -19,7 +19,7 @@ :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} :dependencies [[org.clojure/clojure "1.11.0"] - [borkdude/edamame "0.0.19"] + [borkdude/edamame "1.0.0"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] [cheshire "5.10.2"] diff --git a/sci b/sci index 12ef1bf6..6c10e494 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 12ef1bf6246370d9b02791c9794e5deee790d9a9 +Subproject commit 6c10e494371a37a56bef45c8148435888bae3a45 diff --git a/src/babashka/impl/edamame.clj b/src/babashka/impl/edamame.clj new file mode 100644 index 00000000..62035e3d --- /dev/null +++ b/src/babashka/impl/edamame.clj @@ -0,0 +1,7 @@ +(ns babashka.impl.edamame + (:require [edamame.core] + [sci.core :as sci])) + +(def ens (sci/create-ns 'edamame.core)) + +(def edamame-namespace (sci/copy-ns edamame.core ens)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index a9609562..35f0e107 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -10,7 +10,8 @@ [babashka.impl.classes :as classes] [babashka.impl.classpath :as cp :refer [classpath-namespace]] [babashka.impl.clojure.core :as core :refer [core-extras]] - [babashka.impl.clojure.core.async :refer [async-namespace async-protocols-namespace]] + [babashka.impl.clojure.core.async :refer [async-namespace + async-protocols-namespace]] [babashka.impl.clojure.instant :as instant] [babashka.impl.clojure.java.browse :refer [browse-namespace]] [babashka.impl.clojure.java.io :refer [io-namespace]] @@ -18,7 +19,8 @@ [babashka.impl.clojure.main :as clojure-main :refer [demunge]] [babashka.impl.clojure.math :refer [math-namespace]] [babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]] - [babashka.impl.clojure.tools.reader-types :refer [edn-namespace reader-types-namespace]] + [babashka.impl.clojure.tools.reader-types :refer [edn-namespace + reader-types-namespace]] [babashka.impl.clojure.zip :refer [zip-namespace]] [babashka.impl.common :as common] [babashka.impl.core :as bbcore] @@ -26,6 +28,7 @@ [babashka.impl.data :as data] [babashka.impl.datafy :refer [datafy-namespace]] [babashka.impl.deps :as deps :refer [deps-namespace]] + [babashka.impl.edamame :refer [edamame-namespace]] [babashka.impl.error-handler :refer [error-handler]] [babashka.impl.features :as features] [babashka.impl.fs :refer [fs-namespace]] @@ -392,7 +395,8 @@ Use bb run --help to show this help output. 'clojure.core.rrb-vector (if features/rrb-vector? @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace) {'catvec (sci/copy-var catvec - (sci/create-ns 'clojure.core.rrb-vector))})} + (sci/create-ns 'clojure.core.rrb-vector))}) + 'edamame.core edamame-namespace} features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) From 20e81718693a79027c26c2e645f7ae222580ab12 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 4 May 2022 15:07:20 +0200 Subject: [PATCH 103/550] CHANGELOGs [skip ci] --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f73b686..90be4071 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,15 @@ A preview of the next release can be installed from ## Unreleased - Convey `*print-length*` to pprint and allow `set!` +- `babashka.nrepl`: support pprint length +- SCI: support invoking field, without dash +- Add compatibility with clojure numeric tower +- Update deps.clj +- Compatibility with fipp and puget +- fix #1233: don't print error to stdout in prepl +- Update process with pre-start-fn +- Update fs +- Expose edamame, fixes #549 and #1258 (#1259) ## 0.8.1 (2022-04-15) From 1e8ec5285aa1a70ea0bb24b948f124c666bfc387 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 4 May 2022 17:29:49 +0200 Subject: [PATCH 104/550] fs: cwd --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 7adcefeb..ba83efb6 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 7adcefeb773bd786408cdc788582f145f79626a6 +Subproject commit ba83efb62ee7463e3523dff26a1f2f999537f117 From 200a01fe85b0070ce1b998165423ffe3b1086e05 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 4 May 2022 19:32:11 +0200 Subject: [PATCH 105/550] tasks: use process wrapper --- src/babashka/deps.clj | 7 ++++--- src/babashka/impl/tasks.clj | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/babashka/deps.clj b/src/babashka/deps.clj index 16e56668..d37218f2 100644 --- a/src/babashka/deps.clj +++ b/src/babashka/deps.clj @@ -1,5 +1,6 @@ (ns babashka.deps - (:require [babashka.process :as p] + (:require [babashka.impl.process :as pp] + [babashka.process :as p] [borkdude.deps :as deps] [sci.core :as sci])) @@ -41,8 +42,8 @@ deps/*env* (:env opts) deps/*extra-env* (:extra-env opts) deps/*process-fn* (fn - ([cmd] (p/process cmd opts)) - ([cmd _] (p/process cmd opts))) + ([cmd] (pp/process cmd opts)) + ([cmd _] (pp/process cmd opts))) deps/*exit-fn* (fn ([_]) ([_exit-code msg] diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 478e3671..2c59a4a8 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -1,6 +1,7 @@ (ns babashka.impl.tasks (:require [babashka.deps :as deps] [babashka.impl.common :refer [ctx bb-edn debug]] + [babashka.impl.process :as pp] [babashka.process :as p] [clojure.core.async :refer [ Date: Thu, 5 May 2022 14:36:32 +0200 Subject: [PATCH 106/550] process: exec --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 5b5ae0b4..5347eb8c 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 5b5ae0b4c4ddfe46b7d52941e5b53b7b046deeff +Subproject commit 5347eb8c0ecf99c1b8f4367a1cba26644a4f01e7 From 61ad485ce0f5f9f8d3d9eb1eb6eb77d502c39048 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 5 May 2022 22:50:34 +0200 Subject: [PATCH 107/550] updates --- fs | 2 +- process | 2 +- sci | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs b/fs index ba83efb6..e97706fd 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit ba83efb62ee7463e3523dff26a1f2f999537f117 +Subproject commit e97706fda12a71a5055e845effa0099d638dc531 diff --git a/process b/process index 5347eb8c..59bff35c 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 5347eb8c0ecf99c1b8f4367a1cba26644a4f01e7 +Subproject commit 59bff35cb6f4609f772dd932207ddd031c88559c diff --git a/sci b/sci index 6c10e494..f11824c9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6c10e494371a37a56bef45c8148435888bae3a45 +Subproject commit f11824c98b11adee6213900497a291e647f1b2a8 From 786019ef2a6d308b6b5de08438cb52ac01dd38a6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 14:33:28 +0200 Subject: [PATCH 108/550] fs / sci [skip ci] --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index e97706fd..98b48d46 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit e97706fda12a71a5055e845effa0099d638dc531 +Subproject commit 98b48d4671cd75dd4dd70d72c2cc03b21e2e8132 diff --git a/sci b/sci index f11824c9..972f8d55 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f11824c98b11adee6213900497a291e647f1b2a8 +Subproject commit 972f8d55f59102607908f1f1ab30e598bddaa67e From f1fcf248225486c3c78050c86076c464caa707b7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 14:53:44 +0200 Subject: [PATCH 109/550] Support BABASHKA_PODS_DIR --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index e075b13b..c2d6ba84 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit e075b13bfe3666a73f82c12817bdf5f1d6c692e3 +Subproject commit c2d6ba847c53b1f6b7986b166a8a4d7dda97db83 From 3eee5870cab34c72710534b7512f62e09c61caab Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 14:57:01 +0200 Subject: [PATCH 110/550] v0.8.2 --- CHANGELOG.md | 12 ++++++------ resources/BABASHKA_VERSION | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90be4071..dba13d13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,18 +5,18 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 0.8.2 (2022-05-06) - Convey `*print-length*` to pprint and allow `set!` - `babashka.nrepl`: support pprint length - SCI: support invoking field, without dash - Add compatibility with clojure numeric tower -- Update deps.clj +- Update deps.clj to tools jar `1.11.1.1113` - Compatibility with fipp and puget -- fix #1233: don't print error to stdout in prepl -- Update process with pre-start-fn -- Update fs -- Expose edamame, fixes #549 and #1258 (#1259) +- Fix [#1233](https://github.com/babashka/babashka/issues/1233): don't print error to stdout in prepl +- Update process with `:pre-start-fn` option +- Update fs with `cwd` and Windows glob improvements +- Expose edamame, fixes [#549](https://github.com/babashka/babashka/issues/549) and [#1258](https://github.com/babashka/babashka/issues/1258) (#1259) ## 0.8.1 (2022-04-15) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index d541f39b..53a48a1e 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.2-SNAPSHOT \ No newline at end of file +0.8.2 \ No newline at end of file From 4ff35902f3d8a5570db379d2055049165898859a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 14:59:11 +0200 Subject: [PATCH 111/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dba13d13..15c59682 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ A preview of the next release can be installed from - Update process with `:pre-start-fn` option - Update fs with `cwd` and Windows glob improvements - Expose edamame, fixes [#549](https://github.com/babashka/babashka/issues/549) and [#1258](https://github.com/babashka/babashka/issues/1258) (#1259) +- Support `BABASBHKA_PODS_DIR` environment variable ## 0.8.1 (2022-04-15) From 48501c6f528bec1122b2ae2948f16217b131388d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 15:52:29 +0200 Subject: [PATCH 112/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index c18d72be..53a48a1e 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.8.1 \ No newline at end of file +0.8.2 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 53a48a1e..3840d295 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.2 \ No newline at end of file +0.8.3-SNAPSHOT \ No newline at end of file From 6941a5c2ff8a63eb511ea5ae9b8262b7cc65474e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 16:06:09 +0200 Subject: [PATCH 113/550] Bump ghra [skip ci] --- .build/bb.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.build/bb.edn b/.build/bb.edn index b68f2790..883a5b1b 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -2,5 +2,5 @@ :deps {borkdude/gh-release-artifact #_{:local/root "../gh-release-artifact"} {:git/url "https://github.com/borkdude/gh-release-artifact" - :sha "f34f3e382e6a0ef7f52748b2f27eb681f799a822"}} + :sha "a83ee8da47d56a80b6380cbb6b4b9274048067bd"}} :tasks {release-artifact babashka.release-artifact/release}} From 729de81537994dcc3b99d04acf1e21ce1ad647ec Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 16:39:54 +0200 Subject: [PATCH 114/550] Bump ghra --- .build/bb.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.build/bb.edn b/.build/bb.edn index 883a5b1b..c1e5ff3e 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -2,5 +2,5 @@ :deps {borkdude/gh-release-artifact #_{:local/root "../gh-release-artifact"} {:git/url "https://github.com/borkdude/gh-release-artifact" - :sha "a83ee8da47d56a80b6380cbb6b4b9274048067bd"}} + :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}} :tasks {release-artifact babashka.release-artifact/release}} From eee3b55f5682c343f9db9615ee86e2d50f72d46b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 6 May 2022 16:51:59 +0200 Subject: [PATCH 115/550] Try newer machines for aarch64 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f255a7d8..6e8b0c0d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -214,7 +214,7 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64: machine: - image: ubuntu-2004:202101-01 + image: ubuntu-2004:202111-01 resource_class: arm.large working_directory: ~/repo environment: @@ -281,7 +281,7 @@ jobs: ./bb .circleci/script/publish_artifact.clj || true linux-aarch64-static: machine: - image: ubuntu-2004:202101-01 + image: ubuntu-2004:202111-01 resource_class: arm.large working_directory: ~/repo environment: From 5b455cd51bb4fc460a830d06af4c39c586b3beb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Sun, 8 May 2022 09:31:14 +0100 Subject: [PATCH 116/550] Refine Actions (#1261) --- .circleci/config.yml | 4 +- .github/workflows/build.yml | 396 ++++++++++++------------------------ 2 files changed, 129 insertions(+), 271 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6e8b0c0d..c4e9eddb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -471,7 +471,7 @@ workflows: - jvm - linux - linux-static - - mac + # - mac # TODO: Enable when not needed from Actions - linux-aarch64 - linux-aarch64-static - deploy: @@ -481,7 +481,7 @@ workflows: requires: - jvm - linux - - mac + # - mac # TODO: Enable when not needed from Actions - docker: filters: branches: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 800be951..609a286a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,80 +4,65 @@ on: push: branches: - master + pull_request: +# TODO: Add deploy if needed jobs: - - scratch: - if: "!contains(github.event.head_commit.message, 'skip ci')" - runs-on: ubuntu-18.04 - steps: - - name: Git checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - submodules: 'true' - - - name: Scratch - run: | - echo "Scratch" - jvm: if: "!contains(github.event.head_commit.message, 'skip ci')" - # ubuntu 18.04 comes with lein + java8 installed - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest + env: + LEIN_ROOT: "true" + BABASHKA_PLATFORM: linux # could be used in jar name steps: - name: Git checkout - uses: actions/checkout@v1 + uses: actions/checkout@v2 with: fetch-depth: 1 submodules: 'true' - name: Cache deps - uses: actions/cache@v1 + uses: actions/cache@v2 id: cache-deps with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} - restore-keys: | - ${{ runner.os }}-maven- + restore-keys: ${{ runner.os }}-maven- - - name: Cache GraalVM - uses: actions/cache@v1 - id: cache-graalvm + - name: Prepare java + uses: actions/setup-java@v2 with: - path: ~/graalvm-ce-java11-22.1.0 - key: ${{ runner.os }}-graalvm-22.1.0 - restore-keys: | - ${{ runner.os }}-graalvm-22.1.0 + distribution: 'adopt-hotspot' + java-version: '11' - - name: Download GraalVM - run: | - cd ~ - if ! [ -d graalvm-ce-java11-22.1.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - fi - - - name: Fetch deps - if: steps.cache-deps.outputs.cache-hit != 'true' - run: | - lein deps + - name: Install clojure tools + uses: DeLaGuardo/setup-clojure@5.0 + with: + cli: 1.10.3.1040 + lein: 2.9.8 - name: Run tests + env: + BABASHKA_FEATURE_JDBC: "true" + BABASHKA_FEATURE_POSTGRESQL: "true" run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" script/test - - - name: Test libraries - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - sudo script/install-clojure script/run_lib_tests + - name: Run as lein command + run: echo '{:a 1}' | lein bb '(:a *in*)' + - name: Build uberjar run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" + mkdir -p /tmp/release script/uberjar + VERSION=$(cat resources/BABASHKA_VERSION) + jar=target/babashka-$VERSION-standalone.jar + cp $jar /tmp/release + java -jar $jar script/reflection.clj + reflection="babashka-$VERSION-reflection.json" + java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$jar" + java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$reflection" - name: Babashka version id: babashka-version @@ -87,50 +72,75 @@ jobs: - uses: actions/upload-artifact@v1 with: - name: jar + name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar - linux: + native: if: "!contains(github.event.head_commit.message, 'skip ci')" - needs: [jvm] - runs-on: ubuntu-18.04 + strategy: + matrix: + include: + - os: macos-12 + name: macos + static: false + #- os: ubuntu-latest + # name: linux + # static: false + #- os: ubuntu-latest + # name: linux + # static: true + runs-on: ${{ matrix.os }} + env: + LEIN_ROOT: "true" + GRAALVM_VERSION: "22.1.0" + BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script + BABASHKA_TEST_ENV: native + BABASHKA_XMX: "-J-Xmx6500m" steps: - name: Git checkout - uses: actions/checkout@v1 + uses: actions/checkout@v2 with: fetch-depth: 1 submodules: 'true' - - uses: actions/download-artifact@v1 - with: - name: jar - path: . - - name: Cache deps - uses: actions/cache@v1 + uses: actions/cache@v2 id: cache-deps with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} - restore-keys: | - ${{ runner.os }}-maven- + restore-keys: ${{ runner.os }}-maven- - - name: Cache GraalVM - uses: actions/cache@v1 - id: cache-graalvm + - name: Setup GraalVM + if: "matrix.static == false" + uses: graalvm/setup-graalvm@v1 with: - path: ~/graalvm-ce-java11-22.1.0 - key: ${{ runner.os }}-graalvm-22.1.0 - restore-keys: | - ${{ runner.os }}-graalvm-22.1.0 + version: '22.1.0' + java-version: '11' + components: 'native-image' + github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Download GraalVM + - name: Setup GraalVM+musl + if: "matrix.static == true" + uses: graalvm/setup-graalvm@v1 + with: + version: '22.1.0' + java-version: '11' + components: 'native-image' + native-image-musl: true + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install clojure tools + uses: DeLaGuardo/setup-clojure@5.0 + with: + cli: 1.10.3.1040 + lein: 2.9.8 + + - name: Install native dev tools + if: matrix.os == 'ubuntu-latest' run: | - cd ~ - if ! [ -d graalvm-ce-java11-22.1.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - fi + sudo apt-get update + sudo apt-get -y install build-essential zlib1g-dev - name: Babashka version id: babashka-version @@ -138,209 +148,50 @@ jobs: BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION) echo "##[set-output name=version;]${BABASHKA_VERSION}" - - name: Build Linux native image - run: | - export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar - export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - script/compile + - name: Build uberjar + run: script/uberjar - - name: Test binary - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - BABASHKA_TEST_ENV=native script/test + - name: Build native image + if: "matrix.static == false" + run: script/compile - - name: Install clojure - run: | - sudo script/install-clojure /usr/local - - - name: Test libraries - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - BABASHKA_TEST_ENV=native script/run_lib_tests - - - name: Upload artifact - uses: actions/upload-artifact@v2 - with: - path: bb - name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip - - linux-static: - if: "!contains(github.event.head_commit.message, 'skip ci')" - needs: [jvm] - runs-on: ubuntu-16.04 - steps: - - name: Git checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - submodules: 'true' - - - uses: actions/download-artifact@v1 - with: - name: jar - path: . - - - name: Cache deps - uses: actions/cache@v1 - id: cache-deps - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} - restore-keys: | - ${{ runner.os }}-maven- - - - name: Cache GraalVM - uses: actions/cache@v1 - id: cache-graalvm - with: - path: ~/graalvm-ce-java11-22.1.0 - key: ${{ runner.os }}-graalvm-22.1.0 - restore-keys: | - ${{ runner.os }}-graalvm-22.1.0 - - - name: Download GraalVM - run: | - cd ~ - if ! [ -d graalvm-ce-java11-22.1.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-22.1.0.tar.gz - fi - - - name: Babashka version - id: babashka-version - run: | - BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION) - echo "##[set-output name=version;]${BABASHKA_VERSION}" - - - name: Build Linux native image - run: | - export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar - export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - export BABASHKA_STATIC=true - script/compile - - - name: Test binary - run: | - ./bb '(+ 1 2 3)' - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - BABASHKA_TEST_ENV=native script/test - - - name: Install clojure - run: | - sudo script/install-clojure - - - name: Test libraries - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0" - BABASHKA_TEST_ENV=native script/run_lib_tests - - - name: Upload artifact - uses: actions/upload-artifact@v2 - with: - path: bb - name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip - - mac: - if: "!contains(github.event.head_commit.message, 'skip ci')" - needs: [jvm] - runs-on: macos-latest - steps: - - name: Git checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - submodules: 'true' - - - uses: actions/download-artifact@v1 - with: - name: jar - path: . - - - name: Cache GraalVM - uses: actions/cache@v1 - id: cache-graalvm - with: - path: ~/graalvm-ce-java11-22.1.0 - key: ${{ runner.os }}-graalvm-22.1.0 - restore-keys: | - ${{ runner.os }}-graalvm-22.1.0 - - - name: Download GraalVM - run: | - cd ~ - if ! [ -d graalvm-ce-java11-22.1.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-darwin-amd64-22.1.0.tar.gz - tar xzf graalvm-ce-java11-darwin-amd64-22.1.0.tar.gz - fi - - - name: Babashka version - id: babashka-version - run: | - BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION) - echo "##[set-output name=version;]${BABASHKA_VERSION}" - - - name: Build macOS native image - run: | - export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar - export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" - script/compile - - - name: Test binary - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" - sudo script/install-leiningen - BABASHKA_TEST_ENV=native script/test - - - name: Test libraries - run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-22.1.0/Contents/Home" - sudo script/install-clojure - BABASHKA_TEST_ENV=native script/run_lib_tests - - - uses: actions/upload-artifact@v1 - with: - path: bb - name: babashka-${{ steps.babashka-version.outputs.version }}-macos-amd64.zip - - deploy: - if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'" - needs: [jvm, linux, linux-static, mac] - runs-on: ubuntu-18.04 - steps: - - name: Git checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - submodules: 'true' - - - name: Cache deps - uses: actions/cache@v1 - id: cache-deps - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }} - restore-keys: | - ${{ runner.os }}-maven- - - - name: Deploy + - name: Build static native image + if: "matrix.static == true" env: - CLOJARS_USER: "${{ secrets.CLOJARS_USER }}" - CLOJARS_PASS: "${{ secrets.CLOJARS_PASS }}" + BABASHKA_STATIC: "true" + BABASHKA_MUSL: "true" + run: script/compile + + - name: Test binary and libs run: | - .github/script/deploy + script/test + script/run_lib_tests + + - name: Release + run: .circleci/script/release + + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + path: bb + name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-amd64 + + - name: Upload static artifact + if: "matrix.static == true" + uses: actions/upload-artifact@v2 + with: + path: bb + name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-static-amd64 docker: - if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'" + if: ${{ false }} # Disabled + # if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'" needs: - - linux - - linux-static - runs-on: ubuntu-18.04 + - native + runs-on: ubuntu-latest steps: - name: Git checkout - uses: actions/checkout@v1 + uses: actions/checkout@v2 with: fetch-depth: 1 submodules: 'true' @@ -366,9 +217,16 @@ jobs: name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip path: /tmp/release-static + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Build uberjar + run: script/uberjar + - name: Docker build env: DOCKERHUB_USER: "${{ secrets.DOCKERHUB_USER }}" DOCKERHUB_PASS: "${{ secrets.DOCKERHUB_PASS }}" - run: | - .github/script/docker + PLATFORMS: linux/amd64,linux/arm64 + run: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj From 4a13965a6d25c1ebed9515a2fc2b8e3651afd426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Sun, 8 May 2022 18:49:13 +0100 Subject: [PATCH 117/550] Disable JVM on Actions, better triggers (#1262) --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 609a286a..99a3cf45 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,11 +5,14 @@ on: branches: - master pull_request: + branches: + - master # TODO: Add deploy if needed jobs: jvm: - if: "!contains(github.event.head_commit.message, 'skip ci')" + if: ${{ false }} # Disabled + # if: "!contains(github.event.head_commit.message, 'skip ci')" runs-on: ubuntu-latest env: LEIN_ROOT: "true" From fe88348bf8948457c5c261db71983b57fd9998e5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 9 May 2022 15:09:47 +0200 Subject: [PATCH 118/550] Add exec --- fs | 2 +- process | 2 +- sci | 2 +- src/babashka/impl/process.clj | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs b/fs index 98b48d46..68b42dd1 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 98b48d4671cd75dd4dd70d72c2cc03b21e2e8132 +Subproject commit 68b42dd1b6ee22cbcca6e6a807cfb079b608f033 diff --git a/process b/process index 59bff35c..6bcef6ea 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 59bff35cb6f4609f772dd932207ddd031c88559c +Subproject commit 6bcef6ea7ce4c60b9b66f4028d97f5df93b02b3d diff --git a/sci b/sci index 972f8d55..afc1c010 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 972f8d55f59102607908f1f1ab30e598bddaa67e +Subproject commit afc1c010a71a0640a3c4466b7b3a1cce0ad88eee diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 7a457196..3dad4a91 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -27,4 +27,5 @@ 'tokenize (copy-var process/tokenize tns) '*defaults* defaults 'destroy (copy-var process/destroy tns) - 'destroy-tree (copy-var process/destroy-tree tns)}) + 'destroy-tree (copy-var process/destroy-tree tns) + 'exec (copy-var process/exec tns)}) From 73306079ec5f15043e3289d18b8c97a09ade4a61 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 9 May 2022 16:55:27 +0200 Subject: [PATCH 119/550] Pass env --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 99a3cf45..0fa18439 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: env: LEIN_ROOT: "true" BABASHKA_PLATFORM: linux # could be used in jar name + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Git checkout uses: actions/checkout@v2 @@ -99,6 +100,7 @@ jobs: BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Git checkout uses: actions/checkout@v2 From 6960bc5d240a184fbaaec17059108d951df38258 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 9 May 2022 17:01:54 +0200 Subject: [PATCH 120/550] Tweak release script --- script/babashka/release_artifact.clj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/script/babashka/release_artifact.clj b/script/babashka/release_artifact.clj index b88a1e20..f34f766e 100644 --- a/script/babashka/release_artifact.clj +++ b/script/babashka/release_artifact.clj @@ -7,12 +7,14 @@ (or (System/getenv "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH") (System/getenv "APPVEYOR_REPO_BRANCH") (System/getenv "CIRCLE_BRANCH") + (System/getenv "GITHUB_REF_NAME") (-> (sh "git" "rev-parse" "--abbrev-ref" "HEAD") :out str/trim))) (defn release [& args] (let [ght (System/getenv "GITHUB_TOKEN") + _ (println "Github token found") file (first args) branch (current-branch) current-version @@ -20,6 +22,7 @@ str/trim)] (if (and ght (contains? #{"master" "main"} branch)) (do (assert file "File name must be provided") + (println "On main branch. Publishing asset.") (ghr/overwrite-asset {:org "babashka" :repo "babashka" :file file From d9ff456e60bde29d65e0554470d2ed60f62bc906 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 9 May 2022 17:57:41 +0200 Subject: [PATCH 121/550] Re-enable mac on CircleCI (#1263) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c4e9eddb..74f2ebd9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -471,7 +471,7 @@ workflows: - jvm - linux - linux-static - # - mac # TODO: Enable when not needed from Actions + - mac - linux-aarch64 - linux-aarch64-static - deploy: From 5d47397ffca540733cd19eb78f74555e3236cc4e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 10 May 2022 14:40:45 +0200 Subject: [PATCH 122/550] Add BindException --- src/babashka/impl/classes.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 885e068f..5b09010e 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -261,6 +261,7 @@ java.math.BigInteger java.math.MathContext java.math.RoundingMode + java.net.BindException java.net.ConnectException java.net.DatagramSocket java.net.DatagramPacket From 96d93d3940c28e5e180b44dc2c506e4348a47ac5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 13 May 2022 11:04:33 +0200 Subject: [PATCH 123/550] fix #1264: add support for calling ScheduledExecutorService --- src/babashka/impl/classes.clj | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 5b09010e..d500996f 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -362,6 +362,11 @@ java.util.concurrent.LinkedBlockingQueue java.util.concurrent.ScheduledThreadPoolExecutor java.util.concurrent.ThreadPoolExecutor + java.util.concurrent.ScheduledExecutorService + java.util.concurrent.Future + java.util.concurrent.CompletableFuture + java.util.concurrent.Executors + java.util.concurrent.TimeUnit java.util.jar.Attributes$Name java.util.jar.JarFile java.util.jar.JarEntry @@ -392,10 +397,6 @@ java.util.Set java.util.StringTokenizer java.util.UUID - java.util.concurrent.Future - java.util.concurrent.CompletableFuture - java.util.concurrent.Executors - java.util.concurrent.TimeUnit java.util.function.Consumer java.util.function.Function java.util.function.Predicate @@ -567,6 +568,8 @@ java.nio.file.attribute.BasicFileAttributes (instance? java.util.concurrent.Future v) java.util.concurrent.Future + (instance? java.util.concurrent.ScheduledExecutorService v) + java.util.concurrent.ScheduledExecutorService ;; keep commas for merge friendliness ,,,)))] m)) From 8506c30507d951ed5940c7e679b07d83f700c3a1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 13 May 2022 11:07:11 +0200 Subject: [PATCH 124/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c59682..29a76f03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +- #1264: add support for calling `ScheduledExecutorService` +- Add `java.net.BindException` + ## 0.8.2 (2022-05-06) - Convey `*print-length*` to pprint and allow `set!` From f8657cd59f3d179c64d59cc5c886c09e5f080314 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 13 May 2022 13:42:32 +0200 Subject: [PATCH 125/550] Add note [skip ci] --- src/babashka/impl/classes.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index d500996f..9bdfdf06 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -516,6 +516,8 @@ c)) m (assoc m :public-class (fn [v] + ;; NOTE: a series of instance check, so far, is still cheaper + ;; than piggybacking on defmulti or defprotocol (cond (instance? java.lang.Process v) java.lang.Process (instance? java.lang.ProcessHandle v) From c1539fe3b092183fde9d833d0e90e1bb1b845d96 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 14 May 2022 13:10:16 +0200 Subject: [PATCH 126/550] Some additions that at least make plumatic/schema run partially (#1267) --- resources/META-INF/babashka/deps.edn | 10 ++- sci | 2 +- src/babashka/impl/classes.clj | 16 +++- src/babashka/impl/pprint.clj | 106 +++++++++++++++++---------- 4 files changed, 89 insertions(+), 45 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index aea05d5b..a645274c 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -10,6 +10,7 @@ "feature-selmer" "feature-logging" "feature-priority-map" + "feature-rrb-vector" "feature-jdbc" "pods/src" "babashka.nrepl/src" @@ -18,7 +19,7 @@ "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.0"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.0.7"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.0"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} @@ -46,7 +47,8 @@ com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} - insn/insn {:mvn/version "0.5.2"}} + insn/insn {:mvn/version "0.5.2"} + org.clojure/core.rrb-vector {:mvn/version "0.1.2"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile @@ -134,7 +136,9 @@ aysylu/loom {:mvn/version "1.0.2"} com.layerware/hugsql-core {:mvn/version "0.5.3"} com.github.seancorfield/expectations {:mvn/version "2.0.157"} - com.rpl/specter {:mvn/version "1.1.4"}} + com.rpl/specter {:mvn/version "1.1.4"} + com.github.askonomm/clarktown {:mvn/version "1.1.2"} + org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/sci b/sci index afc1c010..65c9d0d1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit afc1c010a71a0640a3c4466b7b3a1cce0ad88eee +Subproject commit 65c9d0d1b838afdaceece1f74dc7cbac66a658bf diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 9bdfdf06..ce55151e 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -97,7 +97,8 @@ {:name "aset"} {:name "aclone"}]} clojure.lang.Compiler - {:fields [{:name "specials"}]} + {:fields [{:name "specials"} + {:name "CHAR_MAP"}]} clojure.lang.PersistentHashMap {:fields [{:name "EMPTY"}]} clojure.lang.APersistentVector @@ -358,6 +359,7 @@ java.time.temporal.Temporal java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster]) + java.util.concurrent.atomic.AtomicReference java.util.concurrent.ExecutionException java.util.concurrent.LinkedBlockingQueue java.util.concurrent.ScheduledThreadPoolExecutor @@ -387,6 +389,8 @@ java.util.Base64$Decoder java.util.Base64$Encoder java.util.Date + java.util.IdentityHashMap + java.util.List java.util.Locale java.util.Map java.util.MissingResourceException @@ -396,6 +400,7 @@ java.util.Scanner java.util.Set java.util.StringTokenizer + java.util.WeakHashMap java.util.UUID java.util.function.Consumer java.util.function.Function @@ -494,11 +499,13 @@ clojure.lang.Seqable clojure.lang.Volatile java.lang.ExceptionInInitializerError + java.lang.LinkageError + java.lang.ThreadDeath + java.lang.VirtualMachineError java.sql.Timestamp java.util.concurrent.atomic.AtomicInteger java.util.concurrent.atomic.AtomicLong java.util.Collection - java.util.List java.util.Map$Entry ~@(when features/xml? ['clojure.data.xml.node.Element])] :custom ~custom-map}) @@ -572,6 +579,8 @@ java.util.concurrent.Future (instance? java.util.concurrent.ScheduledExecutorService v) java.util.concurrent.ScheduledExecutorService + (instance? java.util.Iterator v) + java.util.Iterator ;; keep commas for merge friendliness ,,,)))] m)) @@ -614,6 +623,7 @@ File java.io.File Float java.lang.Float Long java.lang.Long + LinkageError java.lang.LinkageError Math java.lang.Math NullPointerException java.lang.NullPointerException Number java.lang.Number @@ -630,6 +640,8 @@ System java.lang.System Thread java.lang.Thread Throwable java.lang.Throwable + VirtualMachineError java.lang.VirtualMachineError + ThreadDeath java.lang.ThreadDeath ;; UnsupportedOperationException java.lang.UnsupportedOperationException }) diff --git a/src/babashka/impl/pprint.clj b/src/babashka/impl/pprint.clj index bbc8df71..bb15fb9e 100644 --- a/src/babashka/impl/pprint.clj +++ b/src/babashka/impl/pprint.clj @@ -100,28 +100,28 @@ (pprint/pprint s writer)))) (defn cl-format - "An implementation of a Common Lisp compatible format function. cl-format formats its -arguments to an output stream or string based on the format control string given. It -supports sophisticated formatting of structured data. -Writer is an instance of java.io.Writer, true to output to *out* or nil to output -to a string, format-in is the format control string and the remaining arguments -are the data to be formatted. -The format control string is a string to be output with embedded 'format directives' -describing how to format the various arguments passed in. -If writer is nil, cl-format returns the formatted result string. Otherwise, cl-format -returns nil. -For example: - (let [results [46 38 22]] - (cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\" + "An implementation of a Common Lisp compatible format function. cl-format formats its + arguments to an output stream or string based on the format control string given. It + supports sophisticated formatting of structured data. + Writer is an instance of java.io.Writer, true to output to *out* or nil to output + to a string, format-in is the format control string and the remaining arguments + are the data to be formatted. + The format control string is a string to be output with embedded 'format directives' + describing how to format the various arguments passed in. + If writer is nil, cl-format returns the formatted result string. Otherwise, cl-format + returns nil. + For example: + (let [results [46 38 22]] + (cl-format true \"There ~[are~;is~:;are~]~:* ~d result~:p: ~{~d~^, ~}~%\" (count results) results)) -Prints to *out*: - There are 3 results: 46, 38, 22 -Detailed documentation on format control strings is available in the \"Common Lisp the -Language, 2nd edition\", Chapter 22 (available online at: -http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000) -and in the Common Lisp HyperSpec at -http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm -" + Prints to *out*: + There are 3 results: 46, 38, 22 + Detailed documentation on format control strings is available in the \"Common Lisp the + Language, 2nd edition\", Chapter 22 (available online at: + http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000) + and in the Common Lisp HyperSpec at + http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm + " [& args] ;; bind *out* to sci/out, so with-out-str works (binding [*out* @sci/out] @@ -135,36 +135,63 @@ http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm (apply #'pprint/execute-format args))) (defn get-pretty-writer - "Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's -already a pretty writer. Generally, it is unnecessary to call this function, since pprint, -write, and cl-format all call it if they need to. However if you want the state to be -preserved across calls, you will want to wrap them with this. -For example, when you want to generate column-aware output with multiple calls to cl-format, -do it like in this example: + "Returns the java.io.Writer passed in wrapped in a pretty writer proxy, unless it's + already a pretty writer. Generally, it is unnecessary to call this function, since pprint, + write, and cl-format all call it if they need to. However if you want the state to be + preserved across calls, you will want to wrap them with this. + For example, when you want to generate column-aware output with multiple calls to cl-format, + do it like in this example: (defn print-table [aseq column-width] (binding [*out* (get-pretty-writer *out*)] (doseq [row aseq] (doseq [col row] (cl-format true \"~4D~7,vT\" col column-width)) (prn)))) -Now when you run: + Now when you run: user> (print-table (map #(vector % (* % %) (* % % %)) (range 1 11)) 8) -It prints a table of squares and cubes for the numbers from 1 to 10: - 1 1 1 - 2 4 8 - 3 9 27 - 4 16 64 - 5 25 125 - 6 36 216 - 7 49 343 - 8 64 512 - 9 81 729 + It prints a table of squares and cubes for the numbers from 1 to 10: + 1 1 1 + 2 4 8 + 3 9 27 + 4 16 64 + 5 25 125 + 6 36 216 + 7 49 343 + 8 64 512 + 9 81 729 10 100 1000" [writer] (binding [pprint/*print-right-margin* @print-right-margin pprint/*print-miser-width* @print-miser-width] (pprint/get-pretty-writer writer))) +(def current-length #'pprint/*current-length*) + +(defn write-out + "Write an object to *out* subject to the current bindings of the printer control + variables. Use the kw-args argument to override individual variables for this call (and + any recursive calls). + *out* must be a PrettyWriter if pretty printing is enabled. This is the responsibility + of the caller. + This method is primarily intended for use by pretty print dispatch functions that + already know that the pretty printer will have set up their environment appropriately. + Normal library clients should use the standard \"write\" interface. " + {:added "1.2"} + [object] + (let [length-reached (and + @current-length + @sci/print-length + (>= @current-length @sci/print-length))] + (if-not pprint/*print-pretty* + (pr object) + (if length-reached + (print "...") + (do + (when @current-length + (.set ^clojure.lang.Var current-length (inc @current-length))) + (print-pprint-dispatch object)))) + length-reached)) + (def pprint-namespace {'pp (sci/copy-var pprint/pp pprint-ns) 'pprint (sci/copy-var pprint pprint-ns) @@ -181,6 +208,7 @@ It prints a table of squares and cubes for the numbers from 1 to 10: 'with-pprint-dispatch (sci/copy-var pprint/with-pprint-dispatch pprint-ns) '*print-pprint-dispatch* print-pprint-dispatch '*print-miser-width* print-miser-width - 'get-pretty-writer (sci/copy-var get-pretty-writer pprint-ns)}) + 'get-pretty-writer (sci/copy-var get-pretty-writer pprint-ns) + 'write-out (sci/copy-var write-out pprint-ns)}) (vreset! patched? true) From 3b94b51780fd9e9d31f24382197d7233a0600e3c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 14 May 2022 18:44:22 +0200 Subject: [PATCH 127/550] pods update --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index c2d6ba84..aee5337c 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit c2d6ba847c53b1f6b7986b166a8a4d7dda97db83 +Subproject commit aee5337cefaffbad7d5b2434a6e1d507ac962efc From 063a0b01c65f53dce69e473e602439828e7f9373 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 14 May 2022 20:17:43 +0200 Subject: [PATCH 128/550] sync pods [skip ci] --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index aee5337c..b9f3a285 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit aee5337cefaffbad7d5b2434a6e1d507ac962efc +Subproject commit b9f3a28555eab810aa6ea55a36b656f6c8618078 From 6cf1a3ff6a45f6c114acef2a46647a8be184a38b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 15 May 2022 14:23:16 +0200 Subject: [PATCH 129/550] SCI: use explicit global print-method (#1268) --- sci | 2 +- src/babashka/impl/clojure/core.clj | 3 ++- test-resources/lib_tests/honeysql/core_test.cljc | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sci b/sci index 65c9d0d1..1bc5201e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 65c9d0d1b838afdaceece1f74dc7cbac66a658bf +Subproject commit 1bc5201effdbd72269deebcfbbb6016e6a1e5df7 diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index aafdee3b..44f2ccaf 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -195,5 +195,6 @@ 'abs (sci/copy-var abs clojure-core-ns) 'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns) 'memfn (sci/copy-var memfn clojure-core-ns) - 'into-array (sci/copy-var into-array clojure-core-ns)} + 'into-array (sci/copy-var into-array clojure-core-ns) + 'print-method (sci/copy-var print-method clojure-core-ns)} ) diff --git a/test-resources/lib_tests/honeysql/core_test.cljc b/test-resources/lib_tests/honeysql/core_test.cljc index d1fc2f8b..c5736c6c 100644 --- a/test-resources/lib_tests/honeysql/core_test.cljc +++ b/test-resources/lib_tests/honeysql/core_test.cljc @@ -11,6 +11,17 @@ insert-into with merge-where merge-having]] honeysql.format-test)) +;; BB_TEST_PATCH: must explicitly set data readers +#?(:clj + (do + (require '[honeysql.types]) + (set! *data-readers* {'sql/call honeysql.types/read-sql-call + 'sql/inline honeysql.types/read-sql-inline + 'sql/raw honeysql.types/read-sql-raw + 'sql/param honeysql.types/read-sql-param + 'sql/array honeysql.types/read-sql-array + 'sql/regularize honeysql.format/regularize}))) + ;; TODO: more tests (deftest test-select From 861066082f27635b84bac21339fd297d889abf5a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 15 May 2022 21:44:08 +0200 Subject: [PATCH 130/550] Print-dup --- sci | 2 +- src/babashka/impl/clojure/core.clj | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sci b/sci index 1bc5201e..aee2e432 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1bc5201effdbd72269deebcfbbb6016e6a1e5df7 +Subproject commit aee2e432fc7bb3a49b5c96914553cea51f6f5c37 diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index 44f2ccaf..1349e426 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -196,5 +196,6 @@ 'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns) 'memfn (sci/copy-var memfn clojure-core-ns) 'into-array (sci/copy-var into-array clojure-core-ns) - 'print-method (sci/copy-var print-method clojure-core-ns)} + 'print-method (sci/copy-var print-method clojure-core-ns) + 'print-dup (sci/copy-var print-dup clojure-core-ns)} ) From f9ca314c31bb6415f85b2ef9a4497684c6beada8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 16 May 2022 10:03:35 +0200 Subject: [PATCH 131/550] sci --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index aee2e432..beaf5be7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit aee2e432fc7bb3a49b5c96914553cea51f6f5c37 +Subproject commit beaf5be7bd7247e73f41e7faccf547f8253575b7 From 2c79e9dd3057af9e48de37b92c0269bb335fd3a0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 16 May 2022 10:45:40 +0200 Subject: [PATCH 132/550] AFunction --- src/babashka/impl/classes.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index ce55151e..3b10e90e 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -448,6 +448,7 @@ ;; visible in the native image. :instance-checks [clojure.lang.AFn clojure.lang.Agent + clojure.lang.AFunction clojure.lang.AMapEntry ;; for proxy clojure.lang.APersistentMap ;; for proxy clojure.lang.APersistentSet From a977f04181ca3991e4decf2b5431ad0ba27100ab Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 16 May 2022 10:55:33 +0200 Subject: [PATCH 133/550] AbstractMethodError --- src/babashka/impl/classes.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 3b10e90e..3345dc3b 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -499,6 +499,7 @@ clojure.lang.Sequential clojure.lang.Seqable clojure.lang.Volatile + java.lang.AbstractMethodError java.lang.ExceptionInInitializerError java.lang.LinkageError java.lang.ThreadDeath @@ -599,7 +600,8 @@ java-net-http-classes))))) (def imports - '{Appendable java.lang.Appendable + '{AbstractMethodError java.lang.AbstractMethodError + Appendable java.lang.Appendable ArithmeticException java.lang.ArithmeticException AssertionError java.lang.AssertionError BigDecimal java.math.BigDecimal From 1794fe9dd4151d274fc6dfdcd1f0dcfb4235d00c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 16 May 2022 14:16:26 +0200 Subject: [PATCH 134/550] fly io docs [skip ci] --- doc/fly_io/Dockerfile | 5 +++++ doc/fly_io/README.md | 18 ++++++++++++++++++ doc/fly_io/example.clj | 21 +++++++++++++++++++++ doc/fly_io/fly.toml | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 doc/fly_io/Dockerfile create mode 100644 doc/fly_io/README.md create mode 100644 doc/fly_io/example.clj create mode 100644 doc/fly_io/fly.toml diff --git a/doc/fly_io/Dockerfile b/doc/fly_io/Dockerfile new file mode 100644 index 00000000..8c9149ca --- /dev/null +++ b/doc/fly_io/Dockerfile @@ -0,0 +1,5 @@ +FROM babashka/babashka:0.8.2 + +COPY example.clj / + +ENTRYPOINT bb /example.clj diff --git a/doc/fly_io/README.md b/doc/fly_io/README.md new file mode 100644 index 00000000..66a22856 --- /dev/null +++ b/doc/fly_io/README.md @@ -0,0 +1,18 @@ +# Deploying a babashka app to fly.io + +[Fly.io](https://fly.io/) is a service that can run full stack apps with minimal +configuration. If you like the ease of Heroku, you might like fly.io and perhaps +even better! This document shows how to get a minimal babashka application up +and running on `fly.io`. + +In `example.clj` we start an http-kit web server which spits out some HTML. You +can run this locally by invoking `bb example.clj` from the command line. + +To get this site running on `fly.io`, you need to +[install](https://fly.io/docs/getting-started/installing-flyctl/) and [log +in](https://fly.io/docs/getting-started/log-in-to-fly/). + +Then run `flyctl launch` to create a new application. After making changes, you +can re-deploy the site with `flyctl deploy`. + +That's it! diff --git a/doc/fly_io/example.clj b/doc/fly_io/example.clj new file mode 100644 index 00000000..2250fb95 --- /dev/null +++ b/doc/fly_io/example.clj @@ -0,0 +1,21 @@ +(ns example + (:require [hiccup2.core :refer [html]] + [org.httpkit.server :refer [run-server]])) + +(def port (or (some-> (System/getenv "PORT") + parse-long) + 8092)) + +(run-server + (fn [_] + {:body + (str (html + [:html + [:body + [:h1 "Hello world!"] + [:p (str "This site is running with babashka v" + (System/getProperty "babashka.version"))]]]))}) + {:port port}) + +(println "Site running on port" port) +@(promise) diff --git a/doc/fly_io/fly.toml b/doc/fly_io/fly.toml new file mode 100644 index 00000000..6ebbdeeb --- /dev/null +++ b/doc/fly_io/fly.toml @@ -0,0 +1,41 @@ +# fly.toml file generated for shy-sound-2847 on 2022-05-16T14:12:38+02:00 + +app = "shy-sound-2847" + +kill_signal = "SIGINT" +kill_timeout = 5 +processes = [] + +[env] + PORT = "8092" + +[experimental] + allowed_public_ports = [] + auto_rollback = true + +[[services]] + http_checks = [] + internal_port = 8092 + processes = ["app"] + protocol = "tcp" + script_checks = [] + + [services.concurrency] + hard_limit = 25 + soft_limit = 20 + type = "connections" + + [[services.ports]] + force_https = true + handlers = ["http"] + port = 80 + + [[services.ports]] + handlers = ["tls", "http"] + port = 443 + + [[services.tcp_checks]] + grace_period = "1s" + interval = "15s" + restart_limit = 0 + timeout = "2s" From 7b729c5f4bf248fabf1bae8378dab3de722cfdd8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 16 May 2022 14:18:32 +0200 Subject: [PATCH 135/550] fly io docs [skip ci] --- doc/fly_io/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/fly_io/README.md b/doc/fly_io/README.md index 66a22856..f21090d5 100644 --- a/doc/fly_io/README.md +++ b/doc/fly_io/README.md @@ -15,4 +15,5 @@ in](https://fly.io/docs/getting-started/log-in-to-fly/). Then run `flyctl launch` to create a new application. After making changes, you can re-deploy the site with `flyctl deploy`. -That's it! +That's it! See this +[tweet](https://twitter.com/borkdude/status/1526175120825401344) for a demo. From 0d88606c9dc7fe1c0dc7b644fd4e8b50d1570ffe Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 17 May 2022 11:06:01 +0200 Subject: [PATCH 136/550] process: improve tokenize --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 6bcef6ea..aabbca2e 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 6bcef6ea7ce4c60b9b66f4028d97f5df93b02b3d +Subproject commit aabbca2e7e8ccabe579f4953ca9ea1147a30ff06 From 9b611a42fe8f6a0b76346dab520797c5f2d4529f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 17 May 2022 16:56:06 +0200 Subject: [PATCH 137/550] docs [skip ci] --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 0621b10f..e479d078 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,8 @@ Babashka can be installed using a plugin as follows: ### Windows +#### Scoop + On Windows you can install using [scoop](https://scoop.sh/) and the [scoop-clojure](https://github.com/littleli/scoop-clojure) bucket. @@ -194,6 +196,12 @@ scoop bucket add extras scoop install babashka ``` +#### Manual + +If scoop does not work for you, then you can also just download the `bb.exe` +binary from [Github releases](https://github.com/babashka/babashka/releases) and +place it on your path manually. + ### Installer script Install via the installer script: From 27189657a8dba8b9c43b0b8f01072c4751f16103 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 18 May 2022 17:31:07 +0200 Subject: [PATCH 138/550] SCI: custom record impl, fixes record equiv and with-meta --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index beaf5be7..88692521 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit beaf5be7bd7247e73f41e7faccf547f8253575b7 +Subproject commit 88692521d548232936c16e55027df50b288be062 From ab503951da1bc4c01df6a0bbddda4d6c1330346f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 18 May 2022 23:08:33 +0200 Subject: [PATCH 139/550] SCI: fix resolving of class --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 88692521..c9b63109 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 88692521d548232936c16e55027df50b288be062 +Subproject commit c9b631095d3107e5046cb40e3a59d80fd8e42cd7 From eea1cdadee7ee5d5091f347fb61d867372abafdb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 10:23:47 +0200 Subject: [PATCH 140/550] SCI: preserve closed over value analysis when using fixed + varargs arity --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index c9b63109..3aa3da3c 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c9b631095d3107e5046cb40e3a59d80fd8e42cd7 +Subproject commit 3aa3da3cd946eea5d45d8f2315c793cc69bb4312 From 77b75fe0b99bfa7d7d65db8220a4137516c799d8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 11:13:59 +0200 Subject: [PATCH 141/550] SCI: marker protocol on record --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3aa3da3c..02de7fd8 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3aa3da3cd946eea5d45d8f2315c793cc69bb4312 +Subproject commit 02de7fd818003a1be1dcf0653f3046da564cbb8d From b288abc5421fd2dcd58196a3010956617115ac4d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 12:11:24 +0200 Subject: [PATCH 142/550] SCI: simple-dispatch --- sci | 2 +- src/babashka/impl/pprint.clj | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sci b/sci index 02de7fd8..41130fb5 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 02de7fd818003a1be1dcf0653f3046da564cbb8d +Subproject commit 41130fb524ad4918d067e3538eb8065a9a7fb543 diff --git a/src/babashka/impl/pprint.clj b/src/babashka/impl/pprint.clj index bb15fb9e..ffd31e28 100644 --- a/src/babashka/impl/pprint.clj +++ b/src/babashka/impl/pprint.clj @@ -1,7 +1,8 @@ (ns babashka.impl.pprint {:no-doc true} (:require [clojure.pprint :as pprint] - [sci.core :as sci])) + [sci.core :as sci] + [sci.pprint])) (defonce patched? (volatile! false)) From 55f96e69feafdcd38d18503fdc7d80966f785020 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 21:04:44 +0200 Subject: [PATCH 143/550] fix babashka/sci#743: satisfies? of marker protocol via extend-{type, protocol} --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 41130fb5..51452f76 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 41130fb524ad4918d067e3538eb8065a9a7fb543 +Subproject commit 51452f76b42de6fa1b60ea8f690007881817c227 From 8a25716ef45537913bd1beef40aca1cd931256ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 21:19:42 +0200 Subject: [PATCH 144/550] Fix symbolic representation of records --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 51452f76..665cb62b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 51452f76b42de6fa1b60ea8f690007881817c227 +Subproject commit 665cb62ba50e29836f784ca3a6e999e3eff25e5d From 6089496d9c8c1a58941c884d8ebc715382412bf9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 19 May 2022 21:35:24 +0200 Subject: [PATCH 145/550] babashka/sci#744: syntax quote for records should return class repr --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 665cb62b..0859844b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 665cb62ba50e29836f784ca3a6e999e3eff25e5d +Subproject commit 0859844b3892710a2b9c6dc57002d7bdd0115c74 From 7bf2ca0e57ee84afd838f0b883030d3f8b0a5ecd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 20 May 2022 11:37:49 +0200 Subject: [PATCH 146/550] babashka/sci#745: syntax quote for import record --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 0859844b..b83501c6 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 0859844b3892710a2b9c6dc57002d7bdd0115c74 +Subproject commit b83501c6dba9f88618691f82a51868326fd28a35 From 0f8458fd039442fa5a0ac36c0fac2f96b182b31c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 20 May 2022 11:43:35 +0200 Subject: [PATCH 147/550] SCI: default pprint impl for SCI records --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index b83501c6..db1ae7cc 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit b83501c6dba9f88618691f82a51868326fd28a35 +Subproject commit db1ae7cc344cb3331669c1589321a429c4a17715 From 20e6b447b2ca47389f81d0349fb130c51441a699 Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Fri, 20 May 2022 12:12:59 +0100 Subject: [PATCH 148/550] Add installation instructions using nix (#1272) [skip ci] --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index e479d078..6705a9d7 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,22 @@ Upgrade: brew upgrade babashka +### Nix + +Linux and macOS (including ARM Macs) binaries are provided via nix (see the installation instructions for nix [here](https://nixos.org/download.html)). + +Install: + + # Adding `nixpkgs-unstable` channel for more up-to-date binaries, skip this if you already have `nixpkgs-unstable` in your channel list + nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs-unstable + nix-channel --update + nix-env -iA nixpkgs-unstable.babashka + +Upgrade: + + nix-channel --update + nix-env -iA nixpkgs-unstable.babashka + ### Arch (Linux) `babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as From 9f6ffcf11c5aaa84f8d20fef8973f3deb08ad798 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 20 May 2022 14:37:54 +0200 Subject: [PATCH 149/550] SCI update --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index db1ae7cc..1b350e31 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit db1ae7cc344cb3331669c1589321a429c4a17715 +Subproject commit 1b350e31daa226c13640dd6db066807e3ea5ba0d From f1019384b1cf4da20d1ebd8a7d0844c18a1a1263 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 20 May 2022 15:04:08 +0200 Subject: [PATCH 150/550] bb.nrepl: fix completions for static interop --- babashka.nrepl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/babashka.nrepl b/babashka.nrepl index 156ef6bf..0fba78aa 160000 --- a/babashka.nrepl +++ b/babashka.nrepl @@ -1 +1 @@ -Subproject commit 156ef6bfa59ba4a14ba6c69d1681fd7c2988a36d +Subproject commit 0fba78aaa783d0f103533f035c8c5717ce4ac314 From d547fbf31ac811c0fa5eb78521e13e0e7dbd7939 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 22 May 2022 12:20:19 +0200 Subject: [PATCH 151/550] fs/read-all-lines, support charset --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index 68b42dd1..36210b29 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 68b42dd1b6ee22cbcca6e6a807cfb079b608f033 +Subproject commit 36210b29b18727ff64e4ef1de8bf171e3ea7fa61 diff --git a/sci b/sci index 1b350e31..de14dfcb 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1b350e31daa226c13640dd6db066807e3ea5ba0d +Subproject commit de14dfcb4415c726d5e1bffcd9f719cd875db5a4 From 8b3698063f1d7660ebcd7af1142bce8095bf9bd3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 22 May 2022 12:28:06 +0200 Subject: [PATCH 152/550] fs: strip and split-ext less reliant on file system --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 36210b29..d547a039 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 36210b29b18727ff64e4ef1de8bf171e3ea7fa61 +Subproject commit d547a0397da8ad7a461d168eeff8db661efb647e From 09284932e4f0076f1a5e7b059d6556a3ed3dd187 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 22 May 2022 21:41:29 +0200 Subject: [PATCH 153/550] Add sci.runtime --- fs | 2 +- process | 2 +- sci | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs b/fs index d547a039..5a635869 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit d547a0397da8ad7a461d168eeff8db661efb647e +Subproject commit 5a6358697088261e1d8ace12d4a05ac92b1cd239 diff --git a/process b/process index aabbca2e..0045b7f0 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit aabbca2e7e8ccabe579f4953ca9ea1147a30ff06 +Subproject commit 0045b7f027383fad51d9056da4b087d986d4387a diff --git a/sci b/sci index de14dfcb..30b13377 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit de14dfcb4415c726d5e1bffcd9f719cd875db5a4 +Subproject commit 30b13377dc93923273deac5c401f987e3e715181 From 818ea38a8250713121e4f0d57f0879fc59017944 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 23 May 2022 08:57:14 +0200 Subject: [PATCH 154/550] Roll back sci.runtime --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 30b13377..ff4db905 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 30b13377dc93923273deac5c401f987e3e715181 +Subproject commit ff4db9056392f052f4809c06c68e2bef9e26da09 From d81e58cf43521afcc3c9a5ccae93f4ccdaa9fe1c Mon Sep 17 00:00:00 2001 From: Sohalt Date: Mon, 23 May 2022 18:10:45 +0200 Subject: [PATCH 155/550] Add documentation for usage with nix (#1274) [skip ci] --- README.md | 2 + doc/nix.md | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 doc/nix.md diff --git a/README.md b/README.md index 6705a9d7..3961f215 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,8 @@ Upgrade: nix-channel --update nix-env -iA nixpkgs-unstable.babashka +You can find more documentation on how to use babashka with nix [here](./doc/nix.md). + ### Arch (Linux) `babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as diff --git a/doc/nix.md b/doc/nix.md new file mode 100644 index 00000000..68b26178 --- /dev/null +++ b/doc/nix.md @@ -0,0 +1,119 @@ +# Using Babashka with Nix + +Babashka is [packaged](https://search.nixos.org/packages?type=packages&query=babashka) in nixpkgs and can be easily used from the Nix package manager. + +The following assumes a recent installation of nix and uses the unstable [nix cli](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html) and [Flakes](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html). + +To enable the unstable cli and flakes add the following to `/etc/nix/nix.conf`: + +``` +extra-experimental-features flakes nix-command +``` + +## Imperative install on Nix + +To imperatively install nix for the current user, run `nix profile install babashka`. + +## Declarative global install on NixOS + +To install babashka for all users on a NixOS system, place it in `environment.systemPackages` in your `configuration.nix`: + +```nix +{ pkgs, ... }: +{ + environment.systemPackages = with pkgs; [ + babashka + ]; +} +``` + +Then run `nixos-rebuild switch`, to activate the new configuration. + +## Declarative per-user install with home-manager + +You can install babashka for a specific user using [home-manager](https://github.com/nix-community/home-manager). Add the following to your `~/.config/nixpkgs/home.nix`: + +```nix +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + babashka + ]; +} +``` + +Then run `home-manager switch`, to activate the new configuration. + +## Per project install with direnv + +To make babashka available on a per-project basis, you can use [direnv](https://direnv.net/). + +Create a file `.envrc` in the project directory with the following contents: + +``` +use flake +``` + +Create a file `flake.nix` in the project directory with the following contents: + +```nix +{ + outputs = {nixpkgs, ...}: let + supportedSystems = ["x86_64-linux" "x86_64-darwin"]; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + nixpkgsFor = system: import nixpkgs {inherit system;}; + in { + devShell = forAllSystems (system: let + pkgs = nixpkgsFor system; + in + pkgs.mkShell { + packages = with pkgs; [ + babashka + ]; + }); + }; +} +``` + +After running `direnv allow`, babashka should be available on the `$PATH`, when you are inside the project directory. + +## Write Babashka Application + +You can write babashka scripts with native dependencies using [WriteBabashkaApplication](https://github.com/sohalt/write-babashka-application). + +Here is an example `flake.nix` using `cowsay` as an external dependency: + +```nix +{ + inputs.wbba.url = "github:sohalt/write-babashka-application"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + outputs = { nixpkgs, flake-utils, wbba, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ wbba.overlay ]; + }; + hello-babashka = pkgs.writeBabashkaApplication { + name = "hello"; + runtimeInputs = with pkgs;[ + cowsay # add your dependencies here + ]; + text = '' + (ns hello + (:require [babashka.process :refer [sh]])) + + (-> (sh ["cowsay" "hello from babashka"]) + :out + print) + ''; + }; + in + { + defaultApp = hello-babashka; + defaultPackage = hello-babashka; + }); +} +``` + +You can then build the application using `nix build` or run it using `nix run`. From cb4cbb669164245380213e108e9da1129e50a387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Tue, 24 May 2022 13:24:06 +0100 Subject: [PATCH 156/550] inline bb badge (#1275) [skip ci] --- README.md | 2 +- logo/badge.svg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 logo/badge.svg diff --git a/README.md b/README.md index 3961f215..dda7e2c1 100644 --- a/README.md +++ b/README.md @@ -292,7 +292,7 @@ A list of projects (scripts, libraries, pods and tools) known to work with babas Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo! -[![bb compatible](https://img.shields.io/badge/babashka-compatible-green?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNDcyIDE0NzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTk1LjkxMSAxMTkzLjg5QzExMTAuOTMgMTExMi4zOCAxMTg2IDk3OC4yMDYgMTE4NiA4MjYuNUMxMTg2IDU3Ny45NzIgMTAxNCAyNTQuNSA3MzYgMTEzQzQ2MC41IDI2MiAyODYgNTc3Ljk3MiAyODYgODI2LjVDMjg2IDk3OC4yMDYgMzYxLjA3IDExMTIuMzggNDc2LjA4OSAxMTkzLjg5QzQ3MS45ODMgMTE5NC40NCA0NjcuOTQ5IDExOTUuMTQgNDY0IDExOTZDMzc2LjYxMSAxMjE1LjA3IDI3MCAxMzU5LjA1IDI3MCAxMzU5LjA1SDUzNEM1ODAuOTcyIDEzNTkuMDUgNjI1LjYzMSAxMzQxLjQxIDY2MC45NTYgMTMyMS42MkM2NzguMTE1IDEzNDQuMzIgNzA1LjM0NCAxMzU5IDczNiAxMzU5Qzc2Ni42NTYgMTM1OSA3OTMuODg1IDEzNDQuMzIgODExLjA0NCAxMzIxLjYyQzg0Ni4zNjkgMTM0MS40MSA4OTEuMDI4IDEzNTkuMDUgOTM4IDEzNTkuMDVIMTIwMkMxMjAyIDEzNTkuMDUgMTA5NS4zOSAxMjE1LjA3IDEwMDggMTE5NkMxMDA0LjA1IDExOTUuMTQgMTAwMC4wMiAxMTk0LjQ0IDk5NS45MTEgMTE5My44OVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4KPGNpcmNsZSBjeD0iNzM1LjUiIGN5PSI4NTIuNSIgcj0iMzExLjUiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00NDMgNzUwLjQxN0M2NjIgNzY1Ljg2NiA3OTEuMzgyIDcxMi4zODggODgxIDU3OS44ODFDODgxIDU3OS44ODEgNzA4LjI5MyA1MjEuNjQ5IDYwMy4yNDQgNTc5Ljg4MUM0OTguNTUgNjM3LjkxNiA0NDMgNzUwLjQxNyA0NDMgNzUwLjQxN1oiIGZpbGw9IiNCNEI0QjQiLz4KPHBhdGggZD0iTTEwMzkuOTkgNzQ4LjI4MkM5MTQuODYyIDczNC43NDUgODAzLjI2NCA2OTQuMTM1IDc1MCA1NDFDNzUwIDU0MSA4NjAuNjMzIDU2Ni4yNzIgOTcyLjM1NSA2NjguMTAxQzEwODguMzkgNzczLjg1NyAxMDM5Ljk5IDc0OC4yODIgMTAzOS45OSA3NDguMjgyWiIgZmlsbD0iI0I0QjRCNCIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgc3Ryb2tlPSIjMEEwMDAwIiBzdHJva2Utd2lkdGg9IjQwIi8+CjxwYXRoIGQ9Ik03OTcgNzE5SDY3NEw3MDQgNzQ5VjgzOUM3MDguNSA4MDkuNSA3NjQuNSA4MDguNSA3NjcuNSA4MzlMNzc1IDc0OUw3OTcgNzE5WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTM1MS4xMTcgNzU5QzM1MS4xMTcgNzM2LjkwOSAzNjkuMDI2IDcxOSAzOTEuMTE3IDcxOUg2NzYuMDE4QzcwMC4yIDcxOSA3MTguODUyIDc0MC4yOTIgNzE1LjY3IDc2NC4yNjRMNjkwLjkxIDk1MC43NjRDNjg4LjI3IDk3MC42NDYgNjcxLjMxNCA5ODUuNSA2NTEuMjU4IDk4NS41SDM5MS4xMTdDMzY5LjAyNiA5ODUuNSAzNTEuMTE3IDk2Ny41OTEgMzUxLjExNyA5NDUuNVY3NTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNNzU2LjAxMiA3NjQuMjY3Qzc1Mi44MjggNzQwLjI5NCA3NzEuNDgxIDcxOSA3OTUuNjY0IDcxOUgxMDgwQzExMDIuMDkgNzE5IDExMjAgNzM2LjkwOSAxMTIwIDc1OVY5NDUuMDk2QzExMjAgOTY3LjE4NyAxMTAyLjA5IDk4NS4wOTYgMTA4MCA5ODUuMDk2SDgyMC4zODFDODAwLjMyNSA5ODUuMDk2IDc4My4zNyA5NzAuMjQ0IDc4MC43MjkgOTUwLjM2Mkw3NTYuMDEyIDc2NC4yNjdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTAyNCA5NTJWOTIxLjQ3SDEwMTMuNzFDMTAwNy4wMyA5MjEuNDcgMTAwMi41OCA5MTYuNzUyIDEwMDAuMzUgOTA5LjgxM0w5NTguMDY0IDc4Mi42OTdDOTU1LjI4MiA3NzQuNjQ5IDk1MS45NDQgNzY4LjgyIDk0Ny40OTIgNzY0LjM3OUM5MzkuMTQ2IDc1NS43NzUgOTI4LjI5NiA3NTMgOTE2LjA1NCA3NTNIOTAyLjdWNzg0LjkxOEg5MTEuNjAzQzkxOS4xMTUgNzg0LjkxOCA5MjQuOTU3IDc4Ny42OTMgOTI3LjQ2MSA3OTYuNTc1TDkzMy4zMDMgODE3LjExM0w4ODEgOTUySDkxOS4xMTVMOTUwLjU1MyA4NjMuMTg1TDk2Ny4yNDUgOTE2Ljc1MkM5NzMuNjQ0IDkzNy41NjggOTg0LjQ5NCA5NTIgMTAwOC45OCA5NTJIMTAyNFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OTAgOTUyVjkyMS40N0g1NzkuNzA2QzU3My4wMjkgOTIxLjQ3IDU2OC41NzggOTE2Ljc1MiA1NjYuMzUyIDkwOS44MTNMNTI0LjA2NCA3ODIuNjk3QzUyMS4yODIgNzc0LjY0OSA1MTcuOTQ0IDc2OC44MiA1MTMuNDkyIDc2NC4zNzlDNTA1LjE0NiA3NTUuNzc1IDQ5NC4yOTYgNzUzIDQ4Mi4wNTQgNzUzSDQ2OC43Vjc4NC45MThINDc3LjYwM0M0ODUuMTE1IDc4NC45MTggNDkwLjk1NyA3ODcuNjkzIDQ5My40NjEgNzk2LjU3NUw0OTkuMzAzIDgxNy4xMTNMNDQ3IDk1Mkg0ODUuMTE1TDUxNi41NTMgODYzLjE4NUw1MzMuMjQ1IDkxNi43NTJDNTM5LjY0NCA5MzcuNTY4IDU1MC40OTQgOTUyIDU3NC45NzcgOTUySDU5MFoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSI3NTIiIHkxPSIxMTMiIHgyPSI3NTIiIHkyPSIxMzU5LjUyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNFNDFGMjYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQjcwMDAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==)](https://babashka.org) +[![bb compatible](/logo/badge.svg)](https://babashka.org) ## [Pods](https://github.com/babashka/babashka.pods) diff --git a/logo/badge.svg b/logo/badge.svg new file mode 100644 index 00000000..cc95918c --- /dev/null +++ b/logo/badge.svg @@ -0,0 +1 @@ +babashka: compatiblebabashkacompatible \ No newline at end of file From 92b4dc762031214e23f24860613a643479f37f2e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 26 May 2022 23:12:58 +0200 Subject: [PATCH 157/550] Bump cheshire --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index a645274c..1a40075b 100644 --- a/deps.edn +++ b/deps.edn @@ -28,7 +28,7 @@ org.clojure/core.async {:mvn/version "1.5.648"}, org.clojure/tools.cli {:mvn/version "1.0.206"}, org.clojure/data.csv {:mvn/version "1.0.0"}, - cheshire/cheshire {:mvn/version "5.10.2"} + cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} clj-commons/clj-yaml {:mvn/version "0.7.108"} com.cognitect/transit-clj {:mvn/version "1.0.329"} diff --git a/project.clj b/project.clj index c299173a..e74c31ed 100644 --- a/project.clj +++ b/project.clj @@ -22,7 +22,7 @@ [borkdude/edamame "1.0.0"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] - [cheshire "5.10.2"] + [cheshire "5.11.0"] [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] [org.babashka/sci.impl.types "0.0.2"] From 17c047418e8b7339c8baad31428706b5b18b56ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 27 May 2022 13:26:40 +0200 Subject: [PATCH 158/550] Add support for sun.misc.SignalHandler (#1276) --- deps.edn | 2 +- project.clj | 2 +- reify/build.clj | 2 +- reify/src/babashka/impl/reify2/interfaces.clj | 3 ++- src/babashka/impl/classes.clj | 2 ++ src/babashka/impl/proxy.clj | 9 ++++++++- src/babashka/impl/reify.clj | 3 +++ 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/deps.edn b/deps.edn index 1a40075b..01b1265d 100644 --- a/deps.edn +++ b/deps.edn @@ -19,7 +19,7 @@ "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.0"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.0"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index e74c31ed..4f9225c7 100644 --- a/project.clj +++ b/project.clj @@ -26,7 +26,7 @@ [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] [org.babashka/sci.impl.types "0.0.2"] - [org.babashka/babashka.impl.reify "0.1.0"] + [org.babashka/babashka.impl.reify "0.1.1"] [org.clojure/core.async "1.5.648"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] diff --git a/reify/build.clj b/reify/build.clj index 3b59ff57..acbece15 100644 --- a/reify/build.clj +++ b/reify/build.clj @@ -3,7 +3,7 @@ [clojure.tools.build.api :as b])) (def lib 'org.babashka/babashka.impl.reify) -(def version "0.1.0") +(def version "0.1.1") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/reify/src/babashka/impl/reify2/interfaces.clj b/reify/src/babashka/impl/reify2/interfaces.clj index db5d5297..c92cddb0 100644 --- a/reify/src/babashka/impl/reify2/interfaces.clj +++ b/reify/src/babashka/impl/reify2/interfaces.clj @@ -27,4 +27,5 @@ java.util.function.Supplier java.lang.Comparable javax.net.ssl.X509TrustManager - clojure.lang.LispReader$Resolver]) + clojure.lang.LispReader$Resolver + sun.misc.SignalHandler]) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 3345dc3b..0b253df3 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -418,6 +418,8 @@ java.util.zip.ZipEntry java.util.zip.ZipException java.util.zip.ZipFile + sun.misc.Signal + sun.misc.SignalHandler ~(symbol "[B") ~(symbol "[I") ~(symbol "[Ljava.lang.Object;") diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index 1c0018d4..707ba250 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -74,6 +74,11 @@ (proxy [javax.net.ssl.HostnameVerifier] [] (verify [host-name session] ((method-or-bust methods 'verify) this host-name session))) + ["sun.misc.SignalHandler" #{}] + (proxy [sun.misc.SignalHandler] [] + (handle [sig] + ((method-or-bust methods 'handle) this sig))) + ["java.io.PipedInputStream" #{}] (proxy [java.io.PipedInputStream] [] (available [] ((method-or-bust methods 'available) this)) @@ -92,7 +97,9 @@ (flush [] ((method-or-bust methods 'flush) this)) (write ([b] ((method-or-bust methods 'write) this b)) - ([b off len] ((method-or-bust methods 'write) this b off len))))))) + ([b off len] ((method-or-bust methods 'write) this b off len)))) + , ;; keep this for merge friendliness + ))) (defn class-sym [c] (symbol (class-name c))) diff --git a/src/babashka/impl/reify.clj b/src/babashka/impl/reify.clj index a776651b..63dbf9e4 100644 --- a/src/babashka/impl/reify.clj +++ b/src/babashka/impl/reify.clj @@ -185,4 +185,7 @@ resolveAlias [[this sym]] resolveVar [[this sym]]} + sun.misc.SignalHandler + {handle [[this signal]]} + })) From cfdb4f69e69fa521f0fccfc582938c2a80df07b5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 27 May 2022 13:40:59 +0200 Subject: [PATCH 159/550] deps.edn update [skip ci] --- resources/META-INF/babashka/deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index a645274c..01b1265d 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -19,7 +19,7 @@ "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.0"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.0"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} @@ -28,7 +28,7 @@ org.clojure/core.async {:mvn/version "1.5.648"}, org.clojure/tools.cli {:mvn/version "1.0.206"}, org.clojure/data.csv {:mvn/version "1.0.0"}, - cheshire/cheshire {:mvn/version "5.10.2"} + cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} clj-commons/clj-yaml {:mvn/version "0.7.108"} com.cognitect/transit-clj {:mvn/version "1.0.329"} From 6442487110e6b39f1d96d684e9986d855d89a832 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 28 May 2022 11:24:16 +0200 Subject: [PATCH 160/550] bb.process 0.1.3 --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 0045b7f0..a51e82ea 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 0045b7f027383fad51d9056da4b087d986d4387a +Subproject commit a51e82eaa8a9c32aa6cb48f1c5c948cf4375752c From a858269c749036a5c7d80a71bc08ec718bfca2f5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 28 May 2022 11:25:51 +0200 Subject: [PATCH 161/550] fix #1281: upgrade httpkit to 2.6.0-RC1 --- deps.edn | 2 +- project.clj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index 01b1265d..1a1de57e 100644 --- a/deps.edn +++ b/deps.edn @@ -38,7 +38,7 @@ org.postgresql/postgresql {:mvn/version "42.2.18"} org.hsqldb/hsqldb {:mvn/version "2.5.1"} datascript/datascript {:mvn/version "1.0.1"} - http-kit/http-kit {:mvn/version "2.5.3"} + http-kit/http-kit {:mvn/version "2.6.0-RC1"} babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"} org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} diff --git a/project.clj b/project.clj index 4f9225c7..b1179d4a 100644 --- a/project.clj +++ b/project.clj @@ -52,9 +52,9 @@ :feature/datascript {:source-paths ["feature-datascript"] :dependencies [[datascript "1.3.10"]]} :feature/httpkit-client {:source-paths ["feature-httpkit-client"] - :dependencies [[http-kit "2.5.3"]]} + :dependencies [[http-kit "2.6.0-RC1"]]} :feature/httpkit-server {:source-paths ["feature-httpkit-server"] - :dependencies [[http-kit "2.5.3"]]} + :dependencies [[http-kit "2.6.0-RC1"]]} :feature/lanterna {:source-paths ["feature-lanterna"] :dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]} :feature/core-match {:source-paths ["feature-core-match"] From 162ca902875a2f8f34130ae64f4f88822340a1e8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 28 May 2022 11:38:55 +0200 Subject: [PATCH 162/550] Add process/shell binding --- src/babashka/impl/process.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 3dad4a91..6bc455cc 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -28,4 +28,5 @@ '*defaults* defaults 'destroy (copy-var process/destroy tns) 'destroy-tree (copy-var process/destroy-tree tns) - 'exec (copy-var process/exec tns)}) + 'exec (copy-var process/exec tns) + 'shell (copy-var process/shell tns)}) From b8a3d2447c382998e823aac2c0591c1519a53758 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 28 May 2022 16:03:43 +0200 Subject: [PATCH 163/550] api docs updates [skip ci] --- fs | 2 +- process | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index 5a635869..6c5e180d 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 5a6358697088261e1d8ace12d4a05ac92b1cd239 +Subproject commit 6c5e180d52136e68671e15b639e55fbc14e85969 diff --git a/process b/process index a51e82ea..d95ff42c 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit a51e82eaa8a9c32aa6cb48f1c5c948cf4375752c +Subproject commit d95ff42cfa0659bf1a8edf9d45ca3780668ee1cc From 94034063dbfb91b57d792dea503c2dc53c9fa3ea Mon Sep 17 00:00:00 2001 From: agata-anastazja Date: Sat, 28 May 2022 21:01:20 +0100 Subject: [PATCH 164/550] Skip CI run if commit only documentation changes (#1282) --- .circleci/config.yml | 41 +++++++++++++++++++++++++++++++------ .circleci/script/short.clj | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 .circleci/script/short.clj diff --git a/.circleci/config.yml b/.circleci/config.yml index 74f2ebd9..9aea3e94 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,6 +13,22 @@ commands: docker buildx create --name ci-builder --use jobs: + short-if-irrelevant: + docker: + - image: cimg/base:stable + steps: + - checkout + - run: + name: Bootstrap Babashka + command: | + curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install + sudo bash install --dir /tmp + - run: + name: Rename bb binary + command: mv /tmp/bb /tmp/bbb + - run: + name: Short CI if only irrelevant changes + command: /tmp/bbb .circleci/script/short.clj jvm: docker: - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye @@ -468,12 +484,25 @@ workflows: version: 2 ci: jobs: - - jvm - - linux - - linux-static - - mac - - linux-aarch64 - - linux-aarch64-static + - short-if-irrelevant + - jvm: + requires: + - short-if-irrelevant + - linux: + requires: + - short-if-irrelevant + - linux-static: + requires: + - short-if-irrelevant + - mac: + requires: + - short-if-irrelevant + - linux-aarch64: + requires: + - short-if-irrelevant + - linux-aarch64-static: + requires: + - short-if-irrelevant - deploy: filters: branches: diff --git a/.circleci/script/short.clj b/.circleci/script/short.clj new file mode 100644 index 00000000..490bdb38 --- /dev/null +++ b/.circleci/script/short.clj @@ -0,0 +1,42 @@ +(require '[babashka.process :as proc] + '[clojure.string :as str]) + +(def config + {:skip-if-only [#".*.md$"]}) + +(defn exec [cmd] + (-> cmd + (proc/process) + (proc/check))) + +(defn get-changes [] + (-> "git diff --name-only HEAD~1" + (exec) + (:out) + slurp + (str/split-lines))) + +(defn irrelevant-change? [change regexes] + (some? (some #(re-matches % change) regexes))) + +(defn relevant? [change-set regexes] + (some? (some #(not (irrelevant-change? % regexes)) change-set))) + +(defn main [] + (let [{:keys [skip-if-only]} config + changed-files (get-changes)] + (if (relevant? changed-files skip-if-only) + (println "Proceeding with CI run") + (do + (println "Irrelevant changes - skipping CI run") + (exec "circleci task halt"))))) + +(when (= *file* (System/getProperty "babashka.file")) + (main)) + +(comment + (def regexes [#".*.md$" + #".*.clj"]) ;ignore clojure files + (irrelevant-change? "src/file.png" regexes) + (re-matches #".*.clj$" "src/file.clj.dfff") + (relevant? ["src/file.clj"] regexes)) From 40fdb19c959b2bb69b4aad4040d862250e291921 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 29 May 2022 11:40:05 +0200 Subject: [PATCH 165/550] SCI record "classes" are now instance of sci.lang.Type (#1283) --- sci | 2 +- test-resources/lib_tests/slingshot/slingshot_test.clj | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sci b/sci index ff4db905..05727e9d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit ff4db9056392f052f4809c06c68e2bef9e26da09 +Subproject commit 05727e9ddccc9d641d1d4ba05cd444904ec66514 diff --git a/test-resources/lib_tests/slingshot/slingshot_test.clj b/test-resources/lib_tests/slingshot/slingshot_test.clj index f787a862..f9e7c541 100644 --- a/test-resources/lib_tests/slingshot/slingshot_test.clj +++ b/test-resources/lib_tests/slingshot/slingshot_test.clj @@ -36,7 +36,8 @@ [:class-string e#]) ;; by clojure record type - (catch exception-record e# + ;; BB test patch, exception-record != class?, so this expands into incorrect code + #_(catch exception-record e# [:class-exception-record e#]) ;; by key-value From 35b8204704bbef1f29276ce8951dda1cf891a4b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Sun, 29 May 2022 21:58:09 +0100 Subject: [PATCH 166/550] Use extracted CI short script (#1284) * Use extracted CI short script * Use clojure build env * Update build script --- .build/bb.edn | 8 ++++++-- .circleci/config.yml | 18 ++++++++-------- .circleci/script/short.clj | 42 -------------------------------------- 3 files changed, 15 insertions(+), 53 deletions(-) delete mode 100644 .circleci/script/short.clj diff --git a/.build/bb.edn b/.build/bb.edn index c1e5ff3e..f48f976f 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -2,5 +2,9 @@ :deps {borkdude/gh-release-artifact #_{:local/root "../gh-release-artifact"} {:git/url "https://github.com/borkdude/gh-release-artifact" - :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}} - :tasks {release-artifact babashka.release-artifact/release}} + :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"} + babashka/.build {:git/url "https://github.com/babashka/.build" + :git/sha "1ce87f4960fea14f4d1248052e585e6027555d33"}} + :tasks {:requires ([scripts.short-ci :as short]) + release-artifact babashka.release-artifact/release + short-ci short/main}} diff --git a/.circleci/config.yml b/.circleci/config.yml index 9aea3e94..6e6c64c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,10 +15,10 @@ commands: jobs: short-if-irrelevant: docker: - - image: cimg/base:stable + - image: cimg/clojure:1.11.1 steps: - checkout - - run: + - run: name: Bootstrap Babashka command: | curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install @@ -28,7 +28,7 @@ jobs: command: mv /tmp/bb /tmp/bbb - run: name: Short CI if only irrelevant changes - command: /tmp/bbb .circleci/script/short.clj + command: /tmp/bbb --config .build/bb.edn short-ci "circleci task halt" jvm: docker: - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye @@ -485,22 +485,22 @@ workflows: ci: jobs: - short-if-irrelevant - - jvm: + - jvm: requires: - short-if-irrelevant - - linux: + - linux: requires: - short-if-irrelevant - - linux-static: + - linux-static: requires: - short-if-irrelevant - - mac: + - mac: requires: - short-if-irrelevant - - linux-aarch64: + - linux-aarch64: requires: - short-if-irrelevant - - linux-aarch64-static: + - linux-aarch64-static: requires: - short-if-irrelevant - deploy: diff --git a/.circleci/script/short.clj b/.circleci/script/short.clj deleted file mode 100644 index 490bdb38..00000000 --- a/.circleci/script/short.clj +++ /dev/null @@ -1,42 +0,0 @@ -(require '[babashka.process :as proc] - '[clojure.string :as str]) - -(def config - {:skip-if-only [#".*.md$"]}) - -(defn exec [cmd] - (-> cmd - (proc/process) - (proc/check))) - -(defn get-changes [] - (-> "git diff --name-only HEAD~1" - (exec) - (:out) - slurp - (str/split-lines))) - -(defn irrelevant-change? [change regexes] - (some? (some #(re-matches % change) regexes))) - -(defn relevant? [change-set regexes] - (some? (some #(not (irrelevant-change? % regexes)) change-set))) - -(defn main [] - (let [{:keys [skip-if-only]} config - changed-files (get-changes)] - (if (relevant? changed-files skip-if-only) - (println "Proceeding with CI run") - (do - (println "Irrelevant changes - skipping CI run") - (exec "circleci task halt"))))) - -(when (= *file* (System/getProperty "babashka.file")) - (main)) - -(comment - (def regexes [#".*.md$" - #".*.clj"]) ;ignore clojure files - (irrelevant-change? "src/file.png" regexes) - (re-matches #".*.clj$" "src/file.clj.dfff") - (relevant? ["src/file.clj"] regexes)) From 5ec6fca29a72500d9e21b8728bd97bfc97ce6ee0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 30 May 2022 10:11:46 +0200 Subject: [PATCH 167/550] pods: fix benign socket closed exception --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index b9f3a285..66867eee 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit b9f3a28555eab810aa6ea55a36b656f6c8618078 +Subproject commit 66867eee7f050af0126c83c876f8031e0eae709a From 8e3f22db7a8e5ebbf9bf6ddc89da730cc10b8230 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 30 May 2022 22:07:12 +0200 Subject: [PATCH 168/550] Migrate to sci.lang.Var (#1285) --- sci | 2 +- src/babashka/impl/clojure/core.clj | 3 ++- src/babashka/impl/clojure/core/server.clj | 4 ++-- src/babashka/impl/clojure/test.clj | 6 +++--- src/babashka/impl/error_handler.clj | 2 +- src/babashka/impl/repl.clj | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/sci b/sci index 05727e9d..15ef9bd1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 05727e9ddccc9d641d1d4ba05cd444904ec66514 +Subproject commit 15ef9bd19df0446c7fc7cc245d0d36c2503dc102 diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index 1349e426..ce03b1e3 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -9,7 +9,8 @@ [sci.core :as sci] [sci.impl.namespaces :refer [copy-core-var core-var macrofy]] [sci.impl.parser :as parser] - [sci.impl.vars :as vars :refer [clojure-core-ns]])) + [sci.impl.utils :refer [clojure-core-ns]] + [sci.impl.vars :as vars])) (defn locking* [form bindings v f & args] (apply @#'locking/locking form bindings v f args)) diff --git a/src/babashka/impl/clojure/core/server.clj b/src/babashka/impl/clojure/core/server.clj index ab24645a..fb3c1e90 100644 --- a/src/babashka/impl/clojure/core/server.clj +++ b/src/babashka/impl/clojure/core/server.clj @@ -18,7 +18,7 @@ [babashka.impl.common :refer [debug]] [sci.core :as sci] [sci.impl.parser :as p] - [sci.impl.vars :as vars]) + [sci.impl.utils :as utils]) (:import [clojure.lang LineNumberingPushbackReader] [java.io BufferedWriter InputStreamReader OutputStreamWriter] @@ -214,7 +214,7 @@ :val (if (instance? Throwable ret) (Throwable->map ret) ret) - :ns (str (vars/current-ns-name)) + :ns (str (utils/current-ns-name)) :ms ms :form s}) true))) diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index 98d736d8..1507186e 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -409,7 +409,7 @@ [x] (if (symbol? x) (when-let [v (second (resolve/lookup @ctx x false))] - (when-let [value (if (vars/var? v) + (when-let [value (if (instance? sci.lang.Var v) (get-possibly-unbound-var v) v)] (and (fn? value) @@ -667,7 +667,7 @@ value of key." {:added "1.1"} [key coll] - (swap! ns->fixtures assoc-in [(sci-namespaces/sci-ns-name @vars/current-ns) key] coll)) + (swap! ns->fixtures assoc-in [(sci-namespaces/sci-ns-name @sci/ns) key] coll)) (defmulti use-fixtures "Wrap test runs in a fixture function to perform setup and @@ -779,7 +779,7 @@ Defaults to current namespace if none given. Returns a map summarizing test results." {:added "1.1"} - ([ctx] (run-tests ctx @vars/current-ns)) + ([ctx] (run-tests ctx @sci/ns)) ([ctx & namespaces] (let [summary (assoc (apply merge-with + (map #(test-ns ctx %) namespaces)) :type :summary)] diff --git a/src/babashka/impl/error_handler.clj b/src/babashka/impl/error_handler.clj index b48adb76..e780c33c 100644 --- a/src/babashka/impl/error_handler.clj +++ b/src/babashka/impl/error_handler.clj @@ -108,7 +108,7 @@ stacktrace (dedupe (concat (sequence (comp (map StackTraceElement->vec) (take-while #(not (str/starts-with? (first %) "sci.impl."))) - (map render-native-stacktrace-elem)) + (keep render-native-stacktrace-elem)) (.getStackTrace (or (ex-cause e) e))) (sci/stacktrace e)))] (if exit-code diff --git a/src/babashka/impl/repl.clj b/src/babashka/impl/repl.clj index 9cbf4d95..e1083b5b 100644 --- a/src/babashka/impl/repl.clj +++ b/src/babashka/impl/repl.clj @@ -9,7 +9,7 @@ [sci.impl.interpreter :refer [eval-form]] [sci.impl.io :as sio] [sci.impl.parser :as parser] - [sci.impl.vars :as vars])) + [sci.impl.utils :as utils])) (set! *warn-on-reflection* true) @@ -80,7 +80,7 @@ (let [ret (eval-form sci-ctx expr)] ret)))) :need-prompt (or need-prompt (fn [] true)) - :prompt (or prompt #(sio/printf "%s=> " (vars/current-ns-name))) + :prompt (or prompt #(sio/printf "%s=> " (utils/current-ns-name))) :flush (or flush sio/flush) :print (or print sio/prn) :caught (or caught repl-caught))))) From 201370275ea5a2e03964a65daed1abfa02d336b0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 1 Jun 2022 15:42:09 +0200 Subject: [PATCH 169/550] Bump Clojure to 1.11.1 --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 1a1de57e..b88a7ba7 100644 --- a/deps.edn +++ b/deps.edn @@ -17,7 +17,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0"}, + :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} diff --git a/project.clj b/project.clj index b1179d4a..c69c609b 100644 --- a/project.clj +++ b/project.clj @@ -18,7 +18,7 @@ :resource-paths ["resources" "sci/resources"] :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} - :dependencies [[org.clojure/clojure "1.11.0"] + :dependencies [[org.clojure/clojure "1.11.1"] [borkdude/edamame "1.0.0"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.206"] From 47ceae0ba088268736a1b5c5d3ee0bb1e2c4fa4a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 6 Jun 2022 22:25:02 +0200 Subject: [PATCH 170/550] process/exec: arg0 --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index d95ff42c..d7331aa5 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit d95ff42cfa0659bf1a8edf9d45ca3780668ee1cc +Subproject commit d7331aa5522c44bcd5be74abacf11dbf3903d764 From 826b955543ad385f5272485afbb7af823ea321bb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 20:18:42 +0200 Subject: [PATCH 171/550] Add cirrus --- .cirrus.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .cirrus.yml diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 00000000..ac22cdaf --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,5 @@ +macos_instance: + image: ghcr.io/cirruslabs/macos-monterey-base:latest + +task: + script: echo "Hello World from macOS!" From 83c4ccff2c36326f0af0610b79b653ca641e4bc9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 20:21:38 +0200 Subject: [PATCH 172/550] short always --- .build/bb.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.build/bb.edn b/.build/bb.edn index f48f976f..46cd17f5 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -7,4 +7,4 @@ :git/sha "1ce87f4960fea14f4d1248052e585e6027555d33"}} :tasks {:requires ([scripts.short-ci :as short]) release-artifact babashka.release-artifact/release - short-ci short/main}} + short-ci {:task (do (alter-var-root (var short/config) assoc :skip-if-only (re-pattern ".*")))}}} From 9698ddae61b5c630042151c9a1dd9d2d7970a966 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 21:37:25 +0200 Subject: [PATCH 173/550] cirrus --- .build/bb.edn | 3 ++- .circleci/config.yml | 4 +++- .cirrus.yml | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/.build/bb.edn b/.build/bb.edn index 46cd17f5..13e47f4a 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -7,4 +7,5 @@ :git/sha "1ce87f4960fea14f4d1248052e585e6027555d33"}} :tasks {:requires ([scripts.short-ci :as short]) release-artifact babashka.release-artifact/release - short-ci {:task (do (alter-var-root (var short/config) assoc :skip-if-only (re-pattern ".*")))}}} + short-ci {:task (do (alter-var-root (var short/config) assoc :skip-if-only [(re-pattern ".*")]) + (apply short/main *command-line-args*))}}} diff --git a/.circleci/config.yml b/.circleci/config.yml index 6e6c64c8..f156f337 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,7 +28,9 @@ jobs: command: mv /tmp/bb /tmp/bbb - run: name: Short CI if only irrelevant changes - command: /tmp/bbb --config .build/bb.edn short-ci "circleci task halt" + command: | + /tmp/bbb --config .build/bb.edn short-ci "circleci-agent step halt" + jvm: docker: - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye diff --git a/.cirrus.yml b/.cirrus.yml index ac22cdaf..98bf11a0 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,4 +2,36 @@ macos_instance: image: ghcr.io/cirruslabs/macos-monterey-base:latest task: - script: echo "Hello World from macOS!" + env: + LEIN_ROOT: "true" + GRAALVM_VERSION: "22.1.0" + GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.1.0/Contents/Home + BABASHKA_PLATFORM: macos # used in release script + BABASHKA_ARCH: aarch64 + BABASHKA_TEST_ENV: native + BABASHKA_XMX: "-J-Xmx6500m" + script: | + git submodule init + git submodule update + + sudo script/install-clojure + sudo script/install-leiningen + script/install-graalvm + export PATH=$GRAALVM_HOME/bin:$PATH + sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license + java -version + + script/uberjar + script/compile + + script/test + script/run_lib_tests + + VERSION=$(cat resources/BABASHKA_VERSION) + arch=${BABASHKA_ARCH:-amd64} + archive="babashka-$VERSION-$BABASHKA_PLATFORM-$arch.tar.gz" + tar zcvf "$archive" bb + export GITHUB_TOKEN=ENCRYPTED[d6ff8cdc392157f211c754fa0763875434d1bfde0c00a05e48ba9470003a76c14c9213adb80623f81e13f2f0fa8fbd57] + ./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive" || true + binaries_artifacts: + path: "./bb" From 05223adf7ea540a8e967c1272063eddc8c31761c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 21:49:00 +0200 Subject: [PATCH 174/550] release --- script/babashka/release_artifact.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/babashka/release_artifact.clj b/script/babashka/release_artifact.clj index f34f766e..bd6ca26f 100644 --- a/script/babashka/release_artifact.clj +++ b/script/babashka/release_artifact.clj @@ -8,6 +8,7 @@ (System/getenv "APPVEYOR_REPO_BRANCH") (System/getenv "CIRCLE_BRANCH") (System/getenv "GITHUB_REF_NAME") + (System/getenv "CIRRUS_BRANCH") (-> (sh "git" "rev-parse" "--abbrev-ref" "HEAD") :out str/trim))) @@ -17,6 +18,7 @@ _ (println "Github token found") file (first args) branch (current-branch) + _ (println "On branch:" branch) current-version (-> (slurp "resources/BABASHKA_VERSION") str/trim)] From 1669983cb2c6120c24f0d7cef0dfed0a4f253195 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 22:15:36 +0200 Subject: [PATCH 175/550] github token --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 98bf11a0..0beb47b5 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,6 +10,7 @@ task: BABASHKA_ARCH: aarch64 BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" + GITHUB_TOKEN: ENCRYPTED[d6ff8cdc392157f211c754fa0763875434d1bfde0c00a05e48ba9470003a76c14c9213adb80623f81e13f2f0fa8fbd57] script: | git submodule init git submodule update @@ -31,7 +32,6 @@ task: arch=${BABASHKA_ARCH:-amd64} archive="babashka-$VERSION-$BABASHKA_PLATFORM-$arch.tar.gz" tar zcvf "$archive" bb - export GITHUB_TOKEN=ENCRYPTED[d6ff8cdc392157f211c754fa0763875434d1bfde0c00a05e48ba9470003a76c14c9213adb80623f81e13f2f0fa8fbd57] ./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive" || true binaries_artifacts: path: "./bb" From f0a9e2b88cec07ab18b4d1e3df48cf4883adf041 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 22:16:30 +0200 Subject: [PATCH 176/550] cirrus --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 0beb47b5..f4399631 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -34,4 +34,4 @@ task: tar zcvf "$archive" bb ./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive" || true binaries_artifacts: - path: "./bb" + path: "babashka-*.tar.gz" From c0d4127b570217a0b247af6659ba9ce45887b787 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 22:24:57 +0200 Subject: [PATCH 177/550] cirrus --- .cirrus.yml | 4 ++-- script/babashka/release_artifact.clj | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index f4399631..359c15c8 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -25,8 +25,8 @@ task: script/uberjar script/compile - script/test - script/run_lib_tests + # script/test + # script/run_lib_tests VERSION=$(cat resources/BABASHKA_VERSION) arch=${BABASHKA_ARCH:-amd64} diff --git a/script/babashka/release_artifact.clj b/script/babashka/release_artifact.clj index bd6ca26f..09d3ba3f 100644 --- a/script/babashka/release_artifact.clj +++ b/script/babashka/release_artifact.clj @@ -17,6 +17,7 @@ (let [ght (System/getenv "GITHUB_TOKEN") _ (println "Github token found") file (first args) + _ (println "File" file) branch (current-branch) _ (println "On branch:" branch) current-version From 3c7468b6de15f39df5ad952ce936e143b7d29910 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 22:55:47 +0200 Subject: [PATCH 178/550] cirrus --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 359c15c8..8b56b5b9 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -32,6 +32,6 @@ task: arch=${BABASHKA_ARCH:-amd64} archive="babashka-$VERSION-$BABASHKA_PLATFORM-$arch.tar.gz" tar zcvf "$archive" bb - ./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive" || true + ./bb --config .build/bb.edn --deps-root . release-artifact "$archive" || true binaries_artifacts: path: "babashka-*.tar.gz" From ed0875b52bedfe60caaa488ad87d768797807dbb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 7 Jun 2022 23:12:33 +0200 Subject: [PATCH 179/550] install script [skip ci] --- install | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/install b/install index 50a07309..cf1fb916 100755 --- a/install +++ b/install @@ -74,7 +74,7 @@ if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then fi if [[ "$version" == "" ]]; then - version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)" + version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)" fi case "$(uname -s)" in @@ -82,21 +82,27 @@ case "$(uname -s)" in Darwin*) platform=macos;; esac -case "$(uname -m)" in - aarch64) arch=aarch64;; - *) arch=amd64;; -esac - # Ugly ugly conversion of version to a comparable number IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}" vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}") +case "$(uname -m)" in + aarch64) arch=aarch64;; + arm64) if [[ 10#$vernum -le 10#000008002 ]]; then + arch="amd64" + else + arch="aarch64" + fi + ;; + *) arch=amd64;; +esac + if [[ 10#$vernum -le 10#000002013 ]]; then - ext="zip" - util="$(which unzip) -qqo" + ext="zip" + util="$(which unzip) -qqo" else - ext="tar.gz" - util="$(which tar) -zxf" + ext="tar.gz" + util="$(which tar) -zxf" fi case "$platform-$static_binary" in @@ -121,13 +127,13 @@ download_url="https://github.com/babashka/$repo/releases/download/v$version/$fil # macOS only have shasum available by default # Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both) if command -v sha256sum >/dev/null; then - sha256sum_cmd="sha256sum" + sha256sum_cmd="sha256sum" elif command -v shasum >/dev/null; then - sha256sum_cmd="shasum -a 256" + sha256sum_cmd="shasum -a 256" else - >&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!" - >&2 echo "Exiting..." - exit 1 + >&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!" + >&2 echo "Exiting..." + exit 1 fi # Running this part in a subshell so when it finishes we go back to the previous directory From ecdf952b235151e5bcfe308459f4d9035eb992cf Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 14:09:04 +0200 Subject: [PATCH 180/550] Bump sci --- .../babashka/impl/datascript.clj | 7 +++--- feature-jdbc/babashka/impl/jdbc.clj | 17 +++++++------- feature-transit/babashka/impl/transit.clj | 9 ++++---- feature-xml/babashka/impl/xml.clj | 2 +- sci | 2 +- src/babashka/impl/bencode.clj | 8 +++---- src/babashka/impl/cheshire.clj | 5 ++--- src/babashka/impl/clojure/core/async.clj | 7 +++--- src/babashka/impl/clojure/zip.clj | 5 ++--- src/babashka/impl/curl.clj | 8 +++---- src/babashka/impl/data.clj | 8 +++---- src/babashka/impl/datafy.clj | 3 +-- src/babashka/impl/patches/datafy.clj | 22 ++++++++++--------- src/babashka/impl/tools/cli.clj | 5 ++--- 14 files changed, 53 insertions(+), 55 deletions(-) diff --git a/feature-datascript/babashka/impl/datascript.clj b/feature-datascript/babashka/impl/datascript.clj index 986723f3..e6e33fd8 100644 --- a/feature-datascript/babashka/impl/datascript.clj +++ b/feature-datascript/babashka/impl/datascript.clj @@ -2,11 +2,10 @@ {:no-doc true} (:require [datascript.core :as d] [datascript.db :as db] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + [sci.core :as sci :refer [copy-var]])) -(def datascript-ns (vars/->SciNamespace 'datascript.core nil)) -(def datascript-db-ns (vars/->SciNamespace 'datascript.db nil)) +(def datascript-ns (sci/create-ns 'datascript.core nil)) +(def datascript-db-ns (sci/create-ns 'datascript.db nil)) (def datascript-namespace {'create-conn (copy-var d/create-conn datascript-ns) diff --git a/feature-jdbc/babashka/impl/jdbc.clj b/feature-jdbc/babashka/impl/jdbc.clj index a9a4a3bc..23c28950 100644 --- a/feature-jdbc/babashka/impl/jdbc.clj +++ b/feature-jdbc/babashka/impl/jdbc.clj @@ -1,12 +1,13 @@ (ns babashka.impl.jdbc {:no-doc true} - (:require [next.jdbc :as njdbc] - [next.jdbc.result-set :as rs] - [next.jdbc.sql :as sql] - [sci.impl.namespaces :refer [copy-var macrofy]] - [sci.impl.vars :as vars])) + (:require + [next.jdbc :as njdbc] + [next.jdbc.result-set :as rs] + [next.jdbc.sql :as sql] + [sci.core :as sci] + [sci.impl.namespaces :refer [copy-var macrofy]])) -(def next-ns (vars/->SciNamespace 'next.jdbc nil)) +(def next-ns (sci/create-ns 'next.jdbc nil)) (defn with-transaction "Given a transactable object, gets a connection and binds it to `sym`, @@ -31,12 +32,12 @@ 'transact (copy-var njdbc/transact next-ns) 'with-transaction (macrofy 'with-transaction with-transaction next-ns)}) -(def sns (vars/->SciNamespace 'next.jdbc.sql nil)) +(def sns (sci/create-ns 'next.jdbc.sql nil)) (def next-sql-namespace {'insert-multi! (copy-var sql/insert-multi! sns)}) -(def rsns (vars/->SciNamespace 'next.jdbc.result-set nil)) +(def rsns (sci/create-ns 'next.jdbc.result-set nil)) (def result-set-namespace {'as-maps (copy-var rs/as-maps rsns) diff --git a/feature-transit/babashka/impl/transit.clj b/feature-transit/babashka/impl/transit.clj index ab249c6a..15b0f19a 100644 --- a/feature-transit/babashka/impl/transit.clj +++ b/feature-transit/babashka/impl/transit.clj @@ -1,10 +1,9 @@ (ns babashka.impl.transit - (:require [cognitect.transit :as transit] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + (:require + [cognitect.transit :as transit] + [sci.core :as sci :refer [copy-var]])) - -(def tns (vars/->SciNamespace 'cognitect.transit nil)) +(def tns (sci/create-ns 'cognitect.transit nil)) (def transit-namespace {'write (copy-var transit/write tns) diff --git a/feature-xml/babashka/impl/xml.clj b/feature-xml/babashka/impl/xml.clj index d889aa79..123310e5 100644 --- a/feature-xml/babashka/impl/xml.clj +++ b/feature-xml/babashka/impl/xml.clj @@ -12,7 +12,7 @@ (def xtns (sci/create-ns 'clojure.data.xml.tree nil)) (defn- clj-ns-name [ns] - (cond (instance? sci.impl.vars.SciNamespace ns) (str ns) + (cond (instance? sci.lang.Namespace ns) (str ns) (keyword? ns) (name ns) :else (str ns))) diff --git a/sci b/sci index 15ef9bd1..7c04d1a5 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 15ef9bd19df0446c7fc7cc245d0d36c2503dc102 +Subproject commit 7c04d1a5c0be084da520b6bafd1dda7053d06a43 diff --git a/src/babashka/impl/bencode.clj b/src/babashka/impl/bencode.clj index 70ed7ea1..b608b7d9 100644 --- a/src/babashka/impl/bencode.clj +++ b/src/babashka/impl/bencode.clj @@ -1,10 +1,10 @@ (ns babashka.impl.bencode {:no-doc true} - (:require [bencode.core :as bencode] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + (:require + [bencode.core :as bencode] + [sci.core :as sci :refer [copy-var]])) -(def tns (vars/->SciNamespace 'bencode.core nil)) +(def tns (sci/create-ns 'bencode.core nil)) (def bencode-namespace {'read-bencode (copy-var bencode/read-bencode tns) diff --git a/src/babashka/impl/cheshire.clj b/src/babashka/impl/cheshire.clj index 6ce73d43..4e89afcb 100644 --- a/src/babashka/impl/cheshire.clj +++ b/src/babashka/impl/cheshire.clj @@ -1,10 +1,9 @@ (ns babashka.impl.cheshire {:no-doc true} (:require [cheshire.core :as json] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + [sci.core :as sci :refer [copy-var]])) -(def tns (vars/->SciNamespace 'cheshire.core nil)) +(def tns (sci/create-ns 'cheshire.core nil)) (def cheshire-core-namespace {'encode (copy-var json/encode tns) diff --git a/src/babashka/impl/clojure/core/async.clj b/src/babashka/impl/clojure/core/async.clj index d530af64..686fb34d 100644 --- a/src/babashka/impl/clojure/core/async.clj +++ b/src/babashka/impl/clojure/core/async.clj @@ -2,7 +2,8 @@ {:no-doc true} (:require [clojure.core.async :as async] [clojure.core.async.impl.protocols :as protocols] - [sci.impl.namespaces :refer [copy-var macrofy]] + [sci.core :as sci :refer [copy-var]] + [sci.impl.namespaces :refer [macrofy]] [sci.impl.vars :as vars])) (def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor) @@ -39,7 +40,7 @@ [_ _ bindings & body] (list 'clojure.core.async/thread (list* 'loop bindings body))) -(def core-async-namespace (vars/->SciNamespace 'clojure.core.async nil)) +(def core-async-namespace (sci/create-ns 'clojure.core.async nil)) (def async-namespace {:obj core-async-namespace @@ -109,7 +110,7 @@ 'alts! (copy-var async/alts!! core-async-namespace {:name 'alts!}) 'go-loop (macrofy 'go-loop go-loop core-async-namespace)}) -(def async-protocols-ns (vars/->SciNamespace 'clojure.core.async.impl.protocols nil)) +(def async-protocols-ns (sci/create-ns 'clojure.core.async.impl.protocols nil)) (def async-protocols-namespace {:obj async-protocols-ns diff --git a/src/babashka/impl/clojure/zip.clj b/src/babashka/impl/clojure/zip.clj index 8a101d26..67ee39d1 100644 --- a/src/babashka/impl/clojure/zip.clj +++ b/src/babashka/impl/clojure/zip.clj @@ -1,10 +1,9 @@ (ns babashka.impl.clojure.zip {:no-doc true} (:require [clojure.zip :as zip] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + [sci.core :as sci :refer [copy-var]])) -(def zip-ns (vars/->SciNamespace 'clojure.zip nil)) +(def zip-ns (sci/create-ns 'clojure.zip nil)) (def zip-namespace {'zipper (copy-var zip/zipper zip-ns) diff --git a/src/babashka/impl/curl.clj b/src/babashka/impl/curl.clj index 264a5443..ce0d36bc 100644 --- a/src/babashka/impl/curl.clj +++ b/src/babashka/impl/curl.clj @@ -1,10 +1,10 @@ (ns babashka.impl.curl {:no-doc true} - (:require [babashka.curl :as curl] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + (:require + [babashka.curl :as curl] + [sci.core :as sci :refer [copy-var]])) -(def tns (vars/->SciNamespace 'babashka.curl nil)) +(def tns (sci/create-ns 'babashka.curl nil)) (def curl-namespace {'request (copy-var curl/request tns) diff --git a/src/babashka/impl/data.clj b/src/babashka/impl/data.clj index fd38dfa5..e5900b89 100644 --- a/src/babashka/impl/data.clj +++ b/src/babashka/impl/data.clj @@ -1,10 +1,10 @@ (ns babashka.impl.data {:no-doc true} - (:require [babashka.impl.clojure.data :as data] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + (:require + [babashka.impl.clojure.data :as data] + [sci.core :as sci :refer [copy-var]])) -(def data-ns (vars/->SciNamespace 'clojure.data nil)) +(def data-ns (sci/create-ns 'clojure.data nil)) (def data-namespace {'diff (copy-var data/diff data-ns)}) diff --git a/src/babashka/impl/datafy.clj b/src/babashka/impl/datafy.clj index d0c7a3e5..4f389fc8 100644 --- a/src/babashka/impl/datafy.clj +++ b/src/babashka/impl/datafy.clj @@ -3,8 +3,7 @@ (:refer-clojure :exclude [create-ns]) (:require [babashka.impl.protocols :as protocols] - [sci.core :as sci :refer [copy-var]] - [sci.impl.vars])) + [sci.core :as sci :refer [copy-var]])) (def datafy-ns (sci/create-ns 'clojure.datafy nil)) diff --git a/src/babashka/impl/patches/datafy.clj b/src/babashka/impl/patches/datafy.clj index c0127599..738e664c 100644 --- a/src/babashka/impl/patches/datafy.clj +++ b/src/babashka/impl/patches/datafy.clj @@ -1,13 +1,15 @@ (ns babashka.impl.patches.datafy - (:require [babashka.impl.common :refer [ctx]] - [clojure.core.protocols :as p] - [clojure.datafy] - ;; ensure datafy is loaded, we're going to override its - ;; clojure.lang.Namespace implementation for datafy - [clojure.reflect] - [sci.impl.namespaces :refer [sci-ns-name sci-ns-publics sci-ns-imports sci-ns-interns]] - [sci.impl.vars]) - (:import [sci.impl.vars SciNamespace])) + (:require ;; ensure datafy is loaded, we're going to override its + ;; clojure.lang.Namespace implementation for datafy + [babashka.impl.common :refer [ctx]] + [clojure.core.protocols :as p] + [clojure.datafy] + [clojure.reflect] + [sci.impl.namespaces :refer [sci-ns-imports sci-ns-interns sci-ns-name + sci-ns-publics]] + [sci.impl.vars]) + (:import + [sci.lang Namespace])) (defn- sortmap [m] (into (sorted-map) m)) @@ -29,7 +31,7 @@ (assoc ret :name (-> c .getName symbol) :members (->> members (group-by :name) sortmap))))) (extend-protocol p/Datafiable - SciNamespace + Namespace (datafy [n] (with-meta {:name (sci-ns-name n) :publics (->> n (sci-ns-publics @ctx) sortmap) diff --git a/src/babashka/impl/tools/cli.clj b/src/babashka/impl/tools/cli.clj index 10f4045b..f1db19c1 100644 --- a/src/babashka/impl/tools/cli.clj +++ b/src/babashka/impl/tools/cli.clj @@ -1,10 +1,9 @@ (ns babashka.impl.tools.cli {:no-doc true} (:require [clojure.tools.cli :as tools.cli] - [sci.impl.namespaces :refer [copy-var]] - [sci.impl.vars :as vars])) + [sci.core :as sci :refer [copy-var]])) -(def cli-ns (vars/->SciNamespace 'clojure.tools.cli nil)) +(def cli-ns (sci/create-ns 'clojure.tools.cli nil)) (def tools-cli-namespace {'format-lines (copy-var tools.cli/format-lines cli-ns) From 30ebdfb6e09bb0b7b1706e16b5d4b15f46346772 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 17:41:23 +0200 Subject: [PATCH 181/550] SCI: record in syntax quote resolves to Type --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 7c04d1a5..79826aab 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 7c04d1a5c0be084da520b6bafd1dda7053d06a43 +Subproject commit 79826aab74980e2143859218ccafbaff89b08042 From ba0ce4ca23b3fbfb9ab072e3fd62c83b3c9b0a91 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 17:44:50 +0200 Subject: [PATCH 182/550] Update --- resources/META-INF/babashka/deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 01b1265d..b88a7ba7 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -17,7 +17,7 @@ "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" "resources" "sci/resources"], - :deps {org.clojure/clojure {:mvn/version "1.11.0"}, + :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} @@ -38,7 +38,7 @@ org.postgresql/postgresql {:mvn/version "42.2.18"} org.hsqldb/hsqldb {:mvn/version "2.5.1"} datascript/datascript {:mvn/version "1.0.1"} - http-kit/http-kit {:mvn/version "2.5.3"} + http-kit/http-kit {:mvn/version "2.6.0-RC1"} babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"} org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} From e290c3c2e06d000a54cfc61e1f98e4bc630b0f02 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 19:16:51 +0200 Subject: [PATCH 183/550] SCI: defprotocol symbol --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 79826aab..75117e61 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 79826aab74980e2143859218ccafbaff89b08042 +Subproject commit 75117e6139d0026d4dd035932862134a21c2c41a From 60da44512e7204e83cd3b3155903453294966be3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 19:40:56 +0200 Subject: [PATCH 184/550] v0.8.156 --- CHANGELOG.md | 23 ++++++++++++++++++++--- resources/BABASHKA_VERSION | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29a76f03..042c2d43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,27 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 0.8.156 (2022-06-08) -- #1264: add support for calling `ScheduledExecutorService` -- Add `java.net.BindException` +- macOS aarch64 support (M1 processor) +- Support for running [prismatic/schema](https://github.com/plumatic/schema) + from source. There is an outstanding PR for babashka. Meanwhile you can use + [this](https://github.com/borkdude/schema) fork. +- SCI: many small improvements, especially in `defrecord` (discovered while + trying to make `schema.core` work) +- babashka.nrepl: fix completions for static Java interop +- `fs/read-all-lines`, support charset +- fs: `strip` and `split-ext` are less reliant on file system and are now just + string operations +- Bump cheshire +- Add `babashka.process/exec` for exec call (replacing the current process) +- Improve `babashka.process/tokenize` +- [#1264](https://github.com/babashka/babashka/issues/1264): add support for calling `ScheduledExecutorService` +- Add support for `sun.misc.SignalHandler` +- Add `java.net.BindException`, `clojure.lang.AFunction`, `AbstractMethodError` +- Upgrade httpkit to `2.6.0-RC1` +- Add `process/shell`, similar to `babashka.tasks/shell` but in process ns +- pods: fix benign socket closed exception error output ## 0.8.2 (2022-05-06) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 3840d295..5adb3a3d 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.3-SNAPSHOT \ No newline at end of file +0.8.156 \ No newline at end of file From e9797652753d0f67653fb553e217b1e88523b884 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 20:06:21 +0200 Subject: [PATCH 185/550] CHANGELOGS --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 042c2d43..fad2836e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,14 @@ A preview of the next release can be installed from ## 0.8.156 (2022-06-08) -- macOS aarch64 support (M1 processor) +- macOS aarch64 support. Upgrading via brew or the installer script should + install the aarch64 version on an M1 system. - Support for running [prismatic/schema](https://github.com/plumatic/schema) - from source. There is an outstanding PR for babashka. Meanwhile you can use + from source. There is an open PR for babashka. Until it is merged you can use [this](https://github.com/borkdude/schema) fork. - SCI: many small improvements, especially in `defrecord` (discovered while trying to make `schema.core` work) +- Switch version schema to major.minor.release_count. - babashka.nrepl: fix completions for static Java interop - `fs/read-all-lines`, support charset - fs: `strip` and `split-ext` are less reliant on file system and are now just From ebdbd9ea00cf09ecd7849c46dfc3e0028eb70f02 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 20:06:28 +0200 Subject: [PATCH 186/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 53a48a1e..5adb3a3d 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.8.2 \ No newline at end of file +0.8.156 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 5adb3a3d..e9d5a041 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.156 \ No newline at end of file +0.8.157-SNAPSHOT \ No newline at end of file From 34bd4edf1ea2208021939317fd55fba9abca5e00 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 8 Jun 2022 20:15:44 +0200 Subject: [PATCH 187/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fad2836e..b8ac8280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ A preview of the next release can be installed from install the aarch64 version on an M1 system. - Support for running [prismatic/schema](https://github.com/plumatic/schema) from source. There is an open PR for babashka. Until it is merged you can use - [this](https://github.com/borkdude/schema) fork. + [this](https://github.com/borkdude/schema/tree/bb-test-suite) fork. - SCI: many small improvements, especially in `defrecord` (discovered while trying to make `schema.core` work) - Switch version schema to major.minor.release_count. From 115f89ac81c564ed17db80edc590c2e8e5146f3c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 9 Jun 2022 08:52:21 +0200 Subject: [PATCH 188/550] Fix feature map --- src/babashka/main.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 35f0e107..0a3627a2 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -250,6 +250,7 @@ Use bb run --help to show this help output. :feature/yaml %s :feature/jdbc %s :feature/postgresql %s + :feature/sqlite %s :feature/hsqldb %s :feature/oracledb %s :feature/httpkit-client %s @@ -268,8 +269,8 @@ Use bb run --help to show this help output. features/xml? features/yaml? features/jdbc? - features/sqlite? features/postgresql? + features/sqlite? features/hsqldb? features/oracledb? features/httpkit-client? From 39f057b3aed34d7a95b172ed9de7d88dd0daa90c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 15 Jun 2022 17:58:58 +0200 Subject: [PATCH 189/550] SCI update --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 75117e61..6c859336 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 75117e6139d0026d4dd035932862134a21c2c41a +Subproject commit 6c859336a92d91418611a70152a5590889d88814 From 14b177ad2164518fc5f9a50ac853c5fa1805c7e6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 15 Jun 2022 21:13:53 +0200 Subject: [PATCH 190/550] Add schema tests to CI, fixes #1296 --- deps.edn | 5 ++++- .../lib_tests/babashka/run_all_libtests.clj | 12 ++++++++++-- test-resources/lib_tests/bb-tested-libs.edn | 11 +++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index b88a7ba7..3dd253d6 100644 --- a/deps.edn +++ b/deps.edn @@ -138,7 +138,10 @@ com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.rpl/specter {:mvn/version "1.1.4"} com.github.askonomm/clarktown {:mvn/version "1.1.2"} - org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}} + org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"} + prismatic/schema {:git/url "https://github.com/plumatic/schema" + :git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff" + :git/tag "schema-1.3.0"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/babashka/run_all_libtests.clj b/test-resources/lib_tests/babashka/run_all_libtests.clj index 56fcda74..72c9d8fb 100644 --- a/test-resources/lib_tests/babashka/run_all_libtests.clj +++ b/test-resources/lib_tests/babashka/run_all_libtests.clj @@ -1,5 +1,7 @@ (ns babashka.run-all-libtests - (:require [babashka.core :refer [windows?]] + (:require [babashka.classpath :as cp :refer [add-classpath]] + [babashka.core :refer [windows?]] + [babashka.fs :as fs] [clojure.edn :as edn] [clojure.java.io :as io] [clojure.test :as t :refer [*report-counters*]])) @@ -42,7 +44,13 @@ ;; Standard test-runner for libtests (let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn")))] - (doseq [{tns :test-namespaces skip-windows :skip-windows} (vals lib-tests)] + (doseq [[libname {tns :test-namespaces skip-windows :skip-windows + :keys [test-paths + git-sha]}] lib-tests] + (let [git-dir (format ".gitlibs/libs/%s/%s" libname git-sha) + git-dir (fs/file (fs/home) git-dir)] + (doseq [p test-paths] + (add-classpath (str (fs/file git-dir p))))) (when-not (and skip-windows (windows?)) (apply test-namespaces tns)))) diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 9cd8076e..7c46100b 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -114,4 +114,15 @@ com.rpl/specter {:git-url "https://github.com/redplanetlabs/specter", :test-namespaces (com.rpl.specter.cljs-test-helpers com.rpl.specter.test-helpers com.rpl.specter.core-test com.rpl.specter.zipper-test), :git-sha "67e86806020b9d02fbca8cdb1efad3002fc81a32"} com.github.askonomm/clarktown {:git-url "https://github.com/askonomm/clarktown", :test-namespaces (clarktown.core-test clarktown.parsers.horizontal-line-block-test clarktown.parsers.italic-test clarktown.parsers.link-and-image-test clarktown.parsers.empty-block-test clarktown.parsers.inline-code-test clarktown.parsers.heading-block-test clarktown.parsers.bold-test clarktown.parsers.quote-block-test clarktown.parsers.code-block-test clarktown.parsers.strikethrough-test), :git-sha "059bfa7bd9bfdde0c75646bf1dfc20d23da8a02c"} org.clojure/math.numeric-tower {:git-url "https://github.com/clojure/math.numeric-tower", :test-namespaces (clojure.math.test-numeric-tower), :git-sha "97827be66f35feebc3c89ba81c546fef4adc7947"} + prismatic/schema {:test-namespaces [schema.core-test + schema.macros-test + schema.coerce-test + schema.experimental.abstract-map-test + schema.test-test + schema.utils-test] + :git-url "https://github.com/plumatic/schema" + :git-sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff" + :git-tag "schema-1.3.0" + ;; specify for adding tests to classpath + :test-paths ["test/clj" "test/cljc"]} } From 56d2c2b7d5d3cab72fa8c425602e6fb2ea21db08 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 19 Jun 2022 20:38:49 +0200 Subject: [PATCH 191/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 6c859336..f91e73a7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6c859336a92d91418611a70152a5590889d88814 +Subproject commit f91e73a7fadef86dc32ac8a58e77a25550322f4c From cc2c682e79f3252b7ee97cecb82515f1ef41ba65 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 19 Jun 2022 22:41:52 +0200 Subject: [PATCH 192/550] SCI now has memfn --- sci | 2 +- src/babashka/impl/clojure/core.clj | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sci b/sci index f91e73a7..ce01ada6 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f91e73a7fadef86dc32ac8a58e77a25550322f4c +Subproject commit ce01ada6177cb4b1abd1836534952e728aa0427f diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index ce03b1e3..5a861698 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -195,7 +195,6 @@ 'iteration (sci/copy-var iteration clojure-core-ns) 'abs (sci/copy-var abs clojure-core-ns) 'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns) - 'memfn (sci/copy-var memfn clojure-core-ns) 'into-array (sci/copy-var into-array clojure-core-ns) 'print-method (sci/copy-var print-method clojure-core-ns) 'print-dup (sci/copy-var print-dup clojure-core-ns)} From 0a55554bb8522d42dd2d42bfe3ab718761e5e0b1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 19 Jun 2022 23:03:01 +0200 Subject: [PATCH 193/550] SCI: preserve docstring --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index ce01ada6..c8fba424 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit ce01ada6177cb4b1abd1836534952e728aa0427f +Subproject commit c8fba42400a9c0ce546c372080417c3f0db8abe6 From 9ed705f8db6826b34d8f42443a68db469f25e8d6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 20 Jun 2022 12:14:48 +0200 Subject: [PATCH 194/550] Pod namespaces come before namespaces from source --- src/babashka/main.clj | 73 ++++++++++++++++++++----------------- test/babashka/deps_test.clj | 2 + 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 0a3627a2..c68d7369 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -773,40 +773,45 @@ Use bb run --help to show this help output. _ (when jar (cp/add-classpath jar)) load-fn (fn [{:keys [:namespace :reload]}] - (or (when-let [{:keys [:loader]} - @cp/cp-state] - (if ;; ignore built-in namespaces when uberscripting, unless with :reload - (and uberscript - (not reload) - (or (contains? namespaces namespace) - (contains? sci-namespaces/namespaces namespace))) - "" - (when-let [res (cp/source-for-namespace loader namespace nil)] - (if uberscript - (do (swap! uberscript-sources conj (:source res)) - (uberscript/uberscript {:ctx @common/ctx - :expressions [(:source res)]}) - {}) - res)))) - (if-let [pod (get @pod-namespaces namespace)] - (if uberscript - (do - (swap! uberscript-sources conj - (format - "(babashka.pods/load-pod '%s \"%s\" '%s)\n" - (:pod-spec pod) (:version (:opts pod)) - (dissoc (:opts pod) - :version :metadata))) - {}) - (pods/load-pod (:pod-spec pod) (:opts pod))) - (case namespace - clojure.spec.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) - clojure.core.specs.alpha - (binding [*out* *err*] - (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) - nil)))) + (let [{:keys [loader]} + @cp/cp-state] + (or + (when ;; ignore built-in namespaces when uberscripting, unless with :reload + (and uberscript + (not reload) + (or (contains? namespaces namespace) + (contains? sci-namespaces/namespaces namespace))) + "") + ;; pod namespaces go before namespaces from source, + ;; unless reload is used + (when-not reload + (when-let [pod (get @pod-namespaces namespace)] + (if uberscript + (do + (swap! uberscript-sources conj + (format + "(babashka.pods/load-pod '%s \"%s\" '%s)\n" + (:pod-spec pod) (:version (:opts pod)) + (dissoc (:opts pod) + :version :metadata))) + {}) + (pods/load-pod (:pod-spec pod) (:opts pod))))) + (when loader + (when-let [res (cp/source-for-namespace loader namespace nil)] + (if uberscript + (do (swap! uberscript-sources conj (:source res)) + (uberscript/uberscript {:ctx @common/ctx + :expressions [(:source res)]}) + {}) + res))) + (case namespace + clojure.spec.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha")) + clojure.core.specs.alpha + (binding [*out* *err*] + (println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency.")) + nil)))) main (if (and jar (not main)) (when-let [res (cp/getResource (cp/loader jar) diff --git a/test/babashka/deps_test.clj b/test/babashka/deps_test.clj index 397a01f9..d3edade2 100644 --- a/test/babashka/deps_test.clj +++ b/test/babashka/deps_test.clj @@ -35,6 +35,7 @@ (bb (pr-str `(do (babashka.deps/add-deps '{:deps {babashka/process {:git/url "https://github.com/babashka/process" :sha "4c6699d06b49773d3e5c5b4c11d3334fb78cc996"}}} {:force true :env {"PATH" (System/getenv "PATH") + "JAVA_HOME" (System/getenv "JAVA_HOME") "GITLIBS" ~(str libs-dir)}}) nil))) (bb (pr-str `(do (babashka.deps/add-deps '{:deps {babashka/process {:git/url "https://github.com/babashka/process" :sha "4c6699d06b49773d3e5c5b4c11d3334fb78cc996"}}} {:force true @@ -86,6 +87,7 @@ true libs-dir2 (fs/file tmp-dir ".gitlibs2") template (pr-str '(do (babashka.deps/clojure ["-Sforce" "-Spath" "-Sdeps" "{:deps {babashka/process {:git/url \"https://github.com/babashka/process\" :sha \"4c6699d06b49773d3e5c5b4c11d3334fb78cc996\"}}}"] {:out :string :env-key {"PATH" (System/getenv "PATH") + "JAVA_HOME" (System/getenv "JAVA_HOME") "GITLIBS" :gitlibs}}) nil))] (bb (-> template (str/replace ":gitlibs" (pr-str (str libs-dir))) (str/replace ":env-key" ":env"))) From 573db8ea79ab1e347440fbb33ebbe112f9de9765 Mon Sep 17 00:00:00 2001 From: Odd A Date: Mon, 20 Jun 2022 12:48:31 +0200 Subject: [PATCH 195/550] Exposing babashka.nrepl.server-functions (#1297) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Odd Andreas Sørsæther Co-authored-by: Odd Andreas Sørsæther --- CHANGELOG.md | 5 +++++ src/babashka/impl/nrepl_server.clj | 16 ++++++++++++++++ src/babashka/main.clj | 2 ++ 3 files changed, 23 insertions(+) create mode 100644 src/babashka/impl/nrepl_server.clj diff --git a/CHANGELOG.md b/CHANGELOG.md index b8ac8280..5a2d6143 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +- Expose `babashka.nrepl.server/start-server!`- and `stop-server!`-functions to support programmatically starting + an nrepl-server. `start-server!` is redefined to not require a sci-context as its first argument. + ## 0.8.156 (2022-06-08) - macOS aarch64 support. Upgrading via brew or the installer script should diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj new file mode 100644 index 00000000..f20e239b --- /dev/null +++ b/src/babashka/impl/nrepl_server.clj @@ -0,0 +1,16 @@ +(ns babashka.impl.nrepl-server + {:no-doc true} + (:require [babashka.impl.common :as common] + [babashka.nrepl.server :refer [start-server! stop-server!]] + [sci.core :refer [create-ns new-var copy-var]])) + +(def nrepl-server-namespace + (let [ns-sci (create-ns 'babashka.nrepl.server)] + {'start-server! (new-var 'start-server! + (fn + ([] + (start-server! @common/ctx)) + ([opts] + (start-server! @common/ctx opts))) + {:ns ns-sci}) + 'stop-server! (copy-var stop-server! ns-sci)})) \ No newline at end of file diff --git a/src/babashka/main.clj b/src/babashka/main.clj index c68d7369..0aacc00b 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -32,6 +32,7 @@ [babashka.impl.error-handler :refer [error-handler]] [babashka.impl.features :as features] [babashka.impl.fs :refer [fs-namespace]] + [babashka.impl.nrepl-server :refer [nrepl-server-namespace]] [babashka.impl.pods :as pods] [babashka.impl.pprint :refer [pprint-namespace]] [babashka.impl.print-deps :as print-deps] @@ -354,6 +355,7 @@ Use bb run --help to show this help output. 'clojure.tools.cli tools-cli-namespace 'clojure.java.shell shell-namespace 'babashka.core bbcore/core-namespace + 'babashka.nrepl.server nrepl-server-namespace 'babashka.wait wait-namespace 'babashka.signal signal-ns 'clojure.java.io io-namespace From 77696756481ae6757fd4187f4efe9213be5a1c13 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 20 Jun 2022 12:49:01 +0200 Subject: [PATCH 196/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index c8fba424..09591be1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c8fba42400a9c0ce546c372080417c3f0db8abe6 +Subproject commit 09591be1668488b3165ff6c41e750467ad1fe751 From 381b9f0a4f12bc47097c4d26a9b475bcf67f0a62 Mon Sep 17 00:00:00 2001 From: agata-anastazja Date: Mon, 20 Jun 2022 19:03:03 +0100 Subject: [PATCH 197/550] use dynamic configuration to short CI (#1294) --- .build/bb.edn | 9 +- .circleci/config.yml | 515 ++-------------------------------- .circleci/script/short_ci.clj | 250 +++++++++++++++++ 3 files changed, 268 insertions(+), 506 deletions(-) create mode 100644 .circleci/script/short_ci.clj diff --git a/.build/bb.edn b/.build/bb.edn index 13e47f4a..c1e5ff3e 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -2,10 +2,5 @@ :deps {borkdude/gh-release-artifact #_{:local/root "../gh-release-artifact"} {:git/url "https://github.com/borkdude/gh-release-artifact" - :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"} - babashka/.build {:git/url "https://github.com/babashka/.build" - :git/sha "1ce87f4960fea14f4d1248052e585e6027555d33"}} - :tasks {:requires ([scripts.short-ci :as short]) - release-artifact babashka.release-artifact/release - short-ci {:task (do (alter-var-root (var short/config) assoc :skip-if-only [(re-pattern ".*")]) - (apply short/main *command-line-args*))}}} + :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}} + :tasks {release-artifact babashka.release-artifact/release}} diff --git a/.circleci/config.yml b/.circleci/config.yml index f156f337..3e0293e5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,17 +3,17 @@ # Check https://circleci.com/docs/2.0/language-clojure/ for more details # version: 2.1 -commands: - setup-docker-buildx: - steps: - - run: - name: Create multi-platform capabale buildx builder - command: | - docker run --privileged --rm tonistiigi/binfmt --install all - docker buildx create --name ci-builder --use +# this allows you to use CircleCI's dynamic configuration feature +setup: true + +# the continuation orb is required in order to use dynamic configuration +orbs: + continuation: circleci/continuation@0.1.2 + +# our defined job, and its steps jobs: - short-if-irrelevant: + setup: docker: - image: cimg/clojure:1.11.1 steps: @@ -27,497 +27,14 @@ jobs: name: Rename bb binary command: mv /tmp/bb /tmp/bbb - run: - name: Short CI if only irrelevant changes + name: Generate config command: | - /tmp/bbb --config .build/bb.edn short-ci "circleci-agent step halt" - - jvm: - docker: - - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - BABASHKA_PLATFORM: linux # could be used in jar name - resource_class: large - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - restore_cache: - keys: - - v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- - - run: - name: Install Clojure - command: | - sudo script/install-clojure - - run: - name: Run JVM tests - command: | - export BABASHKA_FEATURE_JDBC=true - export BABASHKA_FEATURE_POSTGRESQL=true - script/test - script/run_lib_tests - - run: - name: Run as lein command - command: | - .circleci/script/lein - - run: - name: Create uberjar - command: | - mkdir -p /tmp/release - script/uberjar - VERSION=$(cat resources/BABASHKA_VERSION) - jar=target/babashka-$VERSION-standalone.jar - cp $jar /tmp/release - java -jar $jar script/reflection.clj - reflection="babashka-$VERSION-reflection.json" - java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$jar" - java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$reflection" - - store_artifacts: - path: /tmp/release - destination: release - - save_cache: - paths: - - ~/.m2 - key: v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }} - linux: - docker: - - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 - BABASHKA_PLATFORM: linux # used in release script - BABASHKA_TEST_ENV: native - BABASHKA_XMX: "-J-Xmx6500m" - resource_class: large - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - restore_cache: - keys: - - linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - run: - name: Install Clojure - command: | - sudo script/install-clojure - - run: - name: Install native dev tools - command: | - sudo apt-get update - sudo apt-get -y install build-essential zlib1g-dev - - run: - name: Download GraalVM - command: | - script/install-graalvm - - run: - name: Build binary - command: | - script/uberjar - script/compile - no_output_timeout: 30m - - run: - name: Run tests - command: | - script/test - script/run_lib_tests - - run: - name: Release - command: | - .circleci/script/release - - persist_to_workspace: - root: /tmp - paths: - - release - - save_cache: - paths: - - ~/.m2 - - ~/graalvm-ce-java11-22.1.0 - key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - store_artifacts: - path: /tmp/release - destination: release - - run: - name: Publish artifact link to Slack - command: | - ./bb .circleci/script/publish_artifact.clj || true - linux-static: - docker: - - image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 - BABASHKA_PLATFORM: linux # used in release script - BABASHKA_TEST_ENV: native - BABASHKA_STATIC: "true" - BABASHKA_MUSL: "true" - BABASHKA_XMX: "-J-Xmx6500m" - resource_class: large - steps: - - checkout - - attach_workspace: - at: /tmp - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - # - run: - # name: "Short circuit on SNAPSHOT" - # command: | - # VERSION=$(cat resources/BABASHKA_VERSION) - # if [[ "$VERSION" == *-SNAPSHOT ]] - # then - # circleci task halt - # fi - - restore_cache: - keys: - - linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - run: - name: Install Clojure - command: | - sudo script/install-clojure - - run: - name: Install native dev tools - command: | - sudo apt-get update - sudo apt-get -y install build-essential zlib1g-dev - sudo -E script/setup-musl - - run: - name: Download GraalVM - command: | - script/install-graalvm - - run: - name: Build binary - command: | - script/uberjar - script/compile - no_output_timeout: 30m - - run: - name: Run tests - command: | - script/test - script/run_lib_tests - - run: - name: Release - command: | - .circleci/script/release - - persist_to_workspace: - root: /tmp - paths: - - release - - save_cache: - paths: - - ~/.m2 - - ~/graalvm-ce-java11-22.1.0 - key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - store_artifacts: - path: /tmp/release - destination: release - - run: - name: Publish artifact link to Slack - command: | - ./bb .circleci/script/publish_artifact.clj || true - linux-aarch64: - machine: - image: ubuntu-2004:202111-01 - resource_class: arm.large - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 - BABASHKA_PLATFORM: linux # used in release script - BABASHKA_ARCH: aarch64 - BABASHKA_TEST_ENV: native - BABASHKA_XMX: "-J-Xmx6500m" - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - run: - name: Install Clojure - command: | - sudo script/install-clojure - - restore_cache: - keys: - - linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - run: - name: Install native dev tools - command: | - sudo apt-get update - sudo apt-get -y install build-essential zlib1g-dev - - run: - name: Download GraalVM - command: | - script/install-graalvm - - run: - name: Build binary - command: | - script/uberjar - script/compile - no_output_timeout: 30m - - run: - name: Run tests - command: | - script/test - script/run_lib_tests - - run: - name: Release - command: | - .circleci/script/release - - persist_to_workspace: - root: /tmp - paths: - - release - - save_cache: - paths: - - ~/.m2 - - ~/graalvm-ce-java11-22.1.0 - key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - store_artifacts: - path: /tmp/release - destination: release - - run: - name: Publish artifact link to Slack - command: | - ./bb .circleci/script/publish_artifact.clj || true - linux-aarch64-static: - machine: - image: ubuntu-2004:202111-01 - resource_class: arm.large - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0 - BABASHKA_PLATFORM: linux # used in release script - BABASHKA_ARCH: aarch64 - BABASHKA_TEST_ENV: native - BABASHKA_XMX: "-J-Xmx6500m" - BABASHKA_STATIC: "true" - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - # - run: - # name: "Short circuit on SNAPSHOT" - # command: | - # VERSION=$(cat resources/BABASHKA_VERSION) - # if [[ "$VERSION" == *-SNAPSHOT ]] - # then - # circleci task halt - # fi - - run: - name: Install Clojure - command: | - sudo script/install-clojure - - restore_cache: - keys: - - linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - run: - name: Install native dev tools - command: | - sudo apt-get update - sudo apt-get -y install build-essential zlib1g-dev - # sudo -E script/setup-musl - - run: - name: Download GraalVM - command: | - script/install-graalvm - - run: - name: Build binary - command: | - script/uberjar - script/compile - no_output_timeout: 30m - - run: - name: Run tests - command: | - script/test - script/run_lib_tests - - run: - name: Release - command: | - .circleci/script/release - - persist_to_workspace: - root: /tmp - paths: - - release - - save_cache: - paths: - - ~/.m2 - - ~/graalvm-ce-java11-22.1.0 - key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - store_artifacts: - path: /tmp/release - destination: release - - run: - name: Publish artifact link to Slack - command: | - ./bb .circleci/script/publish_artifact.clj || true - mac: - macos: - xcode: "12.0.0" - environment: - MACOSX_DEPLOYMENT_TARGET: 10.13 # 10.12 is EOL - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home - BABASHKA_PLATFORM: macos # used in release script - BABASHKA_TEST_ENV: native - BABASHKA_XMX: "-J-Xmx6500m" - resource_class: large - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - restore_cache: - keys: - - mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - run: - name: Install Clojure - command: | - script/install-clojure - - run: - name: Install Leiningen - command: | - script/install-leiningen - - run: - name: Download GraalVM - command: | - script/install-graalvm - - run: - name: Build binary - command: | - export PATH=$GRAALVM_HOME/bin:$PATH - script/uberjar - script/compile - no_output_timeout: 30m - - run: - name: Run tests - command: | - export PATH=$GRAALVM_HOME/bin:$PATH - script/test - script/run_lib_tests - - run: - name: Release - command: | - .circleci/script/release - - save_cache: - paths: - - ~/.m2 - - ~/graalvm-ce-java11-22.1.0/Contents/Home - key: mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - - store_artifacts: - path: /tmp/release - destination: release - - run: - name: Publish artifact link to Slack - command: | - ./bb .circleci/script/publish_artifact.clj || true - deploy: - resource_class: large - docker: - - image: circleci/clojure:lein-2.9.8 - working_directory: ~/repo - environment: - LEIN_ROOT: "true" - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - restore_cache: - keys: - - v1-dependencies-{{ checksum "project.clj" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- - - run: .circleci/script/deploy - - save_cache: - paths: - - ~/.m2 - key: v1-dependencies-{{ checksum "project.clj" }} - docker: - machine: - image: ubuntu-2004:202111-01 - steps: - - checkout - - run: - name: "Pull Submodules" - command: | - git submodule init - git submodule update - - setup-docker-buildx - - attach_workspace: - at: /tmp - - run: - name: Build uberjar - command: script/uberjar - - run: - name: Build Docker image - environment: - PLATFORMS: linux/amd64,linux/arm64 - command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj + /tmp/bbb .circleci/script/short_ci.clj > generated_config.yml + - continuation/continue: + configuration_path: generated_config.yml +# our single workflow, that triggers the setup job defined above workflows: - version: 2 - ci: + setup: jobs: - - short-if-irrelevant - - jvm: - requires: - - short-if-irrelevant - - linux: - requires: - - short-if-irrelevant - - linux-static: - requires: - - short-if-irrelevant - - mac: - requires: - - short-if-irrelevant - - linux-aarch64: - requires: - - short-if-irrelevant - - linux-aarch64-static: - requires: - - short-if-irrelevant - - deploy: - filters: - branches: - only: master - requires: - - jvm - - linux - # - mac # TODO: Enable when not needed from Actions - - docker: - filters: - branches: - only: master - requires: - - linux - - linux-static - - linux-aarch64 + - setup diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj new file mode 100644 index 00000000..3d385efc --- /dev/null +++ b/.circleci/script/short_ci.clj @@ -0,0 +1,250 @@ +(ns short-ci + (:require + [babashka.tasks :as tasks] + [clj-yaml.core :as yaml] + [clojure.string :as str] + [flatland.ordered.map :refer [ordered-map]])) + +(defn run + ([cmd-name cmd] + (run cmd-name cmd nil)) + ([cmd-name cmd no-output-timeout] + (let [base {:run {:name cmd-name + :command cmd}}] + (if no-output-timeout + (assoc-in base [:run :no_output_timeout] no-output-timeout) + base)))) + +(defn gen-steps + [shorted? steps] + (if shorted? + [(run "Shorted" "echo 'Skipping Run'")] + steps)) + +(defn pull-submodules + [] + (run "Pull Submodules" "git submodule init\ngit submodule update")) + +(defn deploy + [shorted?] + (ordered-map + :resource_class "large" + :docker [{:image "circleci/clojure:lein-2.9.8"}] + :working_directory "~/repo" + :environment {:LEIN_ROOT "true"} + :steps (gen-steps + shorted? + [:checkout + (pull-submodules) + {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}" + "v1-dependencies-"]}} + {:run ".circleci/script/deploy"} + {:save_cache {:paths ["~/.m2"] + :key "v1-dependencies-{{ checksum \"project.clj\" }}"}}]))) + +(defn docker + [shorted?] + (ordered-map + :machine {:image "ubuntu-2004:202111-01"} + :steps + (gen-steps + shorted? + [:checkout + (pull-submodules) + "setup-docker-buildx" + {:attach_workspace {:at "/tmp"}} + (run "Build uberjar" "script/uberjar") + {:run + {:name "Build Docker image" + :environment {:PLATFORMS "linux/amd64,linux/arm64"} + :command + "java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}]))) + +(defn jvm + [shorted?] + (ordered-map + :docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}] + :working_directory "~/repo" + :environment {:LEIN_ROOT "true" + :BABASHKA_PLATFORM "linux"} + :resource_class "large" + :steps + (gen-steps + shorted? + [:checkout + (pull-submodules) + {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}" + "v1-dependencies-"]}} + (run "Install Clojure" "sudo script/install-clojure") + (run + "Run JVM tests" + "export BABASHKA_FEATURE_JDBC=true +export BABASHKA_FEATURE_POSTGRESQL=true +script/test\nscript/run_lib_tests") + (run "Run as lein command" ".circleci/script/lein") + (run + "Create uberjar" + "mkdir -p /tmp/release +script/uberjar +VERSION=$(cat resources/BABASHKA_VERSION) +jar=target/babashka-$VERSION-standalone.jar +cp $jar /tmp/release +java -jar $jar script/reflection.clj +reflection=\"babashka-$VERSION-reflection.json\" +java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$jar\" +java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$reflection\"") + {:store_artifacts {:path "/tmp/release" + :destination "release"}} + {:save_cache {:paths ["~/.m2"] + :key "v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"}}]))) + +(defn unix + [shorted? static? musl? arch executor-conf resource-class graalvm-home platform] + (let [env {:LEIN_ROOT "true" + :GRAALVM_VERSION "22.1.0" + :GRAALVM_HOME graalvm-home + :BABASHKA_PLATFORM (if (= "mac" platform) + "macos" + platform) + :BABASHKA_TEST_ENV "native" + :BABASHKA_ARCH arch + :BABASHKA_XMX "-J-Xmx6500m"} + env (if static? + (assoc env :BABASHKA_STATIC "true") + env) + env (if musl? + (assoc env :BABASHKA_MUSL "true") + env) + env (if (= "mac" platform) + (assoc env :MACOSX_DEPLOYMENT_TARGET 10.13) + env) + base-install-cmd "sudo apt-get update\nsudo apt-get -y install build-essential zlib1g-dev" + cache-key (format "%s-%s{{ checksum \"project.clj\" }}-{{ checksum \".circleci/config.yml\" }}" + platform + (if (= "aarch64" arch) + "aarch64-" + ""))] + (merge + executor-conf + (ordered-map + :working_directory "~/repo" + :environment env + :resource_class resource-class + :steps (gen-steps shorted? + (filter some? + [:checkout + {:attach_workspace {:at "/tmp"}} + (run "Pull Submodules" "git submodule init\ngit submodule update") + {:restore_cache + {:keys [cache-key]}} + (run "Install Clojure" "sudo script/install-clojure") + (when (= "mac" platform) + (run "Install Leiningen" "script/install-leiningen")) + (when (not= "mac" platform) + (run "Install native dev tools" + (if (and static? musl? (not= "aarch64" arch)) + (str base-install-cmd "\nsudo -E script/setup-musl") + base-install-cmd))) + (run "Download GraalVM" "script/install-graalvm") + (run "Build binary" "script/uberjar\nscript/compile" "30m") + (run "Run tests" "script/test\nscript/run_lib_tests") + (run "Release" ".circleci/script/release") + {:persist_to_workspace {:root "/tmp" + :paths ["release"]}} + {:save_cache + {:paths ["~/.m2" "~/graalvm-ce-java11-22.1.0"] + :key cache-key}} + {:store_artifacts {:path "/tmp/release" + :destination "release"}} + (run "Publish artifact link to Slack" + "./bb .circleci/script/publish_artifact.clj || true")])))))) + +(defn make-config + [shorted?] + (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} + machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} + mac-executor-conf {:macos {:xcode "12.0.0"}} + linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.1.0" + mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home"] + (ordered-map + :version 2.1 + :commands + {:setup-docker-buildx + {:steps + [{:run + {:name "Create multi-platform capabale buildx builder" + :command + "docker run --privileged --rm tonistiigi/binfmt --install all\ndocker buildx create --name ci-builder --use"}}]}} + :jobs (ordered-map + :jvm (jvm shorted?) + :linux (unix shorted? false false "x86_64" docker-executor-conf "large" linux-graalvm-home "linux") + :linux-static + (unix shorted? true true "x86_64" docker-executor-conf "large" linux-graalvm-home "linux") + :linux-aarch64 (unix shorted? + false + false + "aarch64" + machine-executor-conf + "arm.large" + linux-graalvm-home + "linux") + :linux-aarch64-static + (unix shorted? true false "aarch64" machine-executor-conf "arm.large" linux-graalvm-home "linux") + :mac (unix shorted? false false "x86_64" mac-executor-conf "large" mac-graalvm-home "mac") + :deploy (deploy shorted?) + :docker (docker shorted?)) + :workflows (ordered-map + :version 2 + :ci {:jobs ["jvm" + "linux" + "linux-static" + "mac" + "linux-aarch64" + "linux-aarch64-static" + {:deploy {:filters {:branches {:only "master"}} + :requires ["jvm" "linux"]}} + {:docker {:filters {:branches {:only "master"}} + :requires ["linux" "linux-static" "linux-aarch64"]}}]})))) + +(def skip-config + {:skip-if-only [#".*.md$"]}) + +(defn get-changes + [] + (-> (tasks/shell {:out :string} "git diff --name-only HEAD~1") + (:out) + (str/split-lines))) + +(defn irrelevant-change? + [change regexes] + (some? (some #(re-matches % change) regexes))) + +(defn relevant? + [change-set regexes] + (some? (some #(not (irrelevant-change? % regexes)) change-set))) + +(defn main + [] + (let [{:keys [skip-if-only]} skip-config + changed-files (get-changes) + conf (make-config (not (relevant? changed-files skip-if-only)))] + (println (yaml/generate-string conf + :dumper-options + {:flow-style :block})))) + +(when (= *file* (System/getProperty "babashka.file")) + (main)) + +(comment + (main) + (def regexes + [#".*.md$" + #".*.clj$"]) ; ignore clojure files + + (:out (tasks/shell {:out :string} "ls")) + + (irrelevant-change? "src/file.png" regexes) + + (re-matches #".*.clj$" "src/file.clj.dfff") + + (relevant? ["src/file.clj"] regexes)) From b5dea3563d777684d9e4a2c8318fd5d3befab8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Mon, 20 Jun 2022 21:20:50 +0100 Subject: [PATCH 198/550] Pass correct arch (#1300) * [wip] pass correct arch * [wip] pass arch only when aarch64 * [skip ci] add branch filter back to docker --- .circleci/script/short_ci.clj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index 3d385efc..ffbf3c47 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -107,8 +107,10 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl "macos" platform) :BABASHKA_TEST_ENV "native" - :BABASHKA_ARCH arch :BABASHKA_XMX "-J-Xmx6500m"} + env (if (= "aarch64" arch) + (assoc env :BABASHKA_ARCH arch) + env) env (if static? (assoc env :BABASHKA_STATIC "true") env) @@ -177,9 +179,9 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl "docker run --privileged --rm tonistiigi/binfmt --install all\ndocker buildx create --name ci-builder --use"}}]}} :jobs (ordered-map :jvm (jvm shorted?) - :linux (unix shorted? false false "x86_64" docker-executor-conf "large" linux-graalvm-home "linux") + :linux (unix shorted? false false "amd64" docker-executor-conf "large" linux-graalvm-home "linux") :linux-static - (unix shorted? true true "x86_64" docker-executor-conf "large" linux-graalvm-home "linux") + (unix shorted? true true "amd64" docker-executor-conf "large" linux-graalvm-home "linux") :linux-aarch64 (unix shorted? false false @@ -190,7 +192,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl "linux") :linux-aarch64-static (unix shorted? true false "aarch64" machine-executor-conf "arm.large" linux-graalvm-home "linux") - :mac (unix shorted? false false "x86_64" mac-executor-conf "large" mac-graalvm-home "mac") + :mac (unix shorted? false false "amd64" mac-executor-conf "large" mac-graalvm-home "mac") :deploy (deploy shorted?) :docker (docker shorted?)) :workflows (ordered-map From 512dbf9ea54f0ca8a49e247ee78f7fda7f070d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Tue, 21 Jun 2022 14:32:23 +0100 Subject: [PATCH 199/550] Optimise executors when shorted (#1301) * Optimise executors when shorted * Test short * Also handle mac * Test short --- .circleci/script/short_ci.clj | 190 ++++++++++++++++++---------------- 1 file changed, 102 insertions(+), 88 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index ffbf3c47..a91ff1f8 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -21,70 +21,83 @@ [(run "Shorted" "echo 'Skipping Run'")] steps)) +(defn gen-job + [shorted? conf] + (if shorted? + (-> conf + (dissoc :machine :macos) + (assoc :resource_class "small" :docker [{:image "ubuntu:latest"}])) + conf)) + (defn pull-submodules [] (run "Pull Submodules" "git submodule init\ngit submodule update")) (defn deploy [shorted?] - (ordered-map - :resource_class "large" - :docker [{:image "circleci/clojure:lein-2.9.8"}] - :working_directory "~/repo" - :environment {:LEIN_ROOT "true"} - :steps (gen-steps - shorted? - [:checkout - (pull-submodules) - {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}" - "v1-dependencies-"]}} - {:run ".circleci/script/deploy"} - {:save_cache {:paths ["~/.m2"] - :key "v1-dependencies-{{ checksum \"project.clj\" }}"}}]))) + (gen-job shorted? + (ordered-map + :resource_class "large" + :docker [{:image "circleci/clojure:lein-2.9.8"}] + :working_directory "~/repo" + :environment {:LEIN_ROOT "true"} + :steps (gen-steps + shorted? + [:checkout + (pull-submodules) + {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}" + "v1-dependencies-"]}} + {:run ".circleci/script/deploy"} + {:save_cache {:paths ["~/.m2"] + :key "v1-dependencies-{{ checksum \"project.clj\" }}"}}])))) (defn docker [shorted?] - (ordered-map - :machine {:image "ubuntu-2004:202111-01"} - :steps - (gen-steps - shorted? - [:checkout - (pull-submodules) - "setup-docker-buildx" - {:attach_workspace {:at "/tmp"}} - (run "Build uberjar" "script/uberjar") - {:run - {:name "Build Docker image" - :environment {:PLATFORMS "linux/amd64,linux/arm64"} - :command - "java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}]))) + (gen-job + shorted? + (ordered-map + :machine {:image "ubuntu-2004:202111-01"} + :steps + (gen-steps + shorted? + [:checkout + (pull-submodules) + "setup-docker-buildx" + {:attach_workspace {:at "/tmp"}} + (run "Build uberjar" "script/uberjar") + {:run + {:name "Build Docker image" + :environment {:PLATFORMS "linux/amd64,linux/arm64"} + :command + "java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}])))) (defn jvm [shorted?] - (ordered-map - :docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}] - :working_directory "~/repo" - :environment {:LEIN_ROOT "true" - :BABASHKA_PLATFORM "linux"} - :resource_class "large" - :steps - (gen-steps - shorted? - [:checkout - (pull-submodules) - {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}" - "v1-dependencies-"]}} - (run "Install Clojure" "sudo script/install-clojure") - (run - "Run JVM tests" - "export BABASHKA_FEATURE_JDBC=true + (gen-job + shorted? + (ordered-map + :docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}] + :working_directory "~/repo" + :environment {:LEIN_ROOT "true" + :BABASHKA_PLATFORM "linux"} + :resource_class "large" + :steps + (gen-steps + shorted? + [:checkout + (pull-submodules) + {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}" + "v1-dependencies-"]}} + (run "Install Clojure" "sudo script/install-clojure") + (run + "Run JVM tests" + "export BABASHKA_FEATURE_JDBC=true export BABASHKA_FEATURE_POSTGRESQL=true script/test\nscript/run_lib_tests") - (run "Run as lein command" ".circleci/script/lein") - (run - "Create uberjar" - "mkdir -p /tmp/release + (run "Run as lein command" ".circleci/script/lein") + (run + "Create uberjar" + "mkdir -p /tmp/release script/uberjar VERSION=$(cat resources/BABASHKA_VERSION) jar=target/babashka-$VERSION-standalone.jar @@ -93,10 +106,10 @@ java -jar $jar script/reflection.clj reflection=\"babashka-$VERSION-reflection.json\" java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$jar\" java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$reflection\"") - {:store_artifacts {:path "/tmp/release" - :destination "release"}} - {:save_cache {:paths ["~/.m2"] - :key "v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"}}]))) + {:store_artifacts {:path "/tmp/release" + :destination "release"}} + {:save_cache {:paths ["~/.m2"] + :key "v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"}}])))) (defn unix [shorted? static? musl? arch executor-conf resource-class graalvm-home platform] @@ -126,40 +139,41 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (if (= "aarch64" arch) "aarch64-" ""))] - (merge - executor-conf - (ordered-map - :working_directory "~/repo" - :environment env - :resource_class resource-class - :steps (gen-steps shorted? - (filter some? - [:checkout - {:attach_workspace {:at "/tmp"}} - (run "Pull Submodules" "git submodule init\ngit submodule update") - {:restore_cache - {:keys [cache-key]}} - (run "Install Clojure" "sudo script/install-clojure") - (when (= "mac" platform) - (run "Install Leiningen" "script/install-leiningen")) - (when (not= "mac" platform) - (run "Install native dev tools" - (if (and static? musl? (not= "aarch64" arch)) - (str base-install-cmd "\nsudo -E script/setup-musl") - base-install-cmd))) - (run "Download GraalVM" "script/install-graalvm") - (run "Build binary" "script/uberjar\nscript/compile" "30m") - (run "Run tests" "script/test\nscript/run_lib_tests") - (run "Release" ".circleci/script/release") - {:persist_to_workspace {:root "/tmp" - :paths ["release"]}} - {:save_cache - {:paths ["~/.m2" "~/graalvm-ce-java11-22.1.0"] - :key cache-key}} - {:store_artifacts {:path "/tmp/release" - :destination "release"}} - (run "Publish artifact link to Slack" - "./bb .circleci/script/publish_artifact.clj || true")])))))) + (gen-job shorted? + (merge + executor-conf + (ordered-map + :working_directory "~/repo" + :environment env + :resource_class resource-class + :steps (gen-steps shorted? + (filter some? + [:checkout + {:attach_workspace {:at "/tmp"}} + (run "Pull Submodules" "git submodule init\ngit submodule update") + {:restore_cache + {:keys [cache-key]}} + (run "Install Clojure" "sudo script/install-clojure") + (when (= "mac" platform) + (run "Install Leiningen" "script/install-leiningen")) + (when (not= "mac" platform) + (run "Install native dev tools" + (if (and static? musl? (not= "aarch64" arch)) + (str base-install-cmd "\nsudo -E script/setup-musl") + base-install-cmd))) + (run "Download GraalVM" "script/install-graalvm") + (run "Build binary" "script/uberjar\nscript/compile" "30m") + (run "Run tests" "script/test\nscript/run_lib_tests") + (run "Release" ".circleci/script/release") + {:persist_to_workspace {:root "/tmp" + :paths ["release"]}} + {:save_cache + {:paths ["~/.m2" "~/graalvm-ce-java11-22.1.0"] + :key cache-key}} + {:store_artifacts {:path "/tmp/release" + :destination "release"}} + (run "Publish artifact link to Slack" + "./bb .circleci/script/publish_artifact.clj || true")]))))))) (defn make-config [shorted?] From 0b471636e13ae025365cd20a653ae3373e504136 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 22 Jun 2022 11:59:00 +0200 Subject: [PATCH 200/550] logo [skip ci] --- logo/babashka_red.png | Bin 0 -> 144616 bytes logo/babashka_red.svg | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 logo/babashka_red.png create mode 100644 logo/babashka_red.svg diff --git a/logo/babashka_red.png b/logo/babashka_red.png new file mode 100644 index 0000000000000000000000000000000000000000..f178d08fee8515aaed8f6b627645d2da7d2654c3 GIT binary patch literal 144616 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

A0bPd9SVj` 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 literal 0 HcmV?d00001 diff --git a/logo/babashka_red.svg b/logo/babashka_red.svg new file mode 100644 index 00000000..ad915719 --- /dev/null +++ b/logo/babashka_red.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 6259797f6a1f3aa8143da7b7ae859ee16e7b56bf Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 23 Jun 2022 16:58:48 +0200 Subject: [PATCH 201/550] SCI 0.3.32 --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 09591be1..3d7262ce 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 09591be1668488b3165ff6c41e750467ad1fe751 +Subproject commit 3d7262ce7f5103484d8a4e00a7456f3bf4aebccf From 72e9b6ceee2160be1f48700ad81dbc2ea2880999 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 25 Jun 2022 21:21:27 +0200 Subject: [PATCH 202/550] process update --- process | 2 +- src/babashka/impl/nrepl_server.clj | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/process b/process index d7331aa5..3988cd00 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit d7331aa5522c44bcd5be74abacf11dbf3903d764 +Subproject commit 3988cd008e22d836f5cd400c7baf264aafa376da diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj index f20e239b..cb90065a 100644 --- a/src/babashka/impl/nrepl_server.clj +++ b/src/babashka/impl/nrepl_server.clj @@ -1,16 +1,16 @@ (ns babashka.impl.nrepl-server {:no-doc true} (:require [babashka.impl.common :as common] - [babashka.nrepl.server :refer [start-server! stop-server!]] - [sci.core :refer [create-ns new-var copy-var]])) + [babashka.nrepl.server :as server] + [sci.core :as sci])) + +(defn start-server! + ([] + (server/start-server! @common/ctx)) + ([opts] + (server/start-server! @common/ctx opts))) (def nrepl-server-namespace (let [ns-sci (create-ns 'babashka.nrepl.server)] - {'start-server! (new-var 'start-server! - (fn - ([] - (start-server! @common/ctx)) - ([opts] - (start-server! @common/ctx opts))) - {:ns ns-sci}) - 'stop-server! (copy-var stop-server! ns-sci)})) \ No newline at end of file + {'start-server! (sci/copy-var start-server! ns-sci) + 'stop-server! (sci/copy-var server/stop-server! ns-sci)})) From aec2848e243a6ace16217ad3150a6cff19796128 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 25 Jun 2022 21:30:34 +0200 Subject: [PATCH 203/550] Fix nrepl server built-in --- src/babashka/impl/nrepl_server.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj index cb90065a..096981b5 100644 --- a/src/babashka/impl/nrepl_server.clj +++ b/src/babashka/impl/nrepl_server.clj @@ -11,6 +11,6 @@ (server/start-server! @common/ctx opts))) (def nrepl-server-namespace - (let [ns-sci (create-ns 'babashka.nrepl.server)] + (let [ns-sci (sci/create-ns 'babashka.nrepl.server)] {'start-server! (sci/copy-var start-server! ns-sci) 'stop-server! (sci/copy-var server/stop-server! ns-sci)})) From e651de400a787c6a7e78d81fac1e0be653bbde90 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 27 Jun 2022 17:19:27 +0200 Subject: [PATCH 204/550] Update deps.clj tools jar to 1.11.1.1149 --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index bac83566..65c1b5ec 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit bac835661adbcd06b07ce2c408bb3e4911a48c28 +Subproject commit 65c1b5ecc0dbf12dee5f082cd5d325fcaa811cc4 From 04f16e220c4e2f7724796508bf79fd0c84f6a44c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 27 Jun 2022 20:15:57 +0200 Subject: [PATCH 205/550] Add logo [skip ci] --- logo/babashka-blue-yellow.png | Bin 0 -> 127250 bytes logo/babashka-blue-yellow.svg | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 logo/babashka-blue-yellow.png create mode 100644 logo/babashka-blue-yellow.svg diff --git a/logo/babashka-blue-yellow.png b/logo/babashka-blue-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85cd2bd8d75123cf3e44d3c05e218c72f00c1f GIT binary patch literal 127250 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 YXujz)?K>|+w7jCzcFrd%j|JZPUsNi_eE + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3564cac6b35a3e48bbc93011670ad18edf8d6cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Lafuente?= Date: Wed, 29 Jun 2022 22:48:19 +0200 Subject: [PATCH 206/550] Fix misspelling (#1303) --- CHANGELOG.md | 1 + script/uberjar | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2d6143..a44f8a9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ A preview of the next release can be installed from - Expose `babashka.nrepl.server/start-server!`- and `stop-server!`-functions to support programmatically starting an nrepl-server. `start-server!` is redefined to not require a sci-context as its first argument. +- Fix misspelling in script/uberjar: `BABASHKA_FEATURE_TRANSIT` ## 0.8.156 (2022-06-08) diff --git a/script/uberjar b/script/uberjar index 56414ace..42025c74 100755 --- a/script/uberjar +++ b/script/uberjar @@ -16,7 +16,7 @@ then export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}" export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}" export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}" - export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}" + export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}" export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}" export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}" export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}" From f491d02ba079c22e11bba032ce0a09f1e585600d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 30 Jun 2022 14:20:53 +0200 Subject: [PATCH 207/550] sci: deftype with mutable fields --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3d7262ce..9a29e678 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3d7262ce7f5103484d8a4e00a7456f3bf4aebccf +Subproject commit 9a29e6780b1a7c48dc0b02f8032fdd647595c7ba From 3f404746b484f72df61cf35aef1b0b88347e270e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 30 Jun 2022 17:54:47 +0200 Subject: [PATCH 208/550] Support Java classes for Malli (#1304) --- resources/META-INF/babashka/deps.edn | 5 ++++- sci | 2 +- src/babashka/impl/classes.clj | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index b88a7ba7..3dd253d6 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -138,7 +138,10 @@ com.github.seancorfield/expectations {:mvn/version "2.0.157"} com.rpl/specter {:mvn/version "1.1.4"} com.github.askonomm/clarktown {:mvn/version "1.1.2"} - org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}} + org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"} + prismatic/schema {:git/url "https://github.com/plumatic/schema" + :git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff" + :git/tag "schema-1.3.0"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/sci b/sci index 9a29e678..59763a23 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 9a29e6780b1a7c48dc0b02f8032fdd647595c7ba +Subproject commit 59763a234e5b61dc0b00e3ab6a639a3339508e97 diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 0b253df3..26668863 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -366,6 +366,7 @@ java.util.concurrent.ThreadPoolExecutor java.util.concurrent.ScheduledExecutorService java.util.concurrent.Future + java.util.concurrent.FutureTask java.util.concurrent.CompletableFuture java.util.concurrent.Executors java.util.concurrent.TimeUnit @@ -389,6 +390,7 @@ java.util.Base64$Decoder java.util.Base64$Encoder java.util.Date + java.util.HashMap java.util.IdentityHashMap java.util.List java.util.Locale @@ -509,6 +511,7 @@ java.sql.Timestamp java.util.concurrent.atomic.AtomicInteger java.util.concurrent.atomic.AtomicLong + java.util.concurrent.TimeoutException java.util.Collection java.util.Map$Entry ~@(when features/xml? ['clojure.data.xml.node.Element])] From 2688156b7834a76ff6ccbd2de3549fea30131de5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 11:35:07 +0200 Subject: [PATCH 209/550] Add raw HTML to README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index dda7e2c1..24848ee4 100644 --- a/README.md +++ b/README.md @@ -294,6 +294,12 @@ Have a library that is already compatible or has recently been made compatible? [![bb compatible](/logo/badge.svg)](https://babashka.org) +The raw HTML: + +``` html +bb compatible +``` + ## [Pods](https://github.com/babashka/babashka.pods) Pods are programs that can be used as a Clojure library by From 0c9ddadd90d9df7bd21e7895bb5081349fee876c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 11:39:24 +0200 Subject: [PATCH 210/550] Flair [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 24848ee4..93c24025 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,10 @@ Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list o A list of projects (scripts, libraries, pods and tools) known to work with babashka. -Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo! +### Flair + +Do you have a library that is already compatible or has recently been made +compatible with babashka? Add this badge to add some flair to your repo: [![bb compatible](/logo/badge.svg)](https://babashka.org) From 9cbdc8f767aea28536f954d7351b24389021b9b5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 11:40:43 +0200 Subject: [PATCH 211/550] Flair [skip ci] --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93c24025..4340464b 100644 --- a/README.md +++ b/README.md @@ -292,8 +292,8 @@ A list of projects (scripts, libraries, pods and tools) known to work with babas ### Flair -Do you have a library that is already compatible or has recently been made -compatible with babashka? Add this badge to add some flair to your repo: +Do you have a library that runs with babashka? Add this badge to add some flair +to your repo: [![bb compatible](/logo/badge.svg)](https://babashka.org) From 833318edb2a1529d6270a476270d86b86f1978e3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 11:59:01 +0200 Subject: [PATCH 212/550] Flair [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4340464b..458603a9 100644 --- a/README.md +++ b/README.md @@ -300,7 +300,7 @@ to your repo: The raw HTML: ``` html -bb compatible +bb compatible ``` ## [Pods](https://github.com/babashka/babashka.pods) From 0751e39eacc36b260ffa743edc84c625ecccbac4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 12:46:22 +0200 Subject: [PATCH 213/550] v0.8.157 --- CHANGELOG.md | 3 ++- resources/BABASHKA_VERSION | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a44f8a9b..c0c9e57d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,9 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 0.8.157 (2022-07-01) +- Add compatibility with [`metosin/malli`](https://github.com/metosin/malli#babashka) `{:mvn/version "0.8.9"}`. - Expose `babashka.nrepl.server/start-server!`- and `stop-server!`-functions to support programmatically starting an nrepl-server. `start-server!` is redefined to not require a sci-context as its first argument. - Fix misspelling in script/uberjar: `BABASHKA_FEATURE_TRANSIT` diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index e9d5a041..8e2fbabb 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.157-SNAPSHOT \ No newline at end of file +0.8.157 \ No newline at end of file From abc15c4959fdd662a2d9fc9641ca6d73e3957f1a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 1 Jul 2022 13:12:24 +0200 Subject: [PATCH 214/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 5adb3a3d..8e2fbabb 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.8.156 \ No newline at end of file +0.8.157 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 8e2fbabb..0183df97 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.157 \ No newline at end of file +0.8.158-SNAPSHOT \ No newline at end of file From 53aa17dbde581e8673b85799a51fc2cbcc92b991 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 12:19:25 +0200 Subject: [PATCH 215/550] SCI: don't eval metatada on defn body --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 59763a23..5d6b218e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 59763a234e5b61dc0b00e3ab6a639a3339508e97 +Subproject commit 5d6b218e0fbef4b4401ff4ac34ae592494d9d99d From f8b0a00a17488738ccc9b83f41016fcd39c468cb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 12:38:55 +0200 Subject: [PATCH 216/550] SCI: preserve file metadata in defn --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 5d6b218e..267fa0a3 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 5d6b218e0fbef4b4401ff4ac34ae592494d9d99d +Subproject commit 267fa0a360f2b827fc61d2227bd8757a1c456f50 From f044ba15cdf17955cc8cbc27762c41910155c5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Lafuente?= Date: Sun, 3 Jul 2022 13:02:15 +0200 Subject: [PATCH 217/550] Fix misspelling: BABAHSKA -> BABASHKA (#1308) --- Dockerfile | 4 ++-- script/compile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index ec7e78e3..30f7dae8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,7 +34,7 @@ ARG BABASHKA_FEATURE_CSV= ARG BABASHKA_FEATURE_JAVA_NET_HTTP= ARG BABASHKA_FEATURE_JAVA_NIO= ARG BABASHKA_FEATURE_JAVA_TIME= -ARG BABAHSKA_FEATURE_TRANSIT= +ARG BABASHKA_FEATURE_TRANSIT= ARG BABASHKA_FEATURE_XML= ARG BABASHKA_FEATURE_YAML= ARG BABASHKA_FEATURE_HTTPKIT_CLIENT= @@ -51,7 +51,7 @@ ENV BABASHKA_FEATURE_CSV=$BABASHKA_FEATURE_CSV ENV BABASHKA_FEATURE_JAVA_NET_HTTP=$BABASHKA_FEATURE_JAVA_NET_HTTP ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME -ENV BABAHSKA_FEATURE_TRANSIT=$BABAHSKA_FEATURE_TRANSIT +ENV BABASHKA_FEATURE_TRANSIT=$BABASHKA_FEATURE_TRANSIT ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT diff --git a/script/compile b/script/compile index 42ab80c2..b0e54e74 100755 --- a/script/compile +++ b/script/compile @@ -92,7 +92,7 @@ then export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}" export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}" export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}" - export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}" + export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}" export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}" export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}" export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}" From 01e414c4d1208449dc9555ff359b4a79d1392f02 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:03:08 +0200 Subject: [PATCH 218/550] defn metadata tweak --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 267fa0a3..a046922d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 267fa0a360f2b827fc61d2227bd8757a1c456f50 +Subproject commit a046922df03fc689ec74771d26dd149d339dae31 From 16e427848da334c2183e4d314917e24a18634f74 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:14:25 +0200 Subject: [PATCH 219/550] Add malli tests --- deps.edn | 5 ++++- test-resources/lib_tests/bb-tested-libs.edn | 24 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index 3dd253d6..7ee70b0e 100644 --- a/deps.edn +++ b/deps.edn @@ -141,7 +141,10 @@ org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"} prismatic/schema {:git/url "https://github.com/plumatic/schema" :git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff" - :git/tag "schema-1.3.0"}} + :git/tag "schema-1.3.0"} + metosin/malli {:git/url "https://github.com/metosin/malli" + :git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99" + :git/tag "0.8.9"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 7c46100b..b8ef330e 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -47,7 +47,7 @@ doric/doric {:git-sha "8747fdce565187a5c368c575cf4ca794084b0a5c", :git-url "https://github.com/joegallo/doric", :test-namespaces (doric.test.core doric.test.readme doric.test.doctest)} com.github.seancorfield/honeysql {:git-sha "6e4e1f6928450788353c181f32474d930d6afe84", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honey.sql-test honey.sql.helpers-test honey.sql.postgres-test), :branch "develop"} honeysql/honeysql {:git-sha "1137dd12350afdc30ad4976c3718279581390b36", :git-url "https://github.com/seancorfield/honeysql", :test-namespaces (honeysql.format-test honeysql.core-test), :branch "v1"} - ; skip tests on Windows because of the :compressed thing + ; skip tests on Windows because of the :compressed thing babashka/babashka.curl {:git-url "https://github.com/babashka/babashka.curl", :test-namespaces [babashka.curl-test], :skip-windows true, :manually-added true} http-kit/http-kit {:git-url "https://github.com/http-kit/http-kit", :test-namespaces [httpkit.client-test], :manually-added true} org.clojure/core.match {:git-url "https://github.com/clojure/core.match", :test-namespaces [core-match.core-tests], :manually-added true} @@ -125,4 +125,24 @@ :git-tag "schema-1.3.0" ;; specify for adding tests to classpath :test-paths ["test/clj" "test/cljc"]} -} + metosin/malli {:test-namespaces [malli.clj-kondo-test + malli.core-test + malli.destructure-test + malli.dot-test + malli.error-test + malli.experimental-test + ;; malli.generator-test + malli.instrument-test + malli.json-schema-test + malli.plantuml-test + malli.provider-test + malli.registry-test + malli.swagger-test + malli.transform-test + malli.util-test] + :git-url "https://github.com/metosin/malli" + :git-sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99" + :git-tag "0.8.9" + ;; specify for adding tests to classpath + :test-paths ["test"]} + } From 1a48bdf4bc5ec306345bfda2fa8e6e1dc79f1a52 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:31:02 +0200 Subject: [PATCH 220/550] Add malli to project --- doc/projects.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/projects.md b/doc/projects.md index 463e5857..54186316 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -7,7 +7,6 @@ The following libraries and projects are known to work with babashka. - [tools.namespace](#toolsnamespace) - [test-runner](#test-runner) - [spec.alpha](#specalpha) - - [tools.bbuild](#toolsbbuild) - [clj-http-lite](#clj-http-lite) - [spartan.spec](#spartanspec) - [missing.test.assertions](#missingtestassertions) @@ -62,6 +61,8 @@ The following libraries and projects are known to work with babashka. - [datalog-parser](#datalog-parser) - [at-at](#at-at) - [aysylu/loom](#aysyluloom) + - [Clarktown](#clarktown) + - [Malli](#malli) - [Pods](#pods) - [Projects](#projects-1) - [babashka-test-action](#babashka-test-action) @@ -114,9 +115,9 @@ A fork of `clojure.spec.alpha` that includes support for generation and instrumentation! Its readme also contains instructions on how to use `clojure.core.specs.alpha`. -### [tools.bbuild](https://github.com/babashka/tools.bbuild) + -A fork of `tools.build`. + ### [clj-http-lite](https://github.com/clj-commons/clj-http-lite) @@ -812,6 +813,10 @@ Graph library for Clojure. Compatible with babashka 0.7.8+. An extensible and modular zero-dependency, pure-Clojure Markdown parser. +### [Malli](https://github.com/metosin/malli#babashka) + +Data-Driven Schemas for Clojure/Script + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can From 90add0e787729366cd0acb3769e40d35619dc41c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:41:30 +0200 Subject: [PATCH 221/550] Meander tests --- deps.edn | 5 ++++- test-resources/lib_tests/bb-tested-libs.edn | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index 7ee70b0e..12c22cb2 100644 --- a/deps.edn +++ b/deps.edn @@ -144,7 +144,10 @@ :git/tag "schema-1.3.0"} metosin/malli {:git/url "https://github.com/metosin/malli" :git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99" - :git/tag "0.8.9"}} + :git/tag "0.8.9"} + meander/epsilon {:git/url "https://github.com/noprompt/meander" + :git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} + } :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index b8ef330e..0f40814f 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -145,4 +145,18 @@ :git-tag "0.8.9" ;; specify for adding tests to classpath :test-paths ["test"]} + meander/epsilon {:test-namespaces [meander.epsilon-test + meander.defsyntax-test + meander.syntax.epsilon-test + meander.substitute.epsilon-test + meander.strategy.epsilon-test + meander.matrix.epsilon-test + meander.match.epsilon-test + meander.match.ir.epsilon-test + meander.match.check.epsilon-test + meander.interpreter.epsilon-test + meander.defsyntax-test.gh-145] + :test-paths ["test"] + :git-url "https://github.com/noprompt/meander" + :git-sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} } From 4aa6cfc472fe87be009662f2445205bfc6879200 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:42:45 +0200 Subject: [PATCH 222/550] Add to projects --- doc/projects.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/projects.md b/doc/projects.md index 54186316..645bf018 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -63,6 +63,7 @@ The following libraries and projects are known to work with babashka. - [aysylu/loom](#aysyluloom) - [Clarktown](#clarktown) - [Malli](#malli) + - [Meander](#meander) - [Pods](#pods) - [Projects](#projects-1) - [babashka-test-action](#babashka-test-action) @@ -817,6 +818,10 @@ An extensible and modular zero-dependency, pure-Clojure Markdown parser. Data-Driven Schemas for Clojure/Script +### [Meander](https://github.com/noprompt/meander) + +Tools for transparent data transformation + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can From 7b10adc69ac9f64811296038bf01b577dc79fe58 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 3 Jul 2022 13:46:23 +0200 Subject: [PATCH 223/550] Add schema --- doc/projects.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/projects.md b/doc/projects.md index 645bf018..d89e7467 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -64,6 +64,7 @@ The following libraries and projects are known to work with babashka. - [Clarktown](#clarktown) - [Malli](#malli) - [Meander](#meander) + - [Schema](#schema) - [Pods](#pods) - [Projects](#projects-1) - [babashka-test-action](#babashka-test-action) @@ -822,6 +823,10 @@ Data-Driven Schemas for Clojure/Script Tools for transparent data transformation +### [Schema](https://github.com/plumatic/schema) + +Clojure(Script) library for declarative data description and validation + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can From e7c504b331c8ac503c553a325bbe101cad989bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Mon, 4 Jul 2022 07:43:56 +0100 Subject: [PATCH 224/550] skip logo paths and in actions (#1311) * skip logo paths and in actions * [skip ci] Keep CI happy --- .circleci/script/short_ci.clj | 9 +++++++-- .github/workflows/build.yml | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index a91ff1f8..19e8a85b 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -223,7 +223,8 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl :requires ["linux" "linux-static" "linux-aarch64"]}}]})))) (def skip-config - {:skip-if-only [#".*.md$"]}) + {:skip-if-only [#".*.md$" + #"^logo\/.*$"]}) (defn get-changes [] @@ -253,9 +254,11 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (comment (main) + (def regexes [#".*.md$" - #".*.clj$"]) ; ignore clojure files + #".*.clj$" ; ignore clojure files + #"^logo\/.*$"]) (:out (tasks/shell {:out :string} "ls")) @@ -263,4 +266,6 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (re-matches #".*.clj$" "src/file.clj.dfff") + (re-matches #"^logo\/.*$" "logo/foo/bar.jpg") + (relevant? ["src/file.clj"] regexes)) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0fa18439..64c6479e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,15 @@ name: build on: push: + paths-ignore: + - "**.md" + - "logo/**" branches: - master pull_request: + paths-ignore: + - "**.md" + - "logo/**" branches: - master From 32ac3c5398104553f5518ebf85da864d1fee5c32 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Jul 2022 19:59:04 +0200 Subject: [PATCH 225/550] Manifest dir with env var (#1312) --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 66867eee..93081b75 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 66867eee7f050af0126c83c876f8031e0eae709a +Subproject commit 93081b75e66fb4c4d161f89e714c6b9e8d55c8d5 From cdbe07ad451c5da9d0c9f9f9c1e33923c330dbbc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Jul 2022 21:01:14 +0200 Subject: [PATCH 226/550] bb process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 3988cd00..72cb6e04 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 3988cd008e22d836f5cd400c7baf264aafa376da +Subproject commit 72cb6e04a57a2e549e8bc4cc08ff5cfb15f33e7b From 21fd8e3a3f409f3b0868d79ab70eeb0b16728dc7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Jul 2022 21:10:44 +0200 Subject: [PATCH 227/550] bb process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 72cb6e04..06e5ed36 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 72cb6e04a57a2e549e8bc4cc08ff5cfb15f33e7b +Subproject commit 06e5ed366dde79bf0ffb92cd819c2f091ac9947b From 38185d5658a336a3da9850a7d9d580d14ffcd540 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 4 Jul 2022 21:29:22 +0200 Subject: [PATCH 228/550] bb process [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 06e5ed36..1ae95e36 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 06e5ed366dde79bf0ffb92cd819c2f091ac9947b +Subproject commit 1ae95e3673a6e6dc90a868fc5b137ab59b5b4d8b From d18ecbd22fb16e58a971e92e1c49d15e47c08eb2 Mon Sep 17 00:00:00 2001 From: Brandon Stubbs Date: Wed, 6 Jul 2022 14:50:16 -0400 Subject: [PATCH 229/550] add bb-github-app project (#1313) --- doc/projects.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/projects.md b/doc/projects.md index d89e7467..53076656 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -91,6 +91,7 @@ The following libraries and projects are known to work with babashka. - [Babashka + scittle guestbook](#babashka--scittle-guestbook) - [bb htmx todo app](#bb-htmx-todo-app) - [bb aws lambda runtime](#bb-aws-lambda-runtime) + - [bb-github-app](#bb-github-app) Also keep an eye on the [news](news.md) page for new projects, gists and other developments around babashka. @@ -954,3 +955,8 @@ Quick example of a todo list SPA using Babashka and htmx. ### [bb aws lambda runtime](https://github.com/tatut/bb-lambda) AWS Lambda custom runtime for Babashka scripts. + +### [bb-github-app](https://github.com/brandonstubbs/bb-github-app) + +An example Babashka script that can authenticate as a Github Application, +this example focuses on the checks api. From 3dfcc74324863c3c6a629f2503397d1ef2549e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Wed, 6 Jul 2022 20:25:38 +0100 Subject: [PATCH 230/550] skip appveyor on irrelevant files (#1314) * skip appveyor on irrelevant files * YAML? --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index b6c774cf..2228c399 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,11 @@ environment: JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0 BABASHKA_XMX: "-J-Xmx5g" +skip_commits: + files: + - "logo/*" + - "**/*.md" + cache: - C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml - '%USERPROFILE%\.m2 -> project.clj' From 00ea105d4a1efa1f84660364fa599463a2a3b047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Wed, 6 Jul 2022 20:43:59 +0100 Subject: [PATCH 231/550] Skip cirrus (#1315) * skip cirrus on irrelevant chnages * wrong expr --- .cirrus.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.cirrus.yml b/.cirrus.yml index 8b56b5b9..8e7dccc8 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,6 +2,7 @@ macos_instance: image: ghcr.io/cirruslabs/macos-monterey-base:latest task: + skip: "changesIncludeOnly('logo/*', '**.md')" env: LEIN_ROOT: "true" GRAALVM_VERSION: "22.1.0" From 22763c6485cee52d0d9c38b274e6efdf9442b47e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 8 Jul 2022 23:16:30 +0200 Subject: [PATCH 232/550] sync process and sci [skip ci] --- process | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process b/process index 1ae95e36..ac8a12b0 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 1ae95e3673a6e6dc90a868fc5b137ab59b5b4d8b +Subproject commit ac8a12b0969297bd2abf2c10571df1b84eb1a857 diff --git a/sci b/sci index a046922d..1d2b26d4 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a046922df03fc689ec74771d26dd149d339dae31 +Subproject commit 1d2b26d4f6e014615d4cfe1d20ab4bfcf90d86b8 From e20ba643ffee88a47c34aca55d87dd0a2fbfa956 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 11 Jul 2022 11:52:14 +0200 Subject: [PATCH 233/550] Sci issue 774 interpreter stacktrace (#1318) --- resources/META-INF/babashka/deps.edn | 8 +++++++- sci | 2 +- src/babashka/main.clj | 12 +++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 3dd253d6..12c22cb2 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -141,7 +141,13 @@ org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"} prismatic/schema {:git/url "https://github.com/plumatic/schema" :git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff" - :git/tag "schema-1.3.0"}} + :git/tag "schema-1.3.0"} + metosin/malli {:git/url "https://github.com/metosin/malli" + :git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99" + :git/tag "0.8.9"} + meander/epsilon {:git/url "https://github.com/noprompt/meander" + :git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} + } :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/sci b/sci index 1d2b26d4..c16deb95 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1d2b26d4f6e014615d4cfe1d20ab4bfcf90d86b8 +Subproject commit c16deb95df7764d706f5815b3e7f1323e289c94a diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 0aacc00b..6f20a62c 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -346,6 +346,8 @@ Use bb run --help to show this help output. (defn catvec [& xs] (into [] cat xs)) +(def sci-ns (sci/create-ns 'sci.core)) + (def namespaces (cond-> {'user {'*input* (reify @@ -399,7 +401,15 @@ Use bb run --help to show this help output. @(resolve 'babashka.impl.rrb-vector/rrb-vector-namespace) {'catvec (sci/copy-var catvec (sci/create-ns 'clojure.core.rrb-vector))}) - 'edamame.core edamame-namespace} + 'edamame.core edamame-namespace + 'sci.core {'format-stacktrace (sci/copy-var sci/format-stacktrace sci-ns) + 'stacktrace (sci/copy-var sci/stacktrace sci-ns) + ;; 'eval-string (sci/copy-var sci/eval-string sci-ns) + ;; 'eval-string* (sci/copy-var sci/eval-string* sci-ns) + ;; 'init (sci/copy-var sci/init sci-ns) + ;; 'fork (sci/copy-var sci/fork sci-ns) + } + } features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) 'clojure.data.xml.tree @(resolve 'babashka.impl.xml/xml-tree-namespace)) From 4e2ef2f1521b2645a7ecdf2a8c51ac36207f1ea8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 11 Jul 2022 13:00:19 +0200 Subject: [PATCH 234/550] sci: needs-ctx refactor (#1319) --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index c16deb95..02b6ee64 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c16deb95df7764d706f5815b3e7f1323e289c94a +Subproject commit 02b6ee6419db63913ae477c1af5454b0939b0a50 From e1544f3d65131c8b7327b0ec2b7dde2ec2e1fe44 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 13 Jul 2022 10:45:06 +0200 Subject: [PATCH 235/550] SCI with different CLJS analyzer loading --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 02b6ee64..5a79a88d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 02b6ee6419db63913ae477c1af5454b0939b0a50 +Subproject commit 5a79a88d89999da8b8e1cdfc0de816175132f93e From 0ab0cb24105ccfafa4bbf3c2dca6db2e466242ac Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 21:09:25 +0200 Subject: [PATCH 236/550] news --- README.md | 1 + doc/news.md | 9 ++++++--- sci | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 458603a9..0c3811f6 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea diff --git a/doc/news.md b/doc/news.md index 8ba49892..212cf49a 100644 --- a/doc/news.md +++ b/doc/news.md @@ -5,14 +5,17 @@ you have anything to add. Also see [#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on Twitter. - - ## 2021-12 - Releases: [0.6.8 - 0.7.3](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). diff --git a/sci b/sci index 5a79a88d..3611d7c7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 5a79a88d89999da8b8e1cdfc0de816175132f93e +Subproject commit 3611d7c72257cd9120c8554ef1a53f2eabf87f70 From dca1d2693c38c678e09ec7353f37734cbf0bf9c7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 21:21:24 +0200 Subject: [PATCH 237/550] news for jan 2022 --- README.md | 2 ++ doc/news.md | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 0c3811f6..adab6655 100644 --- a/README.md +++ b/README.md @@ -354,6 +354,8 @@ handling of SIGINT and SIGPIPE. This can be done by setting - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber +- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks) by Cyprien Pannier +- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent - [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea - [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller - [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý diff --git a/doc/news.md b/doc/news.md index 212cf49a..db001c8e 100644 --- a/doc/news.md +++ b/doc/news.md @@ -16,6 +16,16 @@ Twitter. - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber +## [2022-01](https://twitter.com/search?f=live&q=(%23babashka)%20until%3A2022-02-01%20since%3A2022-01-01&src=typed_query) + +- Releases: [0.7.4](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). +- [Babashka dev builds](https://github.com/babashka/babashka-dev-builds) +- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks/) by Cyprien Pannier +- [HTMX Todo App](https://github.com/prestancedesign/babashka-htmx-todoapp) +- [Better linting for `bb.edn`](https://twitter.com/borkdude/status/1484100071134220291) +- [Unwordle](https://github.com/mknoszlig/unwordle): solver for wordle puzzles +- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent + ## 2021-12 - Releases: [0.6.8 - 0.7.3](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). From 3cf09e12fafc892becab3249f41c248c29f0c73e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 21:30:23 +0200 Subject: [PATCH 238/550] news 03 2022 --- README.md | 1 + doc/news.md | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index adab6655..83c26fdc 100644 --- a/README.md +++ b/README.md @@ -352,6 +352,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) +- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks) by Cyprien Pannier diff --git a/doc/news.md b/doc/news.md index db001c8e..738b8ce9 100644 --- a/doc/news.md +++ b/doc/news.md @@ -16,6 +16,19 @@ Twitter. - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber +## [2022-02](https://twitter.com/search?q=(%23babashka)%20until%3A2022-03-01%20since%3A2022-02-01&src=typed_query&f=live) + +- Releases: [0.7.5 - 0.7.6](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). +- [Spire is available as a babashka pod](https://twitter.com/epic_castle/status/1496784352256008194) +- Babashka Clojure template on [Repl.it](https://replit.com/@eccentric-j/Babashka-Clojure-Template?v=1#replit.nix) by Eccentric J +- Create a self-contained executable with [caxa](https://github.com/babashka/babashka/wiki/Self-contained-executable) +- Cli-matic is now compatible due to this [PR](https://github.com/l3nz/cli-matic/pull/145) +- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou +- [Staplegun](https://github.com/escherize/staplegun): Single file clipboard-manager +- [Bbb](https://github.com/nikvdp/bbb): make executable CLI tools from bb scripts +- [Apptemplate](https://github.com/redstarssystems/apptemplate): Application project template for Clojure featuring bb tasks + + ## [2022-01](https://twitter.com/search?f=live&q=(%23babashka)%20until%3A2022-02-01%20since%3A2022-01-01&src=typed_query) - Releases: [0.7.4](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). From 8f447cf43b1e9ebb5ea34bd93dafce113110ee7e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 21:35:28 +0200 Subject: [PATCH 239/550] partial news 03 2022 --- README.md | 1 + doc/news.md | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 83c26fdc..1c2d8697 100644 --- a/README.md +++ b/README.md @@ -352,6 +352,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) +- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg - [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber diff --git a/doc/news.md b/doc/news.md index 738b8ce9..bb16ce67 100644 --- a/doc/news.md +++ b/doc/news.md @@ -12,9 +12,12 @@ Twitter. - [Babashka toolbox](https://babashka.org/toolbox/) - [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well. -## 2022-03 +## [2022-03](https://twitter.com/search?q=(%23babashka)%20until%3A2022-04-01%20since%3A2022-03-01&src=typed_query&f=live) - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber +- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg +- [Clj-konmari](https://github.com/oxalorg/clj-konmari/) by Oxalorg +- [Logseq-query](https://github.com/cldwalker/logseq-query) by Gabriel Horner [(announcement tweet)](https://twitter.com/cldwalker/status/1506991213030871041) ## [2022-02](https://twitter.com/search?q=(%23babashka)%20until%3A2022-03-01%20since%3A2022-02-01&src=typed_query&f=live) From ac9b249cc83ad44671fe43949873a1675bb5eb93 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 21:44:23 +0200 Subject: [PATCH 240/550] news --- README.md | 2 +- doc/news.md | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1c2d8697..5c424d26 100644 --- a/README.md +++ b/README.md @@ -354,7 +354,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg - [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou -- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé +- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks) by Cyprien Pannier - [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent diff --git a/doc/news.md b/doc/news.md index bb16ce67..025ad5ac 100644 --- a/doc/news.md +++ b/doc/news.md @@ -12,12 +12,19 @@ Twitter. - [Babashka toolbox](https://babashka.org/toolbox/) - [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well. +## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) + +- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group + ## [2022-03](https://twitter.com/search?q=(%23babashka)%20until%3A2022-04-01%20since%3A2022-03-01&src=typed_query&f=live) +- Releases: [0.7.7 - 0.7.8](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber - [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg - [Clj-konmari](https://github.com/oxalorg/clj-konmari/) by Oxalorg -- [Logseq-query](https://github.com/cldwalker/logseq-query) by Gabriel Horner [(announcement tweet)](https://twitter.com/cldwalker/status/1506991213030871041) +- [Logseq-query](https://github.com/cldwalker/logseq-query) by Gabriel Horner [(announcement tweet with video)](https://twitter.com/cldwalker/status/1506991213030871041) +- The [loom](https://github.com/aysylu/loom) library is now compatible [(tweet)](https://twitter.com/borkdude/status/1502237220811550723) +- The [at-at](https://github.com/overtone/at-at) library is now compatible ## [2022-02](https://twitter.com/search?q=(%23babashka)%20until%3A2022-03-01%20since%3A2022-02-01&src=typed_query&f=live) From 536f39d435a397bdde32be95da4714d219750056 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:06:05 +0200 Subject: [PATCH 241/550] news 04 22 --- doc/news.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/news.md b/doc/news.md index 025ad5ac..7addbe32 100644 --- a/doc/news.md +++ b/doc/news.md @@ -14,7 +14,11 @@ Twitter. ## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) +- Releases: [0.8.0](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group +- [Setup-Clojure](https://github.com/DeLaGuardo/setup-clojure/releases/tag/5.0) Github action is now able to install babashka! +- Control Chrome via devtools using [clj-chrome-devtools](https://github.com/tatut/clj-chrome-devtools/blob/master/bb.clj) which runs with bb! +- Use pods directly in `bb.edn`: [tweet](https://twitter.com/borkdude/status/1510995356229767172) ## [2022-03](https://twitter.com/search?q=(%23babashka)%20until%3A2022-04-01%20since%3A2022-03-01&src=typed_query&f=live) @@ -110,7 +114,7 @@ Twitter. - [Cursive](https://twitter.com/CursiveIDE/status/1439022267187433472) adds support for babashka in 1.11.0 - How to filter tail output with babashka on [StackOverflow](https://stackoverflow.com/questions/69241046/how-to-filter-output-of-tail-with-babashka/69241911?stw=2#69241911) - [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holy -- [neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects. +- [Neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects. ## 2021-08 From bf06830353aa0e0e023601a0f9711e99fb2109dd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:10:12 +0200 Subject: [PATCH 242/550] news 2022 5 --- doc/news.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/news.md b/doc/news.md index 7addbe32..0fb53d25 100644 --- a/doc/news.md +++ b/doc/news.md @@ -10,7 +10,15 @@ Twitter. - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Expose Clojure functions in the CLI with babashka and nix](https://twitter.com/jlesquembre/status/1546777332471455745) - [Babashka toolbox](https://babashka.org/toolbox/) + +## [2022-05](https://twitter.com/search?q=(%23babashka)%20until%3A2022-06-01%20since%3A2022-05-01&src=typed_query&f=live) + - [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well. +- [Nix docs for babashka](https://github.com/babashka/babashka/blob/master/doc/nix.md) +- [Fly.io docs for babashka](https://github.com/babashka/babashka/tree/master/doc/fly_io) +- [Babashka survey results](https://blog.michielborkent.nl/babashka-survey-q1-2022.html) +- [Quickdoc](Quick and minimal API doc generation for Clojure) +- [Awyeah-api](https://github.com/grzm/awyeah-api) - Cognitect's aws-api for babashka ## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) From 8aba3ffc2d9610d2e0fdde6904b76e66df802897 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:19:34 +0200 Subject: [PATCH 243/550] news 2022 6 --- README.md | 2 ++ doc/news.md | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/README.md b/README.md index 5c424d26..7e18218f 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,8 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! +- [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg - [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou diff --git a/doc/news.md b/doc/news.md index 0fb53d25..cbe5329f 100644 --- a/doc/news.md +++ b/doc/news.md @@ -11,8 +11,23 @@ Twitter. - [Expose Clojure functions in the CLI with babashka and nix](https://twitter.com/jlesquembre/status/1546777332471455745) - [Babashka toolbox](https://babashka.org/toolbox/) +## [2022-06](https://twitter.com/search?q=(%23babashka)%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live) + +- Releases: [0.8.156](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). +- [AWS wiki page](https://github.com/babashka/babashka/wiki/AWS) +- [blambda](https://github.com/jmglov/blambda): Blambda! is a custom runtime for AWS Lambda that lets you write functions using Babashka +- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! +- [Http-server](https://github.com/babashka/http-server#babashka): Serve static assets +- [Deps-bundler](https://github.com/MrGung/deps-bundler): Bundle dependencies on + a computer that has access to maven and clojars (PC-A) and bring these over to + a computer with limited access (PC-L). +- [Prismatic/schema](https://github.com/plumatic/schema/blob/master/CHANGELOG.md#130-2022-06-10) and babashka are now compatible +- [Logseq bb tasks](https://github.com/logseq/bb-tasks): Reusable babashka tasks used by logseq team +- [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman + ## [2022-05](https://twitter.com/search?q=(%23babashka)%20until%3A2022-06-01%20since%3A2022-05-01&src=typed_query&f=live) +- Releases: [0.8.2](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well. - [Nix docs for babashka](https://github.com/babashka/babashka/blob/master/doc/nix.md) - [Fly.io docs for babashka](https://github.com/babashka/babashka/tree/master/doc/fly_io) @@ -22,6 +37,7 @@ Twitter. ## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) +- Releases: [0.8.1](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - Releases: [0.8.0](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group - [Setup-Clojure](https://github.com/DeLaGuardo/setup-clojure/releases/tag/5.0) Github action is now able to install babashka! From 30dcb2ad866779fb08fafad098f6eb37a09abc99 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:29:37 +0200 Subject: [PATCH 244/550] news 2022 7 --- README.md | 1 + doc/news.md | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e18218f..442d228f 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover - [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! - [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) diff --git a/doc/news.md b/doc/news.md index cbe5329f..9fa3cfd8 100644 --- a/doc/news.md +++ b/doc/news.md @@ -5,11 +5,22 @@ you have anything to add. Also see [#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on Twitter. -## 2022-07 +## [2022-07](https://twitter.com/search?q=(%23babashka)%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live) - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Expose Clojure functions in the CLI with babashka and nix](https://twitter.com/jlesquembre/status/1546777332471455745) - [Babashka toolbox](https://babashka.org/toolbox/) +- [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka +- Win a babashka t-shirt by participating in [this](https://twitter.com/borkdude/status/1547847843381030912) contest! +- [AWS Lambda, now with first class parentheses](https://www.juxt.pro/blog/nbb-lambda) by Ray McDermott (about nbb) +- [Babashka toolbox](https://babashka.org/toolbox/): A categorised directory of libraries and tools for Babashka +- [bb-github-app](https://github.com/brandonstubbs/bb-github-app): An example Babashka Script authenticating as a Github App and interacting with the Checks API +- [Ruuter](https://github.com/askonomm/ruuter#setting-up-with-babashka) is a routing library which works very well with bb +- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover +- Files with the `.bb` extension are now correctly highlighted as Clojure code on Github! See [this](https://twitter.com/borkdude/status/1543937735429431298) tweet. +- Encode and decode files as kroki url diagrams, a [gist](https://gist.github.com/henryw374/070845dbd8cfb4672a3c0d06cf8b00e4) by Henry Widd +- Customized bb builds with clj-nix: [tweet](https://twitter.com/jlesquembre/status/1543686641461694470) +- [Meander](https://github.com/noprompt/meander) is now compatible with bb: [tweet](https://twitter.com/borkdude/status/1542881167338250242) ## [2022-06](https://twitter.com/search?q=(%23babashka)%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live) From 4a76fd050d4245c053bedd4f0a70dfc2c7d847c0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:33:20 +0200 Subject: [PATCH 245/550] news 2022 7 --- README.md | 1 + doc/news.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 442d228f..c78190f5 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund - [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover - [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! - [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman diff --git a/doc/news.md b/doc/news.md index 9fa3cfd8..b95c720b 100644 --- a/doc/news.md +++ b/doc/news.md @@ -7,7 +7,7 @@ Twitter. ## [2022-07](https://twitter.com/search?q=(%23babashka)%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live) -- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) +- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund - [Expose Clojure functions in the CLI with babashka and nix](https://twitter.com/jlesquembre/status/1546777332471455745) - [Babashka toolbox](https://babashka.org/toolbox/) - [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka From 55ba655fab96b61b0e9adc53bf52ef436cffc553 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:34:41 +0200 Subject: [PATCH 246/550] news 2022 7 --- doc/news.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/news.md b/doc/news.md index b95c720b..bab58d83 100644 --- a/doc/news.md +++ b/doc/news.md @@ -8,7 +8,6 @@ Twitter. ## [2022-07](https://twitter.com/search?q=(%23babashka)%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live) - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund -- [Expose Clojure functions in the CLI with babashka and nix](https://twitter.com/jlesquembre/status/1546777332471455745) - [Babashka toolbox](https://babashka.org/toolbox/) - [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka - Win a babashka t-shirt by participating in [this](https://twitter.com/borkdude/status/1547847843381030912) contest! @@ -20,6 +19,7 @@ Twitter. - Files with the `.bb` extension are now correctly highlighted as Clojure code on Github! See [this](https://twitter.com/borkdude/status/1543937735429431298) tweet. - Encode and decode files as kroki url diagrams, a [gist](https://gist.github.com/henryw374/070845dbd8cfb4672a3c0d06cf8b00e4) by Henry Widd - Customized bb builds with clj-nix: [tweet](https://twitter.com/jlesquembre/status/1543686641461694470) +- Expose Clojure functions in the CLI with babashka and nix: [tweet](https://twitter.com/jlesquembre/status/1546777332471455745) - [Meander](https://github.com/noprompt/meander) is now compatible with bb: [tweet](https://twitter.com/borkdude/status/1542881167338250242) ## [2022-06](https://twitter.com/search?q=(%23babashka)%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live) From 19f58fca8323ca301d3bcf2449cba11f596fe49d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:35:54 +0200 Subject: [PATCH 247/550] news 2022 7 --- doc/news.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/news.md b/doc/news.md index bab58d83..a22f0dc2 100644 --- a/doc/news.md +++ b/doc/news.md @@ -8,11 +8,10 @@ Twitter. ## [2022-07](https://twitter.com/search?q=(%23babashka)%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live) - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund -- [Babashka toolbox](https://babashka.org/toolbox/) +- [Babashka toolbox](https://babashka.org/toolbox/): A categorised directory of libraries and tools for Babashka - [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka - Win a babashka t-shirt by participating in [this](https://twitter.com/borkdude/status/1547847843381030912) contest! - [AWS Lambda, now with first class parentheses](https://www.juxt.pro/blog/nbb-lambda) by Ray McDermott (about nbb) -- [Babashka toolbox](https://babashka.org/toolbox/): A categorised directory of libraries and tools for Babashka - [bb-github-app](https://github.com/brandonstubbs/bb-github-app): An example Babashka Script authenticating as a Github App and interacting with the Checks API - [Ruuter](https://github.com/askonomm/ruuter#setting-up-with-babashka) is a routing library which works very well with bb - [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover From 9c925002972b143b1279d06c3485873d30696855 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:39:02 +0200 Subject: [PATCH 248/550] news 2022 7 --- doc/news.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/news.md b/doc/news.md index a22f0dc2..125ffdd5 100644 --- a/doc/news.md +++ b/doc/news.md @@ -42,7 +42,7 @@ Twitter. - [Nix docs for babashka](https://github.com/babashka/babashka/blob/master/doc/nix.md) - [Fly.io docs for babashka](https://github.com/babashka/babashka/tree/master/doc/fly_io) - [Babashka survey results](https://blog.michielborkent.nl/babashka-survey-q1-2022.html) -- [Quickdoc](Quick and minimal API doc generation for Clojure) +- [Quickdoc](https://github.com/borkdude/quickdoc): (Quick and minimal API doc generation for Clojure - [Awyeah-api](https://github.com/grzm/awyeah-api) - Cognitect's aws-api for babashka ## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) From cde09afa10bd522428ce7dec2871427d0c2bb0bf Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 15 Jul 2022 23:39:32 +0200 Subject: [PATCH 249/550] news 2022 7 --- doc/news.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/news.md b/doc/news.md index 125ffdd5..3631a764 100644 --- a/doc/news.md +++ b/doc/news.md @@ -47,8 +47,7 @@ Twitter. ## [2022-04](https://twitter.com/search?q=(%23babashka)%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live) -- Releases: [0.8.1](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). -- Releases: [0.8.0](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). +- Releases: [0.8.0 - 0.8.1](https://github.com/babashka/babashka/blob/master/CHANGELOG.md). - [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group - [Setup-Clojure](https://github.com/DeLaGuardo/setup-clojure/releases/tag/5.0) Github action is now able to install babashka! - Control Chrome via devtools using [clj-chrome-devtools](https://github.com/tatut/clj-chrome-devtools/blob/master/bb.clj) which runs with bb! From 5c246ccccba4418cb85b7941a29a92586f6a287f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 16 Jul 2022 17:02:23 +0200 Subject: [PATCH 250/550] process: improve tokenize --- process | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process b/process index ac8a12b0..4392dfff 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit ac8a12b0969297bd2abf2c10571df1b84eb1a857 +Subproject commit 4392dfffa76fd3eebed891f7b5f688710d4c4ec9 diff --git a/sci b/sci index 3611d7c7..b8bae6a7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3611d7c72257cd9120c8554ef1a53f2eabf87f70 +Subproject commit b8bae6a723a78576564d90c661e371793e39cd9b From 9e57cb4430148d025a78b9a3d2bb10d4da245f74 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 23 Jul 2022 14:06:38 +0200 Subject: [PATCH 251/550] Add article --- README.md | 1 + doc/news.md | 2 ++ sci | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c78190f5..e8fea19c 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund - [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover - [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! diff --git a/doc/news.md b/doc/news.md index 3631a764..f5eb263c 100644 --- a/doc/news.md +++ b/doc/news.md @@ -20,6 +20,8 @@ Twitter. - Customized bb builds with clj-nix: [tweet](https://twitter.com/jlesquembre/status/1543686641461694470) - Expose Clojure functions in the CLI with babashka and nix: [tweet](https://twitter.com/jlesquembre/status/1546777332471455745) - [Meander](https://github.com/noprompt/meander) is now compatible with bb: [tweet](https://twitter.com/borkdude/status/1542881167338250242) +- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller + ## [2022-06](https://twitter.com/search?q=(%23babashka)%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live) diff --git a/sci b/sci index b8bae6a7..a9bec09e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit b8bae6a723a78576564d90c661e371793e39cd9b +Subproject commit a9bec09e9dbab55971f7defbd0108f88c16c52e5 From e58fe9db1bf4baafb86f4dc871ba6749fa6f5677 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 27 Jul 2022 12:20:32 +0200 Subject: [PATCH 252/550] Upgrade to GraalVM 22.2.0 (#1325) --- .circleci/script/short_ci.clj | 8 ++++---- .github/workflows/build.yml | 6 +++--- Dockerfile | 2 +- appveyor.yml | 6 +++--- doc/build.md | 8 ++++---- doc/dev.md | 2 +- .../babashka/babashka/native-image.properties | 1 + script/bump_graal_version.clj | 16 ++++++++-------- 8 files changed, 25 insertions(+), 24 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index 19e8a85b..ab796033 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -114,7 +114,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (defn unix [shorted? static? musl? arch executor-conf resource-class graalvm-home platform] (let [env {:LEIN_ROOT "true" - :GRAALVM_VERSION "22.1.0" + :GRAALVM_VERSION "22.2.0" :GRAALVM_HOME graalvm-home :BABASHKA_PLATFORM (if (= "mac" platform) "macos" @@ -168,7 +168,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl {:persist_to_workspace {:root "/tmp" :paths ["release"]}} {:save_cache - {:paths ["~/.m2" "~/graalvm-ce-java11-22.1.0"] + {:paths ["~/.m2" "~/graalvm-ce-java11-22.2.0"] :key cache-key}} {:store_artifacts {:path "/tmp/release" :destination "release"}} @@ -180,8 +180,8 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} mac-executor-conf {:macos {:xcode "12.0.0"}} - linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.1.0" - mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home"] + linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0" + mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"] (ordered-map :version 2.1 :commands diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 64c6479e..d1bb7dc5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -102,7 +102,7 @@ jobs: runs-on: ${{ matrix.os }} env: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" + GRAALVM_VERSION: "22.2.0" BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -126,7 +126,7 @@ jobs: if: "matrix.static == false" uses: graalvm/setup-graalvm@v1 with: - version: '22.1.0' + version: '22.2.0' java-version: '11' components: 'native-image' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -135,7 +135,7 @@ jobs: if: "matrix.static == true" uses: graalvm/setup-graalvm@v1 with: - version: '22.1.0' + version: '22.2.0' java-version: '11' components: 'native-image' native-image-musl: true diff --git a/Dockerfile b/Dockerfile index 30f7dae8..13ee10fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN apt update RUN apt install --no-install-recommends -yy build-essential zlib1g-dev WORKDIR "/opt" -ENV GRAALVM_VERSION="22.1.0" +ENV GRAALVM_VERSION="22.2.0" ARG TARGETARCH ENV BABASHKA_ARCH=${TARGETARCH} ENV GRAALVM_ARCH=${TARGETARCH} diff --git a/appveyor.yml b/appveyor.yml index 2228c399..7ad68110 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,8 +7,8 @@ image: Visual Studio 2017 clone_folder: C:\projects\babashka environment: - GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0 - JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0 + GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0 + JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0 BABASHKA_XMX: "-J-Xmx5g" skip_commits: @@ -38,7 +38,7 @@ clone_script: build_script: - cmd: >- - powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-windows-amd64-22.1.0.zip', 'graalvm.zip') }" + powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java11-windows-amd64-22.2.0.zip', 'graalvm.zip') }" powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }" diff --git a/doc/build.md b/doc/build.md index ad1ebb44..2b5fa2e1 100644 --- a/doc/build.md +++ b/doc/build.md @@ -3,24 +3,24 @@ ## Prerequisites - Install [lein](https://leiningen.org/) for producing uberjars -- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.1.0*. +- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.2.0*. - For Windows, installing Visual Studio 2019 with the "Desktop development with C++" workload is recommended. - Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0/Contents/Home + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.0/Contents/Home ``` On linux: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0 + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.0 ``` On Windows, from the [Visual Studio 2019 x64 Native Tools Command Prompt](https://github.com/oracle/graal/issues/2116#issuecomment-590470806) or `cmd.exe` (not Powershell): ``` - set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.1.0 + set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.2.0 ``` If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using: ``` diff --git a/doc/dev.md b/doc/dev.md index 6c012426..3f1ecd49 100644 --- a/doc/dev.md +++ b/doc/dev.md @@ -37,7 +37,7 @@ reasons: ## Requirements -You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.1.0. +You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.2.0. ## Clone repository diff --git a/resources/META-INF/native-image/babashka/babashka/native-image.properties b/resources/META-INF/native-image/babashka/babashka/native-image.properties index 2577a2dc..77553bc9 100644 --- a/resources/META-INF/native-image/babashka/babashka/native-image.properties +++ b/resources/META-INF/native-image/babashka/babashka/native-image.properties @@ -13,6 +13,7 @@ Args=-H:+ReportExceptionStackTraces \ --report-unsupported-elements-at-runtime \ --initialize-at-build-time=com.fasterxml.jackson \ --initialize-at-build-time=java.sql.SQLException \ + --initialize-at-build-time=org.yaml.snakeyaml \ --initialize-at-run-time=org.postgresql.sspi.SSPIClient \ --initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \ -H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \ diff --git a/script/bump_graal_version.clj b/script/bump_graal_version.clj index a9cb051a..fc80ea12 100755 --- a/script/bump_graal_version.clj +++ b/script/bump_graal_version.clj @@ -43,7 +43,9 @@ ".github/workflows/build.yml" ".circleci/config.yml" "appveyor.yml" - "project.clj"]) + "project.clj" + "script/bump_graal_version.clj" + ".circleci/script/short_ci.clj"]) ;; We might have to keep changing these from ;; time to time whenever the version is bumped @@ -51,10 +53,8 @@ ;; OR ;; ;; We could have them as environment variables -(def current-graal-version "22.0.0.2") +(def current-graal-version "22.2.0") (def current-java-version "java11") -(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0" "21.0.0" "21.1.0" "21.2.0" "21.3.0" "22.0.0.2" "22.1.0"]) -(def valid-java-bumps ["java8" "java11"]) (def cl-options [["-g" "--graal VERSION" "graal version"] @@ -65,8 +65,8 @@ (:options (cli/parse-opts *command-line-args* cl-options))) (defn is-valid-bump? - [version valid-bumps] - (some #(= % version) valid-bumps)) + [_version _valid-bumps] + true) (defn replace-current [file current new] @@ -93,13 +93,13 @@ (let [new-graal-version (:graal args) new-java-version (:java args)] (when (not (nil? new-graal-version)) - (if (is-valid-bump? new-graal-version valid-graal-bumps) + (if (is-valid-bump? new-graal-version nil) (do (println "Performing Graal bump...") (bump-current current-graal-version new-graal-version)) (show-error new-graal-version))) (when (not (nil? new-java-version)) - (if (is-valid-bump? new-java-version valid-java-bumps) + (if (is-valid-bump? new-java-version nil) (do (println "Performing Java bump...") (bump-current current-java-version new-java-version)) From 5c03eef36bccaa0d817d907ff3740f1a955ec9f0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 27 Jul 2022 17:32:38 +0200 Subject: [PATCH 253/550] sci update --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index a9bec09e..3e068bbd 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a9bec09e9dbab55971f7defbd0108f88c16c52e5 +Subproject commit 3e068bbd9cfdf8e39107721658a3717db092c2e0 From dc5b36bbe6def0e05dc95ce8462c59bc845174cd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 12:00:58 +0200 Subject: [PATCH 254/550] bundle babashka cli --- deps.edn | 3 ++- project.clj | 3 ++- src/babashka/impl/cli.clj | 9 +++++++++ src/babashka/main.clj | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 src/babashka/impl/cli.clj diff --git a/deps.edn b/deps.edn index 12c22cb2..2ac4a8d2 100644 --- a/deps.edn +++ b/deps.edn @@ -48,7 +48,8 @@ org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} - org.clojure/core.rrb-vector {:mvn/version "0.1.2"}} + org.clojure/core.rrb-vector {:mvn/version "0.1.2"} + org.babashka/cli {:mvn/version "0.3.33"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index c69c609b..e8163ea4 100644 --- a/project.clj +++ b/project.clj @@ -31,7 +31,8 @@ [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.0.699-alpha"] - [insn/insn "0.5.2"]] + [insn/insn "0.5.2"] + [org.babashka/cli "0.3.33"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj new file mode 100644 index 00000000..d0f91284 --- /dev/null +++ b/src/babashka/impl/cli.clj @@ -0,0 +1,9 @@ +(ns babashka.impl.cli + (:require + [babashka.cli] + [sci.core :as sci])) + +(def cns (sci/create-ns 'babashka.cli)) + +(def cli-namespace + (sci/copy-ns babashka.cli cns)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 6f20a62c..c6d23dc8 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -9,6 +9,7 @@ [babashka.impl.cheshire :refer [cheshire-core-namespace]] [babashka.impl.classes :as classes] [babashka.impl.classpath :as cp :refer [classpath-namespace]] + [babashka.impl.cli :as cli] [babashka.impl.clojure.core :as core :refer [core-extras]] [babashka.impl.clojure.core.async :refer [async-namespace async-protocols-namespace]] @@ -409,6 +410,7 @@ Use bb run --help to show this help output. ;; 'init (sci/copy-var sci/init sci-ns) ;; 'fork (sci/copy-var sci/fork sci-ns) } + 'babashka.cli cli/cli-namespace } features/xml? (assoc 'clojure.data.xml @(resolve 'babashka.impl.xml/xml-namespace) 'clojure.data.xml.event @(resolve 'babashka.impl.xml/xml-event-namespace) From 1b3adaaf64c8499ccdbde3cc43787a21b3c132bb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 12:23:28 +0200 Subject: [PATCH 255/550] -x --- deps.edn | 2 +- project.clj | 2 +- src/babashka/impl/cli.clj | 11 +++++++++++ src/babashka/main.clj | 23 ++++++++++++++++++----- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/deps.edn b/deps.edn index 2ac4a8d2..5a17ef32 100644 --- a/deps.edn +++ b/deps.edn @@ -49,7 +49,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.3.33"}} + org.babashka/cli {:mvn/version "0.3.34"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index e8163ea4..4f232155 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.0.699-alpha"] [insn/insn "0.5.2"] - [org.babashka/cli "0.3.33"]] + [org.babashka/cli "0.3.34"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index d0f91284..85fe6667 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -7,3 +7,14 @@ (def cli-namespace (sci/copy-ns babashka.cli cns)) + +(defn exec-fn-snippet [ns var-name] + (format " +(require '%1$s) +(require '[babashka.cli]) +(def ns-meta (meta (find-ns '%1$s))) +(def var-meta (meta (resolve '%1$s/%2$s))) +(def cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta))) +(def opts (babashka.cli/parse-opts *command-line-args* cli-opts)) +(%1$s/%2$s opts)" + ns var-name)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index c6d23dc8..2ed4ff5f 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -645,6 +645,12 @@ Use bb run --help to show this help output. :command-line-args (if (= "--" (second options)) (nthrest options 2) (rest options)))) + ("--exec", "-x",) + (let [options (next options)] + (assoc opts-map :exec (first options) + :command-line-args (if (= "--" (second options)) + (nthrest options 2) + (rest options)))) ("--run") (parse-run-opts opts-map (next options)) ("--tasks") @@ -751,11 +757,13 @@ Use bb run --help to show this help output. :main :uberscript :describe? :jar :uberjar :clojure :doc :run :list-tasks - :print-deps :prepare]} + :print-deps :prepare] + exec-fn :exec} cli-opts _ (when debug (vreset! common/debug true)) _ (do ;; set properties (when main (System/setProperty "babashka.main" main)) + ;; TODO: what about exec here? (System/setProperty "babashka.version" version)) read-next (fn [*in*] (if (pipe-signal-received?) @@ -865,6 +873,11 @@ Use bb run --help to show this help output. "-main")] [[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)" ns var-name)] nil]) + exec-fn + (let [sym (symbol exec-fn) + ns (namespace sym) + var-name (name sym)] + [[(cli/exec-fn-snippet ns var-name)] nil]) run (if (:run-help cli-opts) [(print-run-help) 0] (do @@ -1008,10 +1021,10 @@ Use bb run --help to show this help output. (defn load-edn [string] (try (edn/read-string string) - (catch java.lang.RuntimeException e - (if (re-find #"No dispatch macro for: \"" (.getMessage e)) - (throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {})) - (throw e))))) + (catch java.lang.RuntimeException e + (if (re-find #"No dispatch macro for: \"" (.getMessage e)) + (throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {})) + (throw e))))) (defn main [& args] (let [[args global-opts] (parse-global-opts args) From 8d24f70d7390fb45badde46266f8ebc6801a1f23 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 12:51:43 +0200 Subject: [PATCH 256/550] task integration --- src/babashka/impl/cli.clj | 3 +++ src/babashka/impl/tasks.clj | 39 +++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index 85fe6667..0d199c5d 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -16,5 +16,8 @@ (def var-meta (meta (resolve '%1$s/%2$s))) (def cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta))) (def opts (babashka.cli/parse-opts *command-line-args* cli-opts)) +(def task-exec-args (:exec-args (babashka.tasks/current-task))) +(def cli-exec-args (:exec-args cli-opts)) +(def opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)) (%1$s/%2$s opts)" ns var-name)) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 2c59a4a8..eeb2a08f 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -1,16 +1,19 @@ (ns babashka.impl.tasks - (:require [babashka.deps :as deps] - [babashka.impl.common :refer [ctx bb-edn debug]] - [babashka.impl.process :as pp] - [babashka.process :as p] - [clojure.core.async :refer [ Date: Fri, 29 Jul 2022 12:57:23 +0200 Subject: [PATCH 257/550] v0.9.158 --- CHANGELOG.md | 9 +++++++++ resources/BABASHKA_VERSION | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0c9e57d..dd93984d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## 0.9.158 (2022-07-29) + +- [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI +- [#1324](https://github.com/babashka/babashka/issues/1324): `babashka.tasks/exec` to invoke a function with babashka CLI in tasks +- SCI: don't eval metatada on defn body +- SCI issue 774: make interpreter stacktrace available to user +- `babashka.process`: improve `tokenize` +- Upgrade to GraalVM 22.2.0 (#1325) + ## 0.8.157 (2022-07-01) - Add compatibility with [`metosin/malli`](https://github.com/metosin/malli#babashka) `{:mvn/version "0.8.9"}`. diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 0183df97..4d57871c 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.8.158-SNAPSHOT \ No newline at end of file +0.9.158 \ No newline at end of file From 05d105716a3a9bf32d43e2bc48b61c18c44ac472 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:04:48 +0200 Subject: [PATCH 258/550] improve snippet --- src/babashka/impl/cli.clj | 18 ++++++++++-------- src/babashka/impl/tasks.clj | 1 - 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index 0d199c5d..49d986d7 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -10,14 +10,16 @@ (defn exec-fn-snippet [ns var-name] (format " +(do (require '%1$s) (require '[babashka.cli]) -(def ns-meta (meta (find-ns '%1$s))) -(def var-meta (meta (resolve '%1$s/%2$s))) -(def cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta))) -(def opts (babashka.cli/parse-opts *command-line-args* cli-opts)) -(def task-exec-args (:exec-args (babashka.tasks/current-task))) -(def cli-exec-args (:exec-args cli-opts)) -(def opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)) -(%1$s/%2$s opts)" +(let [ +ns-meta (meta (find-ns '%1$s)) +var-meta (meta (resolve '%1$s/%2$s)) +cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta)) +opts (babashka.cli/parse-opts *command-line-args* cli-opts) +task-exec-args (:exec-args (babashka.tasks/current-task)) +cli-exec-args (:exec-args cli-opts) +opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] +(%1$s/%2$s opts)))" ns var-name)) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index eeb2a08f..830bcb77 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -462,7 +462,6 @@ (let [ns (namespace fq-sym) var-name (name fq-sym) snippet (cli/exec-fn-snippet ns var-name)] - (prn snippet) `(load-string ~snippet)))) (def tasks-namespace From e8ca180529cebe55abd6f463738342a5680e624d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:09:00 +0200 Subject: [PATCH 259/550] make compatible with init --- src/babashka/impl/tasks.clj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 830bcb77..3924672a 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -458,9 +458,10 @@ (sci/eval-string* @ctx expr)))) (defn ^:macro exec - ([_ _ fq-sym] - (let [ns (namespace fq-sym) - var-name (name fq-sym) + ([_ _ sym] + (let [ns (namespace sym) + ns (or ns (symbol (str @sci/ns))) + var-name (name sym) snippet (cli/exec-fn-snippet ns var-name)] `(load-string ~snippet)))) From dc30728f68a391f849a229fdaacf4d4067eba3c3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:09:33 +0200 Subject: [PATCH 260/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 8e2fbabb..4d57871c 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.8.157 \ No newline at end of file +0.9.158 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 4d57871c..331e62e3 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.158 \ No newline at end of file +0.9.159-SNAPSHOT \ No newline at end of file From 245a5bfaad7978458b9333b9a3ac79ebc6bce3d5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:10:01 +0200 Subject: [PATCH 261/550] v0.9.159 --- resources/BABASHKA_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 331e62e3..2e4d2649 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.159-SNAPSHOT \ No newline at end of file +0.9.159 \ No newline at end of file From 1bd2c18d5e2e08434a96610ed20f1b1484e0e444 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:10:24 +0200 Subject: [PATCH 262/550] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd93984d..18212f2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## 0.9.158 (2022-07-29) +## 0.9.159 (2022-07-29) - [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI - [#1324](https://github.com/babashka/babashka/issues/1324): `babashka.tasks/exec` to invoke a function with babashka CLI in tasks From 774b2d5d3deec0e7a915c0105183c2d82e96f1f1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 13:27:27 +0200 Subject: [PATCH 263/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- resources/META-INF/babashka/deps.edn | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 4d57871c..2e4d2649 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.9.158 \ No newline at end of file +0.9.159 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 2e4d2649..e163b3fc 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.159 \ No newline at end of file +0.9.160-SNAPSHOT \ No newline at end of file diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 12c22cb2..5a17ef32 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -48,7 +48,8 @@ org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} - org.clojure/core.rrb-vector {:mvn/version "0.1.2"}} + org.clojure/core.rrb-vector {:mvn/version "0.1.2"} + org.babashka/cli {:mvn/version "0.3.34"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile From 2a01f8720e69ec50790b5f45a37ff0dc95fcb2cb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 15:05:23 +0200 Subject: [PATCH 264/550] Add note [skip ci] --- src/babashka/impl/tasks.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 3924672a..9d611baa 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -458,6 +458,7 @@ (sci/eval-string* @ctx expr)))) (defn ^:macro exec + "This is a macro so it works correctly with :init" ([_ _ sym] (let [ns (namespace sym) ns (or ns (symbol (str @sci/ns))) From 0608c71687444918a11c1e5d9376d50af9bae708 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 21:03:07 +0200 Subject: [PATCH 265/550] Make exec a function instead --- src/babashka/impl/cli.clj | 27 +++++++++++++++------------ src/babashka/impl/tasks.clj | 14 +++++--------- src/babashka/main.clj | 6 ++---- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index 49d986d7..3762df6d 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -8,18 +8,21 @@ (def cli-namespace (sci/copy-ns babashka.cli cns)) -(defn exec-fn-snippet [ns var-name] +(defn exec-fn-snippet [sym] (format " (do -(require '%1$s) (require '[babashka.cli]) -(let [ -ns-meta (meta (find-ns '%1$s)) -var-meta (meta (resolve '%1$s/%2$s)) -cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta)) -opts (babashka.cli/parse-opts *command-line-args* cli-opts) -task-exec-args (:exec-args (babashka.tasks/current-task)) -cli-exec-args (:exec-args cli-opts) -opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] -(%1$s/%2$s opts)))" - ns var-name)) +(let [var (requiring-resolve `%1$s) + var-meta (meta var) + ns (:ns (meta var)) + ns-meta (meta ns) + ct (babashka.tasks/current-task) + cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) + (:org.babashka/cli var-meta) + (:org.babashka/cli ct)) + opts (babashka.cli/parse-opts *command-line-args* cli-opts) + task-exec-args (:exec-args ct) + cli-exec-args (:exec-args cli-opts) + opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] +(var opts)))" + sym)) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 9d611baa..0be65b5a 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -268,7 +268,7 @@ (intern *ns* 'run babashka.tasks/run)) (when-not (resolve 'exec) - (intern *ns* (with-meta 'exec {:macro true}) @(var babashka.tasks/exec))) + (intern *ns* 'exec @(var babashka.tasks/exec))) %s %s @@ -457,14 +457,10 @@ (let [[[expr]] (assemble-task task parallel)] (sci/eval-string* @ctx expr)))) -(defn ^:macro exec - "This is a macro so it works correctly with :init" - ([_ _ sym] - (let [ns (namespace sym) - ns (or ns (symbol (str @sci/ns))) - var-name (name sym) - snippet (cli/exec-fn-snippet ns var-name)] - `(load-string ~snippet)))) +(defn exec + ([sym] + (let [snippet (cli/exec-fn-snippet sym)] + (sci/eval-string* @ctx snippet)))) (def tasks-namespace {'shell (sci/copy-var shell sci-ns) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 2ed4ff5f..4cff399f 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -874,10 +874,8 @@ Use bb run --help to show this help output. [[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)" ns var-name)] nil]) exec-fn - (let [sym (symbol exec-fn) - ns (namespace sym) - var-name (name sym)] - [[(cli/exec-fn-snippet ns var-name)] nil]) + (let [sym (symbol exec-fn)] + [[(cli/exec-fn-snippet sym)] nil]) run (if (:run-help cli-opts) [(print-run-help) 0] (do From c97b08425a4911264b54363d6f2b9e83c757ae65 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 21:03:24 +0200 Subject: [PATCH 266/550] v0.9.160 --- resources/BABASHKA_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index e163b3fc..a9c40c6c 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.160-SNAPSHOT \ No newline at end of file +0.9.160 \ No newline at end of file From 0cdb897f4faa5139470f78465a6eed1c11bbb7ac Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 21:18:20 +0200 Subject: [PATCH 267/550] changelogs --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18212f2b..dd61241c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## 0.9.160 (2022-07-29) + +- Breaking: change `exec`, introduced in `0.9.159` to a function instead. + You now write `(exec 'mynamespace.function)` instead. + ## 0.9.159 (2022-07-29) - [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI From 2c3b1095c830ae524138f6bb65e26bbd38ddad0b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 21:18:27 +0200 Subject: [PATCH 268/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 2e4d2649..a9c40c6c 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.9.159 \ No newline at end of file +0.9.160 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index a9c40c6c..10827b55 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.160 \ No newline at end of file +0.9.161-SNAPSHOT \ No newline at end of file From c4f2d45f087110e84bcdec44002dc15d6c2ff689 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 29 Jul 2022 21:32:36 +0200 Subject: [PATCH 269/550] CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd61241c..268603f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ A preview of the next release can be installed from ## 0.9.159 (2022-07-29) +Read the introductory blog post about the new babashka CLI integration [here](https://blog.michielborkent.nl/babashka-tasks-meets-babashka-cli.html). + - [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI - [#1324](https://github.com/babashka/babashka/issues/1324): `babashka.tasks/exec` to invoke a function with babashka CLI in tasks - SCI: don't eval metatada on defn body From de439171402814ed2bc9532de28a3917dd25c0ca Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 31 Jul 2022 13:42:44 +0200 Subject: [PATCH 270/550] the-var --- sci | 2 +- src/babashka/impl/cli.clj | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sci b/sci index 3e068bbd..78bcad1d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3e068bbd9cfdf8e39107721658a3717db092c2e0 +Subproject commit 78bcad1db9211ad8804b7bd961fb9d701d1ec64c diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index 3762df6d..d5a4a9e6 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -12,17 +12,17 @@ (format " (do (require '[babashka.cli]) -(let [var (requiring-resolve `%1$s) - var-meta (meta var) - ns (:ns (meta var)) +(let [the-var (requiring-resolve `%1$s) + the-var-meta (meta the-var) + ns (:ns (meta the-var)) ns-meta (meta ns) ct (babashka.tasks/current-task) cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) - (:org.babashka/cli var-meta) + (:org.babashka/cli the-var-meta) (:org.babashka/cli ct)) opts (babashka.cli/parse-opts *command-line-args* cli-opts) task-exec-args (:exec-args ct) cli-exec-args (:exec-args cli-opts) opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] -(var opts)))" +(the-var opts)))" sym)) From b0de4a79a48f20a1ed5d3c3d5c8bd4d862904395 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 31 Jul 2022 13:57:00 +0200 Subject: [PATCH 271/550] fix exec --- src/babashka/impl/cli.clj | 15 ++++++++++----- src/babashka/impl/tasks.clj | 3 +++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index d5a4a9e6..e915057a 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -8,21 +8,26 @@ (def cli-namespace (sci/copy-ns babashka.cli cns)) -(defn exec-fn-snippet [sym] - (format " +(defn exec-fn-snippet + ([sym] (exec-fn-snippet sym nil)) + ([sym extra-opts] + (format " (do (require '[babashka.cli]) -(let [the-var (requiring-resolve `%1$s) +(let [extra-opts '%2$s + the-var (requiring-resolve `%1$s) the-var-meta (meta the-var) ns (:ns (meta the-var)) ns-meta (meta ns) ct (babashka.tasks/current-task) cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli the-var-meta) - (:org.babashka/cli ct)) + (:org.babashka/cli ct) + extra-opts) opts (babashka.cli/parse-opts *command-line-args* cli-opts) task-exec-args (:exec-args ct) cli-exec-args (:exec-args cli-opts) opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] (the-var opts)))" - sym)) + sym + (pr-str extra-opts)))) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 0be65b5a..a5d9592c 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -460,6 +460,9 @@ (defn exec ([sym] (let [snippet (cli/exec-fn-snippet sym)] + (sci/eval-string* @ctx snippet))) + ([sym extra-opts] + (let [snippet (cli/exec-fn-snippet sym extra-opts)] (sci/eval-string* @ctx snippet)))) (def tasks-namespace From 4aa352c94ac9885a1ee896679104dd2461220e2d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 31 Jul 2022 13:57:10 +0200 Subject: [PATCH 272/550] v0.9.161 --- resources/BABASHKA_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 10827b55..b832233e 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.161-SNAPSHOT \ No newline at end of file +0.9.161 \ No newline at end of file From 765a9c084689938bdbf3231f893e939f72d985ae Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 31 Jul 2022 14:20:40 +0200 Subject: [PATCH 273/550] Version bump --- CHANGELOG.md | 4 ++++ resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 268603f4..8f5c3d95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## 0.9.161 (2022-07-31) + +- Fix `exec` + ## 0.9.160 (2022-07-29) - Breaking: change `exec`, introduced in `0.9.159` to a function instead. diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index a9c40c6c..b832233e 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.9.160 \ No newline at end of file +0.9.161 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index b832233e..3792208e 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.161 \ No newline at end of file +0.9.162-SNAPSHOT \ No newline at end of file From ddee3847bf4af6c131b9258ba4220a538cd58dec Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 2 Aug 2022 23:07:04 +0200 Subject: [PATCH 274/550] sci --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 78bcad1d..27d18509 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 78bcad1db9211ad8804b7bd961fb9d701d1ec64c +Subproject commit 27d1850969502b0cde51d9b1a92e394f100383c5 From f9327c04ca23035c8837bbe107045d9febb8abc6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 2 Aug 2022 23:12:53 +0200 Subject: [PATCH 275/550] bump xcode --- .circleci/script/short_ci.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index ab796033..89120513 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -179,7 +179,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl [shorted?] (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} - mac-executor-conf {:macos {:xcode "12.0.0"}} + mac-executor-conf {:macos {:xcode "14"}} linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0" mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"] (ordered-map From a2017880875ee5d328e6455289c3341e074529be Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 2 Aug 2022 23:16:46 +0200 Subject: [PATCH 276/550] xcode --- .circleci/script/short_ci.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index 89120513..b08d0106 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -179,7 +179,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl [shorted?] (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} - mac-executor-conf {:macos {:xcode "14"}} + mac-executor-conf {:macos {:xcode 14}} linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0" mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"] (ordered-map From 42f9440d858d95ed3f55812f620f835fe5c74efb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 2 Aug 2022 23:19:59 +0200 Subject: [PATCH 277/550] last try --- .circleci/script/short_ci.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index b08d0106..90dab434 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -179,7 +179,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl [shorted?] (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} - mac-executor-conf {:macos {:xcode 14}} + mac-executor-conf {:macos {:xcode "14.0.0"}} linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0" mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"] (ordered-map From b4b0ee87fece5fec9ddad6509f81defac33b41aa Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 2 Aug 2022 23:42:10 +0200 Subject: [PATCH 278/550] Marker protocol + satisfies fix (#1331) --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 27d18509..3288e298 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 27d1850969502b0cde51d9b1a92e394f100383c5 +Subproject commit 3288e2988594a20daaadb4ee0662e0c2b2a8ca01 From 55ff3bcf980eec4504c70b4f4835e3b6b4e24c06 Mon Sep 17 00:00:00 2001 From: Radford Smith <11401+rads@users.noreply.github.com> Date: Thu, 4 Aug 2022 07:59:35 -0700 Subject: [PATCH 279/550] README: Add link to babashka.org from logo (#1333) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e8fea19c..8b63a9c2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +[Babashka](https://babashka.org) [![CircleCI](https://circleci.com/gh/babashka/babashka/tree/master.svg?style=shield)](https://circleci.com/gh/babashka/babashka/tree/master) [![project chat](https://img.shields.io/badge/slack-join_chat-brightgreen.svg)](https://app.slack.com/client/T03RZGPFR/CLX41ASCS) From 1b3c90870d7c3910ce52d2c9b7b682bcc24b94ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 5 Aug 2022 14:41:16 +0200 Subject: [PATCH 280/550] Update rewrite-clj --- deps.edn | 2 +- project.clj | 2 +- sci | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index 5a17ef32..dad29c06 100644 --- a/deps.edn +++ b/deps.edn @@ -42,7 +42,7 @@ babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"} org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} - rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} + rewrite-clj/rewrite-clj {:mvn/version "1.1.45"} selmer/selmer {:mvn/version "1.12.50"} com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} diff --git a/project.clj b/project.clj index 4f232155..c1d62e97 100644 --- a/project.clj +++ b/project.clj @@ -30,7 +30,7 @@ [org.clojure/core.async "1.5.648"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] - [rewrite-clj/rewrite-clj "1.0.699-alpha"] + [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] [org.babashka/cli "0.3.34"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] diff --git a/sci b/sci index 3288e298..129d388a 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3288e2988594a20daaadb4ee0662e0c2b2a8ca01 +Subproject commit 129d388ac2589103b31a561defc33b94ca28b59c From 5823a08d51fa140fc13decccf5bc03d20bb33a38 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 6 Aug 2022 14:21:15 +0200 Subject: [PATCH 281/550] Bump deps.clj --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 65c1b5ec..1455d570 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 65c1b5ecc0dbf12dee5f082cd5d325fcaa811cc4 +Subproject commit 1455d5708d6051f139d345d2ae267bd0c3af93e9 From a7a84e872e7d419fce49218d84af57bb22b443e6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 9 Aug 2022 16:41:49 +0200 Subject: [PATCH 282/550] fs issue 68 --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index 6c5e180d..11189421 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 6c5e180d52136e68671e15b639e55fbc14e85969 +Subproject commit 111894217039261c45e4b9f415e6371ae41cf148 diff --git a/sci b/sci index 129d388a..49817626 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 129d388ac2589103b31a561defc33b94ca28b59c +Subproject commit 49817626dd2b1bb69dd10457137e5df1f1fd9445 From 72864a18d695095a189d822e974689b41d6921ce Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 11 Aug 2022 20:52:11 +0200 Subject: [PATCH 283/550] bb.nrepl: preserve stacktrace on exception --- babashka.nrepl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/babashka.nrepl b/babashka.nrepl index 0fba78aa..c8c8a766 160000 --- a/babashka.nrepl +++ b/babashka.nrepl @@ -1 +1 @@ -Subproject commit 0fba78aaa783d0f103533f035c8c5717ce4ac314 +Subproject commit c8c8a766e026d5f87e0968a179dad70e13aa13ee From 33569df040d1237169908391b58ee0db68b661a7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 11 Aug 2022 22:18:13 +0200 Subject: [PATCH 284/550] update fs: expose :win-exts --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 11189421..bc38a26d 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 111894217039261c45e4b9f415e6371ae41cf148 +Subproject commit bc38a26d02f49e5a29c26afe4d65d0707672dce0 From 306d97f4ef9f3a581cfaceeadeef098b5b33f911 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 13 Aug 2022 11:09:52 +0200 Subject: [PATCH 285/550] Update babashka cli --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index dad29c06..f34a7625 100644 --- a/deps.edn +++ b/deps.edn @@ -49,7 +49,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.3.34"}} + org.babashka/cli {:mvn/version "0.3.35"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index c1d62e97..0437c5e7 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] - [org.babashka/cli "0.3.34"]] + [org.babashka/cli "0.3.35"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] From 1eaa094e9b6f7cf2d3941b1550948ac4cd4a0235 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 13 Aug 2022 11:10:18 +0200 Subject: [PATCH 286/550] fs --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index bc38a26d..3b8010d1 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit bc38a26d02f49e5a29c26afe4d65d0707672dce0 +Subproject commit 3b8010d1a0db166771ac7f47573ea09ed45abe33 From b5a17b3af796fe225c04e21e732d68560380379b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 23 Aug 2022 17:28:43 +0200 Subject: [PATCH 287/550] fs/sci --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index 3b8010d1..60aea913 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 3b8010d1a0db166771ac7f47573ea09ed45abe33 +Subproject commit 60aea913a99a39b430a3666b7f5d116463c640c4 diff --git a/sci b/sci index 49817626..f1811a69 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 49817626dd2b1bb69dd10457137e5df1f1fd9445 +Subproject commit f1811a6942820d3ea692e4ecad85f433a1992aec From d27fc0d2d653c61629efd5323ab05137864f520c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 23 Aug 2022 17:40:28 +0200 Subject: [PATCH 288/550] Fix #1343: postgresql feature --- CHANGELOG.md | 4 ++++ resources/META-INF/babashka/deps.edn | 4 ++-- script/compile | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f5c3d95..67e3519e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +- [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature + ## 0.9.161 (2022-07-31) - Fix `exec` diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 5a17ef32..f34a7625 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -42,14 +42,14 @@ babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"} org.clojure/core.match {:mvn/version "1.0.0"} hiccup/hiccup {:mvn/version "2.0.0-alpha2"} - rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"} + rewrite-clj/rewrite-clj {:mvn/version "1.1.45"} selmer/selmer {:mvn/version "1.12.50"} com.taoensso/timbre {:mvn/version "5.2.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.3.34"}} + org.babashka/cli {:mvn/version "0.3.35"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/script/compile b/script/compile index b0e54e74..17b7dc76 100755 --- a/script/compile +++ b/script/compile @@ -78,6 +78,12 @@ if [ "$BABASHKA_FEATURE_HSQLDB" = "true" ]; then args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql") fi +BABASHKA_FEATURE_POSTGRESQL=${BABASHKA_FEATURE_POSTGRESQL:-} + +if [ "$BABASHKA_FEATURE_POSTGRESQL" = "true" ]; then + args+=("--initialize-at-build-time=org.postgresql.PGProperty") +fi + BABASHKA_FEATURE_SELMER=${BABASHKA_FEATURE_SELMER:-} if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then From 464a000b1bcb62cae8e7eeb804c233a536b6c17d Mon Sep 17 00:00:00 2001 From: Lee Read Date: Fri, 26 Aug 2022 03:45:12 -0400 Subject: [PATCH 289/550] Add exception classes useful for clj-http-lite (#1346) * Add exception classes useful for clj-http-lite Closes #1345 * update changelog --- CHANGELOG.md | 2 +- src/babashka/impl/classes.clj | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67e3519e..1d7c28ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ A preview of the next release can be installed from ## Unreleased - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - +- [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) ## 0.9.161 (2022-07-31) - Fix `exec` diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 26668863..bb990c6a 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -141,6 +141,7 @@ java.net.HttpCookie java.net.PasswordAuthentication java.net.ProxySelector + java.net.SocketTimeoutException java.net.http.HttpClient java.net.http.HttpClient$Builder java.net.http.HttpClient$Redirect @@ -164,6 +165,7 @@ javax.net.ssl.HttpsURLConnection ;; clj-http-lite javax.net.ssl.KeyManagerFactory javax.net.ssl.SSLContext + javax.net.ssl.SSLException javax.net.ssl.SSLParameters javax.net.ssl.SSLSession ;; clj-http-lite javax.net.ssl.TrustManager From 6035a46b3a6713bd3bad2f12b5bd3d5d482e30ed Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 26 Aug 2022 11:29:20 +0200 Subject: [PATCH 290/550] SCI upgrade --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index f1811a69..e991b0e7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f1811a6942820d3ea692e4ecad85f433a1992aec +Subproject commit e991b0e7b8dba06d845f42dac69ea665e8f7f6e9 From 57b88f2141813719b85a0540785fd6188a0f0a6e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 30 Aug 2022 11:12:50 +0200 Subject: [PATCH 291/550] deps.clj [skip ci] --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 1455d570..7e8773f7 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 1455d5708d6051f139d345d2ae267bd0c3af93e9 +Subproject commit 7e8773f7554d788ee6ca4d0e60b85b05f20a8066 From 2150cb1e06054c8bf69f8d1025001ce198923412 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 31 Aug 2022 17:57:24 +0200 Subject: [PATCH 292/550] fs + sci --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index 60aea913..32a65e81 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 60aea913a99a39b430a3666b7f5d116463c640c4 +Subproject commit 32a65e81ddbc212608bf30501834a0ba367a9a82 diff --git a/sci b/sci index e991b0e7..6bbfec0e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit e991b0e7b8dba06d845f42dac69ea665e8f7f6e9 +Subproject commit 6bbfec0ede429fc17cb9ba51a96582b4fcd6ea69 From 4dc084502a8b2a1141f4d79daa5ede7d5ea75f6f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 1 Sep 2022 14:15:53 +0200 Subject: [PATCH 293/550] process docs [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 4392dfff..87d627a7 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 4392dfffa76fd3eebed891f7b5f688710d4c4ec9 +Subproject commit 87d627a774dbf06505ae5eaa968e8ed7a7505bf1 From 813c6029c55d130224be87019160cfe9a4db00c1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 1 Sep 2022 21:27:33 +0200 Subject: [PATCH 294/550] deps.clj --- deps.clj | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.clj b/deps.clj index 7e8773f7..565bb8ac 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 7e8773f7554d788ee6ca4d0e60b85b05f20a8066 +Subproject commit 565bb8ac4e4519f7ce2ca5c3a7309cf41e2fced5 diff --git a/sci b/sci index 6bbfec0e..73bd9486 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6bbfec0ede429fc17cb9ba51a96582b4fcd6ea69 +Subproject commit 73bd948625973ad383d512750280c297436afb2c From c77944fad7acd4383ff732ebfa18412cf49bd9b2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Sep 2022 11:08:33 +0200 Subject: [PATCH 295/550] Bump clj-yaml --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index f34a7625..e105cd54 100644 --- a/deps.edn +++ b/deps.edn @@ -30,7 +30,7 @@ org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} - clj-commons/clj-yaml {:mvn/version "0.7.108"} + clj-commons/clj-yaml {:mvn/version "0.7.109"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} diff --git a/project.clj b/project.clj index 0437c5e7..cc29dbfc 100644 --- a/project.clj +++ b/project.clj @@ -38,7 +38,7 @@ :profiles {:feature/xml {:source-paths ["feature-xml"] :dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]} :feature/yaml {:source-paths ["feature-yaml"] - :dependencies [[clj-commons/clj-yaml "0.7.108"]]} + :dependencies [[clj-commons/clj-yaml "0.7.109"]]} :feature/jdbc {:source-paths ["feature-jdbc"] :dependencies [[seancorfield/next.jdbc "1.1.610"]]} :feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}] From 6e92c99f31cb97ec715cfb22e38308954f933e48 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Sep 2022 21:15:27 +0200 Subject: [PATCH 296/550] Fix #1322: improve error location --- sci | 2 +- src/babashka/main.clj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sci b/sci index 73bd9486..a75de7d9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 73bd948625973ad383d512750280c297436afb2c +Subproject commit a75de7d92fbe590f72f22cfb43cb1a21021eb207 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 4cff399f..12298662 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -944,8 +944,8 @@ Use bb run --help to show this help output. ;; execute code (sci/binding [sci/file abs-path] (try - ; when evaluating expression(s), add in repl-requires so things like - ; pprint and dir are available + ;; when evaluating expression(s), add in repl-requires so things like + ;; pprint and dir are available (sci/eval-form sci-ctx `(apply require (quote ~clojure-main/repl-requires))) (loop [] (let [in (read-next *in*)] From 9b2435557d9469954575bdcbcbd3fed2e1bdcd1b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Sep 2022 21:40:14 +0200 Subject: [PATCH 297/550] Revert "Fix #1322: improve error location" This reverts commit 6e92c99f31cb97ec715cfb22e38308954f933e48. --- sci | 2 +- src/babashka/main.clj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sci b/sci index a75de7d9..73bd9486 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a75de7d92fbe590f72f22cfb43cb1a21021eb207 +Subproject commit 73bd948625973ad383d512750280c297436afb2c diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 12298662..4cff399f 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -944,8 +944,8 @@ Use bb run --help to show this help output. ;; execute code (sci/binding [sci/file abs-path] (try - ;; when evaluating expression(s), add in repl-requires so things like - ;; pprint and dir are available + ; when evaluating expression(s), add in repl-requires so things like + ; pprint and dir are available (sci/eval-form sci-ctx `(apply require (quote ~clojure-main/repl-requires))) (loop [] (let [in (read-next *in*)] From 6cdc002423cd243b5d0bed4e078f8db164278087 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Sep 2022 22:22:27 +0200 Subject: [PATCH 298/550] Fix #1322: better error location in tasks --- sci | 2 +- src/babashka/main.clj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sci b/sci index 73bd9486..7a8536cc 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 73bd948625973ad383d512750280c297436afb2c +Subproject commit 7a8536ccc130e60107a96394e8bd2e4526a8d212 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 4cff399f..12298662 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -944,8 +944,8 @@ Use bb run --help to show this help output. ;; execute code (sci/binding [sci/file abs-path] (try - ; when evaluating expression(s), add in repl-requires so things like - ; pprint and dir are available + ;; when evaluating expression(s), add in repl-requires so things like + ;; pprint and dir are available (sci/eval-form sci-ctx `(apply require (quote ~clojure-main/repl-requires))) (loop [] (let [in (read-next *in*)] From 4a42ba938fffbd6fb3bcc983f336d76e7b12a7f5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Sep 2022 22:30:47 +0200 Subject: [PATCH 299/550] sci: minor --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 7a8536cc..f05d161c 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 7a8536ccc130e60107a96394e8bd2e4526a8d212 +Subproject commit f05d161cfec569e728c3ceb65c75b957e5cf157d From d5c76f774e06b7b75166f9b63da986fab5078bfc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 3 Sep 2022 11:59:15 +0200 Subject: [PATCH 300/550] deps.clj fix for windows exe in JAVA_HOME, thanks @Jacob-Kroeze --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 565bb8ac..0d9754fb 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 565bb8ac4e4519f7ce2ca5c3a7309cf41e2fced5 +Subproject commit 0d9754fb1f2cfc49abc6d9d27e95c414b824016d From ccfa50b2bcca8bd45b8c6460ee425120ec8cf73b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 3 Sep 2022 13:51:07 +0200 Subject: [PATCH 301/550] Fix #1338: add-watch segfault --- resources/META-INF/babashka/deps.edn | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index f34a7625..e105cd54 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -30,7 +30,7 @@ org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} - clj-commons/clj-yaml {:mvn/version "0.7.108"} + clj-commons/clj-yaml {:mvn/version "0.7.109"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} diff --git a/sci b/sci index f05d161c..85aac80d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f05d161cfec569e728c3ceb65c75b957e5cf157d +Subproject commit 85aac80d84de1ed1a0da2661f95d127f23d37b62 From 52c60e792833f69fc60df4a9807dc1dc492bee1d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 21:31:15 +0200 Subject: [PATCH 302/550] Fix #1339: SCI --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 85aac80d..67096a23 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 85aac80d84de1ed1a0da2661f95d127f23d37b62 +Subproject commit 67096a2352f68e96f8d4f19c7134938c04001154 From e285d970c7e745c9f27f05a5df1f9212d6483023 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 21:39:39 +0200 Subject: [PATCH 303/550] changelogs [skip ci] --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7c28ed..9cdad1de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,18 @@ A preview of the next release can be installed from - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) +- Fix `satisfies?` with marker protocol (no methods) +- Update `rewrite-clj` +- Update `deps.clj` +- Update `babashka.cli` +- Update `org.clj-commons/clj-yaml` +- `babashka.fs`: fix `expand-home` on Windows +- `babashka.fs`: expose `:win-exts` +- nREPL: preserve stacktrace on exception +- Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location +- Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault +- Fix [#1339](https://github.com/babashka/babashka/issues/1339): record + ``Foo.` should be resolved as `user.Foo.` + ## 0.9.161 (2022-07-31) - Fix `exec` From 191c6b75a8480649c8b58fff90fca71d976916bc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 22:43:08 +0200 Subject: [PATCH 304/550] Another fix for #1339 --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 67096a23..c3460990 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 67096a2352f68e96f8d4f19c7134938c04001154 +Subproject commit c34609904c9323caf33a9ffacda13da85072f4d1 From 1200d5625c2f276d5713a4c053ae87a6cf0d7c65 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 22:56:08 +0200 Subject: [PATCH 305/550] v0.9.162 --- resources/BABASHKA_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 3792208e..8ce56613 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.162-SNAPSHOT \ No newline at end of file +0.9.162 \ No newline at end of file From 38feb35a5347fc0296eed377c55877f95990244b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 22:56:51 +0200 Subject: [PATCH 306/550] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cdad1de..826b395e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 0.9.162 (2022-09-04) - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) From 75994d513494cfaab4c640da9f50aefaec0473bb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 23:09:37 +0200 Subject: [PATCH 307/550] Trigger another release build --- deps.edn | 1 + 1 file changed, 1 insertion(+) diff --git a/deps.edn b/deps.edn index e105cd54..e3f3abff 100644 --- a/deps.edn +++ b/deps.edn @@ -164,3 +164,4 @@ :test-pod {:extra-paths ["test-resources"] :main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}} +;; release From 8ef3bb08a82b45bb400c5fc382241c691f143065 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 23:22:52 +0200 Subject: [PATCH 308/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index b832233e..8ce56613 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.9.161 \ No newline at end of file +0.9.162 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 8ce56613..0bdf1592 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.162 \ No newline at end of file +0.9.163-SNAPSHOT \ No newline at end of file From fc3f178c7e988a0a54233af911cfdd567e1d21fc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 23:24:21 +0200 Subject: [PATCH 309/550] CHANGELOG [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 826b395e..269404b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ A preview of the next release can be installed from - nREPL: preserve stacktrace on exception - Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location - Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault -- Fix [#1339](https://github.com/babashka/babashka/issues/1339): record + ``Foo.` should be resolved as `user.Foo.` +- Fix [#1339](https://github.com/babashka/babashka/issues/1339): record + ```Foo.`` should be resolved as `user.Foo.` ## 0.9.161 (2022-07-31) From d15d38df8aabc0e0eb906c90aa975ca86d966029 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 23:25:54 +0200 Subject: [PATCH 310/550] CHANGELOG [skip ci] --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 269404b1..baf16668 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ A preview of the next release can be installed from ## 0.9.162 (2022-09-04) +Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. + - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) - Fix `satisfies?` with marker protocol (no methods) @@ -19,7 +21,7 @@ A preview of the next release can be installed from - nREPL: preserve stacktrace on exception - Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location - Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault -- Fix [#1339](https://github.com/babashka/babashka/issues/1339): record + ```Foo.`` should be resolved as `user.Foo.` +- Fix [#1339](https://github.com/babashka/babashka/issues/1339): resolve record name ending with dot` ## 0.9.161 (2022-07-31) From bebd20c088e80103aa01c791b4a38a172e706a5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Sep 2022 23:26:13 +0200 Subject: [PATCH 311/550] CHANGELOG [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index baf16668..53aef05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ Check out our new project: [bbin](https://github.com/babashka/bbin): install any - nREPL: preserve stacktrace on exception - Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location - Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault -- Fix [#1339](https://github.com/babashka/babashka/issues/1339): resolve record name ending with dot` +- Fix [#1339](https://github.com/babashka/babashka/issues/1339): resolve record name ending with dot. ## 0.9.161 (2022-07-31) From 2ca3b2ecc511322e4bb8b0f3f29ffb9c330b16e0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 13:54:50 +0200 Subject: [PATCH 312/550] fs: write-bytes --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 32a65e81..4e1749b0 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 32a65e81ddbc212608bf30501834a0ba367a9a82 +Subproject commit 4e1749b075e6a7fd67238939bdc5ff8e65b00e40 From cae237e42af031433d4ba54385f466b0a1746e5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 17:01:09 +0200 Subject: [PATCH 313/550] fs: write-lines --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 4e1749b0..73210e83 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 4e1749b075e6a7fd67238939bdc5ff8e65b00e40 +Subproject commit 73210e83808b8bfe664cba7d2148464a2fa38aae From 3afd85ccb32ed9ca4d1029ee28f90edce1016c2a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 18:13:25 +0200 Subject: [PATCH 314/550] expose core async ManyToManyChannel --- src/babashka/impl/classes.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index bb990c6a..744824df 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -505,6 +505,8 @@ clojure.lang.Sequential clojure.lang.Seqable clojure.lang.Volatile + ;; the only way to check if something is a channel is to call instance? on this... + clojure.core.async.impl.channels.ManyToManyChannel java.lang.AbstractMethodError java.lang.ExceptionInInitializerError java.lang.LinkageError From ef41365656c7d26da38503a224ce4cbdc8dc00ef Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 18:16:44 +0200 Subject: [PATCH 315/550] require core.async in time --- resources/META-INF/babashka/deps.edn | 1 + src/babashka/impl/classes.clj | 1 + 2 files changed, 2 insertions(+) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index e105cd54..e3f3abff 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -164,3 +164,4 @@ :test-pod {:extra-paths ["test-resources"] :main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}} +;; release diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 744824df..47a04a16 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -4,6 +4,7 @@ [babashka.impl.features :as features] [babashka.impl.proxy :as proxy] [cheshire.core :as json] + [clojure.core.async] [sci.impl.types :as t])) (def base-custom-map From 18e19934d1cd7f347e28d6b57e7c097271105b95 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 20:59:29 +0200 Subject: [PATCH 316/550] Fix #1350: map clojure.lang.Var to sci.lang.Var --- src/babashka/impl/classes.clj | 3 ++- test/babashka/main_test.clj | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 47a04a16..59b343be 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -594,7 +594,8 @@ (instance? java.util.Iterator v) java.util.Iterator ;; keep commas for merge friendliness - ,,,)))] + ,,,))) + m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)] m)) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 661e7db4..3973ea03 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -829,6 +829,9 @@ true"))) (testing "for all public vars, ns/symbol from ns map matches metadata" (is (empty? (bb nil (.getPath (io/file "test" "babashka" "scripts" "check_var_names.bb"))))))) +(deftest clojure-lang-var-mapping-test + (is (= :var (bb nil "(defprotocol Foo (foo [_])) (extend-protocol Foo clojure.lang.Var (foo [_] :var)) (foo #'inc)")))) + ;;;; Scratch (comment From 3e2738201ce1fa1a83b1979aaa12ce76e1ebca22 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Sep 2022 22:59:31 +0200 Subject: [PATCH 317/550] auspex compatibility (#1351) --- deps.edn | 2 +- project.clj | 2 +- reify/build.clj | 2 +- reify/src/babashka/impl/reify2/interfaces.clj | 2 ++ resources/META-INF/babashka/deps.edn | 2 +- src/babashka/impl/classes.clj | 9 ++++++++- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/deps.edn b/deps.edn index e3f3abff..535ddb10 100644 --- a/deps.edn +++ b/deps.edn @@ -19,7 +19,7 @@ "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index cc29dbfc..9f70d430 100644 --- a/project.clj +++ b/project.clj @@ -26,7 +26,7 @@ [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] [org.babashka/sci.impl.types "0.0.2"] - [org.babashka/babashka.impl.reify "0.1.1"] + [org.babashka/babashka.impl.reify "0.1.2"] [org.clojure/core.async "1.5.648"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] diff --git a/reify/build.clj b/reify/build.clj index acbece15..87d76733 100644 --- a/reify/build.clj +++ b/reify/build.clj @@ -3,7 +3,7 @@ [clojure.tools.build.api :as b])) (def lib 'org.babashka/babashka.impl.reify) -(def version "0.1.1") +(def version "0.1.2") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/reify/src/babashka/impl/reify2/interfaces.clj b/reify/src/babashka/impl/reify2/interfaces.clj index c92cddb0..416578a4 100644 --- a/reify/src/babashka/impl/reify2/interfaces.clj +++ b/reify/src/babashka/impl/reify2/interfaces.clj @@ -22,7 +22,9 @@ java.net.http.WebSocket$Listener java.util.Iterator java.util.function.Consumer + java.util.function.BiConsumer java.util.function.Function + java.util.function.BiFunction java.util.function.Predicate java.util.function.Supplier java.lang.Comparable diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index e3f3abff..535ddb10 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -19,7 +19,7 @@ "resources" "sci/resources"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.1"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 59b343be..0c693393 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -115,6 +115,9 @@ clojure.lang.Ratio {:fields [{:name "numerator"} {:name "denominator"}]} + clojure.lang.Agent + {:fields [{:name "pooledExecutor"} + {:name "soloExecutor"}]} java.util.Iterator {:methods [{:name "hasNext"} {:name "next"}]} @@ -363,7 +366,10 @@ java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster]) java.util.concurrent.atomic.AtomicReference + java.util.concurrent.CancellationException + java.util.concurrent.CompletionException java.util.concurrent.ExecutionException + java.util.concurrent.Executor java.util.concurrent.LinkedBlockingQueue java.util.concurrent.ScheduledThreadPoolExecutor java.util.concurrent.ThreadPoolExecutor @@ -409,6 +415,8 @@ java.util.UUID java.util.function.Consumer java.util.function.Function + java.util.function.BiConsumer + java.util.function.BiFunction java.util.function.Predicate java.util.function.Supplier java.util.zip.Inflater @@ -454,7 +462,6 @@ ;; list above and then everything reachable via the public class will be ;; visible in the native image. :instance-checks [clojure.lang.AFn - clojure.lang.Agent clojure.lang.AFunction clojure.lang.AMapEntry ;; for proxy clojure.lang.APersistentMap ;; for proxy From cd54d2a9118ea51fb700836d8987397c85f914d9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 10:24:15 +0200 Subject: [PATCH 318/550] Improve reify error messages (#1352) Co-authored-by: Crispin Wellington --- CHANGELOG.md | 7 +++++++ deps.edn | 3 ++- reify/src/babashka/impl/reify2.clj | 31 ++++++++++++++++++++---------- test/babashka/reify_test.clj | 14 ++++++++++++++ 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53aef05a..a1c75415 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ A preview of the next release can be installed from Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. +- Throw exception on attempt to reify multiple interfaces +- Allow java.lang.Object reify with empty methods + +## 0.9.162 (2022-09-04) + +Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. + - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) - Fix `satisfies?` with marker protocol (no methods) diff --git a/deps.edn b/deps.edn index 535ddb10..0576a7a5 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,8 @@ "babashka.nrepl/src" "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" - "resources" "sci/resources"], + "resources" "sci/resources" + "reify/src"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} diff --git a/reify/src/babashka/impl/reify2.clj b/reify/src/babashka/impl/reify2.clj index ec2636c2..dff57479 100644 --- a/reify/src/babashka/impl/reify2.clj +++ b/reify/src/babashka/impl/reify2.clj @@ -45,8 +45,26 @@ (invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20)) (applyTo [this arglist] (apply-fn this arglist))))) +(defn reify-object [m] + (let [methods (:methods m) + toString-fn (or (get methods 'toString) + (fn [this] + (str + (.getName (.getClass this)) + "@" + (Integer/toHexString (.hashCode this)))))] + (reify + sci.impl.types.IReified + (getMethods [_] (:methods m)) + (getInterfaces [_] (:interfaces m)) + (getProtocols [_] (:protocols m)) + java.lang.Object + (toString [this] (toString-fn this))))) + (defmacro gen-reify-fn [] `(fn [~'m] + (when (> (count (:interfaces ~'m)) 1) + (throw (UnsupportedOperationException. "babashka reify only supports implementing a single interface"))) (if (empty? (:interfaces ~'m)) (reify sci.impl.types.IReified @@ -55,19 +73,12 @@ (getProtocols [_] (:protocols ~'m))) (case (.getName ~(with-meta `(first (:interfaces ~'m)) {:tag 'Class})) - "java.lang.Object" - (reify - java.lang.Object - (toString [~'this] - ((method-or-bust (:methods ~'m) (quote ~'toString)) ~'this)) - sci.impl.types.IReified - (getMethods [_] (:methods ~'m)) - (getInterfaces [_] (:interfaces ~'m)) - (getProtocols [_] (:protocols ~'m))) ~@(mapcat identity (cons ["clojure.lang.IFn" - `(reify-ifn ~'m)] + `(reify-ifn ~'m) + "java.lang.Object" + `(reify-object ~'m)] (for [i interfaces] (let [in (.getName ^Class i)] [in diff --git a/test/babashka/reify_test.clj b/test/babashka/reify_test.clj index be7b553b..7e052b5e 100644 --- a/test/babashka/reify_test.clj +++ b/test/babashka/reify_test.clj @@ -51,6 +51,11 @@ ]"))))) (deftest reify-object + (testing "empty methods" + (is (clojure.string/starts-with? + (bb nil " +(str (reify Object))") + "babashka.impl.reify"))) (testing "toString" (is (= ":foo" (bb nil " @@ -114,3 +119,12 @@ iter (reify java.util.function.Consumer (accept [_ x] (vswap! res conj x)))) (= [true :a :b :c] @res))] (is (true? (bb nil prog))))) + +(deftest reify-multiple-interfaces-test + (testing "throws exception" + (is (thrown? + clojure.lang.ExceptionInfo + (bb nil " +(reify + java.lang.Object (toString [_] \"foo\") + clojure.lang.Seqable (seq [_] '(1 2 3)))"))))) From ea36bbecb98cfd25af08a51c8827d2dab5067c37 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 10:31:53 +0200 Subject: [PATCH 319/550] add auspex tests to CI --- deps.edn | 4 +++- test-resources/lib_tests/bb-tested-libs.edn | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index 0576a7a5..a63698d6 100644 --- a/deps.edn +++ b/deps.edn @@ -149,7 +149,9 @@ :git/tag "0.8.9"} meander/epsilon {:git/url "https://github.com/noprompt/meander" :git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} - } + cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex" + :git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a" + :deps/manifest :deps}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 0f40814f..6ec8eee3 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -159,4 +159,8 @@ :test-paths ["test"] :git-url "https://github.com/noprompt/meander" :git-sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} + cc.qbits/auspex {:git-url "https://github.com/mpenet/auspex" + :git-sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a" + :test-paths ["test"] + :test-namespaces [qbits.auspex-test]} } From f116b493be3d7d6a9b1e45955ce056956408bda0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 10:33:32 +0200 Subject: [PATCH 320/550] process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 87d627a7..4e493fa0 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 87d627a774dbf06505ae5eaa968e8ed7a7505bf1 +Subproject commit 4e493fa0929fe5860a575c293730a060ffae169c From 1197f4feecaf67c0fa3bdd2b68065b9baa13c9d0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 14:56:26 +0200 Subject: [PATCH 321/550] Add interceptor tests --- deps.edn | 5 ++++- test-resources/lib_tests/bb-tested-libs.edn | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index a63698d6..cc02f222 100644 --- a/deps.edn +++ b/deps.edn @@ -151,7 +151,10 @@ :git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex" :git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a" - :deps/manifest :deps}} + :deps/manifest :deps} + exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor" + :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" + :deps/manifest :deps}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 6ec8eee3..99d4bdab 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -163,4 +163,8 @@ :git-sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a" :test-paths ["test"] :test-namespaces [qbits.auspex-test]} + exoscale/interceptor {:git-url "https://github.com/exoscale/interceptor" + :git-sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" + :test-paths ["test"] + :test-namespaces [exoscale.interceptor-test]} } From 2400fc7be077ea54b95d94c91cbbb2ebf0ff47de Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 19:38:32 +0200 Subject: [PATCH 322/550] Add PrintWriter-on --- src/babashka/impl/clojure/core.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index 5a861698..e970cf77 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -197,5 +197,6 @@ 'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns) 'into-array (sci/copy-var into-array clojure-core-ns) 'print-method (sci/copy-var print-method clojure-core-ns) - 'print-dup (sci/copy-var print-dup clojure-core-ns)} + 'print-dup (sci/copy-var print-dup clojure-core-ns) + 'PrintWriter-on (sci/copy-var PrintWriter-on clojure-core-ns)} ) From 086a5eb5a216e60951cd4cb121d7aa7288624a33 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Sep 2022 19:52:33 +0200 Subject: [PATCH 323/550] Add AtomicInteger and Long to full interop --- resources/META-INF/babashka/deps.edn | 10 ++++++++-- src/babashka/impl/classes.clj | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 535ddb10..cc02f222 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -16,7 +16,8 @@ "babashka.nrepl/src" "depstar/src" "process/src" "deps.clj/src" "deps.clj/resources" - "resources" "sci/resources"], + "resources" "sci/resources" + "reify/src"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} @@ -148,7 +149,12 @@ :git/tag "0.8.9"} meander/epsilon {:git/url "https://github.com/noprompt/meander" :git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"} - } + cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex" + :git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a" + :deps/manifest :deps} + exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor" + :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" + :deps/manifest :deps}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 0c693393..d934d9d3 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -365,6 +365,8 @@ java.time.temporal.Temporal java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster]) + java.util.concurrent.atomic.AtomicInteger + java.util.concurrent.atomic.AtomicLong java.util.concurrent.atomic.AtomicReference java.util.concurrent.CancellationException java.util.concurrent.CompletionException @@ -521,8 +523,6 @@ java.lang.ThreadDeath java.lang.VirtualMachineError java.sql.Timestamp - java.util.concurrent.atomic.AtomicInteger - java.util.concurrent.atomic.AtomicLong java.util.concurrent.TimeoutException java.util.Collection java.util.Map$Entry From d91eadbc9c85215d89372f2af1fc4dd7a85c1d6a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Sep 2022 15:09:59 +0200 Subject: [PATCH 324/550] Add ns-unalias --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index c3460990..57fcb5a9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit c34609904c9323caf33a9ffacda13da85072f4d1 +Subproject commit 57fcb5a9a12e55347307873dbc28214d3fc82216 From dcae94949626006293114034efa24974cd56982b Mon Sep 17 00:00:00 2001 From: Eero Helenius Date: Wed, 7 Sep 2022 17:45:04 +0300 Subject: [PATCH 325/550] Add clojure.core.server/stop-server (#1355) --- src/babashka/impl/server.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/server.clj b/src/babashka/impl/server.clj index 687056a4..1bb01f2b 100644 --- a/src/babashka/impl/server.clj +++ b/src/babashka/impl/server.clj @@ -21,4 +21,5 @@ {'repl (sci/copy-var socket-repl/repl sns) 'prepl (sci/copy-var prepl sns) 'io-prepl (sci/copy-var io-prepl sns) - 'start-server (sci/copy-var start-server sns)}) + 'start-server (sci/copy-var start-server sns) + 'stop-server (sci/copy-var server/stop-server sns)}) From c97fb958dc7bb19dbb8dcd1947e1e6808c37df6b Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Wed, 7 Sep 2022 09:11:06 -0600 Subject: [PATCH 326/550] Only download pods when os.name / os.arch don't match (#1354) --- src/babashka/impl/pods.clj | 6 +++--- src/babashka/main.clj | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/babashka/impl/pods.clj b/src/babashka/impl/pods.clj index fb07c087..54e7cf22 100644 --- a/src/babashka/impl/pods.clj +++ b/src/babashka/impl/pods.clj @@ -9,20 +9,20 @@ (defn load-pod [& args] (apply pods/load-pod @ctx args)) -(defn load-pods-metadata [pods-map] +(defn load-pods-metadata [pods-map opts] (reduce-kv (fn [pod-namespaces pod-spec coord] (merge pod-namespaces (condp #(contains? %2 %1) coord :version (pods/load-pod-metadata pod-spec - (merge {:cache true} + (merge opts {:cache true} (select-keys coord [:version :cache]))) :path (pods/load-pod-metadata (-> @bb-edn :file io/file) pod-spec - (merge {:cache true} + (merge opts {:cache true} (select-keys coord [:path :cache]))) (throw (IllegalArgumentException. diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 12298662..4353f1d4 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -741,6 +741,12 @@ Use bb run --help to show this help output. (def pod-namespaces (volatile! {})) +(defn download-only? + "If we're preparing pods for another OS / arch, don't try to run them." + [] + (or (not= (System/getenv "OS_NAME") (System/getProperty "os.name")) + (not= (System/getenv "OS_ARCH") (System/getProperty "os.arch")))) + (defn exec [cli-opts] (binding [*unrestricted* true] (sci/binding [core/warn-on-reflection @core/warn-on-reflection @@ -859,7 +865,8 @@ Use bb run --help to show this help output. sci-ctx (sci/init opts) _ (vreset! common/ctx sci-ctx) _ (when-let [pods (:pods @common/bb-edn)] - (let [pod-metadata (pods/load-pods-metadata pods)] + (when-let [pod-metadata (pods/load-pods-metadata + pods {:download-only (download-only?)})] (vreset! pod-namespaces pod-metadata))) preloads (some-> (System/getenv "BABASHKA_PRELOADS") (str/trim)) [expressions exit-code] From 8afd672a2076e3d87291571b7f300e6cfbcf0d17 Mon Sep 17 00:00:00 2001 From: Eero Helenius Date: Wed, 7 Sep 2022 20:19:42 +0300 Subject: [PATCH 327/550] Add ThreadPoolExecutor rejection policy classes (#1356) --- src/babashka/impl/classes.clj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index d934d9d3..306d7e75 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -375,6 +375,10 @@ java.util.concurrent.LinkedBlockingQueue java.util.concurrent.ScheduledThreadPoolExecutor java.util.concurrent.ThreadPoolExecutor + java.util.concurrent.ThreadPoolExecutor$AbortPolicy + java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy + java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy + java.util.concurrent.ThreadPoolExecutor$DiscardPolicy java.util.concurrent.ScheduledExecutorService java.util.concurrent.Future java.util.concurrent.FutureTask From 42f79d0db3d384a927fd7330d45e2e3d240d5783 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Sep 2022 19:29:11 +0200 Subject: [PATCH 328/550] Expose clojure.main/with-bindings --- src/babashka/main.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 4353f1d4..8e638672 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -373,7 +373,8 @@ Use bb run --help to show this help output. 'repl (sci/new-var 'repl (fn [& opts] (let [opts (apply hash-map opts)] - (repl/start-repl! @common/ctx opts))) {:ns clojure-main-ns})} + (repl/start-repl! @common/ctx opts))) {:ns clojure-main-ns}) + 'with-bindings (sci/copy-var clojure-main/with-bindings clojure-main-ns)} 'clojure.test t/clojure-test-namespace 'clojure.math math-namespace 'babashka.classpath classpath-namespace From 57a6249dcbcb43a2217d08f31440fdce4580bd96 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Sep 2022 19:48:15 +0200 Subject: [PATCH 329/550] pods: allow downloading for other os --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 93081b75..5754d433 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 93081b75e66fb4c4d161f89e714c6b9e8d55c8d5 +Subproject commit 5754d433aa421c68b7558da92a852df69ab66e9d From ef84df8bc9d7a932cebb511e530c767df7d415e0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Sep 2022 20:02:06 +0200 Subject: [PATCH 330/550] Revert "pods: allow downloading for other os" This reverts commit 57a6249dcbcb43a2217d08f31440fdce4580bd96. --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 5754d433..93081b75 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 5754d433aa421c68b7558da92a852df69ab66e9d +Subproject commit 93081b75e66fb4c4d161f89e714c6b9e8d55c8d5 From a592104bc5e97122d08a7ae64df46589ae0ddc6d Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Wed, 7 Sep 2022 13:08:53 -0600 Subject: [PATCH 331/550] Fix download-only? fn & use new env var names (#1357) --- src/babashka/main.clj | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 8e638672..94bc2d15 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -745,8 +745,21 @@ Use bb run --help to show this help output. (defn download-only? "If we're preparing pods for another OS / arch, don't try to run them." [] - (or (not= (System/getenv "OS_NAME") (System/getProperty "os.name")) - (not= (System/getenv "OS_ARCH") (System/getProperty "os.arch")))) + (let [env-os-name (System/getenv "BABASHKA_PODS_OS_NAME") + env-os-name-present? (not (str/blank? env-os-name)) + sys-os-name (System/getProperty "os.name") + env-os-arch (System/getenv "BABASHKA_PODS_OS_ARCH") + env-os-arch-present? (not (str/blank? env-os-arch)) + sys-os-arch (System/getProperty "os.arch")] + (when @common/debug + (binding [*out* *err*] + (println "System OS name:" sys-os-name) + (when env-os-name-present? (println "BABASHKA_PODS_OS_NAME:" env-os-name)) + (println "System OS arch:" sys-os-arch) + (when env-os-arch-present? (println "BABASHKA_PODS_OS_ARCH:" env-os-arch)))) + (cond + env-os-name-present? (not= env-os-name sys-os-name) + env-os-arch-present? (not= env-os-arch sys-os-arch)))) (defn exec [cli-opts] (binding [*unrestricted* true] From 55ffa95b7d36ae6466f4ff05cc4cc70395c76a59 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Sep 2022 21:24:27 +0200 Subject: [PATCH 332/550] pods issue 52 --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 93081b75..8bc08527 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 93081b75e66fb4c4d161f89e714c6b9e8d55c8d5 +Subproject commit 8bc0852799c7ae36ade12bacb7c6ede2fc91c6dc From e3e855f7ae7d95bad68758d9ae983e8277bbcf9f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Sep 2022 14:28:20 +0200 Subject: [PATCH 333/550] SCI --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 57fcb5a9..aa460c34 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 57fcb5a9a12e55347307873dbc28214d3fc82216 +Subproject commit aa460c34ca39f1d325072f2329f2c4eb122b20e1 From c4c76d58ac008d55175a05da61b73ccf2951e95c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Sep 2022 16:00:22 +0200 Subject: [PATCH 334/550] fix exec --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 4e493fa0..d070f411 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 4e493fa0929fe5860a575c293730a060ffae169c +Subproject commit d070f411598a5f9921f07d4a5db2600d6101dd2e From ea4f56886d6728a51505e8c23da2ad49174f64d9 Mon Sep 17 00:00:00 2001 From: Crispin Wellington Date: Fri, 9 Sep 2022 23:25:32 +0800 Subject: [PATCH 335/550] Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects (#1359) * reify java.lang.Object with optional toString and finalize * reify java.lang.Runnable * reflection support for java.lang.Runnable * java.lang.ref.* class exposure * test for detection of garbage collection of Object * added change to changelog --- CHANGELOG.md | 4 ++++ reify/src/babashka/impl/reify2.clj | 17 ++++++++++++++++- src/babashka/impl/classes.clj | 5 +++++ test/babashka/reify_test.clj | 23 +++++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1c75415..4aa0e1ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects + ## 0.9.162 (2022-09-04) Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. diff --git a/reify/src/babashka/impl/reify2.clj b/reify/src/babashka/impl/reify2.clj index dff57479..3186ceaf 100644 --- a/reify/src/babashka/impl/reify2.clj +++ b/reify/src/babashka/impl/reify2.clj @@ -61,6 +61,19 @@ java.lang.Object (toString [this] (toString-fn this))))) +(defn reify-runnable [m] + (let [methods (:methods m) + run-fn (or (get methods 'run) + (fn [_]))] + (reify + sci.impl.types.IReified + (getMethods [_] (:methods m)) + (getInterfaces [_] (:interfaces m)) + (getProtocols [_] (:protocols m)) + java.lang.Runnable + (run [this] (run-fn this)))) + ) + (defmacro gen-reify-fn [] `(fn [~'m] (when (> (count (:interfaces ~'m)) 1) @@ -78,7 +91,9 @@ ["clojure.lang.IFn" `(reify-ifn ~'m) "java.lang.Object" - `(reify-object ~'m)] + `(reify-object ~'m) + "java.lang.Runnable" + `(reify-runnable ~'m)] (for [i interfaces] (let [in (.getName ^Class i)] [in diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 306d7e75..cbe81f35 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -84,6 +84,8 @@ java.lang.reflect.Array {:methods [{:name "newInstance"} {:name "set"}]} + java.lang.Runnable + {:methods [{:name "run"}]} java.net.Inet4Address {:methods [{:name "getHostAddress"}]} java.net.Inet6Address @@ -264,6 +266,9 @@ java.lang.System java.lang.Throwable ;; java.lang.UnsupportedOperationException + java.lang.ref.WeakReference + java.lang.ref.ReferenceQueue + java.lang.ref.Cleaner java.math.BigDecimal java.math.BigInteger java.math.MathContext diff --git a/test/babashka/reify_test.clj b/test/babashka/reify_test.clj index 7e052b5e..82c4a08a 100644 --- a/test/babashka/reify_test.clj +++ b/test/babashka/reify_test.clj @@ -128,3 +128,26 @@ (reify java.lang.Object (toString [_] \"foo\") clojure.lang.Seqable (seq [_] '(1 2 3)))"))))) + +(deftest reify-runnable-and-garbage-collection-test + (is (bb nil " +(def cleaner (java.lang.ref.Cleaner/create)) +(def deleted? (atom false)) +(defn make-cleanable-ref [] + (let [obj (Object.)] + (.register cleaner obj + (reify java.lang.Runnable + (run [_] + (reset! deleted? true)))) + nil)) +(defn force-gc [] + (let [t (atom (Object.)) + wr (java.lang.ref.WeakReference. @t)] + (reset! t nil) + (while (.get wr) + (System/gc) + (System/runFinalization)))) +(make-cleanable-ref) +(force-gc) +@deleted? +"))) From 267646fbe772f0fb2ae2e5a64c7741f6160dcdea Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Sep 2022 18:13:29 +0200 Subject: [PATCH 336/550] Fix gc test --- deps.edn | 2 +- project.clj | 2 +- reify/bb.edn | 2 ++ reify/build.clj | 2 +- reify/src/babashka/impl/reify2.clj | 17 +---------------- reify/src/babashka/impl/reify2/interfaces.clj | 1 + test/babashka/reify_test.clj | 6 ++++-- 7 files changed, 11 insertions(+), 21 deletions(-) create mode 100644 reify/bb.edn diff --git a/deps.edn b/deps.edn index cc02f222..d7d32bc2 100644 --- a/deps.edn +++ b/deps.edn @@ -20,7 +20,7 @@ "reify/src"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.3"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/project.clj b/project.clj index 9f70d430..82e1e98a 100644 --- a/project.clj +++ b/project.clj @@ -26,7 +26,7 @@ [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] [org.babashka/sci.impl.types "0.0.2"] - [org.babashka/babashka.impl.reify "0.1.2"] + [org.babashka/babashka.impl.reify "0.1.3"] [org.clojure/core.async "1.5.648"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] diff --git a/reify/bb.edn b/reify/bb.edn new file mode 100644 index 00000000..adce8f9c --- /dev/null +++ b/reify/bb.edn @@ -0,0 +1,2 @@ +{:tasks {install (clojure "-T:build install") + deploy (clojure "-T:build deploy")}} diff --git a/reify/build.clj b/reify/build.clj index 87d76733..c0493917 100644 --- a/reify/build.clj +++ b/reify/build.clj @@ -3,7 +3,7 @@ [clojure.tools.build.api :as b])) (def lib 'org.babashka/babashka.impl.reify) -(def version "0.1.2") +(def version "0.1.3") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/reify/src/babashka/impl/reify2.clj b/reify/src/babashka/impl/reify2.clj index 3186ceaf..dff57479 100644 --- a/reify/src/babashka/impl/reify2.clj +++ b/reify/src/babashka/impl/reify2.clj @@ -61,19 +61,6 @@ java.lang.Object (toString [this] (toString-fn this))))) -(defn reify-runnable [m] - (let [methods (:methods m) - run-fn (or (get methods 'run) - (fn [_]))] - (reify - sci.impl.types.IReified - (getMethods [_] (:methods m)) - (getInterfaces [_] (:interfaces m)) - (getProtocols [_] (:protocols m)) - java.lang.Runnable - (run [this] (run-fn this)))) - ) - (defmacro gen-reify-fn [] `(fn [~'m] (when (> (count (:interfaces ~'m)) 1) @@ -91,9 +78,7 @@ ["clojure.lang.IFn" `(reify-ifn ~'m) "java.lang.Object" - `(reify-object ~'m) - "java.lang.Runnable" - `(reify-runnable ~'m)] + `(reify-object ~'m)] (for [i interfaces] (let [in (.getName ^Class i)] [in diff --git a/reify/src/babashka/impl/reify2/interfaces.clj b/reify/src/babashka/impl/reify2/interfaces.clj index 416578a4..a94feec3 100644 --- a/reify/src/babashka/impl/reify2/interfaces.clj +++ b/reify/src/babashka/impl/reify2/interfaces.clj @@ -19,6 +19,7 @@ clojure.lang.Reversible clojure.lang.Seqable java.lang.Iterable + java.lang.Runnable java.net.http.WebSocket$Listener java.util.Iterator java.util.function.Consumer diff --git a/test/babashka/reify_test.clj b/test/babashka/reify_test.clj index 82c4a08a..a9911dd7 100644 --- a/test/babashka/reify_test.clj +++ b/test/babashka/reify_test.clj @@ -2,6 +2,7 @@ (:require [babashka.test-utils :as test-utils] [clojure.edn :as edn] + [clojure.string :as str] [clojure.test :as test :refer [deftest is testing]])) (defn bb [input & args] @@ -52,7 +53,7 @@ (deftest reify-object (testing "empty methods" - (is (clojure.string/starts-with? + (is (str/starts-with? (bb nil " (str (reify Object))") "babashka.impl.reify"))) @@ -144,7 +145,8 @@ (let [t (atom (Object.)) wr (java.lang.ref.WeakReference. @t)] (reset! t nil) - (while (.get wr) + (while (or (.get wr) + (not @deleted?)) (System/gc) (System/runFinalization)))) (make-cleanable-ref) From e1094e1529eca1408835e28483b1a7d001ca8ffc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Sep 2022 20:24:37 +0200 Subject: [PATCH 337/550] Add more reflection classes (#1360) --- resources/META-INF/babashka/deps.edn | 2 +- src/babashka/impl/classes.clj | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index cc02f222..d7d32bc2 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -20,7 +20,7 @@ "reify/src"], :deps {org.clojure/clojure {:mvn/version "1.11.1"}, org.babashka/sci {:local/root "sci"} - org.babashka/babashka.impl.reify {:mvn/version "0.1.2"} + org.babashka/babashka.impl.reify {:mvn/version "0.1.3"} org.babashka/sci.impl.types {:mvn/version "0.0.2"} babashka/babashka.curl {:local/root "babashka.curl"} babashka/fs {:local/root "fs"} diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index cbe81f35..69873fca 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -79,7 +79,16 @@ ;; this fixes clojure.lang.Reflector for Java 11 java.lang.reflect.AccessibleObject {:methods [{:name "canAccess"}]} + java.lang.Package + {:methods [{:name "getName"}]} java.lang.reflect.Method + {:methods [{:name "getName"} + {:name "getModifiers"} + {:name "getParameterTypes"} + {:name "getReturnType"}]} + java.lang.reflect.Modifier + {:methods [{:name "isStatic"}]} + java.lang.reflect.Field {:methods [{:name "getName"}]} java.lang.reflect.Array {:methods [{:name "newInstance"} From 03b1bfa80f222802e5fe4d24c398616d15549847 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Sep 2022 20:51:25 +0200 Subject: [PATCH 338/550] sci tweaks --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index aa460c34..d0968cd7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit aa460c34ca39f1d325072f2329f2c4eb122b20e1 +Subproject commit d0968cd7b3607b6106f81beb154806b450ddaf3e From 9566a7d1f1e95947f61d89cf697845f3950e48fa Mon Sep 17 00:00:00 2001 From: Eero Helenius Date: Fri, 9 Sep 2022 21:55:11 +0300 Subject: [PATCH 339/550] Add more reflection class methods (#1361) --- src/babashka/impl/classes.clj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 69873fca..cacccd70 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -81,6 +81,8 @@ {:methods [{:name "canAccess"}]} java.lang.Package {:methods [{:name "getName"}]} + java.lang.reflect.Member + {:methods [{:name "getModifiers"}]} java.lang.reflect.Method {:methods [{:name "getName"} {:name "getModifiers"} @@ -89,7 +91,8 @@ java.lang.reflect.Modifier {:methods [{:name "isStatic"}]} java.lang.reflect.Field - {:methods [{:name "getName"}]} + {:methods [{:name "getName"} + {:name "getModifiers"}]} java.lang.reflect.Array {:methods [{:name "newInstance"} {:name "set"}]} From 1631349fb6c1bcba6fe60fe084e2e0c6198d102a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 12 Sep 2022 12:43:49 +0200 Subject: [PATCH 340/550] pods: TCP_NODELAY --- pods | 2 +- src/babashka/impl/classes.clj | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pods b/pods index 8bc08527..53f79da0 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 8bc0852799c7ae36ade12bacb7c6ede2fc91c6dc +Subproject commit 53f79da09d5da542204f3cb0161724221276dfcb diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index cacccd70..b6ea4d1e 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -147,7 +147,8 @@ :parameterTypes ["org.hsqldb.Database"]}]} `java.util.ResourceBundle {:methods [{:name "getBundle" - :parameterTypes ["java.lang.String","java.util.Locale","java.lang.ClassLoader"]}]}))) + :parameterTypes ["java.lang.String","java.util.Locale", + "java.lang.ClassLoader"]}]}))) (def java-net-http-classes "These classes must be initialized at run time since GraalVM 22.1" @@ -536,7 +537,8 @@ clojure.lang.Sequential clojure.lang.Seqable clojure.lang.Volatile - ;; the only way to check if something is a channel is to call instance? on this... + ;; the only way to check if something is a channel is to + ;; call instance? on this... clojure.core.async.impl.channels.ManyToManyChannel java.lang.AbstractMethodError java.lang.ExceptionInInitializerError @@ -628,7 +630,8 @@ (def class-map* - "This contains mapping of symbol to class of all classes that are allowed to be initialized at build time." + "This contains mapping of symbol to class of all classes that are + allowed to be initialized at build time." (gen-class-map)) (def class-map @@ -724,7 +727,8 @@ (let [all-entries (reflection-file-entries)] (spit (or (first args) - "resources/META-INF/native-image/babashka/babashka/reflect-config.json") (json/generate-string all-entries {:pretty true})))) + "resources/META-INF/native-image/babashka/babashka/reflect-config.json") + (json/generate-string all-entries {:pretty true})))) (defn public-declared-method? [c m] (and (= c (.getDeclaringClass m)) From 1a700f6a69b8869fda88828889c004cbc061388d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 12 Sep 2022 14:19:42 +0200 Subject: [PATCH 341/550] Add -x help --- src/babashka/main.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 94bc2d15..5cd9ff9b 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -162,6 +162,7 @@ Evaluation: -e, --eval Evaluate an expression. -f, --file Evaluate a file. -m, --main Call the -main function from a namespace or call a fully qualified var. + -x, --exec Call the fully qualified var. Args are parsed by babashka CLI. REPL: From d0d36a2bc45a653bc69a79312fd81c5238176301 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 13 Sep 2022 10:19:52 +0200 Subject: [PATCH 342/550] Bump clj-yaml --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index d7d32bc2..60f66cea 100644 --- a/deps.edn +++ b/deps.edn @@ -31,7 +31,7 @@ org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} - clj-commons/clj-yaml {:mvn/version "0.7.109"} + clj-commons/clj-yaml {:mvn/version "0.7.110"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} diff --git a/project.clj b/project.clj index 82e1e98a..b1d806d4 100644 --- a/project.clj +++ b/project.clj @@ -38,7 +38,7 @@ :profiles {:feature/xml {:source-paths ["feature-xml"] :dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]} :feature/yaml {:source-paths ["feature-yaml"] - :dependencies [[clj-commons/clj-yaml "0.7.109"]]} + :dependencies [[clj-commons/clj-yaml "0.7.110"]]} :feature/jdbc {:source-paths ["feature-jdbc"] :dependencies [[seancorfield/next.jdbc "1.1.610"]]} :feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}] From 4926aaf85f5690654d36c5f335d225e6c9c3bd0c Mon Sep 17 00:00:00 2001 From: Eero Helenius Date: Tue, 13 Sep 2022 11:54:30 +0300 Subject: [PATCH 343/550] Add and expose babashka.classes/all-classes (#1362) * Add and expose babashka.classes/all-classes * Add test for babashka.classes/all-classes --- src/babashka/impl/classes.clj | 20 ++++++++++++++------ src/babashka/main.clj | 3 ++- test/babashka/classes_test.clj | 11 +++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 test/babashka/classes_test.clj diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index b6ea4d1e..5a2c669d 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -5,6 +5,7 @@ [babashka.impl.proxy :as proxy] [cheshire.core :as json] [clojure.core.async] + [sci.core :as sci] [sci.impl.types :as t])) (def base-custom-map @@ -744,18 +745,25 @@ (sort-by :name) (vec))) -(defn all-methods [] +(defn all-classes [] + "Returns every java.lang.Class instance Babashka supports." (->> (reflection-file-entries) (map :name) - (map #(Class/forName %)) - (mapcat public-declared-method-names))) + (map #(Class/forName %)))) + +(defn all-methods [] + (mapcat public-declared-method-names (all-classes))) + +(def cns (sci/create-ns 'babashka.classes nil)) + +(def classes-namespace + {:obj cns + 'all-classes (sci/copy-var all-classes cns)}) (comment (public-declared-method-names java.net.URL) (public-declared-method-names java.util.Properties) - (->> (reflection-file-entries) - (map :name) - (map #(Class/forName %))) + (all-classes) ) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 5cd9ff9b..0c0dda6c 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -7,7 +7,7 @@ [babashka.fs :as fs] [babashka.impl.bencode :refer [bencode-namespace]] [babashka.impl.cheshire :refer [cheshire-core-namespace]] - [babashka.impl.classes :as classes] + [babashka.impl.classes :as classes :refer [classes-namespace]] [babashka.impl.classpath :as cp :refer [classpath-namespace]] [babashka.impl.cli :as cli] [babashka.impl.clojure.core :as core :refer [core-extras]] @@ -379,6 +379,7 @@ Use bb run --help to show this help output. 'clojure.test t/clojure-test-namespace 'clojure.math math-namespace 'babashka.classpath classpath-namespace + 'babashka.classes classes-namespace 'clojure.pprint pprint-namespace 'babashka.curl curl-namespace 'babashka.fs fs-namespace diff --git a/test/babashka/classes_test.clj b/test/babashka/classes_test.clj new file mode 100644 index 00000000..31b7872e --- /dev/null +++ b/test/babashka/classes_test.clj @@ -0,0 +1,11 @@ +(ns babashka.classes-test + (:require [babashka.test-utils :as tu] + [clojure.edn :as edn] + [clojure.test :as t :refer [deftest is testing]])) + +(defn bb + [& args] + (edn/read-string (apply tu/bb nil (map pr-str args)))) + +(deftest all-classes-test + (is (true? (bb '(let [classes (babashka.classes/all-classes)] (and (seq classes) (every? class? classes))))))) From 2f146bd712b9311b8a4edfccfc6935a69822d714 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 18 Sep 2022 12:29:16 +0200 Subject: [PATCH 344/550] Fix #1364: Be tolerant of unknown tags in bb.edn --- CHANGELOG.md | 1 + sci | 2 +- src/babashka/main.clj | 6 +++--- test/babashka/bb_edn_test.clj | 6 ++++++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aa0e1ac..80d685f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ A preview of the next release can be installed from ## Unreleased - [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects +- [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` ## 0.9.162 (2022-09-04) diff --git a/sci b/sci index d0968cd7..22095a3a 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit d0968cd7b3607b6106f81beb154806b450ddaf3e +Subproject commit 22095a3a741eef0ce6bb3efacad54f3f5bd24af8 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 0c0dda6c..e089b0f3 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -1040,8 +1040,8 @@ Use bb run --help to show this help output. (and (= minor-current minor-min) (>= patch-current patch-min))))))) -(defn load-edn [string] - (try (edn/read-string string) +(defn load-bb-edn [string] + (try (edn/read-string {:default tagged-literal} string) (catch java.lang.RuntimeException e (if (re-find #"No dispatch macro for: \"" (.getMessage e)) (throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {})) @@ -1060,7 +1060,7 @@ Use bb run --help to show this help output. bb-edn (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file) (let [raw-string (slurp bb-edn-file) - edn (load-edn raw-string) + edn (load-bb-edn raw-string) edn (assoc edn :raw raw-string :file bb-edn-file) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 30a9bac2..589d72b7 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -445,3 +445,9 @@ even more stuff here\" (pr-str '{:paths ["test-resources"] :pods {pod/test-pod {:path "test-resources/pod"}}}) (is (= "42\n" (test-utils/bb nil "-m" "pod-tests.local"))))) + +(deftest tag-test + (test-utils/with-config + "{:deps {} + :aliases {:foo {:env-vars {:dude #env \"DUDE\"}}}}" + (is (= 6 (bb "-e" "(+ 1 2 3)"))))) From b84ecd5da7f2fe65455b9f1038dbb1e12c8fcf57 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 18 Sep 2022 12:48:21 +0200 Subject: [PATCH 345/550] CHANGELOG [skip ci] --- CHANGELOG.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d685f5..9e031bdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,25 @@ A preview of the next release can be installed from ## Unreleased -- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects +- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` +- Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele)) +- Add more reflection class methods ([@eerohele](https://github.com/eerohele)) +- Bump `clj-yaml` +- Add `-x` help +- Set `TCP_NODELAY` in pods for performance +- Expose `clojure.main/with-bindings` +- Add `ThreadPoolExecutor` rejection policy classes ([@eerohele](https://github.com/eerohele)) +- Download but don't run pods when `os.name` / `os.arch` don't match ([@cap10morgan](https://github.com/cap10morgan)) +- Add `clojure.core.server/stop-server` ([@eerohele](https://github.com/eerohele)) +- Add `ns-unalias` +- Add `AtomicInteger` and `AtomicLong` to full interop +- Add `PrintWriter-on` +- Improve `reify` error messages ([@retrogradeorbit](https://github.com/retrogradeorbit)) +- Expose `core.async` `ManyToManyChannel` +- fs: add `write-lines` +- fs: add `write-bytes` +- [#1350](https://github.com/babashka/babashka/issues/1350): map `clojure.lang.Var` to `sci.lang.Var` ## 0.9.162 (2022-09-04) From 739f05cc5e7634ea53b51421cb3aee96723b917c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 18 Sep 2022 12:51:02 +0200 Subject: [PATCH 346/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e031bdb..4eefbeb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,15 +29,10 @@ A preview of the next release can be installed from ## 0.9.162 (2022-09-04) -Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. - -- Throw exception on attempt to reify multiple interfaces -- Allow java.lang.Object reify with empty methods - -## 0.9.162 (2022-09-04) - -Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. +Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. Thanks [@rads](https://github.com/rads)! +- Throw exception on attempt to reify multiple interfaces ([@retrogradeorbit](https://github.com/retrogradeorbit)) +- Allow java.lang.Object reify with empty methods ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature - [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread)) - Fix `satisfies?` with marker protocol (no methods) From 621130960bc50ba4d256cb507ac08cf8574c447e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 18 Sep 2022 21:38:23 +0200 Subject: [PATCH 347/550] Bump deps.clj --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 0d9754fb..d4d6d720 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 0d9754fb1f2cfc49abc6d9d27e95c414b824016d +Subproject commit d4d6d720c0d62eb3e2230fa85291a5fd68398d6a From 3b9163cde90a54717d5a0d0500de1e07a3d44514 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 19 Sep 2022 14:01:10 +0200 Subject: [PATCH 348/550] Bump clojure.xml --- deps.edn | 2 +- process | 2 +- project.clj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index 60f66cea..43fe207d 100644 --- a/deps.edn +++ b/deps.edn @@ -30,7 +30,7 @@ org.clojure/tools.cli {:mvn/version "1.0.206"}, org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} - org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} + org.clojure/data.xml {:mvn/version "0.2.0-alpha8"} clj-commons/clj-yaml {:mvn/version "0.7.110"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} diff --git a/process b/process index d070f411..79826811 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit d070f411598a5f9921f07d4a5db2600d6101dd2e +Subproject commit 79826811257f6bdf21d0a114e44471ae0da36fa8 diff --git a/project.clj b/project.clj index b1d806d4..2b7a4d7a 100644 --- a/project.clj +++ b/project.clj @@ -36,7 +36,7 @@ :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] - :dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]} + :dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]} :feature/yaml {:source-paths ["feature-yaml"] :dependencies [[clj-commons/clj-yaml "0.7.110"]]} :feature/jdbc {:source-paths ["feature-jdbc"] From 3bc5bcab5bd8ce1a551df94e763ef8877122a5e7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 20 Sep 2022 12:10:08 +0200 Subject: [PATCH 349/550] Bump process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 79826811..58d542f8 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 79826811257f6bdf21d0a114e44471ae0da36fa8 +Subproject commit 58d542f83c33c9075dd7c4cd382c920548b40e95 From 06d6e9792737b7c9e15975dc0a8497ecf702e925 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 21 Sep 2022 12:50:07 +0200 Subject: [PATCH 350/550] sci protocol docs --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 22095a3a..8330cd8b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 22095a3a741eef0ce6bb3efacad54f3f5bd24af8 +Subproject commit 8330cd8bee67dfbea2688643ec45406300ecb6ff From 00dee391967547a2c9df9f12ba78ec5f9adf0af6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 21 Sep 2022 16:38:19 +0200 Subject: [PATCH 351/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 8330cd8b..584a4ab5 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 8330cd8bee67dfbea2688643ec45406300ecb6ff +Subproject commit 584a4ab5fef1aaa84aedab29c28153c7b178eb59 From aa0da8f503534b1e620284da719af5af6ed4a511 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Wed, 21 Sep 2022 13:46:03 -0600 Subject: [PATCH 352/550] Map (on)to-chan!(!) core.async fns (#1371) * Map (on)to-chan!(!) core.async fns These are recent replacements for their deprecated predecessors onto-chan & to-chan. * Add note to changelog about #1370 fix --- CHANGELOG.md | 1 + src/babashka/impl/clojure/core/async.clj | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4eefbeb9..3a276717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#1370](https://github.com/babashka/babashka/issues/1370): Map to-chan!, to-chan!!, onto-chan!, & onto-chan!! core.async fns into babashka's SCI core.async namespace. - [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` - Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele)) diff --git a/src/babashka/impl/clojure/core/async.clj b/src/babashka/impl/clojure/core/async.clj index 686fb34d..6ae94083 100644 --- a/src/babashka/impl/clojure/core/async.clj +++ b/src/babashka/impl/clojure/core/async.clj @@ -68,6 +68,8 @@ 'mult (copy-var async/mult core-async-namespace) 'offer! (copy-var async/offer! core-async-namespace) 'onto-chan (copy-var async/onto-chan core-async-namespace) + 'onto-chan! (copy-var async/onto-chan! core-async-namespace) + 'onto-chan!! (copy-var async/onto-chan!! core-async-namespace) 'partition (copy-var async/partition core-async-namespace) 'partition-by (copy-var async/partition-by core-async-namespace) 'pipe (copy-var async/pipe core-async-namespace) @@ -92,6 +94,8 @@ 'thread-call (copy-var thread-call core-async-namespace) 'timeout (copy-var async/timeout core-async-namespace) 'to-chan (copy-var async/to-chan core-async-namespace) + 'to-chan! (copy-var async/to-chan! core-async-namespace) + 'to-chan!! (copy-var async/to-chan!! core-async-namespace) 'toggle (copy-var async/toggle core-async-namespace) 'transduce (copy-var async/transduce core-async-namespace) 'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace) From 3b5dbb7c66ce0115fbce6d93c814777b06671e35 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 14:03:12 +0200 Subject: [PATCH 353/550] Fix #1367: line number in clojure.test output --- sci | 2 +- src/babashka/impl/clojure/test.clj | 14 +++++++------- src/babashka/wait.clj | 10 ++++++---- test-resources/line_number_test_test.clj | 7 +++++++ test/babashka/test_test.clj | 4 ++++ 5 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 test-resources/line_number_test_test.clj diff --git a/sci b/sci index 584a4ab5..2b8751f8 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 584a4ab5fef1aaa84aedab29c28153c7b178eb59 +Subproject commit 2b8751f8443948e618dfab354e980aadc912dcc4 diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index 1507186e..2810192e 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -232,13 +232,13 @@ For additional event types, see the examples in the code. "} babashka.impl.clojure.test - (:require [babashka.impl.common :refer [ctx]] - [clojure.stacktrace :as stack] - [clojure.template :as temp] - [sci.core :as sci] - [sci.impl.namespaces :as sci-namespaces] - [sci.impl.resolve :as resolve] - [sci.impl.vars :as vars])) + (:require + [babashka.impl.common :refer [ctx]] + [clojure.stacktrace :as stack] + [clojure.template :as temp] + [sci.core :as sci] + [sci.impl.namespaces :as sci-namespaces] + [sci.impl.resolve :as resolve])) ;; Nothing is marked "private" here, so you can rebind things to plug ;; in your own testing or reporting frameworks. diff --git a/src/babashka/wait.clj b/src/babashka/wait.clj index 5cbea999..d8c4fe69 100644 --- a/src/babashka/wait.clj +++ b/src/babashka/wait.clj @@ -26,8 +26,9 @@ :wait-for-port.impl/timed-out :wait-for-port.impl/try-again))))] (cond (identical? :wait-for-port.impl/try-again v) - (do (Thread/sleep (or pause 100)) - (recur)) + (let [^long pause (or pause 100)] + (Thread/sleep pause) + (recur)) (identical? :wait-for-port.impl/timed-out v) default :else @@ -51,8 +52,9 @@ :wait-for-path.impl/timed-out :wait-for-path.impl/try-again)))] (cond (identical? :wait-for-path.impl/try-again v) - (do (Thread/sleep (or pause 100)) - (recur)) + (let [^long pause (or pause 100)] + (Thread/sleep pause) + (recur)) (identical? :wait-for-path.impl/timed-out v) default :else diff --git a/test-resources/line_number_test_test.clj b/test-resources/line_number_test_test.clj new file mode 100644 index 00000000..e3d3fdba --- /dev/null +++ b/test-resources/line_number_test_test.clj @@ -0,0 +1,7 @@ +(ns line-number-test-test + (:require [clojure.test :refer [is deftest run-tests]])) + +(deftest test-is + (is false)) + +(run-tests 'line-number-test-test) diff --git a/test/babashka/test_test.clj b/test/babashka/test_test.clj index d88c3fd5..08a58249 100644 --- a/test/babashka/test_test.clj +++ b/test/babashka/test_test.clj @@ -108,3 +108,7 @@ (t/with-test-out (t/run-tests *ns*))) (str/includes? (str sw) \"Ran 1 tests containing 2 assertions.\"))")] (is (str/includes? output "true")))) + +(deftest line-number-test + (is (str/includes? (bb "test-resources/line_number_test_test.clj") + "line_number_test_test.clj:4"))) From c3f61bdc3479c93c7b993e4ce033491d5ee963d5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 14:05:42 +0200 Subject: [PATCH 354/550] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a276717..c72015fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1370](https://github.com/babashka/babashka/issues/1370): Map to-chan!, to-chan!!, onto-chan!, & onto-chan!! core.async fns into babashka's SCI core.async namespace. - [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` From 92a8042f9729148ac67c7d42c3fd4c311231d8a8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 14:05:50 +0200 Subject: [PATCH 355/550] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c72015fe..f464ef06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ A preview of the next release can be installed from ## Unreleased - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) -- [#1370](https://github.com/babashka/babashka/issues/1370): Map to-chan!, to-chan!!, onto-chan!, & onto-chan!! core.async fns into babashka's SCI core.async namespace. +- [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan)) - [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` - Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele)) From d2c86960390a7fe849c1617fc417102ff2fa55dc Mon Sep 17 00:00:00 2001 From: Lee Read Date: Thu, 22 Sep 2022 11:40:15 -0400 Subject: [PATCH 356/550] Make a "babashka built-in" badge available (#1366) * Make a "babashka built-in" badge available Of note: added markdown and adoc syntaxes for badges to README. Closes #1365 * Moved flair section under new badges section Badges themselves act as headings under badges section. Reworded badges text for 2 audiences. 1. The general bb user who wants to know what they mean. 2. The library author who might want to display them. Renamed "Projects" heading to "Compatible Projects" --- README.md | 60 ++++++++++++++++++++++++++++++++++++----- logo/built-in-badge.svg | 1 + 2 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 logo/built-in-badge.svg diff --git a/README.md b/README.md index 8b63a9c2..a1e17bef 100644 --- a/README.md +++ b/README.md @@ -286,22 +286,68 @@ Check out the [news](doc/news.md) page to keep track of babashka-related news it Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list of built-in namespaces. -## [Projects](doc/projects.md) +## [Compatible Projects](doc/projects.md) A list of projects (scripts, libraries, pods and tools) known to work with babashka. -### Flair - -Do you have a library that runs with babashka? Add this badge to add some flair -to your repo: +## Badges + [![bb compatible](/logo/badge.svg)](https://babashka.org) -The raw HTML: +The babashka compatible badge indicates that a [library can be used as babashka dependency](doc/projects.md). -``` html +If this is the case for your library, we encourage you to proudly display this badge. + +

Markdown + +```markdown +[![bb compatible](https://raw.githubusercontent.com/babashka/babashka/master/logo/badge.svg)](https://babashka.org) +``` +
+ +
AsciiDoc + +```asciidoc +https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/badge.svg[bb compatible]] +``` +
+ +
HTML + +```html bb compatible ``` +
+
+ +[![bb built-in](/logo/built-in-badge.svg)](https://babashka.org) + +The babashka built-in badge means that a [library has been built directly into babashka](https://book.babashka.org/#built-in-namespaces) and requires no extra dependencies to use it. + +If this rare honor belongs to your library, you should display this badge. + +
Markdown + +```markdown +[![bb built-in](https://raw.githubusercontent.com/babashka/babashka/master/logo/built-in-badge.svg)](https://babashka.org) +``` +
+ +
AsciiDoc + +```asciidoc +https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/built-in-badge.svg[bb built-in]] +``` +
+ +
HTML + +```html +bb built-in +``` +
+
## [Pods](https://github.com/babashka/babashka.pods) diff --git a/logo/built-in-badge.svg b/logo/built-in-badge.svg new file mode 100644 index 00000000..afeae2eb --- /dev/null +++ b/logo/built-in-badge.svg @@ -0,0 +1 @@ +babashka: built-inbabashkabuilt-in \ No newline at end of file From 848683f82d7776ead24f47578fa5429d05b85a65 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 18:13:54 +0200 Subject: [PATCH 357/550] sci --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 2b8751f8..42bd17de 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 2b8751f8443948e618dfab354e980aadc912dcc4 +Subproject commit 42bd17def34633b03d663211693eff972c9735bb From 3110dde2aba4c6a8672980715c403b484edf23f1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 20:04:41 +0200 Subject: [PATCH 358/550] Fix #1368: -x: do not pick up on aliases in user ns --- CHANGELOG.md | 1 + src/babashka/impl/cli.clj | 15 +++++++++------ test/babashka/exec_test.clj | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 test/babashka/exec_test.clj diff --git a/CHANGELOG.md b/CHANGELOG.md index f464ef06..e4633746 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan)) - [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index e915057a..fcbbe8ef 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -12,10 +12,11 @@ ([sym] (exec-fn-snippet sym nil)) ([sym extra-opts] (format " -(do -(require '[babashka.cli]) -(let [extra-opts '%2$s - the-var (requiring-resolve `%1$s) +(ns exec-%s + (:require [babashka.cli :as cli])) +(let [extra-opts '%s + sym `%s + the-var (requiring-resolve sym) the-var-meta (meta the-var) ns (:ns (meta the-var)) ns-meta (meta ns) @@ -28,6 +29,8 @@ task-exec-args (:exec-args ct) cli-exec-args (:exec-args cli-opts) opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] -(the-var opts)))" +(the-var opts))" + (random-uuid) + (pr-str extra-opts) sym - (pr-str extra-opts)))) + ))) diff --git a/test/babashka/exec_test.clj b/test/babashka/exec_test.clj new file mode 100644 index 00000000..4ff54716 --- /dev/null +++ b/test/babashka/exec_test.clj @@ -0,0 +1,16 @@ +(ns babashka.exec-test + (:require + [babashka.test-utils :as u] + [cheshire.core :as cheshire] + [clojure.edn :as edn] + [clojure.test :as t :refer [deftest is]])) + +(defn bb [& args] + (apply u/bb nil args)) + +(deftest exec-test + (is (= {:foo 1} (edn/read-string (bb "-x" "prn" "--foo" "1")))) + (is (thrown? Exception (bb "-x" "json/generate-string" "--foo" "1"))) + (is (= {:foo 1} (cheshire/parse-string + (edn/read-string + (bb "-x" "cheshire.core/generate-string" "--foo" "1")) true)))) From a9f0483869ee99febde4e85b0461f195f0fec3a4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 22 Sep 2022 20:58:36 +0200 Subject: [PATCH 359/550] Bump CLI --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 43fe207d..1bdf045f 100644 --- a/deps.edn +++ b/deps.edn @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.3.35"}} + org.babashka/cli {:mvn/version "0.4.37"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index 2b7a4d7a..1970c796 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] - [org.babashka/cli "0.3.35"]] + [org.babashka/cli "0.4.37"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] From fd3f4a100a39ca6231a755037455db500500217c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 13:14:27 +0200 Subject: [PATCH 360/550] process: exit-fn --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 58d542f8..09b3a329 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 58d542f83c33c9075dd7c4cd382c920548b40e95 +Subproject commit 09b3a329404f132eab9ccd59363f35a5d84d2ae6 From 525f73f822d93adb0f38561e7e6a32287627b969 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 17:02:13 +0200 Subject: [PATCH 361/550] process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 09b3a329..b8e2466a 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 09b3a329404f132eab9ccd59363f35a5d84d2ae6 +Subproject commit b8e2466ad41fab0c67afec0a5bcf40a5c03773e6 From 2ffbef09d8c6f70700923139e67d20ae5e192e1b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 17:12:04 +0200 Subject: [PATCH 362/550] process [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index b8e2466a..bd203b79 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit b8e2466ad41fab0c67afec0a5bcf40a5c03773e6 +Subproject commit bd203b79a21b6155b61b4b4efda5a497dec2567d From 2ff030482127e15df0f99b8b31c20e913cbec9de Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 20:55:23 +0200 Subject: [PATCH 363/550] changelog [skip ci] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4633746..2a8ba632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` are methods missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek)) - [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan)) From 7b563dd802addd39e26140ffdfd84a5c20669f11 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 21:18:52 +0200 Subject: [PATCH 364/550] exec-test [skip ci] --- test/babashka/exec_test.clj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/babashka/exec_test.clj b/test/babashka/exec_test.clj index 4ff54716..b3626a0a 100644 --- a/test/babashka/exec_test.clj +++ b/test/babashka/exec_test.clj @@ -14,3 +14,9 @@ (is (= {:foo 1} (cheshire/parse-string (edn/read-string (bb "-x" "cheshire.core/generate-string" "--foo" "1")) true)))) + +(deftest tag-test + (u/with-config + "{:deps {} + :tasks {foo (exec 'clojure.core/prn)}}" + (is (= {:dude 1} (edn/read-string (bb "run" "foo" "--dude" "1")))))) From 42ebb92c5d9b3eba9d7180073026bb8c3812085a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Sep 2022 21:26:28 +0200 Subject: [PATCH 365/550] exec tests --- test-resources/babashka/exec_test.clj | 7 +++++++ test/babashka/exec_test.clj | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test-resources/babashka/exec_test.clj diff --git a/test-resources/babashka/exec_test.clj b/test-resources/babashka/exec_test.clj new file mode 100644 index 00000000..6eca718f --- /dev/null +++ b/test-resources/babashka/exec_test.clj @@ -0,0 +1,7 @@ +(ns babashka.exec-test + {:org.babashka/cli {:coerce {:foo []}}}) + +(defn exec-test + {:org.babashka/cli {:coerce {:bar :keyword}}} + [m] + (prn m)) diff --git a/test/babashka/exec_test.clj b/test/babashka/exec_test.clj index b3626a0a..4493e356 100644 --- a/test/babashka/exec_test.clj +++ b/test/babashka/exec_test.clj @@ -15,8 +15,22 @@ (edn/read-string (bb "-x" "cheshire.core/generate-string" "--foo" "1")) true)))) -(deftest tag-test +(deftest tasks-exec-test (u/with-config "{:deps {} :tasks {foo (exec 'clojure.core/prn)}}" - (is (= {:dude 1} (edn/read-string (bb "run" "foo" "--dude" "1")))))) + (is (= {:dude 1} (edn/read-string (bb "run" "foo" "--dude" "1"))))) + (u/with-config + "{:deps {} + :tasks {foo (exec 'clojure.core/prn)}}" + (is (= {:dude 1} (edn/read-string (bb "run" "foo" "--dude" "1"))))) + (u/with-config + "{:deps {} + :tasks {foo {:org.babashka/cli {:coerce {:dude []}} + :task (exec 'clojure.core/prn)}}}" + (is (= {:dude [1]} (edn/read-string (bb "run" "foo" "--dude" "1"))))) + (u/with-config + "{:deps {} + :tasks {foo {:task (exec 'babashka.exec-test/exec-test)}}}" + (is (= {:foo [1], :bar :yeah} + (edn/read-string (bb "-cp" "test-resources" "run" "foo" "--foo" "1" "--bar" "yeah")))))) From 78cbdd1d82bc99c3fa913fabe40052e89295a52c Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 24 Sep 2022 04:59:34 -0400 Subject: [PATCH 366/550] #1336: --force as global opt (#1374) --- CHANGELOG.md | 1 + src/babashka/main.clj | 6 +++--- test/babashka/main_test.clj | 7 ++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a8ba632..e0e970bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global --force option ([@bobisageek](https://github.com/bobisageek)) - [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` are methods missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek)) - [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index e089b0f3..784c5473 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -552,9 +552,6 @@ Use bb run --help to show this help output. ("--verbose") (recur (next options) (assoc opts-map :verbose? true)) - ("--force") (recur (next options) - (assoc opts-map - :force? true)) ("--describe") (recur (next options) (assoc opts-map :describe? true)) @@ -699,6 +696,9 @@ Use bb run --help to show this help output. ("--init") (recur (nnext options) (assoc opts-map :init (second options))) + ("--force") + (recur (next options) (assoc opts-map :force? true)) + ("--config") (recur (nnext options) (assoc opts-map :config (second options))) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 3973ea03..e645c82b 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -60,7 +60,12 @@ (is (:feature/xml v))) (is (= {:force? true} (parse-opts ["--force"]))) (is (= {:main "foo", :command-line-args '("-h")} (parse-opts ["-m" "foo" "-h"]))) - (is (= {:main "foo", :command-line-args '("-h")} (parse-opts ["-m" "foo" "--" "-h"])))) + (is (= {:main "foo", :command-line-args '("-h")} (parse-opts ["-m" "foo" "--" "-h"]))) + (is (= {:force? true :list-tasks true :command-line-args nil} (parse-opts ["--force" "tasks"]))) + (is (= {:force? true :run "sometask" :command-line-args nil} (parse-opts ["--force" "run" "sometask"]))) + (is (= {:force? true :repl true} (parse-opts ["--force" "repl"]))) + (is (= {:force? true :clojure true :command-line-args '("-M" "-r")} + (parse-opts ["--force" "clojure" "-M" "-r"])))) (deftest version-test (is (= [1 0 0] (main/parse-version "1.0.0-SNAPSHOT"))) From 0c87ed23120fb0db4741863935a97718d63863a0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 12:33:46 +0200 Subject: [PATCH 367/550] Use clj-yaml with fixes --- deps.edn | 3 ++- project.clj | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 1bdf045f..b77e7cc9 100644 --- a/deps.edn +++ b/deps.edn @@ -31,7 +31,8 @@ org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha8"} - clj-commons/clj-yaml {:mvn/version "0.7.110"} + io.github.borkdude/clj-yaml {:mvn/version "0.7-1.33-next"} + #_#_clj-commons/clj-yaml {:mvn/version "0.7.110"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} diff --git a/project.clj b/project.clj index 1970c796..cb60ab7c 100644 --- a/project.clj +++ b/project.clj @@ -38,7 +38,8 @@ :profiles {:feature/xml {:source-paths ["feature-xml"] :dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]} :feature/yaml {:source-paths ["feature-yaml"] - :dependencies [[clj-commons/clj-yaml "0.7.110"]]} + :dependencies [[io.github.borkdude/clj-yaml "0.7-1.33-next" + #_#_clj-commons/clj-yaml "0.7.110"]]} :feature/jdbc {:source-paths ["feature-jdbc"] :dependencies [[seancorfield/next.jdbc "1.1.610"]]} :feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}] From eed298f4a400c43043d6952fc4121490ba5e6464 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 12:41:00 +0200 Subject: [PATCH 368/550] Changelog [skip ci] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0e970bd..c2408f75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,10 @@ A preview of the next release can be installed from - fs: add `write-lines` - fs: add `write-bytes` - [#1350](https://github.com/babashka/babashka/issues/1350): map `clojure.lang.Var` to `sci.lang.Var` +- Use temporary fork of `clj-yaml` with new `:load-all`, `:unknown-tag-fn` + options and preserves strings with numbers that start with zeros as strings + (this solves a problem when YAML 1.1 output is read as YAML 1.2.). Once + upstream SnakeYAML 1.33 lands, this will be used again. ## 0.9.162 (2022-09-04) From 020d42a94fab2a2f80abd15fa05b19b355b1b545 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:25:06 +0200 Subject: [PATCH 369/550] Fix #808: -Sdeps --- CHANGELOG.md | 1 + src/babashka/main.clj | 21 +++++++++++++++------ test/babashka/bb_edn_test.clj | 6 ++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2408f75..0396b8d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ A preview of the next release can be installed from ## Unreleased +- [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last - [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global --force option ([@bobisageek](https://github.com/bobisageek)) - [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` are methods missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek)) - [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 784c5473..e5bd9b4b 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -145,10 +145,11 @@ Global opts: -cp, --classpath Classpath to use. Overrides bb.edn classpath. --debug Print debug information and internal stacktrace in case of exception. - --force Passes -Sforce to deps.clj, forcing recalculation of the classpath. --init Load file after any preloads and prior to evaluation/subcommands. --config Replacing bb.edn with file. Relative paths are resolved relative to file. --deps-root Treat dir as root of relative paths in config. + -Sforce Force recalculation of the classpath (don't use the cache) + -Sdeps Deps data to use as the last deps file to be merged Help: @@ -696,9 +697,12 @@ Use bb run --help to show this help output. ("--init") (recur (nnext options) (assoc opts-map :init (second options))) - ("--force") + ("--force" "-Sforce") (recur (next options) (assoc opts-map :force? true)) + ("-Sdeps") + (recur (nnext options) (assoc opts-map :merge-deps (second options))) + ("--config") (recur (nnext options) (assoc opts-map :config (second options))) @@ -1052,15 +1056,19 @@ Use bb run --help to show this help output. {:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile) (parse-file-opt args global-opts)) config (:config global-opts) + merge-deps (:merge-deps global-opts) abs-path #(-> % io/file .getAbsolutePath) bb-edn-file (cond config (when (fs/exists? config) (abs-path config)) jar (some-> jar cp/loader (cp/resource "META-INF/bb.edn") .toString) :else (when (fs/exists? "bb.edn") (abs-path "bb.edn"))) - bb-edn (when bb-edn-file - (System/setProperty "babashka.config" bb-edn-file) - (let [raw-string (slurp bb-edn-file) - edn (load-bb-edn raw-string) + bb-edn (when (or bb-edn-file merge-deps) + (when bb-edn-file (System/setProperty "babashka.config" bb-edn-file)) + (let [raw-string (when bb-edn-file (slurp bb-edn-file)) + edn (when bb-edn-file (load-bb-edn raw-string)) + edn (if merge-deps + (deps/merge-deps [edn (load-bb-edn merge-deps)]) + edn) edn (assoc edn :raw raw-string :file bb-edn-file) @@ -1069,6 +1077,7 @@ Use bb run --help to show this help output. (assoc edn :deps-root deps-root) edn)] (vreset! common/bb-edn edn))) + ;; _ (.println System/err (str bb-edn)) min-bb-version (:min-bb-version bb-edn)] (when min-bb-version (when-not (satisfies-min-version? min-bb-version) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 589d72b7..0422fe2b 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -451,3 +451,9 @@ even more stuff here\" "{:deps {} :aliases {:foo {:env-vars {:dude #env \"DUDE\"}}}}" (is (= 6 (bb "-e" "(+ 1 2 3)"))))) + +(deftest merge-deps-test + (test-utils/with-config + "{:deps {}}" + (is (= {1 {:a 1}} + (bb "-Sdeps" "{:deps {medley/medley {:mvn/version \"1.4.0\"}}}" "-e" "(require 'medley.core) (medley.core/index-by :a [{:a 1}])"))))) From e2a8f03d21ef1c00f64b885377f6e0fa01ad71c3 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:27:04 +0200 Subject: [PATCH 370/550] v0.10.163 --- CHANGELOG.md | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0396b8d0..271aed7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 0.10.163 (2022-09-24) - [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last - [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global --force option ([@bobisageek](https://github.com/bobisageek)) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 0bdf1592..f303f848 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.9.163-SNAPSHOT \ No newline at end of file +0.10.163 \ No newline at end of file From 89e8dfdf324b1cfb47a6d9384e55ba4e1dc26f69 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:53:54 +0200 Subject: [PATCH 371/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 8ce56613..f303f848 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.9.162 \ No newline at end of file +0.10.163 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index f303f848..9fb7894f 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.10.163 \ No newline at end of file +0.10.164-SNAPSHOT \ No newline at end of file From 9e8571cd08e2e1d5c48349e4c5fd0aa4a5ddc2dc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:54:26 +0200 Subject: [PATCH 372/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 271aed7a..188d710e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +... + ## 0.10.163 (2022-09-24) - [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last From 4b1e02c6c76f23cd9ceda2326e70bd8b259bb4d4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:56:25 +0200 Subject: [PATCH 373/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 188d710e..0f1694ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,8 @@ A preview of the next release can be installed from ## 0.10.163 (2022-09-24) - [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last -- [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global --force option ([@bobisageek](https://github.com/bobisageek)) -- [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` are methods missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek)) +- [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global `-Sforce` option ([@bobisageek](https://github.com/bobisageek)) +- [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` methods are missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek)) - [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan)) From 7baa0542ec45dba8c675c570c5e9643586ffa75b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 24 Sep 2022 13:56:46 +0200 Subject: [PATCH 374/550] CHANGELOGS [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1694ce..e1dbdaac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ A preview of the next release can be installed from - [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns - [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan)) -- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of java.lang.ref to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) +- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of `java.lang.ref` to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit)) - [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn` - Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele)) - Add more reflection class methods ([@eerohele](https://github.com/eerohele)) From e6f6b02c060ecaf3ad9818055100bd45d23b221b Mon Sep 17 00:00:00 2001 From: Crispin Wellington Date: Mon, 26 Sep 2022 16:52:59 +0800 Subject: [PATCH 375/550] Add single arg read method to PipedInputStream proxy (#1372) * reify java.lang.Object with optional toString and finalize * add single argument read method to PipedInputStream proxy * update changelog Co-authored-by: Michiel Borkent --- CHANGELOG.md | 2 +- src/babashka/impl/proxy.clj | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dbdaac..5b6d8c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ A preview of the next release can be installed from ## Unreleased -... +- Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit)) ## 0.10.163 (2022-09-24) diff --git a/src/babashka/impl/proxy.clj b/src/babashka/impl/proxy.clj index 707ba250..f40b7ab1 100644 --- a/src/babashka/impl/proxy.clj +++ b/src/babashka/impl/proxy.clj @@ -86,8 +86,10 @@ (read ([] ((method-or-bust methods 'read) this)) - ([b off len] - ((method-or-bust methods 'read) this b off len))) + ([bs] + ((method-or-bust methods 'read) this bs)) + ([bs off len] + ((method-or-bust methods 'read) this bs off len))) (receive [b] ((method-or-bust methods 'receive) this b))) ["java.io.PipedOutputStream" #{}] From 8fdefb99b9266d9e57be8c7bc34f03e2cc26d930 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 26 Sep 2022 12:17:24 +0200 Subject: [PATCH 376/550] Go back to clj-commons/clj-yaml --- deps.edn | 3 +-- project.clj | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/deps.edn b/deps.edn index b77e7cc9..7cb15a30 100644 --- a/deps.edn +++ b/deps.edn @@ -31,8 +31,7 @@ org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha8"} - io.github.borkdude/clj-yaml {:mvn/version "0.7-1.33-next"} - #_#_clj-commons/clj-yaml {:mvn/version "0.7.110"} + clj-commons/clj-yaml {:mvn/version "0.7.169"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} diff --git a/project.clj b/project.clj index cb60ab7c..3dd6e582 100644 --- a/project.clj +++ b/project.clj @@ -38,7 +38,7 @@ :profiles {:feature/xml {:source-paths ["feature-xml"] :dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]} :feature/yaml {:source-paths ["feature-yaml"] - :dependencies [[io.github.borkdude/clj-yaml "0.7-1.33-next" + :dependencies [[clj-commons/clj-yaml "0.7.169" #_#_clj-commons/clj-yaml "0.7.110"]]} :feature/jdbc {:source-paths ["feature-jdbc"] :dependencies [[seancorfield/next.jdbc "1.1.610"]]} From 835244861191a246a83b5908b7bf7905f7c15c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Wed, 28 Sep 2022 16:42:05 +0530 Subject: [PATCH 377/550] check if supplied deps is non-empty (#1377) --- src/babashka/impl/deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/babashka/impl/deps.clj b/src/babashka/impl/deps.clj index 3224ebce..c6cfb413 100644 --- a/src/babashka/impl/deps.clj +++ b/src/babashka/impl/deps.clj @@ -66,7 +66,7 @@ paths) paths)] (cp/add-classpath (str/join cp/path-sep paths)))) - (let [need-deps? (or (:deps deps-map) + (let [need-deps? (or (seq (:deps deps-map)) (and (:aliases deps-map) aliases))] (when need-deps? From 0684119000e6c615c210883e919b10d6cf3560e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Wed, 28 Sep 2022 19:18:35 +0530 Subject: [PATCH 378/550] Mark bb.edn load exception (#1378) * Mark bb.edn load exception * print to stderr * print with binding --- src/babashka/main.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index e5bd9b4b..6b19dc77 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -1049,7 +1049,9 @@ Use bb run --help to show this help output. (catch java.lang.RuntimeException e (if (re-find #"No dispatch macro for: \"" (.getMessage e)) (throw (ex-info "Invalid regex literal found in EDN config, use re-pattern instead" {})) - (throw e))))) + (do (binding [*out* *err*] + (println "Error during loading bb.edn:")) + (throw e)))))) (defn main [& args] (let [[args global-opts] (parse-global-opts args) From 8170fd7675ae5c12ecdb7d0badeb41ac82234154 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 29 Sep 2022 09:31:13 +0200 Subject: [PATCH 379/550] pods: print + flush for out and err, thanks @justone --- pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pods b/pods index 53f79da0..decf7910 160000 --- a/pods +++ b/pods @@ -1 +1 @@ -Subproject commit 53f79da09d5da542204f3cb0161724221276dfcb +Subproject commit decf791000081ca9e6d2fbea9f20a0aa3fae902e From c081367304ad534360d6451e3cfad0355bd7a638 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 29 Sep 2022 10:05:43 +0200 Subject: [PATCH 380/550] Fix pod test --- test-resources/pod.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-resources/pod.clj b/test-resources/pod.clj index 53394b75..698471e0 100644 --- a/test-resources/pod.clj +++ b/test-resources/pod.clj @@ -104,14 +104,14 @@ "id" id}) pod.test-pod/print (do (write - {"out" (pr-str args) + {"out" (prn-str args) "id" id}) (write {"status" ["done"] "id" id})) pod.test-pod/print-err (do (write - {"err" (pr-str args) + {"err" (prn-str args) "id" id}) (write {"status" ["done"] From c94960eac180731ae0e8e0f78f1326961c51a916 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 30 Sep 2022 11:51:06 +0200 Subject: [PATCH 381/550] deps.clj: support for CLJ_JVM_OPTS and JAVA_OPTS --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index d4d6d720..c8c4d79c 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit d4d6d720c0d62eb3e2230fa85291a5fd68398d6a +Subproject commit c8c4d79c5fd8cb1d6e8daec4eec7b0a4d739f36c From 465ea247eb50517ebefe4873750afd3c492d82a2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 2 Oct 2022 13:14:15 +0200 Subject: [PATCH 382/550] process and sci --- process | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process b/process index bd203b79..2055e047 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit bd203b79a21b6155b61b4b4efda5a497dec2567d +Subproject commit 2055e0470a0ae6faedd15d5a3c8da4d82a6f4641 diff --git a/sci b/sci index 42bd17de..7452e4d3 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 42bd17def34633b03d663211693eff972c9735bb +Subproject commit 7452e4d328d1be6c4d639ed34999ca714be1ba3c From 80a8ee1b7efdb79d9afa9a899178e2d9a0ad8c8d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 2 Oct 2022 13:24:06 +0200 Subject: [PATCH 383/550] Don't let orchestra nuke other spec tests --- .../lib_tests/babashka/run_all_libtests.clj | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/test-resources/lib_tests/babashka/run_all_libtests.clj b/test-resources/lib_tests/babashka/run_all_libtests.clj index 72c9d8fb..85d47294 100644 --- a/test-resources/lib_tests/babashka/run_all_libtests.clj +++ b/test-resources/lib_tests/babashka/run_all_libtests.clj @@ -4,7 +4,8 @@ [babashka.fs :as fs] [clojure.edn :as edn] [clojure.java.io :as io] - [clojure.test :as t :refer [*report-counters*]])) + [clojure.test :as t :refer [*report-counters*]] + [clojure.string :as str])) (defmethod clojure.test/report :end-test-var [_m] (when-let [rc *report-counters*] @@ -34,16 +35,21 @@ (defn test-namespaces [& namespaces] (let [namespaces (seq (filter test-namespace? namespaces))] (when (seq namespaces) - (doseq [n namespaces] - (require n) - (filter-vars! (find-ns n) #(-> % meta ((some-fn :skip-bb - :test-check-slow)) not))) - (let [m (apply t/run-tests namespaces)] - (swap! status (fn [status] - (merge-with + status (dissoc m :type)))))))) + (let [no-orch-namespaces (remove #(str/starts-with? (str %) "orchestra") namespaces) + ;; somehow orchestra screws up other tests, so we run that last + orch-namespaces (filter #(str/starts-with? (str %) "orchestra") namespaces) + namespaces (concat no-orch-namespaces orch-namespaces)] + (doseq [n namespaces] + (require n) + (filter-vars! (find-ns n) #(-> % meta ((some-fn :skip-bb + :test-check-slow)) not)) + (let [m (apply t/run-tests [n])] + (swap! status (fn [status] + (merge-with + status (dissoc m :type)))))))))) ;; Standard test-runner for libtests -(let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn")))] +(let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn"))) + test-nss (atom [])] (doseq [[libname {tns :test-namespaces skip-windows :skip-windows :keys [test-paths git-sha]}] lib-tests] @@ -52,7 +58,8 @@ (doseq [p test-paths] (add-classpath (str (fs/file git-dir p))))) (when-not (and skip-windows (windows?)) - (apply test-namespaces tns)))) + (swap! test-nss into tns))) + (apply test-namespaces @test-nss)) ;; Non-standard tests - These are tests with unusual setup around test-namespaces From 2b3e7df2e949eeda9cc573dbd2ac38aba3219399 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 3 Oct 2022 15:34:47 +0200 Subject: [PATCH 384/550] Fix tests --- .../lib_tests/babashka/run_all_libtests.clj | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/test-resources/lib_tests/babashka/run_all_libtests.clj b/test-resources/lib_tests/babashka/run_all_libtests.clj index 85d47294..092263f8 100644 --- a/test-resources/lib_tests/babashka/run_all_libtests.clj +++ b/test-resources/lib_tests/babashka/run_all_libtests.clj @@ -1,13 +1,17 @@ (ns babashka.run-all-libtests - (:require [babashka.classpath :as cp :refer [add-classpath]] - [babashka.core :refer [windows?]] - [babashka.fs :as fs] - [clojure.edn :as edn] - [clojure.java.io :as io] - [clojure.test :as t :refer [*report-counters*]] - [clojure.string :as str])) + (:require + [babashka.classpath :as cp :refer [add-classpath]] + [babashka.core :refer [windows?]] + [babashka.fs :as fs] + [clojure.edn :as edn] + [clojure.java.io :as io] + [clojure.spec.test.alpha :as st] + [clojure.string :as str] + [clojure.test :as t :refer [*report-counters*]])) -(defmethod clojure.test/report :end-test-var [_m] +(def orig-spec-checking-fn @#'st/spec-checking-fn) + +(defmethod t/report :end-test-var [_m] (when-let [rc *report-counters*] (let [{:keys [:fail :error]} @rc] (when (and (= "true" (System/getenv "BABASHKA_FAIL_FAST")) @@ -35,17 +39,19 @@ (defn test-namespaces [& namespaces] (let [namespaces (seq (filter test-namespace? namespaces))] (when (seq namespaces) - (let [no-orch-namespaces (remove #(str/starts-with? (str %) "orchestra") namespaces) - ;; somehow orchestra screws up other tests, so we run that last - orch-namespaces (filter #(str/starts-with? (str %) "orchestra") namespaces) - namespaces (concat no-orch-namespaces orch-namespaces)] + (let [namespaces namespaces] (doseq [n namespaces] - (require n) - (filter-vars! (find-ns n) #(-> % meta ((some-fn :skip-bb - :test-check-slow)) not)) - (let [m (apply t/run-tests [n])] - (swap! status (fn [status] - (merge-with + status (dissoc m :type)))))))))) + (let [orchestra? (str/starts-with? (str n) "orchestra")] + (if orchestra? + nil ;; (alter-var-root #'st/spec-checking-fn (constantly ot/spec-checking-fn)) + (alter-var-root #'st/spec-checking-fn (constantly orig-spec-checking-fn))) + (when-not orchestra? + (require n) + (filter-vars! (find-ns n) #(-> % meta ((some-fn :skip-bb + :test-check-slow)) not)) + (let [m (apply t/run-tests [n])] + (swap! status (fn [status] + (merge-with + status (dissoc m :type)))))))))))) ;; Standard test-runner for libtests (let [lib-tests (edn/read-string (slurp (io/resource "bb-tested-libs.edn"))) From 7e77ab56338dd4fbbcc3b4ea462f2fe7173627f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rahu=CE=BB=20D=C3=A9?= Date: Mon, 3 Oct 2022 19:43:14 +0530 Subject: [PATCH 385/550] Update contajners to latest (#1382) --- deps.edn | 2 +- doc/projects.md | 2 +- resources/META-INF/babashka/deps.edn | 2 +- test-resources/lib_tests/bb-tested-libs.edn | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deps.edn b/deps.edn index 7cb15a30..367b0bf0 100644 --- a/deps.edn +++ b/deps.edn @@ -119,7 +119,7 @@ borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"} dev.nubank/docopt {:mvn/version "0.6.1-fix7"} testdoc/testdoc {:mvn/version "1.4.1"} - org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"} + org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"} borkdude/rewrite-edn {:mvn/version "0.1.0"} clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"} io.aviso/pretty {:mvn/version "1.1.1"} diff --git a/doc/projects.md b/doc/projects.md index 53076656..058d23df 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -767,7 +767,7 @@ Example: (require '[babashka.deps :as deps]) -(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.2"}}}) +(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}}}) (require '[contajners.core :as c]) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index d7d32bc2..79854b14 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -119,7 +119,7 @@ borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"} dev.nubank/docopt {:mvn/version "0.6.1-fix7"} testdoc/testdoc {:mvn/version "1.4.1"} - org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"} + org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"} borkdude/rewrite-edn {:mvn/version "0.1.0"} clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"} io.aviso/pretty {:mvn/version "1.1.1"} diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 99d4bdab..90b5c914 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -79,7 +79,7 @@ ;; BB-TEST-PATCH: Deleted unused resources/ testdoc/testdoc {:git-url "https://github.com/liquidz/testdoc", :test-namespaces (testdoc.style.repl-test testdoc.style.code-first-test testdoc.core-test), :git-sha "6b995ef25f3cc6450a1ce30f72baed371476f6eb"} ;; BB-TEST-PATCH: Remove contajners.core-test as it fails - org.clojars.lispyclouds/contajners {:git-url "https://github.com/lispyclouds/contajners", :test-namespaces (contajners.impl-test), :git-sha "d163637ff36d79995516d6705da1e9afc7b44764"} + org.clojars.lispyclouds/contajners {:git-url "https://github.com/lispyclouds/contajners", :test-namespaces (contajners.impl-test), :git-sha "5d55187eebedee4cd4f120fbffcbbcfae70a8a7b"} ;; Don't run tests b/c they depend on `psql` douglass/clj-psql {:git-url "https://github.com/DarinDouglass/clj-psql", :test-namespaces [], :manually-added true} ;; Don't run tests b/c they depend on `ffmpeg` From 9fba927ec8d1b9dddeb5e8265f6ba24c44419488 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 4 Oct 2022 16:42:47 +0200 Subject: [PATCH 386/550] sci: print-namespace-maps --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 7452e4d3..2b987b90 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 7452e4d328d1be6c4d639ed34999ca714be1ba3c +Subproject commit 2b987b90df613daedf321c0987d8e4d5fe2465c6 From 77768cec6772ea6a0de00dbe9bc114c28844387a Mon Sep 17 00:00:00 2001 From: Baishampayan Ghose Date: Tue, 4 Oct 2022 22:41:59 +0530 Subject: [PATCH 387/550] feat: Honor `*print-namespace-maps*` in pprint (#1387) We can now use the dynamic var `*print-namespace-maps*` to control how maps with namespaced keys are printed using `pprint`. Fixes: #1381 --- CHANGELOG.md | 1 + src/babashka/impl/pprint.clj | 3 ++- test/babashka/pprint_test.clj | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b6d8c11..d5926105 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ A preview of the next release can be installed from ## Unreleased - Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit)) +- feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb)) ## 0.10.163 (2022-09-24) diff --git a/src/babashka/impl/pprint.clj b/src/babashka/impl/pprint.clj index ffd31e28..0c0e815f 100644 --- a/src/babashka/impl/pprint.clj +++ b/src/babashka/impl/pprint.clj @@ -97,7 +97,8 @@ pprint/*print-miser-width* @print-miser-width *print-meta* @sci/print-meta *print-readably* @sci/print-readably - *print-length* @sci/print-length] + *print-length* @sci/print-length + *print-namespace-maps* @sci/print-namespace-maps] (pprint/pprint s writer)))) (defn cl-format diff --git a/test/babashka/pprint_test.clj b/test/babashka/pprint_test.clj index 4679db46..d21c3386 100644 --- a/test/babashka/pprint_test.clj +++ b/test/babashka/pprint_test.clj @@ -10,3 +10,13 @@ (deftest print-length-test (is (= "(0 1 2 3 4 5 6 7 8 9 ...)" (bb "-e" "(set! *print-length* 10) (clojure.pprint/pprint (range 20))")))) + +(deftest print-namespaced-map-test + (test/testing + "Testing disabling of printing namespace maps..." + (is (= "{:a/x 1, :a/y 2, :a/z {:b/x 10, :b/y 20}}" + (bb "-e" "(binding [*print-namespace-maps* false] (clojure.pprint/pprint {:a/x 1 :a/y 2 :a/z {:b/x 10 :b/y 20}}))")))) + (test/testing + "Testing manually enabling printing namespace maps..." + (is (= "#:a{:x 1, :y 2, :z #:b{:x 10, :y 20}}" + (bb "-e" "(binding [*print-namespace-maps* true] (clojure.pprint/pprint {:a/x 1 :a/y 2 :a/z {:b/x 10 :b/y 20}}))"))))) From ec842c942db34687409a1675b041d13302391334 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 5 Oct 2022 19:56:00 +0200 Subject: [PATCH 388/550] process: only slurp err when inputstream (@ikappaki) --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 2055e047..d820dcdd 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 2055e0470a0ae6faedd15d5a3c8da4d82a6f4641 +Subproject commit d820dcddf507f295904712462d1a617e76d5ae80 From 851e1f5eb04d5b73d6a6df962cd29fc1dc1c2d1c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 6 Oct 2022 12:55:09 +0200 Subject: [PATCH 389/550] Bump CLI --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 367b0bf0..2ab6dd34 100644 --- a/deps.edn +++ b/deps.edn @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.4.37"}} + org.babashka/cli {:mvn/version "0.4.38"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index 3dd6e582..b267d9a4 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] - [org.babashka/cli "0.4.37"]] + [org.babashka/cli "0.4.38"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] From 2dac7847a89dde8b09755076a556a14e066ca11d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 6 Oct 2022 14:12:13 +0200 Subject: [PATCH 390/550] Fix #1369: provide .sha256 files for every released asset --- .build/bb.edn | 2 +- CHANGELOG.md | 1 + script/babashka/release_artifact.clj | 8 ++++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.build/bb.edn b/.build/bb.edn index c1e5ff3e..6ec32294 100644 --- a/.build/bb.edn +++ b/.build/bb.edn @@ -2,5 +2,5 @@ :deps {borkdude/gh-release-artifact #_{:local/root "../gh-release-artifact"} {:git/url "https://github.com/borkdude/gh-release-artifact" - :sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}} + :git/sha "ce060c12a25b552b864dc90f8fb344a2eb91ea9d"}} :tasks {release-artifact babashka.release-artifact/release}} diff --git a/CHANGELOG.md b/CHANGELOG.md index d5926105..f1ba157b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ A preview of the next release can be installed from - Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit)) - feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb)) +- [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset ## 0.10.163 (2022-09-24) diff --git a/script/babashka/release_artifact.clj b/script/babashka/release_artifact.clj index 09d3ba3f..92da4564 100644 --- a/script/babashka/release_artifact.clj +++ b/script/babashka/release_artifact.clj @@ -30,7 +30,9 @@ :repo "babashka" :file file :tag (str "v" current-version) - :draft true}) + :draft true + :overwrite (str/ends-with? current-version "SNAPSHOT") + :sha256 true}) (ghr/overwrite-asset {:org "babashka" :repo "babashka-dev-builds" :file file @@ -38,6 +40,8 @@ ;; do not set, because we are posting to another repo :target-commitish false :draft false - :prerelease true})) + :prerelease true + :overwrite (str/ends-with? current-version "SNAPSHOT") + :sha256 true})) (println "Skipping release artifact (no GITHUB_TOKEN or not on main branch)")) nil)) From 87e9e0861c56333bc09dd61e6a862815e6967e73 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 6 Oct 2022 14:16:20 +0200 Subject: [PATCH 391/550] Upgrade graalvm in cirrus --- .cirrus.yml | 4 ++-- script/bump_graal_version.clj | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 8e7dccc8..91a7a8e3 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -5,8 +5,8 @@ task: skip: "changesIncludeOnly('logo/*', '**.md')" env: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.1.0" - GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.1.0/Contents/Home + GRAALVM_VERSION: "22.2.0" + GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.2.0/Contents/Home BABASHKA_PLATFORM: macos # used in release script BABASHKA_ARCH: aarch64 BABASHKA_TEST_ENV: native diff --git a/script/bump_graal_version.clj b/script/bump_graal_version.clj index fc80ea12..f8178f6e 100755 --- a/script/bump_graal_version.clj +++ b/script/bump_graal_version.clj @@ -45,7 +45,8 @@ "appveyor.yml" "project.clj" "script/bump_graal_version.clj" - ".circleci/script/short_ci.clj"]) + ".circleci/script/short_ci.clj" + ".cirrus.yml"]) ;; We might have to keep changing these from ;; time to time whenever the version is bumped From 5bb2d2f8bd7cad84a015304e978ebef5202a22af Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 7 Oct 2022 12:23:22 +0200 Subject: [PATCH 392/550] process: add alive? - thanks @grzm --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index d820dcdd..f6a31466 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit d820dcddf507f295904712462d1a617e76d5ae80 +Subproject commit f6a31466fdd76d5f74f701c0aa88af52e56f7fd4 From 863c6051bdb67d4d228d0a648a68a98508196a63 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 7 Oct 2022 12:40:16 +0200 Subject: [PATCH 393/550] Add process alive? --- src/babashka/impl/process.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index 6bc455cc..b463562a 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -29,4 +29,5 @@ 'destroy (copy-var process/destroy tns) 'destroy-tree (copy-var process/destroy-tree tns) 'exec (copy-var process/exec tns) - 'shell (copy-var process/shell tns)}) + 'shell (copy-var process/shell tns) + 'alive? (copy-var process/alive? tns)}) From 9241c8123878021390442ba483239f57553786fe Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 10 Oct 2022 11:04:15 -0400 Subject: [PATCH 394/550] doc additions/cleanups [skip ci] (#1388) --- README.md | 2 +- examples/README.md | 15 ++++++++++++++- examples/wiki-translate.clj | 11 +++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 examples/wiki-translate.clj diff --git a/README.md b/README.md index a1e17bef..418f2036 100644 --- a/README.md +++ b/README.md @@ -401,7 +401,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund - [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover - [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs! -- [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman +- [Breakneck Babashka on K8s](https://www.linkedin.com/pulse/breakneck-babashka-k8s-heow-goodman/) by Heow Goodman - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) - [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg - [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou diff --git a/examples/README.md b/examples/README.md index 0f851994..53064d50 100644 --- a/examples/README.md +++ b/examples/README.md @@ -38,6 +38,8 @@ - [Simple logger](#simple-logger) - [Using GZip streams (memo utility)](#using-gzip-streams-to-make-a-note-utility) - [Pretty-printing mySQL results](#pretty-printing-mysql-results) + - [Single page application with Babashka + htmx](#single-page-application-with-babashka--htmx) + - [Wikipedia translation](#wikipedia-translation) Here's a gallery of useful examples. Do you have a useful example? PR welcome! @@ -390,7 +392,7 @@ Example usage: $ examples/http-server.clj ``` -See [file-server.clj](file-server.clj). +See [http-server.clj](http-server.clj). ## Torrent viewer @@ -555,3 +557,14 @@ Example of a todo list SPA using Babashka and htmx See [htmx_todoapp.clj](htmx_todoapp.clj) Contributed by [@prestancedesign](https://github.com/prestancedesign). + +## Wikipedia translation + +[wiki-translate.clj](wiki-translate.clj) uses Wikipedia to translate words from English to Dutch (other languages are available). + +``` shell +$ bb wiki-translate.clj window +"Venster (muur) – Dutch" +``` + +Shared by Janne Himanka on Clojurians Slack diff --git a/examples/wiki-translate.clj b/examples/wiki-translate.clj new file mode 100644 index 00000000..1558705b --- /dev/null +++ b/examples/wiki-translate.clj @@ -0,0 +1,11 @@ +#!/usr/bin/env bb +;; by Janne Himanka shared on Clojurians Slack +(require '[babashka.curl :as curl]) + +(let [url (str "https://en.wikipedia.org/wiki/" (first *command-line-args*)) + page (:body (curl/get url))] + (cond + (re-find #"Disambiguation" page) + (doseq [item (map last (re-seq #"
  • Date: Wed, 12 Oct 2022 12:33:18 +0200 Subject: [PATCH 395/550] Bump babashka CLI --- deps.edn | 6 ++++-- fs | 2 +- project.clj | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/deps.edn b/deps.edn index 2ab6dd34..afa3f268 100644 --- a/deps.edn +++ b/deps.edn @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.4.38"}} + org.babashka/cli {:mvn/version "0.5.40"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile @@ -154,7 +154,9 @@ :deps/manifest :deps} exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor" :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" - :deps/manifest :deps}} + :deps/manifest :deps} + lambdaisland/uri {:local/root "/tmp/uri"} #_{:git/url "https://github.com/lambdaisland/uri" + :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/fs b/fs index 73210e83..75bdf5aa 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 73210e83808b8bfe664cba7d2148464a2fa38aae +Subproject commit 75bdf5aa42a8a34e4e38279f79d761887dc46847 diff --git a/project.clj b/project.clj index b267d9a4..e8a8565c 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] - [org.babashka/cli "0.4.38"]] + [org.babashka/cli "0.5.40"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] From c2b3fea9fcf568f78ed7939785d88d522acd505d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 12 Oct 2022 12:42:27 +0200 Subject: [PATCH 396/550] Bump tools.cli --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index afa3f268..f2e701c4 100644 --- a/deps.edn +++ b/deps.edn @@ -27,7 +27,7 @@ babashka/babashka.core {:local/root "babashka.core"} borkdude/graal.locking {:mvn/version "0.0.2"}, org.clojure/core.async {:mvn/version "1.5.648"}, - org.clojure/tools.cli {:mvn/version "1.0.206"}, + org.clojure/tools.cli {:mvn/version "1.0.214"}, org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} org.clojure/data.xml {:mvn/version "0.2.0-alpha8"} diff --git a/project.clj b/project.clj index e8a8565c..e16928c4 100644 --- a/project.clj +++ b/project.clj @@ -21,7 +21,7 @@ :dependencies [[org.clojure/clojure "1.11.1"] [borkdude/edamame "1.0.0"] [borkdude/graal.locking "0.0.2"] - [org.clojure/tools.cli "1.0.206"] + [org.clojure/tools.cli "1.0.214"] [cheshire "5.11.0"] [nrepl/bencode "1.1.0"] [borkdude/sci.impl.reflector "0.0.1"] From 682f8514fb2887918ff5f80ede4e1b4c81f13d19 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 12 Oct 2022 12:47:03 +0200 Subject: [PATCH 397/550] #1391: include raw in hiccup2.core ns --- feature-hiccup/babashka/impl/hiccup.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature-hiccup/babashka/impl/hiccup.clj b/feature-hiccup/babashka/impl/hiccup.clj index d2903b06..7ff8e53f 100644 --- a/feature-hiccup/babashka/impl/hiccup.clj +++ b/feature-hiccup/babashka/impl/hiccup.clj @@ -55,7 +55,8 @@ {'html (copy-var html-1 hns {:name 'html})}) (def hiccup2-namespace - {'html (copy-var html-2 hns2 {:name 'html})}) + {'html (copy-var html-2 hns2 {:name 'html}) + 'raw (copy-var util/raw-string hns2)}) (def html-mode (copy-var util/*html-mode* uns)) (def escape-strings? (copy-var util/*escape-strings?* uns)) From ed22bb573b64f6e3d6dc808a339a26a8b028b53e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 12 Oct 2022 12:59:37 +0200 Subject: [PATCH 398/550] Fix #1391: support loading hiccup.page from source --- feature-hiccup/babashka/impl/hiccup.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature-hiccup/babashka/impl/hiccup.clj b/feature-hiccup/babashka/impl/hiccup.clj index 7ff8e53f..0e62248c 100644 --- a/feature-hiccup/babashka/impl/hiccup.clj +++ b/feature-hiccup/babashka/impl/hiccup.clj @@ -64,7 +64,8 @@ (def hiccup-util-namespace {'*html-mode* html-mode '*escape-strings?* escape-strings? - 'raw-string (copy-var util/raw-string uns)}) + 'raw-string (copy-var util/raw-string uns) + 'to-uri (copy-var util/to-uri uns)}) (defn render-html [& contents] (binding [util/*html-mode* @html-mode From 33bee0480db28a50d9b8da2d804e416748f09fc1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 12 Oct 2022 13:00:56 +0200 Subject: [PATCH 399/550] Fix #1391: fix var name --- feature-hiccup/babashka/impl/hiccup.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature-hiccup/babashka/impl/hiccup.clj b/feature-hiccup/babashka/impl/hiccup.clj index 0e62248c..f29581c4 100644 --- a/feature-hiccup/babashka/impl/hiccup.clj +++ b/feature-hiccup/babashka/impl/hiccup.clj @@ -56,7 +56,7 @@ (def hiccup2-namespace {'html (copy-var html-2 hns2 {:name 'html}) - 'raw (copy-var util/raw-string hns2)}) + 'raw (copy-var util/raw-string hns2 {:name 'raw})}) (def html-mode (copy-var util/*html-mode* uns)) (def escape-strings? (copy-var util/*escape-strings?* uns)) From 7c15b04fa2851e7be402c617980f6a048766c7e9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 12 Oct 2022 13:06:48 +0200 Subject: [PATCH 400/550] Fix tests --- deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index f2e701c4..8cc78c93 100644 --- a/deps.edn +++ b/deps.edn @@ -155,7 +155,7 @@ exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor" :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" :deps/manifest :deps} - lambdaisland/uri {:local/root "/tmp/uri"} #_{:git/url "https://github.com/lambdaisland/uri" + lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} From 1e9cc9f203678e828781183aa2ff6350cfe1a745 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 14 Oct 2022 12:34:04 +0200 Subject: [PATCH 401/550] submodules --- babashka.curl | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/babashka.curl b/babashka.curl index 8a27e606..99e6d3ba 160000 --- a/babashka.curl +++ b/babashka.curl @@ -1 +1 @@ -Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178 +Subproject commit 99e6d3ba7a7252284b43f9de7d91d3433ecfa8f0 diff --git a/sci b/sci index 2b987b90..ee74bb0f 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 2b987b90df613daedf321c0987d8e4d5fe2465c6 +Subproject commit ee74bb0f8930b41ad3a940bda030bd7d241f24f9 From 9ca24ffce4d21f4bc0717705a2a6da9756907f25 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 12:20:02 +0200 Subject: [PATCH 402/550] SCI: optimize let (#1396) --- deps.clj | 2 +- fs | 2 +- sci | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deps.clj b/deps.clj index c8c4d79c..0de87228 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit c8c4d79c5fd8cb1d6e8daec4eec7b0a4d739f36c +Subproject commit 0de87228dc48239d7d5e42a661a82e03719bf532 diff --git a/fs b/fs index 75bdf5aa..c43b784f 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 75bdf5aa42a8a34e4e38279f79d761887dc46847 +Subproject commit c43b784f52a250e4d21205f8e1ea6ec82bde038f diff --git a/sci b/sci index ee74bb0f..a201fd70 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit ee74bb0f8930b41ad3a940bda030bd7d241f24f9 +Subproject commit a201fd70567437e228359999ecdca337c3060b70 From e283a87b4c467599068c673d068d213069f75d0e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 14:08:25 +0200 Subject: [PATCH 403/550] SCI: or/and --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index a201fd70..1fb6f454 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a201fd70567437e228359999ecdca337c3060b70 +Subproject commit 1fb6f454dcdc64bd4494f267566b67b971d17d8f From bfe59b57d0c0ef0269b0b40d1745718f514d4a67 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 16:42:00 +0200 Subject: [PATCH 404/550] SCI: simplify do --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 1fb6f454..be1bc4ef 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1fb6f454dcdc64bd4494f267566b67b971d17d8f +Subproject commit be1bc4ef970355dca38ad7810f5df9ad0c6325f9 From b6dffe3f87a373e6e3292e5e6110dceba1c252ca Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 16:46:14 +0200 Subject: [PATCH 405/550] manifest [skip ci] --- resources/META-INF/babashka/deps.edn | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 79854b14..8cc78c93 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -27,11 +27,11 @@ babashka/babashka.core {:local/root "babashka.core"} borkdude/graal.locking {:mvn/version "0.0.2"}, org.clojure/core.async {:mvn/version "1.5.648"}, - org.clojure/tools.cli {:mvn/version "1.0.206"}, + org.clojure/tools.cli {:mvn/version "1.0.214"}, org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} - org.clojure/data.xml {:mvn/version "0.2.0-alpha6"} - clj-commons/clj-yaml {:mvn/version "0.7.109"} + org.clojure/data.xml {:mvn/version "0.2.0-alpha8"} + clj-commons/clj-yaml {:mvn/version "0.7.169"} com.cognitect/transit-clj {:mvn/version "1.0.329"} org.clojure/test.check {:mvn/version "1.1.1"} nrepl/bencode {:mvn/version "1.1.0"} @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.3.35"}} + org.babashka/cli {:mvn/version "0.5.40"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile @@ -154,7 +154,9 @@ :deps/manifest :deps} exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor" :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" - :deps/manifest :deps}} + :deps/manifest :deps} + lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" + :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd From 94aab468551c6d9fd555c86698b4e3b15b87c213 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 17:18:05 +0200 Subject: [PATCH 406/550] sci --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index be1bc4ef..5e6d234b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit be1bc4ef970355dca38ad7810f5df9ad0c6325f9 +Subproject commit 5e6d234b50dfebedd71734d09167e012ef55045e From b6f19b03dcbd502bde734e1d040f65ab5ae271ec Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 17:27:17 +0200 Subject: [PATCH 407/550] Fix #1397: clojure.lang.Namespace --- CHANGELOG.md | 1 + src/babashka/impl/classes.clj | 3 ++- test/babashka/main_test.clj | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1ba157b..ac0a0eae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ A preview of the next release can be installed from - Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit)) - feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb)) - [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset +- [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb ## 0.10.163 (2022-09-24) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 5a2c669d..f245e635 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -626,7 +626,8 @@ java.util.Iterator ;; keep commas for merge friendliness ,,,))) - m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)] + m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var) + m (assoc m (list 'quote 'clojure.lang.Namespace) 'sci.lang.Namespace)] m)) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index e645c82b..b3914c3e 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -837,6 +837,9 @@ true"))) (deftest clojure-lang-var-mapping-test (is (= :var (bb nil "(defprotocol Foo (foo [_])) (extend-protocol Foo clojure.lang.Var (foo [_] :var)) (foo #'inc)")))) +(deftest clojure-ns-test + (is (true? (bb nil "(instance? clojure.lang.Namespace *ns*)")))) + ;;;; Scratch (comment From 351723fdb6f862e446d0569d1f989070fa080e89 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 17:32:22 +0200 Subject: [PATCH 408/550] Fix #1384: allow .indexOf on LazySeq --- CHANGELOG.md | 1 + src/babashka/impl/classes.clj | 3 ++- test/babashka/main_test.clj | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac0a0eae..3961c234 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ A preview of the next release can be installed from - feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb)) - [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset - [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb +- [#1384](https://github.com/babashka/babashka/issues/1384): allow `.indexOf` on `LazySeq` ## 0.10.163 (2022-09-24) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index f245e635..f9340772 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -119,6 +119,8 @@ {:fields [{:name "EMPTY"}]} clojure.lang.APersistentVector {:methods [{:name "indexOf"}]} + clojure.lang.LazySeq + {:methods [{:name "indexOf"}]} clojure.lang.ILookup {:methods [{:name "valAt"}]} clojure.lang.IPersistentMap @@ -517,7 +519,6 @@ clojure.lang.IPersistentVector clojure.lang.ITransientVector clojure.lang.Iterate - clojure.lang.LazySeq clojure.lang.LispReader$Resolver clojure.lang.Named clojure.lang.Keyword diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index b3914c3e..28102ba8 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -840,6 +840,9 @@ true"))) (deftest clojure-ns-test (is (true? (bb nil "(instance? clojure.lang.Namespace *ns*)")))) +(deftest index-of-test + (is (= 1 (bb nil "(.indexOf (map inc [1 2 3]) 3)")))) + ;;;; Scratch (comment From 0e57b9d461ddde80dc97fc49b2433f578aadd9a2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 17:54:38 +0200 Subject: [PATCH 409/550] Fix #1330: allow *warn-on-reflection* in programmatic nREPL (#1398) --- CHANGELOG.md | 1 + src/babashka/impl/common.clj | 6 +++++- src/babashka/impl/nrepl_server.clj | 17 ++++++++++++----- src/babashka/main.clj | 20 ++++++++------------ 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3961c234..df670e19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ A preview of the next release can be installed from - [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset - [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb - [#1384](https://github.com/babashka/babashka/issues/1384): allow `.indexOf` on `LazySeq` +- [#1330](https://github.com/babashka/babashka/issues/1330): allow `(set! *warn-on-reflection*)` in programmatic nREPL ## 0.10.163 (2022-09-24) diff --git a/src/babashka/impl/common.clj b/src/babashka/impl/common.clj index 9cf5c2a2..4a8057d7 100644 --- a/src/babashka/impl/common.clj +++ b/src/babashka/impl/common.clj @@ -1,6 +1,10 @@ -(ns babashka.impl.common) +(ns babashka.impl.common + (:require + [clojure.java.io :as io] + [clojure.string :as str])) ;; placeholder for ctx (def ctx (volatile! nil)) (def bb-edn (volatile! nil)) (def debug (volatile! false)) +(def version (str/trim (slurp (io/resource "BABASHKA_VERSION")))) diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj index 096981b5..6340e6d6 100644 --- a/src/babashka/impl/nrepl_server.clj +++ b/src/babashka/impl/nrepl_server.clj @@ -1,14 +1,21 @@ (ns babashka.impl.nrepl-server {:no-doc true} - (:require [babashka.impl.common :as common] - [babashka.nrepl.server :as server] - [sci.core :as sci])) + (:require + [babashka.impl.clojure.core] + [babashka.impl.common :as common] + [babashka.nrepl.server :as server] + [sci.core :as sci])) (defn start-server! ([] - (server/start-server! @common/ctx)) + (start-server! nil)) ([opts] - (server/start-server! @common/ctx opts))) + (let [dev? (= "true" (System/getenv "BABASHKA_DEV")) + opts (merge {:debug dev? + :describe {"versions" {"babashka" common/version}} + :thread-bind [babashka.impl.clojure.core/warn-on-reflection]} + opts)] + (server/start-server! @common/ctx opts)))) (def nrepl-server-namespace (let [ns-sci (sci/create-ns 'babashka.nrepl.server)] diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 6b19dc77..ba8b10a9 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -96,7 +96,8 @@ ;; echo '1' | java -agentlib:native-image-agent=config-output-dir=/tmp -jar target/babashka-xxx-standalone.jar '...' ;; with the java provided by GraalVM. -(def version (str/trim (slurp (io/resource "BABASHKA_VERSION")))) +(def version common/version) + (defn parse-version [version] (mapv #(Integer/parseInt %) (-> version @@ -305,16 +306,11 @@ Use bb run --help to show this help output. (defn start-socket-repl! [address ctx] (socket-repl/start-repl! address ctx)) -(defn start-nrepl! [address ctx] - (let [dev? (= "true" (System/getenv "BABASHKA_DEV")) - nrepl-opts (nrepl-server/parse-opt address) - nrepl-opts (assoc nrepl-opts - :debug dev? - :describe {"versions" {"babashka" version}} - :thread-bind [core/warn-on-reflection])] - (nrepl-server/start-server! ctx nrepl-opts) - (binding [*out* *err*] - (println "For more info visit: https://book.babashka.org/#_nrepl"))) +(defn start-nrepl! [address] + (let [opts (nrepl-server/parse-opt address)] + (babashka.impl.nrepl-server/start-server! opts)) + (binding [*out* *err*] + (println "For more info visit: https://book.babashka.org/#_nrepl")) ;; hang until SIGINT @(promise)) @@ -958,7 +954,7 @@ Use bb run --help to show this help output. describe? [(print-describe) 0] repl [(repl/start-repl! sci-ctx) 0] - nrepl [(start-nrepl! nrepl sci-ctx) 0] + nrepl [(start-nrepl! nrepl) 0] uberjar [nil 0] list-tasks [(tasks/list-tasks sci-ctx) 0] print-deps [(print-deps/print-deps (:print-deps-format cli-opts)) 0] From 5cdeb09a178ce933b36ecabb098dbee4596d6326 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 18:05:59 +0200 Subject: [PATCH 410/550] v1.0.164 --- CHANGELOG.md | 14 ++++++++++++++ resources/BABASHKA_VERSION | 2 +- sci | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df670e19..de85fa01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,26 @@ A preview of the next release can be installed from ## Unreleased +... + +## 1.0.164 (2022-10-17) + +- SCI: optimizations for `let` - Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit)) - feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb)) - [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset - [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb - [#1384](https://github.com/babashka/babashka/issues/1384): allow `.indexOf` on `LazySeq` - [#1330](https://github.com/babashka/babashka/issues/1330): allow `(set! *warn-on-reflection*)` in programmatic nREPL +- Better error message when failing to load `bb.edn` ([@lispyclouds](https://github.com/lispyclouds)) +- Pods: print and flush to `*out*` and `*err*` instead of using `println` ([@justone](https://github.com/justone)) +- deps.clj: support for `CLJ_JVM_OPTS` and `JAVA_OPTS` ([@ikappaki](https://github.com/ikappaki)) +- Fix `*print-namespace-maps*` when using `clojure.pprint` ([@ghoseb](https://github.com/ghoseb)) +- Process: only slurp `*err*` when inputstream ([@ikappaki](https://github.com/ikappaki)) +- Process: add `alive?` API function ([@grzm](https://github.com/grzm)) +- Bump libraries: tools.cli, babashka.cli +- [#1391](https://github.com/babashka/babashka/issues/1391): include raw in `hiccup2.core` ns +- [#1391](https://github.com/babashka/babashka/issues/1391): support loading `hiccup.page` when adding hiccup to deps ## 0.10.163 (2022-09-24) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 9fb7894f..b4f7675e 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -0.10.164-SNAPSHOT \ No newline at end of file +1.0.164 \ No newline at end of file diff --git a/sci b/sci index 5e6d234b..cb490f28 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 5e6d234b50dfebedd71734d09167e012ef55045e +Subproject commit cb490f280aa42b440749980bbb6b83f1e1ef7d75 From 81e837006e7e42311a979bd9606b2d8f5fbb7949 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 18 Oct 2022 18:22:39 +0200 Subject: [PATCH 411/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index f303f848..b4f7675e 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -0.10.163 \ No newline at end of file +1.0.164 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index b4f7675e..ccf2eb83 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.164 \ No newline at end of file +1.0.165-SNAPSHOT \ No newline at end of file From 9cd1f71b76a0fcb2eb2572b4b162e5263cedead7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 20 Oct 2022 12:05:52 +0200 Subject: [PATCH 412/550] deps.clj: stale classpath --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 0de87228..c2cb64a6 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 0de87228dc48239d7d5e42a661a82e03719bf532 +Subproject commit c2cb64a60beae108913a8935908c3b259047059d From b409d663ff697a4b5b634d7edf8325c33e38e7e1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 20 Oct 2022 17:35:13 +0200 Subject: [PATCH 413/550] deps.clj: revert non-upstream change --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index c2cb64a6..30bd5647 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit c2cb64a60beae108913a8935908c3b259047059d +Subproject commit 30bd56472daba5661d4c3f549c2e6572caed57ae From 74c26084e3a0b07146f65b2e76d36abc5789e418 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 20 Oct 2022 21:36:45 +0200 Subject: [PATCH 414/550] Fix #1401: mutation of deftype field should be visible in protocol method (#1402) --- CHANGELOG.md | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de85fa01..cefd2c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ A preview of the next release can be installed from ## Unreleased -... +Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method ## 1.0.164 (2022-10-17) diff --git a/sci b/sci index cb490f28..cf600e62 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit cb490f280aa42b440749980bbb6b83f1e1ef7d75 +Subproject commit cf600e62ef6d01a4e8c57160643a3a0c9ba1252c From a61c2721d7e21f99aa79169dd890c80c78d66a0c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 20 Oct 2022 23:20:55 +0200 Subject: [PATCH 415/550] SCI: restore do recur warning --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index cf600e62..55a20de5 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit cf600e62ef6d01a4e8c57160643a3a0c9ba1252c +Subproject commit 55a20de5c940d707ee832dc474d0663f1f6b9f2d From e3b55b5f47e803f68c96862c6407daccc57c8163 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 21 Oct 2022 10:16:54 +0200 Subject: [PATCH 416/550] SCI [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 55a20de5..5fcfeb1b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 55a20de5c940d707ee832dc474d0663f1f6b9f2d +Subproject commit 5fcfeb1b324004bf66bed46f4f05bb54d0a9422c From 1ead74a501dfe4ba7023d3d2837a400229fb3cc1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 21 Oct 2022 10:21:09 +0200 Subject: [PATCH 417/550] SCI: fix node test [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 5fcfeb1b..207e994e 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 5fcfeb1b324004bf66bed46f4f05bb54d0a9422c +Subproject commit 207e994e667b6213bf21191843a05ab212a63f34 From 16ea1e8f951aa95421dac3d5e06729f87527ee19 Mon Sep 17 00:00:00 2001 From: polemius <48512663+polemius@users.noreply.github.com> Date: Fri, 21 Oct 2022 10:43:46 +0200 Subject: [PATCH 418/550] Fix small typo (#1404) --- install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install b/install index cf1fb916..cb680842 100755 --- a/install +++ b/install @@ -125,7 +125,7 @@ fi download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename" # macOS only have shasum available by default -# Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both) +# Some Linux distros (RHEL-like) only have sha256sum available by default (others have both) if command -v sha256sum >/dev/null; then sha256sum_cmd="sha256sum" elif command -v shasum >/dev/null; then From 17c9003e2aca79998c1098eeca8c957df9a087de Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 22 Oct 2022 18:40:37 +0200 Subject: [PATCH 419/550] SCI: don't rely on metadata for record implementation --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 207e994e..edefeda9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 207e994e667b6213bf21191843a05ab212a63f34 +Subproject commit edefeda9e6038ab8eb918377dd09ec96f9c73219 From 5566a7869f1694ad3393717689300d43953c7a0a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 23 Oct 2022 20:07:22 +0200 Subject: [PATCH 420/550] Fix #1405: drop name metadata from conditionally defined var --- CHANGELOG.md | 3 ++- sci | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cefd2c5d..c4b24591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ A preview of the next release can be installed from ## Unreleased -Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method +- Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method +- Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var ## 1.0.164 (2022-10-17) diff --git a/sci b/sci index edefeda9..09b269c2 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit edefeda9e6038ab8eb918377dd09ec96f9c73219 +Subproject commit 09b269c242db8af20edde575b1827a2b86027411 From a141998f55be2f4f5f292517d6d5e69d9b2e59b6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 24 Oct 2022 12:07:25 +0200 Subject: [PATCH 421/550] deps.clj: jar check --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 30bd5647..9cc85f5e 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 30bd56472daba5661d4c3f549c2e6572caed57ae +Subproject commit 9cc85f5e0c00c63a333af415a6a24730da424aa7 From 1cf8321960897bd9cee53d3da28ac49b936e2779 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 24 Oct 2022 16:23:24 -0400 Subject: [PATCH 422/550] Add fs lib test (#1406) --- CHANGELOG.md | 1 + deps.edn | 4 +- doc/libraries.csv | 1 + test-resources/lib_tests/bb-tested-libs.edn | 1 + .../lib_tests/me/raynes/core_test.clj | 467 ++++++++++++++++++ .../lib_tests/me/raynes/mock_midje.clj | 38 ++ .../lib_tests/me/raynes/testfiles/bar | 0 .../lib_tests/me/raynes/testfiles/bbb.bz2 | Bin 0 -> 48 bytes .../lib_tests/me/raynes/testfiles/foo | 0 .../lib_tests/me/raynes/testfiles/ggg.gz | Bin 0 -> 27 bytes .../lib_tests/me/raynes/testfiles/ggg.tar | Bin 0 -> 5632 bytes .../lib_tests/me/raynes/testfiles/ggg.zip | Bin 0 -> 441 bytes .../lib_tests/me/raynes/testfiles/xxx.xz | Bin 0 -> 56 bytes .../me/raynes/testfiles/zip-slip.tar | Bin 0 -> 10240 bytes .../me/raynes/testfiles/zip-slip.zip | Bin 0 -> 545 bytes 15 files changed, 511 insertions(+), 1 deletion(-) create mode 100644 test-resources/lib_tests/me/raynes/core_test.clj create mode 100644 test-resources/lib_tests/me/raynes/mock_midje.clj create mode 100644 test-resources/lib_tests/me/raynes/testfiles/bar create mode 100644 test-resources/lib_tests/me/raynes/testfiles/bbb.bz2 create mode 100644 test-resources/lib_tests/me/raynes/testfiles/foo create mode 100644 test-resources/lib_tests/me/raynes/testfiles/ggg.gz create mode 100644 test-resources/lib_tests/me/raynes/testfiles/ggg.tar create mode 100644 test-resources/lib_tests/me/raynes/testfiles/ggg.zip create mode 100644 test-resources/lib_tests/me/raynes/testfiles/xxx.xz create mode 100644 test-resources/lib_tests/me/raynes/testfiles/zip-slip.tar create mode 100644 test-resources/lib_tests/me/raynes/testfiles/zip-slip.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index c4b24591..14018e1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ A preview of the next release can be installed from - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method - Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var +- [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek)) ## 1.0.164 (2022-10-17) diff --git a/deps.edn b/deps.edn index 8cc78c93..54e38584 100644 --- a/deps.edn +++ b/deps.edn @@ -156,7 +156,9 @@ :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" :deps/manifest :deps} lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" - :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"}} + :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" + :deps/manifest :deps} + clj-commons/fs {:mvn/version "1.6.310"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/doc/libraries.csv b/doc/libraries.csv index b6d89c55..f6b5e674 100644 --- a/doc/libraries.csv +++ b/doc/libraries.csv @@ -11,6 +11,7 @@ camel-snake-kebab/camel-snake-kebab,https://github.com/clj-commons/camel-snake-k circleci/bond,https://github.com/circleci/bond cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml +clj-commons/fs,https://github.com/clj-commons/fs clj-commons/multigrep,https://github.com/clj-commons/multigrep clj-stacktrace/clj-stacktrace,https://github.com/mmcgrana/clj-stacktrace clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 90b5c914..c852169f 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -167,4 +167,5 @@ :git-sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" :test-paths ["test"] :test-namespaces [exoscale.interceptor-test]} + clj-commons/fs {:git-url "https://github.com/clj-commons/fs", :test-namespaces (me.raynes.core-test), :git-sha "60026817c44015da8656925411d4af1d8210bad0"} } diff --git a/test-resources/lib_tests/me/raynes/core_test.clj b/test-resources/lib_tests/me/raynes/core_test.clj new file mode 100644 index 00000000..9effc484 --- /dev/null +++ b/test-resources/lib_tests/me/raynes/core_test.clj @@ -0,0 +1,467 @@ +(ns me.raynes.core-test + (:refer-clojure :exclude [name parents]) + (:require [me.raynes.fs :refer :all] + ;; BB-TEST-PATCH: remove compression ns (requires unavailable classes from apache commons) + #_[me.raynes.fs.compression :refer :all] + ;; BB-TEST-PATCH: remove midje (needs currently unavailable classes) and add mock midje ns + #_[midje.sweet :refer :all] + [me.raynes.mock-midje :refer [fact]] + [clojure.java.io :as io] + [clojure.string :as string]) + (:import java.io.File)) + +(def system-tempdir (System/getProperty "java.io.tmpdir")) + +(def fs-supports-symlinks? (not (.startsWith (System/getProperty "os.name") "Windows"))) + +(defn create-walk-dir [] + (let [root (temp-dir "fs-")] + (mkdir (file root "a")) + (mkdir (file root "b")) + (spit (file root "1") "1") + (spit (file root "a" "2") "1") + (spit (file root "b" "3") "1") + root)) + +(fact "Makes paths absolute." + (file ".") => *cwd* + (file "foo") => (io/file *cwd* "foo")) + + +(fact "Expands path to current user." + (let [user (System/getProperty "user.home")] + (expand-home "~") => (file user) + (expand-home (str "~" File/separator "foo")) => (file user "foo"))) + +(fact "Expands to given user." + (let [user (System/getProperty "user.home") + name (System/getProperty "user.name")] + (expand-home (str "~" name)) => (file user) + (expand-home (format "~%s/foo" name)) => (file user "foo"))) + +(fact "Expand a path w/o tilde just returns path" + (let [user (System/getProperty "user.home")] + (expand-home (str user File/separator "foo")) => (io/file user "foo"))) + +;; BB-TEST-PATCH: commented tests use midje functionality that isn't currently converted and/or +;; the compression ns + +;; BB-TEST-PATCH: made binding to adapt paths to bb folder structure +(def libtest-files-path "test-resources/lib_tests/me/raynes/testfiles") + +;(fact (list-dir ".") => (has every? #(instance? File %))) +; +;;; Want to change these files to be tempfiles at some point. +;(when unix-root (against-background +; [(around :contents (let [f (io/file "test/me/raynes/testfiles/bar")] +; (.setExecutable f false) +; (.setReadable f false) +; (.setWritable f false) +; ?form +; (.setExecutable f true) +; (.setReadable f true) +; (.setWritable f true)))] +; (fact +; (executable? "test/me/raynes/testfiles/foo") => true +; (executable? "test/me/raynes/testfiles/bar") => false) +; +; (fact +; (readable? "test/me/raynes/testfiles/foo") => true +; (readable? "test/me/raynes/testfiles/bar") => false) +; +; (fact +; (writeable? "test/me/raynes/testfiles/foo") => true +; (writeable? "test/me/raynes/testfiles/bar") => false))) + +;; BB-TEST-PATCH: update these paths to use bb folder structure + +(fact + (file? (str libtest-files-path "/foo")) => true + (file? ".") => false) + +(fact + (exists? (str libtest-files-path "/foo")) => true + (exists? "ewjgnr4ig43j") => false) + +(fact + (let [f (io/file (str libtest-files-path "/baz"))] + (.createNewFile f) + (delete f) + (exists? f) => false)) + +(fact + (directory? ".") => true + (directory? (str libtest-files-path "/foo")) => false) + +(fact + (file? ".") => false + (file? (str libtest-files-path "/foo")) => true) + +(fact + (let [tmp (temp-file "fs-")] + (exists? tmp) => true + (file? tmp) => true + (delete tmp))) + +(fact + (let [tmp (temp-dir "fs-")] + (exists? tmp) => true + (directory? tmp) => true + (delete tmp))) + +(fact + (let [tmp (ephemeral-file "fs-")] + (exists? tmp) => true + (file? tmp) => true)) ;; is deleted on JVM exit + +(fact + (let [tmp (ephemeral-dir "fs-")] + (exists? tmp) => true + (directory? tmp) => true)) ;; is deleted on JVM exit + +(fact + (absolute "foo") => (io/file *cwd* "foo")) + +(fact + (normalized ".") => *cwd*) + +(fact + (base-name "foo/bar") => "bar" + (base-name "foo/bar.txt" true) => "bar" + (base-name "bar.txt" ".txt") => "bar" + (base-name "foo/bar.txt" ".png") => "bar.txt") + +(fact + (let [tmp (temp-file "fs-")] + (> (mod-time tmp) 0) => true + (delete tmp))) + +(fact + (let [f (temp-file "fs-")] + (spit f "abc") + (size f) => 3 + (delete f))) + +(fact + (let [root (create-walk-dir) + result (delete-dir root)] + (exists? root) => false)) + +(fact + (let [f (temp-file "fs-")] + (delete f) + (mkdir f) + (directory? f) => true + (delete-dir f))) + +(fact + (let [f (temp-file "fs-") + sub (file f "a" "b")] + (delete f) + (mkdirs sub) + (directory? sub) => true + (delete-dir f))) + +;(fact +; (split (file "test/fs")) => (has-suffix ["test" "fs"])) + +(when unix-root + (fact + (split (file "/tmp/foo/bar.txt")) => '("/" "tmp" "foo" "bar.txt") + (split (file "/")) => '("/") + (split "/") => '("/") + (split "") => '(""))) + +(fact + (let [f (temp-file "fs-") + new-f (str f "-new")] + (rename f new-f) + (exists? f) => false + (exists? new-f) => true + (delete new-f))) + +;(fact +; (let [root (create-walk-dir)] +; (walk vector root) => (contains [[root #{"b" "a"} #{"1"}] +; [(file root "a") #{} #{"2"}] +; [(file root "b") #{} #{"3"}]] +; :in-any-order) +; (delete-dir root))) + +(fact + (let [from (temp-file "fs-") + to (temp-file "fs-") + data "What's up Doc?"] + (delete to) + (spit from data) + (copy from to) + (slurp from) => (slurp to) + (delete from) + (delete to))) + +(fact + (let [f (temp-file "fs-") + t (mod-time f)] + (Thread/sleep 1000) + (touch f) + (> (mod-time f) t) => true + (let [t2 3000] + (touch f t2) + (mod-time f) => t2) + (delete f))) + +(fact + (let [f (temp-file "fs-")] + (chmod "+x" f) + (executable? f) => true + (when-not (re-find #"Windows" (System/getProperty "os.name")) + (chmod "-x" f) + (executable? f) => false) + (delete f))) + +(fact + (let [f (temp-file "fs-")] + (chmod "777" f) + (executable? f) => true + (readable? f) => true + (writeable? f) => true + (chmod "000" f) + (when-not (re-find #"Windows" (System/getProperty "os.name")) + (chmod "-x" f) + (executable? f) => false + (readable? f) => false + (writeable? f) => false) + (delete f))) + +;(fact +; (let [from (create-walk-dir) +; to (temp-dir "fs-") +; path (copy-dir from to) +; dest (file to (base-name from))] +; path => dest +; (walk vector to) => (contains [[to #{(base-name from)} #{}] +; [dest #{"b" "a"} #{"1"}] +; [(file dest "a") #{} #{"2"}] +; [(file dest "b") #{} #{"3"}]] +; :in-any-order) +; (delete-dir from) +; (delete-dir to))) +; +;(fact "copy-dir-into works as expected." +; (let [from (create-walk-dir) +; to (temp-dir "fs-")] +; (copy-dir-into from to) +; (walk vector to) => (contains [[(file to) #{"a" "b"} #{"1"}] +; [(file to "a") #{} #{"2"}] +; [(file to "b") #{} #{"3"}]] +; :in-any-order) +; (delete-dir from) +; (delete-dir to))) + +(when (System/getenv "HOME") + (fact + (let [env-home (io/file (System/getenv "HOME"))] + (home) => env-home + (home "") => env-home + (home (System/getProperty "user.name")) => env-home))) + +;(tabular +; (fact (split-ext ?file) => ?ext) +; +; ?file ?ext +; "fs.clj" ["fs" ".clj"] +; "fs." ["fs" "."] +; "fs.clj.bak" ["fs.clj" ".bak"] +; "/path/to/fs" ["fs" nil] +; "" [(base-name (System/getProperty "user.dir")) nil] +; "~user/.bashrc" [".bashrc" nil]) +; +;(tabular +; (fact (extension ?file) => ?ext) +; +; ?file ?ext +; "fs.clj" ".clj" +; "fs." "." +; "fs.clj.bak" ".bak" +; "/path/to/fs" nil +; "" nil +; ".bashrc" nil) +; +;(tabular +; (fact (name ?file) => ?ext) +; +; ?file ?ext +; "fs.clj" "fs" +; "fs." "fs" +; "fs.clj.bak" "fs.clj" +; "/path/to/fs" "fs" +; "" (base-name (System/getProperty "user.dir")) +; ".bashrc" ".bashrc") + +(fact "Can change cwd with with-cwd." + (let [old *cwd*] + (with-cwd "foo" + *cwd* => (io/file old "foo")))) + +(fact "Can change cwd mutably with with-mutable-cwd" + (let [old *cwd*] + (with-mutable-cwd + (chdir "foo") + *cwd* => (io/file old "foo")))) + +;(with-cwd "test/me/raynes/testfiles" +; (fact +; (unzip "ggg.zip" "zggg") +; (exists? "zggg/ggg") => true +; (exists? "zggg/hhh/jjj") => true +; (delete-dir "zggg")) +; +; (fact (zip "fro.zip" ["bbb.txt" "bbb"]) +; (exists? "fro.zip") => true +; (unzip "fro.zip" "fro") +; (exists? "fro/bbb.txt") => true +; (rename "fro.zip" "fro2.zip") => true +; (delete "fro2.zip") +; (delete-dir "fro")) +; +; (fact "about zip round trip" +; (zip "round.zip" ["some.txt" "some text"]) +; (unzip "round.zip" "round") +; (slurp (file "round/some.txt")) => "some text") +; +; (fact "zip-files" +; (zip-files "foobar.zip" ["foo" "bar"]) +; (exists? "foobar.zip") +; (unzip "foobar.zip" "foobar") +; (exists? "foobar/foo") => true +; (exists? "foobar/bar") => true +; (delete "foobar.zip") +; (delete-dir "foobar")) +; +; (fact +; (untar "ggg.tar" "zggg") +; (exists? "zggg/ggg") => true +; (exists? "zggg/hhh/jjj") => true +; (delete-dir "zggg")) +; +; (fact +; (gunzip "ggg.gz" "ggg") +; (exists? "ggg") => true +; (delete "ggg")) +; +; (fact +; (bunzip2 "bbb.bz2" "bbb") +; (exists? "bbb") => true +; (delete "bbb")) +; +; (fact +; (unxz "xxx.xz" "xxx") +; (exists? "xxx") => true +; (delete "xxx")) +; +; (fact "zip-slip vulnerability" +; (unzip "zip-slip.zip" "zip-slip") => (throws Exception "Expanding entry would be created outside target dir") +; (untar "zip-slip.tar" "zip-slip") => (throws Exception "Expanding entry would be created outside target dir") +; (exists? "/tmp/evil.txt") => false +; (delete-dir "zip-slip"))) + +;(let [win-root (when-not unix-root "c:")] +; (fact +; (parents (str win-root "/foo/bar/baz")) => (just [(file (str win-root "/foo")) +; (file (str win-root "/foo/bar")) +; (file (str win-root "/"))] +; :in-any-order) +; (parents (str win-root "/")) => nil)) +; +;(fact +; (child-of? "/foo/bar" "/foo/bar/baz") => truthy +; (child-of? "/foo/bar/baz" "/foo/bar") => falsey) + +(fact + (path-ns "foo/bar/baz_quux.clj") => 'foo.bar.baz-quux) + +;(fact +; (str (ns-path 'foo.bar.baz-quux)) => (has-suffix (string/join File/separator ["foo" "bar" "baz_quux.clj"]))) + +(fact + (let [win-root (when-not unix-root "c:")] + (absolute? (str win-root "/foo/bar")) => true + (absolute? (str win-root "/foo/")) => true + (absolute? "foo/bar") => false + (absolute? "foo/") => false)) + +(defmacro run-java-7-tests [] + (when (try (import '[java.nio.file Files Path LinkOption StandardCopyOption FileAlreadyExistsException] + '[java.nio.file.attribute FileAttribute]) + (catch Exception _ nil)) + '(do + ;; BB-TEST-PATCH: change path to match bb folders + (def test-files-path "test-resources/lib_tests/me/raynes/testfiles") + + (fact + (let [files (find-files test-files-path #"ggg\.*") + gggs (map #(file (str test-files-path "/ggg." %)) '(gz tar zip))] + (every? (set gggs) files) => true)) + + (fact + (let [fs1 (find-files test-files-path #"ggg\.*") + fs2 (find-files* test-files-path #(re-matches #"ggg\.*" (.getName %)))] + (= fs1 fs2) => true)) + + (fact + (let [f (touch (io/file test-files-path ".hidden"))] + (hidden? f) + (delete f))) + + (fact + (let [target (io/file test-files-path "ggg.tar") + hard (link (io/file test-files-path "hard.link") target)] + (file? hard) => true + (delete hard))) + + (when fs-supports-symlinks? + (fact + (let [target (io/file test-files-path "ggg.tar") + soft (sym-link (io/file test-files-path "soft.link") target)] + (file? soft) => true + (link? soft) => true + (= (read-sym-link soft) target) + (delete soft))) + + (fact + (let [soft (sym-link (io/file test-files-path "soft.link") test-files-path)] + (link? soft) => true + (file? soft) => false + (directory? soft) => true + (directory? soft LinkOption/NOFOLLOW_LINKS) => false + (delete soft))) + + (fact + (let [root (create-walk-dir) + soft-a (sym-link (io/file root "soft-a.link") (io/file root "a")) + soft-b (sym-link (io/file root "soft-b.link") (io/file root "b"))] + (delete-dir soft-a LinkOption/NOFOLLOW_LINKS) + (exists? (io/file root "a" "2")) => true + (delete-dir soft-b) + (exists? (io/file root "b" "3")) => false + (delete-dir root) + (exists? root) => false))) + + (fact "`move` moves files" + (let [source (io/file test-files-path "foo") + target (io/file test-files-path "foo.moved") + existing-target (io/file test-files-path "bar")] + (move source target) + (exists? target) => true + (exists? source) => false + (move target source) + (exists? target) => false + (exists? source) => true +; (move source existing-target) => (throws FileAlreadyExistsException) + (copy source target) + (move source target StandardCopyOption/REPLACE_EXISTING) + (exists? target) => true + (exists? source) => false + (move target source)))))) + +(run-java-7-tests) diff --git a/test-resources/lib_tests/me/raynes/mock_midje.clj b/test-resources/lib_tests/me/raynes/mock_midje.clj new file mode 100644 index 00000000..6724496f --- /dev/null +++ b/test-resources/lib_tests/me/raynes/mock_midje.clj @@ -0,0 +1,38 @@ +;; BB-TEST-PATCH: add this file to mock the midje 'fact' macro + +(ns me.raynes.mock-midje + (:require [rewrite-clj.paredit :as rcp] + [rewrite-clj.zip :as rcz] + [clojure.string :as str] + [clojure.test :refer [deftest is testing]])) + +(defn- up-until-nil [z] + (if-let [new-z (rcz/up z)] + (recur new-z) + z)) + +(defn- replace-arrow [form-zipper-at-arrow] + (let [lhs (-> form-zipper-at-arrow rcz/left rcz/node) + rhs (-> form-zipper-at-arrow rcz/right rcz/node)] + (-> form-zipper-at-arrow + (rcp/wrap-around :list) + rcp/slurp-backward + rcp/slurp-forward + rcz/up + (rcz/replace `(is (= ~lhs ~rhs))) + up-until-nil))) + +(defn- replace-arrows [form-zipper] + (if-let [next-arrow (rcz/find-next-value form-zipper rcz/next '=>)] + (let [rd (replace-arrow next-arrow)] + (recur rd)) + (rcz/sexpr form-zipper))) + +(defmacro fact + "mockup of midje's fact that just transforms `=>` into `is` checks and uses deftest" + [& _] ;operating on &form + (let [[nameish body] (if (string? (second &form)) + [(str/replace (second &form) #"[^\w\d]" "-") (nnext &form)] + ["test" (next &form)]) + transformed-body (replace-arrows (rcz/of-string (pr-str body)))] + `(deftest ~(gensym nameish) ~@transformed-body))) diff --git a/test-resources/lib_tests/me/raynes/testfiles/bar b/test-resources/lib_tests/me/raynes/testfiles/bar new file mode 100644 index 00000000..e69de29b diff --git a/test-resources/lib_tests/me/raynes/testfiles/bbb.bz2 b/test-resources/lib_tests/me/raynes/testfiles/bbb.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..5910bdb80eeffe55ad8da3cb5511dcc8c99ab926 GIT binary patch literal 48 zcmZ>Y%CIzaj8qGbY@d6qn}LDRw}C-GfI)zPLBT;lfk8aw#1E DCw~i{ literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/foo b/test-resources/lib_tests/me/raynes/testfiles/foo new file mode 100644 index 00000000..e69de29b diff --git a/test-resources/lib_tests/me/raynes/testfiles/ggg.gz b/test-resources/lib_tests/me/raynes/testfiles/ggg.gz new file mode 100644 index 0000000000000000000000000000000000000000..09cf484261e2d346d6cd5398957cd740eeb2cfa2 GIT binary patch literal 27 icmb2|=HR&K`_zwtIXyj{!Ta=ib_T`N;vQxO1_l6ll?S*0 literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/ggg.tar b/test-resources/lib_tests/me/raynes/testfiles/ggg.tar new file mode 100644 index 0000000000000000000000000000000000000000..c83a66330c0670ed774fba261e830981291d10a8 GIT binary patch literal 5632 zcmeHK!A`?43=K#K!4YYk^98Mww#lIiAnsC{{TUk|A8j{?Sluf^gBpDh2~ mvVWKQFKo~Mn*W0S{|@spj!kuWn3ZT1LVyq;1PFoOguo}QGMJ_S literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/ggg.zip b/test-resources/lib_tests/me/raynes/testfiles/ggg.zip new file mode 100644 index 0000000000000000000000000000000000000000..eaddda3854a004e2f207f1a2d6f645ad606cb9e6 GIT binary patch literal 441 zcmWIWW@h1H0D;h{-S%Jxlwe_yVaUkH&<_paWMF3Ud+K)yh)XND85mi#U<3GpnvY-_kd#=&g)qb#XozBJaSt=l00@?0NKa1( z8*tGVs{v{G`2pUHOmfV)JRt!z3j_oh-a3M4h?iI)Uc&GW!X!)&K}-UAonc9%9n>VS s_kf0hyobjyOphTO)(kWZ>`kCSAa7zA#L5O#0Spmlh6h0UFo?qd05^zCk^lez literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/xxx.xz b/test-resources/lib_tests/me/raynes/testfiles/xxx.xz new file mode 100644 index 0000000000000000000000000000000000000000..f36dec0df48a759c55ed0528dbb9b712a64e4c59 GIT binary patch literal 56 zcmexsUKJ6=z`&TPbkB^5L6K2{fq}t2!pfPEfw`iJmy2PS?xki1MhTYemmii+aGJ@> L2$W}FjEn*Ria`z4 literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/zip-slip.tar b/test-resources/lib_tests/me/raynes/testfiles/zip-slip.tar new file mode 100644 index 0000000000000000000000000000000000000000..264b25064d10164a497faa576c7c8628e9560499 GIT binary patch literal 10240 zcmeH}QEr4F5Qcs3Ddq$^3<|G3fR`{?*P6E2xVGu>J4$Meud8-VenP?kW*9#B9h$DY zq{H`+>{yuDap*4LKE_FYT zuMPd|dR-4L`f(?5bIi1ud1!NZX>X*pqDF55b)kNG=y(y_wgl2F&7R9HG-VrJw{<;x zi_+jx|6^IVEL{AK#d%}INJ8c8VMk-qKhfPQOj}!Q?rw+2I7syZ{6`($KeGC(ecLj009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X0D(1u EA5o@v#sB~S literal 0 HcmV?d00001 diff --git a/test-resources/lib_tests/me/raynes/testfiles/zip-slip.zip b/test-resources/lib_tests/me/raynes/testfiles/zip-slip.zip new file mode 100644 index 0000000000000000000000000000000000000000..38b3f499de0163e62ca15ce18350a9d9a477a51b GIT binary patch literal 545 zcmWIWW@h1H0D=Au{XYEp{-1?`Y!K#PkYPyA&ri`SsVE5z;bdU8U359h4v0%DxEUB( zzA-W|u!sQFm1JZVD*#cV0!Xz&eqJh90MJm76a&LlprHwl)s`S02)6*So}T`Ippx7I z{nWC|9FT|Lj?Pm62|-=W$Rx*%D=;L0E@xl>dYWNLBZ!3v8dgZqpan~SHzSh>Gwx6T jnE?Vz8bg8PfCLE8QsgiR@MdKLxrhk}K_2A>d6oeH^pk5C literal 0 HcmV?d00001 From cf93651e8e6a79466644c9acb939d206fec3f49d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 25 Oct 2022 11:05:47 +0200 Subject: [PATCH 423/550] Add java.net.URLConnection --- src/babashka/impl/classes.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index f9340772..dcbd5217 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -301,7 +301,8 @@ java.net.SocketException java.net.UnknownHostException java.net.URI - ;; java.net.URL, see below + ;; java.net.URL, see custom map + java.net.URLConnection java.net.URLEncoder java.net.URLDecoder ~@(when features/java-nio? From b452c1d94a5930017c986aea8b95095203c1be8b Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 25 Oct 2022 11:11:31 +0200 Subject: [PATCH 424/550] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14018e1f..cc31ebf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ A preview of the next release can be installed from - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method - Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var - [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek)) +- Add `java.net.URLConnection` class ## 1.0.164 (2022-10-17) From bca3f28e28c35c24a4aa0f7e5eedae57bf75c412 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 25 Oct 2022 22:56:57 +0200 Subject: [PATCH 425/550] Graalvm 22.3.0 (#1408) --- .circleci/script/short_ci.clj | 8 ++++---- .cirrus.yml | 4 ++-- .github/workflows/build.yml | 6 +++--- Dockerfile | 2 +- appveyor.yml | 6 +++--- doc/build.md | 8 ++++---- doc/dev.md | 2 +- script/bump_graal_version.clj | 2 +- test/babashka/crypto_test.clj | 9 +++++++-- 9 files changed, 26 insertions(+), 21 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index 90dab434..b977f773 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -114,7 +114,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (defn unix [shorted? static? musl? arch executor-conf resource-class graalvm-home platform] (let [env {:LEIN_ROOT "true" - :GRAALVM_VERSION "22.2.0" + :GRAALVM_VERSION "22.3.0" :GRAALVM_HOME graalvm-home :BABASHKA_PLATFORM (if (= "mac" platform) "macos" @@ -168,7 +168,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl {:persist_to_workspace {:root "/tmp" :paths ["release"]}} {:save_cache - {:paths ["~/.m2" "~/graalvm-ce-java11-22.2.0"] + {:paths ["~/.m2" "~/graalvm-ce-java11-22.3.0"] :key cache-key}} {:store_artifacts {:path "/tmp/release" :destination "release"}} @@ -180,8 +180,8 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl (let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]} machine-executor-conf {:machine {:image "ubuntu-2004:202111-01"}} mac-executor-conf {:macos {:xcode "14.0.0"}} - linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.2.0" - mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.2.0/Contents/Home"] + linux-graalvm-home "/home/circleci/graalvm-ce-java11-22.3.0" + mac-graalvm-home "/Users/distiller/graalvm-ce-java11-22.3.0/Contents/Home"] (ordered-map :version 2.1 :commands diff --git a/.cirrus.yml b/.cirrus.yml index 91a7a8e3..aa61cb30 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -5,8 +5,8 @@ task: skip: "changesIncludeOnly('logo/*', '**.md')" env: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.2.0" - GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.2.0/Contents/Home + GRAALVM_VERSION: "22.3.0" + GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.3.0/Contents/Home BABASHKA_PLATFORM: macos # used in release script BABASHKA_ARCH: aarch64 BABASHKA_TEST_ENV: native diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d1bb7dc5..66e1f6ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -102,7 +102,7 @@ jobs: runs-on: ${{ matrix.os }} env: LEIN_ROOT: "true" - GRAALVM_VERSION: "22.2.0" + GRAALVM_VERSION: "22.3.0" BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -126,7 +126,7 @@ jobs: if: "matrix.static == false" uses: graalvm/setup-graalvm@v1 with: - version: '22.2.0' + version: '22.3.0' java-version: '11' components: 'native-image' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -135,7 +135,7 @@ jobs: if: "matrix.static == true" uses: graalvm/setup-graalvm@v1 with: - version: '22.2.0' + version: '22.3.0' java-version: '11' components: 'native-image' native-image-musl: true diff --git a/Dockerfile b/Dockerfile index 13ee10fa..573142ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ RUN apt update RUN apt install --no-install-recommends -yy build-essential zlib1g-dev WORKDIR "/opt" -ENV GRAALVM_VERSION="22.2.0" +ENV GRAALVM_VERSION="22.3.0" ARG TARGETARCH ENV BABASHKA_ARCH=${TARGETARCH} ENV GRAALVM_ARCH=${TARGETARCH} diff --git a/appveyor.yml b/appveyor.yml index 7ad68110..7e60e61c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,8 +7,8 @@ image: Visual Studio 2017 clone_folder: C:\projects\babashka environment: - GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0 - JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.2.0 + GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.3.0 + JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.3.0 BABASHKA_XMX: "-J-Xmx5g" skip_commits: @@ -38,7 +38,7 @@ clone_script: build_script: - cmd: >- - powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java11-windows-amd64-22.2.0.zip', 'graalvm.zip') }" + powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/graalvm-ce-java11-windows-amd64-22.3.0.zip', 'graalvm.zip') }" powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }" diff --git a/doc/build.md b/doc/build.md index 2b5fa2e1..4de497e0 100644 --- a/doc/build.md +++ b/doc/build.md @@ -3,24 +3,24 @@ ## Prerequisites - Install [lein](https://leiningen.org/) for producing uberjars -- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.2.0*. +- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.3.0*. - For Windows, installing Visual Studio 2019 with the "Desktop development with C++" workload is recommended. - Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.0/Contents/Home + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.3.0/Contents/Home ``` On linux: ``` shell - export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.2.0 + export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.3.0 ``` On Windows, from the [Visual Studio 2019 x64 Native Tools Command Prompt](https://github.com/oracle/graal/issues/2116#issuecomment-590470806) or `cmd.exe` (not Powershell): ``` - set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.2.0 + set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.3.0 ``` If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using: ``` diff --git a/doc/dev.md b/doc/dev.md index 3f1ecd49..dac50075 100644 --- a/doc/dev.md +++ b/doc/dev.md @@ -37,7 +37,7 @@ reasons: ## Requirements -You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.2.0. +You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.3.0. ## Clone repository diff --git a/script/bump_graal_version.clj b/script/bump_graal_version.clj index f8178f6e..191c8e01 100755 --- a/script/bump_graal_version.clj +++ b/script/bump_graal_version.clj @@ -54,7 +54,7 @@ ;; OR ;; ;; We could have them as environment variables -(def current-graal-version "22.2.0") +(def current-graal-version "22.3.0") (def current-java-version "java11") (def cl-options diff --git a/test/babashka/crypto_test.clj b/test/babashka/crypto_test.clj index 08549691..48503f69 100644 --- a/test/babashka/crypto_test.clj +++ b/test/babashka/crypto_test.clj @@ -17,7 +17,10 @@ (deftest hmac-sha-256-test (let [key-s "some-key" data "some-data" - expected-sha (String. (hmac-sha-256 (.getBytes key-s) data))] + expected-sha (String. (.encode (java.util.Base64/getEncoder) + (hmac-sha-256 (.getBytes key-s) data)) + "utf-8")] + (prn expected-sha) (is (= expected-sha (bb '(do (ns net (:import (javax.crypto Mac) (javax.crypto.spec SecretKeySpec))) @@ -28,4 +31,6 @@ (.doFinal mac (.getBytes data "UTF-8")))) (let [key-s "some-key" data "some-data"] - (String. (hmac-sha-256 (.getBytes key-s) data))))))))) + (String. (.encode (java.util.Base64/getEncoder) + (hmac-sha-256 (.getBytes key-s) data)) + "utf-8")))))))) From eaf0a068f31a6119ca1f37200fe5e35207f70117 Mon Sep 17 00:00:00 2001 From: Andrea Richiardi Date: Wed, 26 Oct 2022 10:15:12 -0600 Subject: [PATCH 426/550] Link pod registry to Pods section in README (#1411) In the `Pods` section we were pointing to a place with a slightly outdated list of projects. This patch adds the correct link to the pod registry. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 418f2036..032f8893 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ Pods are programs that can be used as a Clojure library by babashka. Documentation is available in the [pod library repo](https://github.com/babashka/pods). -A list of available pods can be found [here](doc/projects.md#pods). +A list of available pods can be found in the [pod registry](https://github.com/babashka/pod-registry). ## Differences with Clojure From 9de689c62360c964b0b476302eaae5c0ede9e772 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 26 Oct 2022 17:42:30 +0200 Subject: [PATCH 427/550] deps.clj 1.11.1.1182 --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 9cc85f5e..0765bdab 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 9cc85f5e0c00c63a333af415a6a24730da424aa7 +Subproject commit 0765bdabb35522beb653693c18f7266b400d9d3b From fc5dccc9efa466200bff6e4576f014f4f8689c8d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 27 Oct 2022 13:42:51 +0200 Subject: [PATCH 428/550] sci: in-ns as function --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 09b269c2..674897d4 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 09b269c242db8af20edde575b1827a2b86027411 +Subproject commit 674897d4378049126bbd24ad4d537df9f619e9ea From 10ec7dcf1a4b037f486fbbe228351ffb7849da77 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 27 Oct 2022 20:11:12 +0200 Subject: [PATCH 429/550] Bump core.async to 673 (#1412) --- .cirrus.yml | 1 + deps.edn | 2 +- project.clj | 2 +- resources/META-INF/babashka/deps.edn | 6 ++++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index aa61cb30..34ebcced 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -20,6 +20,7 @@ task: sudo script/install-leiningen script/install-graalvm export PATH=$GRAALVM_HOME/bin:$PATH + export JAVA_HOME=$GRAALVM_HOME sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license java -version diff --git a/deps.edn b/deps.edn index 54e38584..c367f9a7 100644 --- a/deps.edn +++ b/deps.edn @@ -26,7 +26,7 @@ babashka/fs {:local/root "fs"} babashka/babashka.core {:local/root "babashka.core"} borkdude/graal.locking {:mvn/version "0.0.2"}, - org.clojure/core.async {:mvn/version "1.5.648"}, + org.clojure/core.async {:mvn/version "1.6.673"}, org.clojure/tools.cli {:mvn/version "1.0.214"}, org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} diff --git a/project.clj b/project.clj index e16928c4..c8872421 100644 --- a/project.clj +++ b/project.clj @@ -27,7 +27,7 @@ [borkdude/sci.impl.reflector "0.0.1"] [org.babashka/sci.impl.types "0.0.2"] [org.babashka/babashka.impl.reify "0.1.3"] - [org.clojure/core.async "1.5.648"] + [org.clojure/core.async "1.6.673"] [org.clojure/test.check "1.1.1"] [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 8cc78c93..c367f9a7 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -26,7 +26,7 @@ babashka/fs {:local/root "fs"} babashka/babashka.core {:local/root "babashka.core"} borkdude/graal.locking {:mvn/version "0.0.2"}, - org.clojure/core.async {:mvn/version "1.5.648"}, + org.clojure/core.async {:mvn/version "1.6.673"}, org.clojure/tools.cli {:mvn/version "1.0.214"}, org.clojure/data.csv {:mvn/version "1.0.0"}, cheshire/cheshire {:mvn/version "5.11.0"} @@ -156,7 +156,9 @@ :git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e" :deps/manifest :deps} lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" - :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"}} + :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" + :deps/manifest :deps} + clj-commons/fs {:mvn/version "1.6.310"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd From f5a226ab34a3e8fb62d8a0d521c6aedef8a04e25 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 27 Oct 2022 21:01:14 +0200 Subject: [PATCH 430/550] Add notes for detecting runtime requiring-resolve, etc [skip ci] --- .../because_patches.clj | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/aaaa_this_has_to_be_first/because_patches.clj b/src/aaaa_this_has_to_be_first/because_patches.clj index f13b10a4..d0b5cda1 100644 --- a/src/aaaa_this_has_to_be_first/because_patches.clj +++ b/src/aaaa_this_has_to_be_first/because_patches.clj @@ -2,3 +2,29 @@ ;; we need pprint loaded first, it patches pprint to not bloat the GraalVM binary (:require [babashka.impl.patches.datafy] [babashka.impl.pprint])) + +;; Enable this for scanning requiring-resolve usage: +;; --- +;; (def old-requiring-resolve requiring-resolve) + +;; (defmacro static-requiring-resolve [sym] +;; (prn :sym sym) +;; `(old-requiring-resolve ~sym)) + +;; (alter-var-root #'requiring-resolve (constantly @#'static-requiring-resolve)) +;; (doto #'requiring-resolve (.setMacro)) +;; --- + +;; ((requiring-resolve 'clojure.pprint/pprint) (range 20)) + +;; Enable this for detecting literal usages of require +;; --- +;; (def old-require require) + +;; (defmacro static-require [& syms] +;; (when (meta &form) +;; (prn :require &form )) +;; `(old-require ~@syms)) +;; (alter-var-root #'require (constantly @#'static-require)) +;; (doto #'require (.setMacro)) +;; --- From a035291f415b30a1628d528f39d842ad109703e8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 30 Oct 2022 15:12:23 +0100 Subject: [PATCH 431/550] SCI: now with docstrings for core macros --- sci | 2 +- src/babashka/impl/clojure/core.clj | 4 ++-- src/babashka/main.clj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sci b/sci index 674897d4..eb322b3b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 674897d4378049126bbd24ad4d537df9f619e9ea +Subproject commit eb322b3b68312f4de109153ec1719042267320ac diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index e970cf77..ca10a0b2 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -7,7 +7,7 @@ [clojure.core :as c] [clojure.string :as str] [sci.core :as sci] - [sci.impl.namespaces :refer [copy-core-var core-var macrofy]] + [sci.impl.namespaces :refer [copy-core-var new-var macrofy]] [sci.impl.parser :as parser] [sci.impl.utils :refer [clojure-core-ns]] [sci.impl.vars :as vars])) @@ -166,7 +166,7 @@ '*data-readers* data-readers 'default-data-readers (copy-core-var default-data-readers) 'xml-seq (copy-core-var xml-seq) - 'read+string (core-var 'read+string (fn [& args] + 'read+string (new-var 'read+string (fn [& args] (apply read+string @common/ctx args))) '*command-line-args* command-line-args '*warn-on-reflection* warn-on-reflection diff --git a/src/babashka/main.clj b/src/babashka/main.clj index ba8b10a9..5c9c261d 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -867,7 +867,7 @@ Use bb run --help to show this help output. :namespaces (-> namespaces (assoc 'clojure.core (assoc core-extras - 'load-file (sci-namespaces/core-var 'load-file load-file*)))) + 'load-file (sci-namespaces/new-var 'load-file load-file*)))) :env env :features #{:bb :clj} :classes @classes/class-map From a4ba9527b9ff1998cf9d853da7c81f45c032212a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 13:42:42 +0100 Subject: [PATCH 432/550] SCI: more docstrings --- sci | 2 +- src/babashka/impl/clojure/core.clj | 2 +- src/babashka/impl/clojure/core/async.clj | 2 +- src/babashka/main.clj | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sci b/sci index eb322b3b..6bf76cb4 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit eb322b3b68312f4de109153ec1719042267320ac +Subproject commit 6bf76cb446784d698046694f947544ec2468f979 diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index ca10a0b2..1c269aed 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -7,7 +7,7 @@ [clojure.core :as c] [clojure.string :as str] [sci.core :as sci] - [sci.impl.namespaces :refer [copy-core-var new-var macrofy]] + [sci.impl.copy-vars :refer [copy-core-var new-var macrofy]] [sci.impl.parser :as parser] [sci.impl.utils :refer [clojure-core-ns]] [sci.impl.vars :as vars])) diff --git a/src/babashka/impl/clojure/core/async.clj b/src/babashka/impl/clojure/core/async.clj index 6ae94083..391c4d9b 100644 --- a/src/babashka/impl/clojure/core/async.clj +++ b/src/babashka/impl/clojure/core/async.clj @@ -3,7 +3,7 @@ (:require [clojure.core.async :as async] [clojure.core.async.impl.protocols :as protocols] [sci.core :as sci :refer [copy-var]] - [sci.impl.namespaces :refer [macrofy]] + [sci.impl.copy-vars :refer [macrofy]] [sci.impl.vars :as vars])) (def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 5c9c261d..b7514eb1 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -57,6 +57,7 @@ [hf.depstar.uberjar :as uberjar] [sci.addons :as addons] [sci.core :as sci] + [sci.impl.copy-vars :as sci-copy-vars] [sci.impl.io :as sio] [sci.impl.namespaces :as sci-namespaces] [sci.impl.types :as sci-types] @@ -867,7 +868,7 @@ Use bb run --help to show this help output. :namespaces (-> namespaces (assoc 'clojure.core (assoc core-extras - 'load-file (sci-namespaces/new-var 'load-file load-file*)))) + 'load-file (sci-copy-vars/new-var 'load-file load-file*)))) :env env :features #{:bb :clj} :classes @classes/class-map From ee85685334fddda28afee71da85de90312f7e606 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 14:13:45 +0100 Subject: [PATCH 433/550] Fix tests --- feature-jdbc/babashka/impl/jdbc.clj | 37 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/feature-jdbc/babashka/impl/jdbc.clj b/feature-jdbc/babashka/impl/jdbc.clj index 23c28950..bfcffdb2 100644 --- a/feature-jdbc/babashka/impl/jdbc.clj +++ b/feature-jdbc/babashka/impl/jdbc.clj @@ -4,8 +4,7 @@ [next.jdbc :as njdbc] [next.jdbc.result-set :as rs] [next.jdbc.sql :as sql] - [sci.core :as sci] - [sci.impl.namespaces :refer [copy-var macrofy]])) + [sci.core :as sci])) (def next-ns (sci/create-ns 'next.jdbc nil)) @@ -20,30 +19,30 @@ * `:rollback-only` -- `true` / `false`." [_ _ [sym transactable opts] & body] (let [con (vary-meta sym assoc :tag 'java.sql.Connection)] - `(next.jdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {})))) + `(njdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {})))) (def njdbc-namespace - {'get-datasource (copy-var njdbc/get-datasource next-ns) - 'execute! (copy-var njdbc/execute! next-ns) - 'execute-one! (copy-var njdbc/execute-one! next-ns) - 'get-connection (copy-var njdbc/get-connection next-ns) - 'plan (copy-var njdbc/plan next-ns) - 'prepare (copy-var njdbc/prepare next-ns) - 'transact (copy-var njdbc/transact next-ns) - 'with-transaction (macrofy 'with-transaction with-transaction next-ns)}) + {'get-datasource (sci/copy-var njdbc/get-datasource next-ns) + 'execute! (sci/copy-var njdbc/execute! next-ns) + 'execute-one! (sci/copy-var njdbc/execute-one! next-ns) + 'get-connection (sci/copy-var njdbc/get-connection next-ns) + 'plan (sci/copy-var njdbc/plan next-ns) + 'prepare (sci/copy-var njdbc/prepare next-ns) + 'transact (sci/copy-var njdbc/transact next-ns) + 'with-transaction (sci/copy-var with-transaction next-ns)}) (def sns (sci/create-ns 'next.jdbc.sql nil)) (def next-sql-namespace - {'insert-multi! (copy-var sql/insert-multi! sns)}) + {'insert-multi! (sci/copy-var sql/insert-multi! sns)}) (def rsns (sci/create-ns 'next.jdbc.result-set nil)) (def result-set-namespace - {'as-maps (copy-var rs/as-maps rsns) - 'as-unqualified-maps (copy-var rs/as-unqualified-maps rsns) - 'as-modified-maps (copy-var rs/as-modified-maps rsns) - 'as-unqualified-modified-maps (copy-var rs/as-unqualified-modified-maps rsns) - 'as-lower-maps (copy-var rs/as-lower-maps rsns) - 'as-unqualified-lower-maps (copy-var rs/as-unqualified-lower-maps rsns) - 'as-maps-adapter (copy-var rs/as-maps-adapter rsns)}) + {'as-maps (sci/copy-var rs/as-maps rsns) + 'as-unqualified-maps (sci/copy-var rs/as-unqualified-maps rsns) + 'as-modified-maps (sci/copy-var rs/as-modified-maps rsns) + 'as-unqualified-modified-maps (sci/copy-var rs/as-unqualified-modified-maps rsns) + 'as-lower-maps (sci/copy-var rs/as-lower-maps rsns) + 'as-unqualified-lower-maps (sci/copy-var rs/as-unqualified-lower-maps rsns) + 'as-maps-adapter (sci/copy-var rs/as-maps-adapter rsns)}) From 98741c9db7f5a92c169d7861660c8b37754d1877 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 15:27:07 +0100 Subject: [PATCH 434/550] Fix tests --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 6bf76cb4..3f48534d 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6bf76cb446784d698046694f947544ec2468f979 +Subproject commit 3f48534d746e3f035bf9d4f6811410923d05ac3a From 42d721a92ff2c6b0e1114045275fa1587368e97a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 15:52:31 +0100 Subject: [PATCH 435/550] Fix tests --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3f48534d..729ea284 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3f48534d746e3f035bf9d4f6811410923d05ac3a +Subproject commit 729ea284b2c0181537c724bbd216b2039df9a962 From c89300b3b532fe3becb9ce4bc884b4a8c3830a90 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 17:58:51 +0100 Subject: [PATCH 436/550] SCI: more docstrings --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 729ea284..f8e79a14 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 729ea284b2c0181537c724bbd216b2039df9a962 +Subproject commit f8e79a14eee6a98ea5719ce39bbcc12fad0e35fc From 8b146525f2bbf59fe9f6a98d6b9e94c4a182737d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 18:18:38 +0100 Subject: [PATCH 437/550] SCI: more docs --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index f8e79a14..3b82c930 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f8e79a14eee6a98ea5719ce39bbcc12fad0e35fc +Subproject commit 3b82c930f09a65ac6c5d472383d171ffdf3bf905 From ccc1512bb67469268493deec4a24b8f6390602cf Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 20:23:11 +0100 Subject: [PATCH 438/550] SCI: fix alength --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3b82c930..ca53e695 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3b82c930f09a65ac6c5d472383d171ffdf3bf905 +Subproject commit ca53e695125faf25279949c6cd9217978a804e3d From e31cb57a3db943acd8a37234e48a2b60e7dc7dfc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 31 Oct 2022 22:40:39 +0100 Subject: [PATCH 439/550] Add java.time.zone.ZoneRules class --- CHANGELOG.md | 1 + sci | 2 +- src/babashka/impl/classes.clj | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc31ebf2..26954ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ A preview of the next release can be installed from - Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var - [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek)) - Add `java.net.URLConnection` class +- Add `java.time.zone.ZoneRules` class ## 1.0.164 (2022-10-17) diff --git a/sci b/sci index ca53e695..4b7d7cf7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit ca53e695125faf25279949c6cd9217978a804e3d +Subproject commit 4b7d7cf7f20e18831e95036187225cdd83cc3aed diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index dcbd5217..dc1c725e 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -368,6 +368,7 @@ java.time.Year java.time.YearMonth java.time.ZoneRegion + java.time.zone.ZoneRules java.time.ZonedDateTime java.time.ZoneId java.time.ZoneOffset From ce064291f3f2167fc99f7faba484a65f3691de0f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 1 Nov 2022 12:41:19 +0100 Subject: [PATCH 440/550] SCI: more docstrings --- deps.clj | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.clj b/deps.clj index 0765bdab..9581d79e 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 0765bdabb35522beb653693c18f7266b400d9d3b +Subproject commit 9581d79e6ca27fd9176b67ab8c31d71573e15641 diff --git a/sci b/sci index 4b7d7cf7..d95cd13f 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 4b7d7cf7f20e18831e95036187225cdd83cc3aed +Subproject commit d95cd13f7dc8694776069d99a060f01bcc3ef6a6 From 4483ccf20b0fc58ddd4fbac0bd4d9d507357c6dd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 1 Nov 2022 12:46:18 +0100 Subject: [PATCH 441/550] v1.0.165 --- CHANGELOG.md | 8 +++++++- resources/BABASHKA_VERSION | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26954ea2..505ac4e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,19 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 1.0.165 (2202-11-01) - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method - Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var - [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek)) - Add `java.net.URLConnection` class - Add `java.time.zone.ZoneRules` class +- Copy more docstrings for core macros and vars +- Bump `core.async` to `1.6.673` +- Implement `in-ns` as function, rather than special form (@SignSpice) +- Bump `deps.clj` to `1.11.1.1182` +- Bump GraalVM to `22.3.0` +- SCI: don't rely on metadata for record implementation ## 1.0.164 (2022-10-17) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index ccf2eb83..dd075a7f 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.165-SNAPSHOT \ No newline at end of file +1.0.165 \ No newline at end of file From 9083959a5df4d3d09e1cba69bfaa9e2de3713dc4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 1 Nov 2022 13:04:08 +0100 Subject: [PATCH 442/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index b4f7675e..dd075a7f 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -1.0.164 \ No newline at end of file +1.0.165 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index dd075a7f..f231bfab 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.165 \ No newline at end of file +1.0.166-SNAPSHOT \ No newline at end of file From 07030d8f89872497fdeb857e9fcd3e4dccdd20b4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 1 Nov 2022 13:09:28 +0100 Subject: [PATCH 443/550] changelogs [skip ci] --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 505ac4e6..990c32fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +## Unreleased + +... + ## 1.0.165 (2202-11-01) - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method @@ -14,7 +18,7 @@ A preview of the next release can be installed from - Add `java.time.zone.ZoneRules` class - Copy more docstrings for core macros and vars - Bump `core.async` to `1.6.673` -- Implement `in-ns` as function, rather than special form (@SignSpice) +- Implement `in-ns` as function, rather than special form ([@SignSpice](https://github.com/SignSpice)) - Bump `deps.clj` to `1.11.1.1182` - Bump GraalVM to `22.3.0` - SCI: don't rely on metadata for record implementation From 70d9bbd10e984641423e5f34d15047a7cac4c458 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 1 Nov 2022 13:11:56 +0100 Subject: [PATCH 444/550] changelog [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 990c32fc..b0e73ac8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ A preview of the next release can be installed from ... -## 1.0.165 (2202-11-01) +## 1.0.165 (2022-11-01) - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method - Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var From 3d916df4a0c1e00df94100860b8eb5577e59c56a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 2 Nov 2022 17:46:54 +0100 Subject: [PATCH 445/550] SCI: minor change to type --- deps.clj | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.clj b/deps.clj index 9581d79e..3c369e0b 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 9581d79e6ca27fd9176b67ab8c31d71573e15641 +Subproject commit 3c369e0bd965423fda36c649c7e893bd94ecaac3 diff --git a/sci b/sci index d95cd13f..ee637746 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit d95cd13f7dc8694776069d99a060f01bcc3ef6a6 +Subproject commit ee6377460bb0e29466a4271f192c8540c9a4ace9 From 8d9ac4c4d18a5588a4a258a61a9db3835b4f4e5c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 5 Nov 2022 15:53:58 +0100 Subject: [PATCH 446/550] Add lib tests for Postmortem --- deps.clj | 2 +- deps.edn | 4 +++- test-resources/lib_tests/bb-tested-libs.edn | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/deps.clj b/deps.clj index 3c369e0b..aebc6c9a 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 3c369e0bd965423fda36c649c7e893bd94ecaac3 +Subproject commit aebc6c9a12ce1ab16a35159c660f6b1dfc7a44ee diff --git a/deps.edn b/deps.edn index c367f9a7..41c8bc0c 100644 --- a/deps.edn +++ b/deps.edn @@ -158,7 +158,9 @@ lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" :deps/manifest :deps} - clj-commons/fs {:mvn/version "1.6.310"}} + clj-commons/fs {:mvn/version "1.6.310"} + postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" + :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index c852169f..b99ea3e5 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -168,4 +168,8 @@ :test-paths ["test"] :test-namespaces [exoscale.interceptor-test]} clj-commons/fs {:git-url "https://github.com/clj-commons/fs", :test-namespaces (me.raynes.core-test), :git-sha "60026817c44015da8656925411d4af1d8210bad0"} - } + postmortem/postmortem {:git-url "https://github.com/athos/Postmortem" + :git-sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba" + :test-paths ["test"] + :test-namespaces [postmortem.core-test postmortem.instrument-test + postmortem.instrument-test]}} From 36d2ec2d876fbcd7e1c7fcfbc9c203e7c0117c6f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 5 Nov 2022 15:56:31 +0100 Subject: [PATCH 447/550] doc [skip ci] --- doc/dev.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/dev.md b/doc/dev.md index dac50075..872cfa8e 100644 --- a/doc/dev.md +++ b/doc/dev.md @@ -81,8 +81,14 @@ Test the native version: ## Tests for Libraries Babashka runs tests of libraries that are compatible with it through -`script/run_lib_tests`. The script `add-libtest.clj` makes adding new libraries -fairly easy. Some examples: +`script/run_lib_tests`. + +You can check out [this +commit](https://github.com/babashka/babashka/commit/8d9ac4c4d18a5588a4a258a61a9db3835b4f4e5c) +for how to add tests for a library that needs no changes to its tests. +The library is cloned as a git dependency, which also includes the tests, that are then added to the test's classpath and ran. + +If a library's tests needs changes, we copy the tests using the `add-libtest.clj` script. Examples: ```sh # To add tests for a new library on clojars From ee5f2a7a2ef0c715dbb01b8a87d9b3c439db335c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 8 Nov 2022 12:35:21 +0100 Subject: [PATCH 448/550] Add run-test and run-test-var to clojure.test --- CHANGELOG.md | 2 +- src/babashka/impl/clojure/test.clj | 36 ++++++++++++++++++++++++++++++ src/babashka/impl/test.clj | 2 ++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e73ac8..6c215b33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ A preview of the next release can be installed from ## Unreleased -... +- Add `run-test` and `run-test-var` to `clojure.test` ## 1.0.165 (2022-11-01) diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index 2810192e..bd2c98b0 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -804,3 +804,39 @@ [summary] (and (zero? (:fail summary 0)) (zero? (:error summary 0)))) + +(defn run-test-var + "Runs the tests for a single Var, with fixtures executed around the test, and summary output after." + {:added "1.11"} + [v] + (sci/binding [report-counters (atom @initial-report-counters)] + (let [ns-obj (-> v meta :ns) + summary (do + (do-report {:type :begin-test-ns + :ns ns-obj}) + (test-vars [v]) + (do-report {:type :end-test-ns + :ns ns-obj}) + (assoc @@report-counters :type :summary))] + (do-report summary) + summary))) + +(defmacro run-test + "Runs a single test. + Because the intent is to run a single test, there is no check for the namespace test-ns-hook." + {:added "1.11"} + [test-symbol] + (let [test-var (sci/resolve @ctx test-symbol)] + (cond + (nil? test-var) + (sci/binding [sci/out sci/err] + (binding [*out* sci/out] + (println "Unable to resolve" test-symbol "to a test function."))) + + (not (-> test-var meta :test)) + (sci/binding [sci/out sci/err] + (binding [*out* sci/out] + (println test-symbol "is not a test."))) + + :else + `(run-test-var ~test-var)))) diff --git a/src/babashka/impl/test.clj b/src/babashka/impl/test.clj index 62b1b494..2d3e95a5 100644 --- a/src/babashka/impl/test.clj +++ b/src/babashka/impl/test.clj @@ -55,6 +55,8 @@ 'test-ns (new-var 'test-ns (contextualize t/test-ns)) ;; running tests: high level 'run-tests (new-var 'run-tests (contextualize t/run-tests)) + 'run-test-var (sci/copy-var t/run-test-var tns) + 'run-test (sci/copy-var t/run-test tns) 'run-all-tests (new-var 'run-all-tests (contextualize t/run-all-tests)) 'successful? (sci/copy-var t/successful? tns) 'with-test-out (sci/copy-var t/with-test-out tns)}) From 5be61476d8a68b06198a3f9dc3c6b8b600ddb9d0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 8 Nov 2022 12:38:13 +0100 Subject: [PATCH 449/550] meta inf [skip ci] --- resources/META-INF/babashka/deps.edn | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index c367f9a7..41c8bc0c 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -158,7 +158,9 @@ lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" :deps/manifest :deps} - clj-commons/fs {:mvn/version "1.6.310"}} + clj-commons/fs {:mvn/version "1.6.310"} + postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" + :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd From e5ee1f4a776d68a7314f615e07d2de1ea1dfca3f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 8 Nov 2022 12:39:31 +0100 Subject: [PATCH 450/550] Fix run-test --- src/babashka/impl/clojure/test.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index bd2c98b0..b16d16de 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -839,4 +839,4 @@ (println test-symbol "is not a test."))) :else - `(run-test-var ~test-var)))) + `(clojure.test/run-test-var ~test-var)))) From bb84bd357e6bb8014b1e461a682b925839879cc8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 8 Nov 2022 13:32:41 +0100 Subject: [PATCH 451/550] Fix tests --- test-resources/lib_tests/integrant/core_test.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-resources/lib_tests/integrant/core_test.cljc b/test-resources/lib_tests/integrant/core_test.cljc index 065bb5a5..ceeb60f7 100644 --- a/test-resources/lib_tests/integrant/core_test.cljc +++ b/test-resources/lib_tests/integrant/core_test.cljc @@ -489,7 +489,7 @@ [(f m (keys m) (fn [k v] (last (swap! log conj [:test k v])))) @log])) -(deftest run-test +(deftest run-test* ;; BB-TEST-PATCH: renamed due to conflict with clojure.test (let [config {::a (ig/ref ::b), ::b 1} [system _] (build-log config)] (is (= [nil From ac1b16bfc89e394b7dce555dad329d97a6fa0e8c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 10 Nov 2022 21:04:01 +0100 Subject: [PATCH 452/550] SCI: preserve more stacktrace, e.g. on throw --- deps.edn | 5 ++- process | 2 +- project.clj | 3 +- sci | 2 +- test/babashka/error_test.clj | 75 +++++++++++++++++++++--------------- 5 files changed, 52 insertions(+), 35 deletions(-) diff --git a/deps.edn b/deps.edn index 41c8bc0c..df76cd44 100644 --- a/deps.edn +++ b/deps.edn @@ -157,7 +157,7 @@ :deps/manifest :deps} lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" - :deps/manifest :deps} + :deps/manifest :deps} clj-commons/fs {:mvn/version "1.6.310"} postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} @@ -170,7 +170,8 @@ :test {:extra-paths ["test"] :extra-deps {io.github.cognitect-labs/test-runner - {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + {:git/tag "v0.5.0" :git/sha "b3fd0d2"} + nubank/matcher-combinators {:mvn/version "3.6.0"}} :main-opts ["-m" "cognitect.test-runner"] :exec-fn cognitect.test-runner.api/test} :test-pod diff --git a/process b/process index f6a31466..be047624 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit f6a31466fdd76d5f74f701c0aa88af52e56f7fd4 +Subproject commit be047624edac65c3c648adace291bba38cd1a933 diff --git a/project.clj b/project.clj index c8872421..32478136 100644 --- a/project.clj +++ b/project.clj @@ -93,7 +93,8 @@ :feature/priority-map :feature/rrb-vector {:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"] - [com.opentable.components/otj-pg-embedded "0.13.3"]]}] + [com.opentable.components/otj-pg-embedded "0.13.3"] + [nubank/matcher-combinators "3.6.0"]]}] :uberjar {:global-vars {*assert* false} :jvm-opts ["-Dclojure.compiler.direct-linking=true" "-Dclojure.spec.skip-macros=true" diff --git a/sci b/sci index ee637746..b9f4dff7 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit ee6377460bb0e29466a4271f192c8540c9a4ace9 +Subproject commit b9f4dff7a69b5ac729427d86c6d457dc56d3bb6b diff --git a/test/babashka/error_test.clj b/test/babashka/error_test.clj index fba11c14..e82a7175 100644 --- a/test/babashka/error_test.clj +++ b/test/babashka/error_test.clj @@ -1,24 +1,29 @@ (ns babashka.error-test + {:clj-kondo/config '{:linters {:unresolved-symbol {:exclude [match?]}}}} (:require [babashka.test-utils :as tu] [clojure.java.io :as io] [clojure.string :as str] - [clojure.test :as t :refer [deftest is testing]])) + [clojure.test :as t :refer [deftest is testing]] + [matcher-combinators.test])) -(defn multiline-equals [s1 s2] - (let [lines-s1 (str/split-lines s1) - lines-s2 (str/split-lines s2) - max-lines (max (count lines-s1) (count lines-s2))] - (run! (fn [i] - (let [l1 (get lines-s1 i) - l2 (get lines-s2 i)] - (if (and l1 l2) - (is (= l1 l2) - (format "Lines did not match.\nLine: %s\nLeft: %s\nRight: %s" - i (pr-str l1) (pr-str l2))) - (is false (format "Out of lines at line: %s.\nLeft: %s\nRight: %s" - i (pr-str l1) (pr-str l2)))))) - (range max-lines)))) +(defmacro multiline-equals [s1 s2] + `(let [lines-s1# (str/split-lines ~s1) + lines-s2# (str/split-lines ~s2) + max-lines# (max (count lines-s1#) (count lines-s2#)) + lines-s1# (take max-lines# lines-s1#) + lines-s2# (take max-lines# lines-s2#)] + (is (~'match? (map str/trimr lines-s1#) (map str/trimr lines-s2#))) + #_(run! (fn [i] + (let [l1 (get lines-s1 i) + l2 (get lines-s2 i)] + (if (and l1 l2) + (is (= l1 l2) + (format "Lines did not match.\nLine: %s\nLeft: %s\nRight: %s" + i (pr-str l1) (pr-str l2))) + (is false (format "Out of lines at line: %s.\nLeft: %s\nRight: %s" + i (pr-str l1) (pr-str l2)))))) + (range max-lines)))) (deftest stacktrace-from-script-test (try (tu/bb nil (.getPath (io/file "test" "babashka" "scripts" "divide_by_zero.bb"))) @@ -122,7 +127,7 @@ Phase: macroexpand ----- Context ------------------------------------------------------------------ 1: (defmacro foo [x] (subs nil 1) `(do ~x ~x)) (foo 1) - ^--- + ^--- ----- Stack trace -------------------------------------------------------------- clojure.core/subs - @@ -140,7 +145,7 @@ Location: :1:35 ----- Context ------------------------------------------------------------------ 1: (defmacro foo [x] `(subs nil ~x)) (foo 1) - ^--- + ^--- ----- Stack trace -------------------------------------------------------------- clojure.core/subs - @@ -156,7 +161,7 @@ Location: :1:15 ----- Context ------------------------------------------------------------------ 1: (defn quux [] (subs nil 1)) (defmacro foo [x & xs] `(do (quux) ~x)) (defn bar [] (foo 1)) (bar) - ^--- + ^--- ----- Stack trace -------------------------------------------------------------- clojure.core/subs - @@ -178,7 +183,11 @@ Location: :1:27 ----- Context ------------------------------------------------------------------ 1: (let [d {:zero 0 :one 1}] (throw (ex-info \"some msg\" d))) - ^--- some msg"))) + ^--- some msg + +----- Stack trace -------------------------------------------------------------- +user - :1:27 +user - :1:1"))) (testing "output of ordinary Exception" (let [output (try (tu/bb nil "(throw (Exception. \"some msg\"))") @@ -191,15 +200,19 @@ Location: :1:1 ----- Context ------------------------------------------------------------------ 1: (throw (Exception. \"some msg\")) - ^--- some msg")))) + ^--- some msg + +----- Stack trace -------------------------------------------------------------- +user - :1:1")))) (deftest debug-exception-print-test (testing "debug mode includes locals and exception data in output" (let [output (try (tu/bb nil "--debug" "(let [x 1] (/ x 0))") (is false) ; ensure that exception is thrown and we don't get here - (catch Exception e (ex-message e)))] - (is (str/includes? (tu/normalize output) - "----- Error -------------------------------------------------------------------- + (catch Exception e (ex-message e))) + actual-lines (str/split-lines (tu/normalize output))] + (is (match? (take 16 actual-lines) + (str/split-lines "----- Error -------------------------------------------------------------------- Type: java.lang.ArithmeticException Message: Divide by zero Location: :1:12 @@ -211,18 +224,21 @@ Location: :1:12 ----- Stack trace -------------------------------------------------------------- clojure.core// - user - :1:12 +user - :1:1 ----- Exception ---------------------------------------------------------------- -clojure.lang.ExceptionInfo: Divide by zero -{:type :sci/error, :line 1, :column 12, :message \"Divide by zero\","))))) +clojure.lang.ExceptionInfo: Divide by zero"))) + (is (str/includes? (nth actual-lines 16) + "{:type :sci/error, :line 1, :column 12, :message \"Divide by zero\","))))) (deftest macro-test (let [output (try (tu/bb nil "--debug" "(defmacro foo [x] (subs nil 1) `(do ~x ~x)) (foo 1)") (is false) (catch Exception e (ex-message e))) - output (tu/normalize output)] - (is (str/includes? output - "----- Error -------------------------------------------------------------------- + output (tu/normalize output) + actual-lines (str/join "\n" (take 17 (str/split-lines output)))] + (multiline-equals actual-lines + "----- Error -------------------------------------------------------------------- Type: java.lang.NullPointerException Location: :1:19 Phase: macroexpand @@ -238,8 +254,7 @@ user/foo - :1:1 user - :1:45 ----- Exception ---------------------------------------------------------------- -clojure.lang.ExceptionInfo: null -{:type :sci/error, :line 1, :column 19")))) +clojure.lang.ExceptionInfo: null"))) (deftest native-stacktrace-test (let [output (try (tu/bb nil "(merge 1 2 3)") From a5dec07279184355a7de0813ec19401667c75a14 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 11 Nov 2022 15:14:02 +0100 Subject: [PATCH 453/550] Build uberjar using graalvm --- .circleci/script/short_ci.clj | 9 ++++++--- resources/META-INF/babashka/deps.edn | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index b977f773..88d7a92f 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -72,14 +72,16 @@ "java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}])))) (defn jvm - [shorted?] + [shorted? graalvm-home] (gen-job shorted? (ordered-map :docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}] :working_directory "~/repo" :environment {:LEIN_ROOT "true" - :BABASHKA_PLATFORM "linux"} + :BABASHKA_PLATFORM "linux" + :GRAALVM_VERSION "22.3.0" + :GRAALVM_HOME graalvm-home} :resource_class "large" :steps (gen-steps @@ -89,6 +91,7 @@ {:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}" "v1-dependencies-"]}} (run "Install Clojure" "sudo script/install-clojure") + (run "Download GraalVM" "script/install-graalvm") (run "Run JVM tests" "export BABASHKA_FEATURE_JDBC=true @@ -192,7 +195,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl :command "docker run --privileged --rm tonistiigi/binfmt --install all\ndocker buildx create --name ci-builder --use"}}]}} :jobs (ordered-map - :jvm (jvm shorted?) + :jvm (jvm shorted? linux-graalvm-home) :linux (unix shorted? false false "amd64" docker-executor-conf "large" linux-graalvm-home "linux") :linux-static (unix shorted? true true "amd64" docker-executor-conf "large" linux-graalvm-home "linux") diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 41c8bc0c..df76cd44 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -157,7 +157,7 @@ :deps/manifest :deps} lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri" :git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c" - :deps/manifest :deps} + :deps/manifest :deps} clj-commons/fs {:mvn/version "1.6.310"} postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} @@ -170,7 +170,8 @@ :test {:extra-paths ["test"] :extra-deps {io.github.cognitect-labs/test-runner - {:git/tag "v0.5.0" :git/sha "b3fd0d2"}} + {:git/tag "v0.5.0" :git/sha "b3fd0d2"} + nubank/matcher-combinators {:mvn/version "3.6.0"}} :main-opts ["-m" "cognitect.test-runner"] :exec-fn cognitect.test-runner.api/test} :test-pod From bc901fdcf0697cdb8ff19fe25eb7fe388bdb3d4a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 11 Nov 2022 15:31:35 +0100 Subject: [PATCH 454/550] Set java to GRAALVM --- .circleci/script/short_ci.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/script/short_ci.clj b/.circleci/script/short_ci.clj index 88d7a92f..f467f36b 100644 --- a/.circleci/script/short_ci.clj +++ b/.circleci/script/short_ci.clj @@ -105,6 +105,8 @@ script/uberjar VERSION=$(cat resources/BABASHKA_VERSION) jar=target/babashka-$VERSION-standalone.jar cp $jar /tmp/release +export PATH=$GRAALVM_HOME/bin:$PATH +export JAVA_HOME=$GRAALVM_HOME java -jar $jar script/reflection.clj reflection=\"babashka-$VERSION-reflection.json\" java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$jar\" From 8269a632c019e631afd578869c2937af786c5ca9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 11 Nov 2022 15:35:29 +0100 Subject: [PATCH 455/550] changelog [skip ci] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c215b33..081a4178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ A preview of the next release can be installed from ## Unreleased - Add `run-test` and `run-test-var` to `clojure.test` +- Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix ## 1.0.165 (2022-11-01) From 9ed3cb6a3198147d06d6a18b85d3d0b28fe74ad1 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 11 Nov 2022 17:34:44 +0100 Subject: [PATCH 456/550] Fix #1414: preserve metadata on exec task function argument map --- CHANGELOG.md | 1 + src/babashka/impl/cli.clj | 5 +++-- test-resources/babashka/exec_test.clj | 4 +++- test/babashka/exec_test.clj | 17 +++++++++++++++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 081a4178..e77212b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ A preview of the next release can be installed from - Add `run-test` and `run-test-var` to `clojure.test` - Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix +- [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map ## 1.0.165 (2022-11-01) diff --git a/src/babashka/impl/cli.clj b/src/babashka/impl/cli.clj index fcbbe8ef..753e99a7 100644 --- a/src/babashka/impl/cli.clj +++ b/src/babashka/impl/cli.clj @@ -25,10 +25,11 @@ (:org.babashka/cli the-var-meta) (:org.babashka/cli ct) extra-opts) - opts (babashka.cli/parse-opts *command-line-args* cli-opts) task-exec-args (:exec-args ct) cli-exec-args (:exec-args cli-opts) - opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] + exec-args {:exec-args (babashka.cli/merge-opts cli-exec-args task-exec-args)} + cli-opts (babashka.cli/merge-opts exec-args cli-opts) + opts (babashka.cli/parse-opts *command-line-args* cli-opts)] (the-var opts))" (random-uuid) (pr-str extra-opts) diff --git a/test-resources/babashka/exec_test.clj b/test-resources/babashka/exec_test.clj index 6eca718f..a18676bf 100644 --- a/test-resources/babashka/exec_test.clj +++ b/test-resources/babashka/exec_test.clj @@ -4,4 +4,6 @@ (defn exec-test {:org.babashka/cli {:coerce {:bar :keyword}}} [m] - (prn m)) + (if (:meta m) + (prn (meta m)) + (prn m))) diff --git a/test/babashka/exec_test.clj b/test/babashka/exec_test.clj index 4493e356..4a990520 100644 --- a/test/babashka/exec_test.clj +++ b/test/babashka/exec_test.clj @@ -3,7 +3,7 @@ [babashka.test-utils :as u] [cheshire.core :as cheshire] [clojure.edn :as edn] - [clojure.test :as t :refer [deftest is]])) + [clojure.test :as t :refer [deftest is testing]])) (defn bb [& args] (apply u/bb nil args)) @@ -33,4 +33,17 @@ "{:deps {} :tasks {foo {:task (exec 'babashka.exec-test/exec-test)}}}" (is (= {:foo [1], :bar :yeah} - (edn/read-string (bb "-cp" "test-resources" "run" "foo" "--foo" "1" "--bar" "yeah")))))) + (edn/read-string (bb "-cp" "test-resources" "run" "foo" "--foo" "1" "--bar" "yeah"))))) + (testing "task exec args" + (u/with-config + "{:deps {} + :tasks {foo {:exec-args {:foo :bar} + :task (exec 'babashka.exec-test/exec-test)}}}" + (is (= {:foo :bar, :bar :yeah} + (edn/read-string (bb "-cp" "test-resources" "run" "foo" "--bar" "yeah")))))) + (testing "meta" + (u/with-config + "{:deps {} + :tasks {foo {:task (exec 'babashka.exec-test/exec-test)}}}" + (is (= #:org.babashka{:cli {:args ["dude"]}} + (edn/read-string (bb "-cp" "test-resources" "run" "foo" "dude" "--bar" "yeah" "--meta"))))))) From 6e2eaa9e878fbc7fcbacdba26e9c43b84747baa2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 12 Nov 2022 15:46:59 +0100 Subject: [PATCH 457/550] Remove obsolete code --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index b9f4dff7..1162a6d2 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit b9f4dff7a69b5ac729427d86c6d457dc56d3bb6b +Subproject commit 1162a6d24fbefc40a29578351bba6ff0f5e12671 From a24c8fa197773182fdc42dbbfe9e43fe9fc460eb Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 12 Nov 2022 14:58:32 -0500 Subject: [PATCH 458/550] add force overwrite flag when installing glibc on alpine (#1415) Alpine 3.16 includes /etc/nsswitch.conf, which glibc install tries to create. This change adds the force-overwrite flag to the glibc install. --- Dockerfile.alpine | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.alpine b/Dockerfile.alpine index 091f6654..ed2968ac 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -6,7 +6,7 @@ RUN chmod +x /bin/bb RUN apk --no-cache add curl ca-certificates tar && \ curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \ - apk add --allow-untrusted /tmp/glibc-2.28-r0.apk + apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf # TODO: Run actual native tests when they are ported @@ -21,7 +21,7 @@ FROM alpine:3 RUN apk --no-cache add curl ca-certificates tar && \ curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \ - apk add --allow-untrusted /tmp/glibc-2.28-r0.apk + apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf COPY metabom.jar /opt/babashka-metabom.jar From 4c1da7d242865274b0f8636d470cb70a0fe15b98 Mon Sep 17 00:00:00 2001 From: Rahul De Date: Sun, 13 Nov 2022 07:54:13 +0000 Subject: [PATCH 459/550] [skip ci] Mark the sgerrand/alpine-pkg-glibc issue as a TODO --- Dockerfile.alpine | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.alpine b/Dockerfile.alpine index ed2968ac..f1b10a07 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -4,6 +4,8 @@ COPY bb /bin/bb RUN chmod +x /bin/bb +# TODO: See https://github.com/sgerrand/alpine-pkg-glibc/issues/185 and remove the `--force-overwrite`s when resolved. + RUN apk --no-cache add curl ca-certificates tar && \ curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \ apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk From bf55d65f147ab50aa1fc01c7288e6333081bdd49 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 12 Nov 2022 22:40:54 +0100 Subject: [PATCH 460/550] fs: update-file --- fs | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs b/fs index c43b784f..77e0e5c7 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit c43b784f52a250e4d21205f8e1ea6ec82bde038f +Subproject commit 77e0e5c76c680928aead72ab6ab1badeae4f0839 diff --git a/sci b/sci index 1162a6d2..cfb71252 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1162a6d24fbefc40a29578351bba6ff0f5e12671 +Subproject commit cfb71252378b5c6af75c3bfe6e310bdcdeaa372a From 4c3fa4c40640eed3d7e0f628cfe66e569a05c790 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 13 Nov 2022 11:19:34 +0100 Subject: [PATCH 461/550] fs docs [skip ci] --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 77e0e5c7..6e579add 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 77e0e5c76c680928aead72ab6ab1badeae4f0839 +Subproject commit 6e579addecc91acce5df15e8345b1b470d857755 From d8a00182139eea4fae6c1973f6db246ef4a82368 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 13 Nov 2022 16:07:01 -0500 Subject: [PATCH 462/550] Sluj tests (#1416) * add lib test for sluj (#1269) * changelog * add sluj to projects.md --- CHANGELOG.md | 1 + deps.edn | 5 ++++- doc/libraries.csv | 7 +++++++ doc/projects.md | 5 +++++ test-resources/lib_tests/bb-tested-libs.edn | 6 +++++- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e77212b9..ec0d8f76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ A preview of the next release can be installed from - Add `run-test` and `run-test-var` to `clojure.test` - Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix - [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map +- [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek)) ## 1.0.165 (2022-11-01) diff --git a/deps.edn b/deps.edn index df76cd44..35f44103 100644 --- a/deps.edn +++ b/deps.edn @@ -160,7 +160,10 @@ :deps/manifest :deps} clj-commons/fs {:mvn/version "1.6.310"} postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" - :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} + :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"} + com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj" + :git/sha "4a92e772b4e07bf127423448d4140748b5782198" + :deps/manifest :deps}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd diff --git a/doc/libraries.csv b/doc/libraries.csv index f6b5e674..7d8c22c1 100644 --- a/doc/libraries.csv +++ b/doc/libraries.csv @@ -8,6 +8,7 @@ borkdude/deps,https://github.com/borkdude/deps.clj borkdude/missing.test.assertions,https://github.com/borkdude/missing.test.assertions borkdude/rewrite-edn,https://github.com/borkdude/rewrite-edn camel-snake-kebab/camel-snake-kebab,https://github.com/clj-commons/camel-snake-kebab +cc.qbits/auspex,https://github.com/mpenet/auspex circleci/bond,https://github.com/circleci/bond cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml @@ -19,6 +20,7 @@ clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors com.exoscale/lingo,https://github.com/exoscale/lingo com.github.askonomm/clarktown,https://github.com/askonomm/clarktown +com.github.rawleyfowler/sluj,https://github.com/rawleyfowler/sluj com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql com.grammarly/omniconf,https://github.com/grammarly/omniconf @@ -37,6 +39,7 @@ douglass/clj-psql,https://github.com/DarinDouglass/clj-psql edn-query-language/eql,https://github.com/edn-query-language/eql environ/environ,https://github.com/weavejester/environ exoscale/coax,https://github.com/exoscale/coax +exoscale/interceptor,https://github.com/exoscale/interceptor expound/expound,https://github.com/bhb/expound failjure/failjure,https://github.com/adambard/failjure ffclj/ffclj,https://github.com/luissantos/ffclj @@ -58,8 +61,10 @@ java-http-clj/java-http-clj,http://www.github.com/schmee/java-http-clj lambdaisland/regal,https://github.com/lambdaisland/regal listora/again,https://github.com/liwp/again markdown-clj/markdown-clj,https://github.com/yogthos/markdown-clj +meander/epsilon,https://github.com/noprompt/meander medley/medley,https://github.com/weavejester/medley meta-merge/meta-merge,https://github.com/weavejester/meta-merge +metosin/malli,https://github.com/metosin/malli minimallist/minimallist,https://github.com/green-coder/minimallist mvxcvi/arrangement,https://github.com/greglook/clj-arrangement orchestra/orchestra,https://github.com/jeaye/orchestra @@ -79,6 +84,8 @@ org.clojure/math.numeric-tower,https://github.com/clojure/math.numeric-tower org.clojure/test.check,https://github.com/clojure/test.check org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs org.clojure/tools.namespace,https://github.com/babashka/tools.namespace +postmortem/postmortem,https://github.com/athos/Postmortem +prismatic/schema,https://github.com/plumatic/schema progrock/progrock,https://github.com/weavejester/progrock reifyhealth/specmonstah,https://github.com/reifyhealth/specmonstah rewrite-clj/rewrite-clj,https://github.com/clj-commons/rewrite-clj diff --git a/doc/projects.md b/doc/projects.md index 058d23df..f27bbe9e 100644 --- a/doc/projects.md +++ b/doc/projects.md @@ -65,6 +65,7 @@ The following libraries and projects are known to work with babashka. - [Malli](#malli) - [Meander](#meander) - [Schema](#schema) + - [Sluj](#sluj) - [Pods](#pods) - [Projects](#projects-1) - [babashka-test-action](#babashka-test-action) @@ -828,6 +829,10 @@ Tools for transparent data transformation Clojure(Script) library for declarative data description and validation +### [Sluj](https://github.com/rawleyfowler/sluj) + +Sluj is a very small library for converting strings of UTF-16 text to slugs. A slug is a piece of text that is URL safe. + ## Pods [Babashka pods](https://github.com/babashka/babashka.pods) are programs that can diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index b99ea3e5..513917a5 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -172,4 +172,8 @@ :git-sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba" :test-paths ["test"] :test-namespaces [postmortem.core-test postmortem.instrument-test - postmortem.instrument-test]}} + postmortem.instrument-test]} + com.github.rawleyfowler/sluj {:git-url "https://github.com/rawleyfowler/sluj" + :git-sha "4a92e772b4e07bf127423448d4140748b5782198" + :test-paths ["test"] + :test-namespaces [sluj.core-test]}} From fc15eab795a3b012d23f1e38f18056f7f398a642 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 14 Nov 2022 13:54:30 +0100 Subject: [PATCH 463/550] SCI: optimize analysis and eval of fn --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index cfb71252..bcb280e1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit cfb71252378b5c6af75c3bfe6e310bdcdeaa372a +Subproject commit bcb280e1307dec81984315af2c5f2dff9c3a0481 From 85bb1fec76630483e3bb7ebed9f83cfa195f8624 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 14 Nov 2022 14:24:55 +0100 Subject: [PATCH 464/550] SCI changelogs [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index bcb280e1..e2b20a95 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit bcb280e1307dec81984315af2c5f2dff9c3a0481 +Subproject commit e2b20a958cca2dd7c120cdcecb05b53af0303574 From 66e90be6a7d13fc12ea6638cd8e27b5ab6c0a9a6 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 13:01:49 +0100 Subject: [PATCH 465/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index e2b20a95..a0cc0f35 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit e2b20a958cca2dd7c120cdcecb05b53af0303574 +Subproject commit a0cc0f35c6bd8fbf9403baa289d4073d846a7047 From 65d77d3555a45f947b0a3e386a78786694a7a286 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 13:14:51 +0100 Subject: [PATCH 466/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index a0cc0f35..3d633f32 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit a0cc0f35c6bd8fbf9403baa289d4073d846a7047 +Subproject commit 3d633f32fb850728a5ebfeb15df295ad66c31cc3 From 8d514cc98275c16045a36ca28cab1b27b7ac3bac Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 13:56:41 +0100 Subject: [PATCH 467/550] sci [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3d633f32..58c5b3a9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3d633f32fb850728a5ebfeb15df295ad66c31cc3 +Subproject commit 58c5b3a94f3aabbf9a294e417a14a1a581e2e732 From d222b32d7009e43cd0f6aa639bd7e1d39157cb58 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 17:10:52 +0100 Subject: [PATCH 468/550] Upgrade timbre to 6.0.1 (#1419) --- deps.edn | 2 +- project.clj | 2 +- resources/META-INF/babashka/deps.edn | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/deps.edn b/deps.edn index 35f44103..90d20af1 100644 --- a/deps.edn +++ b/deps.edn @@ -45,7 +45,7 @@ hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.1.45"} selmer/selmer {:mvn/version "1.12.50"} - com.taoensso/timbre {:mvn/version "5.2.1"} + com.taoensso/timbre {:mvn/version "6.0.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} diff --git a/project.clj b/project.clj index 32478136..0726898c 100644 --- a/project.clj +++ b/project.clj @@ -68,7 +68,7 @@ :feature/selmer {:source-paths ["feature-selmer"] :dependencies [[selmer/selmer "1.12.50"]]} :feature/logging {:source-paths ["feature-logging"] - :dependencies [[com.taoensso/timbre "5.2.1"] + :dependencies [[com.taoensso/timbre "6.0.1"] [org.clojure/tools.logging "1.1.0"]]} :feature/priority-map {:source-paths ["feature-priority-map"] :dependencies [[org.clojure/data.priority-map "1.1.0"]]} diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index df76cd44..90d20af1 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -45,7 +45,7 @@ hiccup/hiccup {:mvn/version "2.0.0-alpha2"} rewrite-clj/rewrite-clj {:mvn/version "1.1.45"} selmer/selmer {:mvn/version "1.12.50"} - com.taoensso/timbre {:mvn/version "5.2.1"} + com.taoensso/timbre {:mvn/version "6.0.1"} org.clojure/tools.logging {:mvn/version "1.1.0"} org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} @@ -160,7 +160,10 @@ :deps/manifest :deps} clj-commons/fs {:mvn/version "1.6.310"} postmortem/postmortem {:git/url "https://github.com/athos/Postmortem" - :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}} + :git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"} + com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj" + :git/sha "4a92e772b4e07bf127423448d4140748b5782198" + :deps/manifest :deps}} :classpath-overrides {org.clojure/clojure nil org.clojure/spec.alpha nil}} :clj-nvd From 885a82b736508e29b491fce0763b8ad179664500 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 17:48:50 +0100 Subject: [PATCH 469/550] sci docs [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 58c5b3a9..6cdf788a 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 58c5b3a94f3aabbf9a294e417a14a1a581e2e732 +Subproject commit 6cdf788aca5dcd579b77688a4efa24325e7852ff From 0ac4eea9ee2615243b868eb25b9c8777d370e05c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 18:06:16 +0100 Subject: [PATCH 470/550] deps.clj: 1.11.1.1200 --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index aebc6c9a..a481d764 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit aebc6c9a12ce1ab16a35159c660f6b1dfc7a44ee +Subproject commit a481d764199b3feb8fb1871ce7ed09c527c35e2e From e08eab080e621b73ec29e8badb4a36767bdf18f5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 15 Nov 2022 18:09:33 +0100 Subject: [PATCH 471/550] deps.clj [skip ci] --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index a481d764..a195e410 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit a481d764199b3feb8fb1871ce7ed09c527c35e2e +Subproject commit a195e410bfd61b3befcab40915cf6c2e54b0b7ca From 7a22c5fa5a90cf9ac7197c45b48c065771d737fb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 16 Nov 2022 11:11:19 +0100 Subject: [PATCH 472/550] Update fs --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 6e579add..5098aa71 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 6e579addecc91acce5df15e8345b1b470d857755 +Subproject commit 5098aa7187ddb7b6eaf159a5d3dfd95796c7329f From 3751749ca33cb2c526f5f0dd4ddaf85b6cefcc2e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 16 Nov 2022 15:49:07 +0100 Subject: [PATCH 473/550] Update keyword example [skip ci] --- examples/normalize-keywords.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/normalize-keywords.clj b/examples/normalize-keywords.clj index b4b455c7..c11fd01d 100644 --- a/examples/normalize-keywords.clj +++ b/examples/normalize-keywords.clj @@ -3,7 +3,7 @@ [rewrite-clj.node :as node] [rewrite-clj.zip :as z])) -(pods/load-pod 'borkdude/clj-kondo "2021.06.18") +(pods/load-pod 'clj-kondo/clj-kondo "2022.11.02") (require '[pod.borkdude.clj-kondo :as clj-kondo]) From b57981bcd5545ee0b223a3dfa51f15a023fbc407 Mon Sep 17 00:00:00 2001 From: Max Penet Date: Wed, 16 Nov 2022 17:01:39 +0100 Subject: [PATCH 474/550] make normalize-keywords walk clj[cdx]? files in specified location (#1420) [skip ci] --- examples/normalize-keywords.clj | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/normalize-keywords.clj b/examples/normalize-keywords.clj index c11fd01d..d6292f8a 100644 --- a/examples/normalize-keywords.clj +++ b/examples/normalize-keywords.clj @@ -1,5 +1,6 @@ (ns normalize-keywords (:require [babashka.pods :as pods] + [clojure.java.io :as io] [rewrite-clj.node :as node] [rewrite-clj.zip :as z])) @@ -9,10 +10,9 @@ (def code (first *command-line-args*)) -(def findings - (->> (with-in-str code - (clj-kondo/run! {:lint [code] - :config {:output {:analysis {:keywords true}}}})) +(defn findings [file-path] + (->> (clj-kondo/run! {:lint [file-path] + :config {:output {:analysis {:keywords true}}}}) :analysis :keywords (filter (some-fn :alias :auto-resolved)))) @@ -33,6 +33,11 @@ zloc (z/replace zloc (node/coerce k))] (recur zloc (next findings))) (recur (z/next zloc) findings))) - (println (str (z/root zloc)))))) + (str (z/root zloc))))) -(remove-locs (z/of-file code) findings) +(doseq [f (file-seq (io/file code)) + :when (re-find #"\.clj[cdx]?$" (str f)) + :let [file-path (str f)]] + (when-let [findings' (findings file-path)] + (prn (format "Rewriting %s" file-path)) + (spit f (remove-locs (z/of-file file-path) findings')))) From 759d977879c54b378b4aa5290d9e370f3f475d68 Mon Sep 17 00:00:00 2001 From: Max Penet Date: Wed, 16 Nov 2022 17:13:13 +0100 Subject: [PATCH 475/550] allow normalize-keywords to work on cljs files (#1421) [skip ci] --- examples/normalize-keywords.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/normalize-keywords.clj b/examples/normalize-keywords.clj index d6292f8a..af3ff329 100644 --- a/examples/normalize-keywords.clj +++ b/examples/normalize-keywords.clj @@ -36,7 +36,7 @@ (str (z/root zloc))))) (doseq [f (file-seq (io/file code)) - :when (re-find #"\.clj[cdx]?$" (str f)) + :when (re-find #"\.clj[cdsx]?$" (str f)) :let [file-path (str f)]] (when-let [findings' (findings file-path)] (prn (format "Rewriting %s" file-path)) From b7e327c6907a0c8aad4687759667964dd5c053bb Mon Sep 17 00:00:00 2001 From: samrose Date: Thu, 17 Nov 2022 10:58:20 -0500 Subject: [PATCH 476/550] refactor: propose changing to working example found at (#1422) --- CHANGELOG.md | 2 +- doc/nix.md | 36 ++---------------------------------- 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0d8f76..48fd22e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ A preview of the next release can be installed from - Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix - [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map - [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek)) - +- Update nix app example in docs ## 1.0.165 (2022-11-01) - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method diff --git a/doc/nix.md b/doc/nix.md index 68b26178..25dcb3ec 100644 --- a/doc/nix.md +++ b/doc/nix.md @@ -81,39 +81,7 @@ After running `direnv allow`, babashka should be available on the `$PATH`, when You can write babashka scripts with native dependencies using [WriteBabashkaApplication](https://github.com/sohalt/write-babashka-application). -Here is an example `flake.nix` using `cowsay` as an external dependency: +The WriteBabashkaApplication repository has an [example](https://github.com/Sohalt/write-babashka-application/tree/main/example) `flake.nix` using `cowsay` as an external dependency. -```nix -{ - inputs.wbba.url = "github:sohalt/write-babashka-application"; - inputs.flake-utils.url = "github:numtide/flake-utils"; - outputs = { nixpkgs, flake-utils, wbba, ... }: - flake-utils.lib.eachDefaultSystem (system: - let - pkgs = import nixpkgs { - inherit system; - overlays = [ wbba.overlay ]; - }; - hello-babashka = pkgs.writeBabashkaApplication { - name = "hello"; - runtimeInputs = with pkgs;[ - cowsay # add your dependencies here - ]; - text = '' - (ns hello - (:require [babashka.process :refer [sh]])) - (-> (sh ["cowsay" "hello from babashka"]) - :out - print) - ''; - }; - in - { - defaultApp = hello-babashka; - defaultPackage = hello-babashka; - }); -} -``` - -You can then build the application using `nix build` or run it using `nix run`. +You can download that example, and then build the application using `nix build` or run it using `nix run`. From 326b1def6b1ba476b445d58c954f0c8c78751dbc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 17 Nov 2022 21:20:19 +0100 Subject: [PATCH 477/550] Add java.net.URLClassLoader for compatibility with java.classpath lib --- src/babashka/impl/classes.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index dc1c725e..9e8e1792 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -549,6 +549,7 @@ java.lang.LinkageError java.lang.ThreadDeath java.lang.VirtualMachineError + java.net.URLClassLoader java.sql.Timestamp java.util.concurrent.TimeoutException java.util.Collection From 495ded8a50e605b7ea5ea98e59133f5afd2db1ea Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 18 Nov 2022 23:43:42 +0100 Subject: [PATCH 478/550] Compatibility with cognitest test runner and tools.namespace (#1423) --- CHANGELOG.md | 2 + deps.edn | 6 +- project.clj | 2 +- sci | 2 +- script/install-clojure | 2 +- script/lib_tests/run_all_libtests | 2 +- src/babashka/impl/clojure/tools/reader.clj | 56 ++++ .../impl/clojure/tools/reader_types.clj | 3 +- src/babashka/main.clj | 2 + test-resources/lib_tests/bb-tested-libs.edn | 14 +- .../tools/namespace/dependency_test.clj | 315 ------------------ .../clojure/tools/namespace/dir_test.clj | 20 -- .../clojure/tools/namespace/find_test.clj | 29 -- .../clojure/tools/namespace/move_test.clj | 52 --- .../clojure/tools/namespace/parse_test.clj | 210 ------------ .../clojure/tools/namespace/test_helpers.clj | 82 ----- .../test_runner/sample_property_test.clj | 10 - .../cognitect/test_runner/samples_test.clj | 14 - .../lib_tests/cognitect/test_runner_test.clj | 23 -- 19 files changed, 80 insertions(+), 766 deletions(-) create mode 100644 src/babashka/impl/clojure/tools/reader.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/dir_test.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/find_test.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/move_test.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/parse_test.clj delete mode 100644 test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj delete mode 100644 test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj delete mode 100644 test-resources/lib_tests/cognitect/test_runner/samples_test.clj delete mode 100644 test-resources/lib_tests/cognitect/test_runner_test.clj diff --git a/CHANGELOG.md b/CHANGELOG.md index 48fd22e6..6c57bec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,12 @@ A preview of the next release can be installed from ## Unreleased - Add `run-test` and `run-test-var` to `clojure.test` +- Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace) - Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix - [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map - [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek)) - Update nix app example in docs + ## 1.0.165 (2022-11-01) - Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method diff --git a/deps.edn b/deps.edn index 90d20af1..eb07e9a8 100644 --- a/deps.edn +++ b/deps.edn @@ -113,9 +113,11 @@ environ/environ {:mvn/version "1.2.0"} table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"} markdown-clj/markdown-clj {:mvn/version "1.10.8"} - org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"} + org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32", + :git/url "https://github.com/clojure/tools.namespace"} medley/medley {:mvn/version "1.3.0"} - io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"} + io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner", + :git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"} borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"} dev.nubank/docopt {:mvn/version "0.6.1-fix7"} testdoc/testdoc {:mvn/version "1.4.1"} diff --git a/project.clj b/project.clj index 0726898c..106731db 100644 --- a/project.clj +++ b/project.clj @@ -19,7 +19,7 @@ :test-selectors {:default (complement :windows-only) :windows (complement :skip-windows)} :dependencies [[org.clojure/clojure "1.11.1"] - [borkdude/edamame "1.0.0"] + [borkdude/edamame "1.0.16"] [borkdude/graal.locking "0.0.2"] [org.clojure/tools.cli "1.0.214"] [cheshire "5.11.0"] diff --git a/sci b/sci index 6cdf788a..71782ebb 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6cdf788aca5dcd579b77688a4efa24325e7852ff +Subproject commit 71782ebbeb43927780570a67a6b119a7b428a495 diff --git a/script/install-clojure b/script/install-clojure index 40b096a7..d0d5e24b 100755 --- a/script/install-clojure +++ b/script/install-clojure @@ -2,7 +2,7 @@ set -euo pipefail -CLOJURE_TOOLS_VERSION="1.10.3.1040" +CLOJURE_TOOLS_VERSION="1.11.1.1200" install_dir="${1:-/usr/local}" mkdir -p "$install_dir" diff --git a/script/lib_tests/run_all_libtests b/script/lib_tests/run_all_libtests index 99f55079..a5409d57 100755 --- a/script/lib_tests/run_all_libtests +++ b/script/lib_tests/run_all_libtests @@ -9,7 +9,7 @@ else fi export BABASHKA_CLASSPATH -BABASHKA_CLASSPATH=$(clojure -A:lib-tests -Spath) +BABASHKA_CLASSPATH=$(clojure -Spath -A:lib-tests) $BB_CMD -cp "$BABASHKA_CLASSPATH" \ -f "test-resources/lib_tests/babashka/run_all_libtests.clj" "$@" diff --git a/src/babashka/impl/clojure/tools/reader.clj b/src/babashka/impl/clojure/tools/reader.clj new file mode 100644 index 00000000..29f67289 --- /dev/null +++ b/src/babashka/impl/clojure/tools/reader.clj @@ -0,0 +1,56 @@ +(ns babashka.impl.clojure.tools.reader + (:refer-clojure :exclude [read]) + (:require + [edamame.core :as e] + [sci.core :as sci] + [clojure.tools.reader.reader-types :as rt])) + +(def rns (sci/create-ns 'clojure.tools.reader)) + +(def default-opts + (e/normalize-opts + {:all true + :row-key :line + :col-key :column + :location? seq? + :end-location false})) + +;; Added for compatibility with tools.namespace +(defn read + "Reads the first object from an IPushbackReader or a java.io.PushbackReader. + Returns the object read. If EOF, throws if eof-error? is true. + Otherwise returns sentinel. If no stream is provided, *in* will be used. + Opts is a persistent map with valid keys: + :read-cond - :allow to process reader conditionals, or + :preserve to keep all branches + :features - persistent set of feature keywords for reader conditionals + :eof - on eof, return value unless :eofthrow, then throw. + if not specified, will throw + ***WARNING*** + Note that read can execute code (controlled by *read-eval*), + and as such should be used only with trusted sources. + To read data structures only, use clojure.tools.reader.edn/read + Note that the function signature of clojure.tools.reader/read and + clojure.tools.reader.edn/read is not the same for eof-handling" + {:arglists '([] [reader] [opts reader] [reader eof-error? eof-value])} + ([] (read @sci/in true nil)) + ([reader] (read reader true nil)) + ([{eof :eof :as opts :or {eof :eofthrow}} reader] + (let [opts (assoc default-opts + :read-cond (:read-cond opts) + :features (:features opts)) + v (e/parse-next reader opts)] + (if (identical? ::e/eof v) + (if (identical? :eofthrow eof) + (throw (java.io.EOFException.)) + eof) + v))) + ([reader eof-error? sentinel] + (let [v (e/parse-next reader default-opts)] + (if (identical? ::e/eof v) + (if eof-error? + (throw (java.io.EOFException.)) + sentinel) + v)))) + +(def reader-namespace {'read (sci/copy-var read rns)}) diff --git a/src/babashka/impl/clojure/tools/reader_types.clj b/src/babashka/impl/clojure/tools/reader_types.clj index c88f036d..4d45ee25 100644 --- a/src/babashka/impl/clojure/tools/reader_types.clj +++ b/src/babashka/impl/clojure/tools/reader_types.clj @@ -13,4 +13,5 @@ 'peek-char (sci/copy-var rt/peek-char rtns) 'read-char (sci/copy-var rt/read-char rtns) 'unread (sci/copy-var rt/unread rtns) - 'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)}) + 'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns) + 'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)}) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index b7514eb1..42ef4266 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -20,6 +20,7 @@ [babashka.impl.clojure.main :as clojure-main :refer [demunge]] [babashka.impl.clojure.math :refer [math-namespace]] [babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]] + [babashka.impl.clojure.tools.reader :refer [reader-namespace]] [babashka.impl.clojure.tools.reader-types :refer [edn-namespace reader-types-namespace]] [babashka.impl.clojure.zip :refer [zip-namespace]] @@ -392,6 +393,7 @@ Use bb run --help to show this help output. 'babashka.tasks tasks-namespace 'clojure.tools.reader.edn edn-namespace 'clojure.tools.reader.reader-types reader-types-namespace + 'clojure.tools.reader reader-namespace 'clojure.core.async async-namespace 'clojure.core.async.impl.protocols async-protocols-namespace 'rewrite-clj.node rewrite/node-namespace diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 513917a5..d549dfa2 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -20,8 +20,6 @@ ;; BB-TEST-PATCH: Removed markdown.md-file-test b/c tests hardcode path to test ;; files. Removed markdown.benchmark b/c it depends on criterium which isn't bb compatible markdown-clj/markdown-clj {:git-sha "ac245d3049afa25a6d41fcb5ba5a268f52c610e4", :git-url "https://github.com/yogthos/markdown-clj", :test-namespaces (markdown.md-test)} - ;; BB-TEST-PATCH: Removed clojure.tools.namespace.dir-test as it fails on windows - org.clojure/tools.namespace {:git-sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b", :git-url "https://github.com/babashka/tools.namespace", :test-namespaces (clojure.tools.namespace.test-helpers clojure.tools.namespace.dependency-test clojure.tools.namespace.find-test clojure.tools.namespace.move-test clojure.tools.namespace.parse-test), :branch "babashka"} com.stuartsierra/component {:git-sha "9f9653d1d95644e3c30beadf8c8811f86758ea23", :git-url "https://github.com/stuartsierra/component", :test-namespaces (com.stuartsierra.component-test)} slingshot/slingshot {:git-sha "6961ab0593ab9633c15b7697ffd43823090720be", :git-url "https://github.com/scgilardi/slingshot", :test-namespaces (slingshot.slingshot-test slingshot.support-test slingshot.test-test)} rm-hull/jasentaa {:git-sha "f52a0e75cbdf1d2b72d9604232db264ff6473f12", :git-url "https://github.com/rm-hull/jasentaa", :test-namespaces (jasentaa.position-test jasentaa.worked-example-2 jasentaa.collections-test jasentaa.parser.basic-test jasentaa.parser.combinators-test jasentaa.test-helpers jasentaa.worked-example-1)} @@ -71,7 +69,6 @@ cprop/cprop {:git-url "https://github.com/tolitius/cprop", :test-namespaces [cprop.smoke-test], :manually-added true} org.clojure/data.zip {:git-url "https://github.com/clojure/data.zip", :test-namespaces [clojure.data.zip-test], :manually-added true} borkdude/deps {:git-url "https://github.com/borkdude/deps.clj", :test-namespaces [borkdude.deps.smoke-test], :manually-added true} - io.github.cognitect-labs/test-runner {:git-url "https://github.com/cognitect-labs/test-runner", :test-namespaces (cognitect.test-runner.samples-test cognitect.test-runner.sample-property-test cognitect.test-runner-test), :git-sha "cc75980b43011773162b485f46f939dc5fba91e4"} borkdude/missing.test.assertions {:git-url "https://github.com/borkdude/missing.test.assertions", :test-namespaces (missing.test.assertions-test missing.test.old-methods), :git-sha "603cb01bee72fb17addacc53c34c85612684ad70"} ;; No tests to run io.github.technomancy/limit-break {:git-url "https://github.com/technomancy/limit-break", :test-namespaces [], :manually-added true} @@ -176,4 +173,13 @@ com.github.rawleyfowler/sluj {:git-url "https://github.com/rawleyfowler/sluj" :git-sha "4a92e772b4e07bf127423448d4140748b5782198" :test-paths ["test"] - :test-namespaces [sluj.core-test]}} + :test-namespaces [sluj.core-test]} + io.github.cognitect-labs/test-runner {:git-url "https://github.com/cognitect-labs/test-runner", + :git-sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023" + :test-namespaces [cognitect.test-runner.samples-test cognitect.test-runner.sample-property-test cognitect.test-runner-test], + :test-paths ["test"]} + ;; BB-TEST-PATCH: Removed clojure.tools.namespace.dir-test as it fails on windows + org.clojure/tools.namespace {:git-sha "daf82a10e70182aea4c0716a48f3922163441b32", + :git-url "https://github.com/clojure/tools.namespace", + :test-namespaces [clojure.tools.namespace.test-helpers clojure.tools.namespace.dependency-test clojure.tools.namespace.find-test clojure.tools.namespace.move-test clojure.tools.namespace.parse-test], + :test-paths ["src/test/clojure"]}} diff --git a/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj b/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj deleted file mode 100644 index 5aedb27f..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj +++ /dev/null @@ -1,315 +0,0 @@ -(ns clojure.tools.namespace.dependency-test - (:use clojure.test - clojure.tools.namespace.dependency)) - -;; building a graph like: -;; -;; :a -;; / | -;; :b | -;; \ | -;; :c -;; | -;; :d -;; -(def g1 (-> (graph) - (depend :b :a) ; "B depends on A" - (depend :c :b) ; "C depends on B" - (depend :c :a) ; "C depends on A" - (depend :d :c))) ; "D depends on C" - -;; 'one 'five -;; | | -;; 'two | -;; / \ | -;; / \ | -;; / \ / -;; 'three 'four -;; | / -;; 'six / -;; | / -;; | / -;; | / -;; 'seven -;; -(def g2 (-> (graph) - (depend 'two 'one) - (depend 'three 'two) - (depend 'four 'two) - (depend 'four 'five) - (depend 'six 'three) - (depend 'seven 'six) - (depend 'seven 'four))) - -;; :level0 -;; / | | \ -;; ----- | | ----- -;; / | | \ -;; :level1a :level1b :level1c :level1d -;; \ | | / -;; ----- | | ----- -;; \ | | / -;; :level2 -;; / | | \ -;; ----- | | ----- -;; / | | \ -;; :level3a :level3b :level3c :level3d -;; \ | | / -;; ----- | | ----- -;; \ | | / -;; :level4 -;; -;; ... and so on in a repeating pattern like that, up to :level26 - -(def g3 (-> (graph) - (depend :level1a :level0) - (depend :level1b :level0) - (depend :level1c :level0) - (depend :level1d :level0) - (depend :level2 :level1a) - (depend :level2 :level1b) - (depend :level2 :level1c) - (depend :level2 :level1d) - - (depend :level3a :level2) - (depend :level3b :level2) - (depend :level3c :level2) - (depend :level3d :level2) - (depend :level4 :level3a) - (depend :level4 :level3b) - (depend :level4 :level3c) - (depend :level4 :level3d) - - (depend :level5a :level4) - (depend :level5b :level4) - (depend :level5c :level4) - (depend :level5d :level4) - (depend :level6 :level5a) - (depend :level6 :level5b) - (depend :level6 :level5c) - (depend :level6 :level5d) - - (depend :level7a :level6) - (depend :level7b :level6) - (depend :level7c :level6) - (depend :level7d :level6) - (depend :level8 :level7a) - (depend :level8 :level7b) - (depend :level8 :level7c) - (depend :level8 :level7d) - - (depend :level9a :level8) - (depend :level9b :level8) - (depend :level9c :level8) - (depend :level9d :level8) - (depend :level10 :level9a) - (depend :level10 :level9b) - (depend :level10 :level9c) - (depend :level10 :level9d) - - (depend :level11a :level10) - (depend :level11b :level10) - (depend :level11c :level10) - (depend :level11d :level10) - (depend :level12 :level11a) - (depend :level12 :level11b) - (depend :level12 :level11c) - (depend :level12 :level11d) - - (depend :level13a :level12) - (depend :level13b :level12) - (depend :level13c :level12) - (depend :level13d :level12) - (depend :level14 :level13a) - (depend :level14 :level13b) - (depend :level14 :level13c) - (depend :level14 :level13d) - - (depend :level15a :level14) - (depend :level15b :level14) - (depend :level15c :level14) - (depend :level15d :level14) - (depend :level16 :level15a) - (depend :level16 :level15b) - (depend :level16 :level15c) - (depend :level16 :level15d) - - (depend :level17a :level16) - (depend :level17b :level16) - (depend :level17c :level16) - (depend :level17d :level16) - (depend :level18 :level17a) - (depend :level18 :level17b) - (depend :level18 :level17c) - (depend :level18 :level17d) - - (depend :level19a :level18) - (depend :level19b :level18) - (depend :level19c :level18) - (depend :level19d :level18) - (depend :level20 :level19a) - (depend :level20 :level19b) - (depend :level20 :level19c) - (depend :level20 :level19d) - - (depend :level21a :level20) - (depend :level21b :level20) - (depend :level21c :level20) - (depend :level21d :level20) - (depend :level22 :level21a) - (depend :level22 :level21b) - (depend :level22 :level21c) - (depend :level22 :level21d) - - (depend :level23a :level22) - (depend :level23b :level22) - (depend :level23c :level22) - (depend :level23d :level22) - (depend :level24 :level23a) - (depend :level24 :level23b) - (depend :level24 :level23c) - (depend :level24 :level23d) - - (depend :level25a :level24) - (depend :level25b :level24) - (depend :level25c :level24) - (depend :level25d :level24) - (depend :level26 :level25a) - (depend :level26 :level25b) - (depend :level26 :level25c) - (depend :level26 :level25d))) - -(deftest t-transitive-dependencies - (is (= #{:a :c :b} - (transitive-dependencies g1 :d))) - (is (= '#{two four six one five three} - (transitive-dependencies g2 'seven)))) - -(deftest t-transitive-dependencies-deep - (is (= #{:level0 - :level1a :level1b :level1c :level1d - :level2 - :level3a :level3b :level3c :level3d - :level4 - :level5a :level5b :level5c :level5d - :level6 - :level7a :level7b :level7c :level7d - :level8 - :level9a :level9b :level9c :level9d - :level10 - :level11a :level11b :level11c :level11d - :level12 - :level13a :level13b :level13c :level13d - :level14 - :level15a :level15b :level15c :level15d - :level16 - :level17a :level17b :level17c :level17d - :level18 - :level19a :level19b :level19c :level19d - :level20 - :level21a :level21b :level21c :level21d - :level22 - :level23a :level23b :level23c :level23d} - (transitive-dependencies g3 :level24))) - (is (= #{:level0 - :level1a :level1b :level1c :level1d - :level2 - :level3a :level3b :level3c :level3d - :level4 - :level5a :level5b :level5c :level5d - :level6 - :level7a :level7b :level7c :level7d - :level8 - :level9a :level9b :level9c :level9d - :level10 - :level11a :level11b :level11c :level11d - :level12 - :level13a :level13b :level13c :level13d - :level14 - :level15a :level15b :level15c :level15d - :level16 - :level17a :level17b :level17c :level17d - :level18 - :level19a :level19b :level19c :level19d - :level20 - :level21a :level21b :level21c :level21d - :level22 - :level23a :level23b :level23c :level23d - :level24 - :level25a :level25b :level25c :level25d} - (transitive-dependencies g3 :level26)))) - - -(deftest t-transitive-dependents - (is (= '#{four seven} - (transitive-dependents g2 'five))) - (is (= '#{four seven six three} - (transitive-dependents g2 'two)))) - -(defn- before? - "True if x comes before y in an ordered collection." - [coll x y] - (loop [[item & more] (seq coll)] - (cond (nil? item) true ; end of the seq - (= x item) true ; x comes first - (= y item) false - :else (recur more)))) - -(deftest t-before - (is (true? (before? [:a :b :c :d] :a :b))) - (is (true? (before? [:a :b :c :d] :b :c))) - (is (false? (before? [:a :b :c :d] :d :c))) - (is (false? (before? [:a :b :c :d] :c :a)))) - -(deftest t-topo-comparator-1 - (let [sorted (sort (topo-comparator g1) [:d :a :b :foo])] - (are [x y] (before? sorted x y) - :a :b - :a :d - :a :foo - :b :d - :b :foo - :d :foo))) - -(deftest t-topo-comparator-2 - (let [sorted (sort (topo-comparator g2) '[three seven nine eight five])] - (are [x y] (before? sorted x y) - 'three 'seven - 'three 'eight - 'three 'nine - 'five 'eight - 'five 'nine - 'seven 'eight - 'seven 'nine))) - -(deftest t-topo-sort - (let [sorted (topo-sort g2)] - (are [x y] (before? sorted x y) - 'one 'two - 'one 'three - 'one 'four - 'one 'six - 'one 'seven - 'two 'three - 'two 'four - 'two 'six - 'two 'seven - 'three 'six - 'three 'seven - 'four 'seven - 'five 'four - 'five 'seven - 'six 'seven))) - -(deftest t-no-cycles - (is (thrown? Exception - (-> (graph) - (depend :a :b) - (depend :b :c) - (depend :c :a))))) - -(deftest t-no-self-cycles - (is (thrown? Exception - (-> (graph) - (depend :a :b) - (depend :a :a))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj b/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj deleted file mode 100644 index 60e56427..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj +++ /dev/null @@ -1,20 +0,0 @@ -(ns clojure.tools.namespace.dir-test - (:require [clojure.test :refer [deftest is]] - [clojure.tools.namespace.test-helpers :as help] - [clojure.tools.namespace.dir :as dir]) - (:import - (java.io File))) - -;; Only run this test on Java 1.7+, where java.nio.file.Files is available. -(when (try (Class/forName "java.nio.file.Files") - (catch ClassNotFoundException _ false)) - (deftest t-scan-by-canonical-path - (let [dir (help/create-temp-dir "t-scan-by-canonical-path") - main-clj (help/create-source dir 'example.main :clj '[example.one]) - one-cljc (help/create-source dir 'example.one :clj) - other-dir (help/create-temp-dir "t-scan-by-canonical-path-other") - link (File. other-dir "link")] - (java.nio.file.Files/createSymbolicLink (.toPath link) (.toPath dir) - (make-array java.nio.file.attribute.FileAttribute 0)) - (is (= (::dir/files (dir/scan-dirs {} [dir])) - (::dir/files (dir/scan-dirs {} [link]))))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/find_test.clj b/test-resources/lib_tests/clojure/tools/namespace/find_test.clj deleted file mode 100644 index d081e84a..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/find_test.clj +++ /dev/null @@ -1,29 +0,0 @@ -(ns clojure.tools.namespace.find-test - (:require [clojure.test :refer [deftest is]] - [clojure.tools.namespace.test-helpers :as help] - [clojure.tools.namespace.find :as find]) - (:import (java.io File))) - -(deftest t-find-clj-and-cljc-files - "main.clj depends on one.cljc which depends on two.clj. - two.cljs also exists but should not be returned" - (let [dir (help/create-temp-dir "t-find-clj-and-cljc-files") - main-clj (help/create-source dir 'example.main :clj '[example.one]) - one-cljc (help/create-source dir 'example.one :cljc '[example.two]) - two-clj (help/create-source dir 'example.two :clj) - two-cljs (help/create-source dir 'example.two :cljs)] - (is (help/same-files? - [main-clj one-cljc two-clj] - (find/find-sources-in-dir dir))))) - -(deftest t-find-cljs-and-cljc-files - "main.cljs depends on one.cljc which depends on two.cljs. - two.clj also exists but should not be returned" - (let [dir (help/create-temp-dir "t-find-cljs-and-cljc-files") - main-cljs (help/create-source dir 'example.main :cljs '[example.one]) - one-cljc (help/create-source dir 'example.one :cljc '[example.two]) - two-clj (help/create-source dir 'example.two :clj) - two-cljs (help/create-source dir 'example.two :cljs)] - (is (help/same-files? - [main-cljs one-cljc two-cljs] - (find/find-sources-in-dir dir find/cljs))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/move_test.clj b/test-resources/lib_tests/clojure/tools/namespace/move_test.clj deleted file mode 100644 index 47de7ac4..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/move_test.clj +++ /dev/null @@ -1,52 +0,0 @@ -(ns clojure.tools.namespace.move-test - (:require [clojure.java.io :as io] - [clojure.test :refer [deftest is]] - [clojure.tools.namespace.move :refer [move-ns]] - [clojure.tools.namespace.test-helpers :as help]) - (:import (java.io File))) - -(defn- create-file-one [dir] - (help/create-source dir 'example.one :clj - '[example.two example.three] - '[(defn foo [] - (example.a.four/foo))])) - -(defn- create-file-two [dir] - (help/create-source dir 'example.two :clj - '[example.three example.a.four])) - -(defn- create-file-three [dir] - (help/create-source dir 'example.three :clj - '[example.five])) - -(defn- create-file-four [dir] - (help/create-source dir 'example.a.four :clj)) - -(deftest t-move-ns - (let [temp-dir (help/create-temp-dir "tools-namespace-t-move-ns") - src-dir (io/file temp-dir "src") - example-dir (io/file temp-dir "src" "example") - file-one (create-file-one src-dir) - file-two (create-file-two src-dir) - file-three (create-file-three src-dir) - old-file-four (create-file-four src-dir) - new-file-four (io/file example-dir "b" "four.clj")] - - (let [file-three-last-modified (.lastModified file-three)] - - (Thread/sleep 1500) ;; ensure file timestamps are different - - (move-ns 'example.a.four 'example.b.four src-dir [src-dir]) - - (is (.exists new-file-four) - "new file should exist") - (is (not (.exists old-file-four)) - "old file should not exist") - (is (not (.exists (.getParentFile old-file-four))) - "old empty directory should not exist") - (is (= file-three-last-modified (.lastModified file-three)) - "unaffected file should not have been modified") - (is (not-any? #(.contains (slurp %) "example.a.four") - [file-one file-two file-three new-file-four])) - (is (every? #(.contains (slurp %) "example.b.four") - [file-one file-two new-file-four]))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj b/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj deleted file mode 100644 index b6ac6aaa..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj +++ /dev/null @@ -1,210 +0,0 @@ -(ns clojure.tools.namespace.parse-test - (:use [clojure.test :only (deftest is)] - [clojure.tools.namespace.parse :only (deps-from-ns-decl - read-ns-decl)])) - -(def ns-decl-prefix-list - '(ns com.example.one - (:require (com.example two - [three :as three] - [four :refer (a b)]) - (com.example.sub [five :as five] - six)) - (:use (com.example seven - [eight :as eight] - (nine :only (c d)) - [ten])))) - -;; Some people like to write prefix lists as vectors, not lists. The -;; use/require functions accept this form. -(def ns-decl-prefix-list-as-vector - '(ns com.example.one - (:require [com.example - two - [three :as three] - [four :refer (a b)]] - [com.example.sub - [five :as five] - six]) - (:use [com.example - seven - [eight :as eight] - (nine :only (c d)) - [ten]]))) - -(def ns-decl-prefix-list-clauses-as-vectors - "Sometimes people even write the clauses inside ns as vectors, which - clojure.core/ns allows. See TNS-21." - '(ns com.example.one - [:require [com.example - two - [three :as three] - [four :refer (a b)]] - [com.example.sub - [five :as five] - six]] - [:use [com.example - seven - [eight :as eight] - (nine :only (c d)) - [ten]]])) - -(def deps-from-prefix-list - '#{com.example.two - com.example.three - com.example.four - com.example.sub.five - com.example.sub.six - com.example.seven - com.example.eight - com.example.nine - com.example.ten}) - -(deftest t-prefix-list - (is (= deps-from-prefix-list - (deps-from-ns-decl ns-decl-prefix-list)))) - -(deftest t-prefix-list-as-vector - (is (= deps-from-prefix-list - (deps-from-ns-decl ns-decl-prefix-list-as-vector)))) - -(deftest t-prefix-list-clauses-as-vectors - (is (= deps-from-prefix-list - (deps-from-ns-decl ns-decl-prefix-list-clauses-as-vectors)))) - -(deftest t-no-deps-returns-empty-set - (is (= #{} (deps-from-ns-decl '(ns com.example.one))))) - -(def multiple-ns-decls - '((ns one) - (ns two (:require one)) - (ns three (:require [one :as o] [two :as t])))) - -(def multiple-ns-decls-string -" (println \"Code before first ns\") - (ns one) - (println \"Some code\") - (defn hello-world [] \"Hello, World!\") - (ns two (:require one)) - (println \"Some more code\") - (ns three (:require [one :as o] [two :as t]))") - -(deftest t-read-multiple-ns-decls - (with-open [rdr (clojure.lang.LineNumberingPushbackReader. - (java.io.PushbackReader. - (java.io.StringReader. multiple-ns-decls-string)))] - (is (= multiple-ns-decls - (take-while identity (repeatedly #(read-ns-decl rdr))))))) - -(def ns-docstring-example - "The example ns declaration used in the docstring of clojure.core/ns" - '(ns foo.bar - (:refer-clojure :exclude [ancestors printf]) - (:require (clojure.contrib sql combinatorics)) - (:use (my.lib this that)) - (:import (java.util Date Timer Random) - (java.sql Connection Statement)))) - -(def deps-from-ns-docstring-example - '#{clojure.contrib.sql - clojure.contrib.combinatorics - my.lib.this - my.lib.that}) - -(deftest t-ns-docstring-example - (is (= deps-from-ns-docstring-example - (deps-from-ns-decl ns-docstring-example)))) - -(def require-docstring-example - "The example ns declaration used in the docstring of - clojure.core/require" - '(ns (:require (clojure zip [set :as s])))) - -(def deps-from-require-docstring-example - '#{clojure.zip - clojure.set}) - -(deftest t-require-docstring-example - (is (= deps-from-require-docstring-example - (deps-from-ns-decl require-docstring-example)))) - -(def multiple-clauses - "Example showing more than one :require or :use clause in one ns - declaration, which clojure.core/ns allows." - '(ns foo.bar - (:require com.example.one) - (:import java.io.File) - (:require (com.example two three)) - (:use (com.example [four :only [x]])) - (:use (com.example (five :only [x]))))) - -(def deps-from-multiple-clauses - '#{com.example.one - com.example.two - com.example.three - com.example.four - com.example.five}) - -(deftest t-deps-from-multiple-clauses - (is (= deps-from-multiple-clauses - (deps-from-ns-decl multiple-clauses)))) - -(def clauses-without-keywords - "Example of require/use clauses with symbols instead of keywords, - which clojure.core/ns allows." - '(ns foo.bar - (require com.example.one) - (import java.io.File) - (use (com.example (prefixes (two :only [x]) - three))))) - -(def deps-from-clauses-without-keywords - '#{com.example.one - com.example.prefixes.two - com.example.prefixes.three}) - -(deftest t-clauses-without-keywords - (is (= deps-from-clauses-without-keywords - (deps-from-ns-decl clauses-without-keywords)))) - -(def reader-conditionals-string - "(ns com.examples.one - (:require #?(:clj clojure.string - :cljs goog.string)))") - -(deftest t-reader-conditionals - ;; TODO: the predicate wasn't added to bb yet, will come in version after 0.6.7 - (when true #_(resolve 'clojure.core/reader-conditional?) - (let [actual (-> reader-conditionals-string - java.io.StringReader. - java.io.PushbackReader. - clojure.lang.LineNumberingPushbackReader. - read-ns-decl - deps-from-ns-decl)] - (is (= #{'clojure.string} actual))))) - -(def ns-with-npm-dependency - "(ns com.examples.one - (:require [\"foobar\"] [baz]))") - -(deftest npm-dependency - (let [actual (-> ns-with-npm-dependency - java.io.StringReader. - java.io.PushbackReader. - clojure.lang.LineNumberingPushbackReader. - read-ns-decl - deps-from-ns-decl)] - (is (= #{'baz} actual)))) - -(def ns-with-require-macros - "(ns com.examples.one - (:require-macros [foo :refer [bar]]))") - -(deftest require-macros - (let [actual (-> ns-with-require-macros - java.io.StringReader. - java.io.PushbackReader. - clojure.lang.LineNumberingPushbackReader. - read-ns-decl - deps-from-ns-decl)] - (is (= #{'foo} actual)))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj b/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj deleted file mode 100644 index 62679e69..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj +++ /dev/null @@ -1,82 +0,0 @@ -(ns clojure.tools.namespace.test-helpers - "Utilities to help with testing files and namespaces." - (:require [clojure.java.io :as io] - [clojure.string :as string]) - (:import (java.io Closeable File Writer PrintWriter))) - -(defn create-temp-dir - "Creates and returns a new temporary directory java.io.File." - [name] - (let [temp-file (File/createTempFile name nil)] - (.delete temp-file) - (.mkdirs temp-file) - (println "Temporary directory" (.getAbsolutePath temp-file)) - temp-file)) - -(defn- write-contents - "Writes contents into writer. Strings are written as-is via println, - other types written as by prn." - [^Writer writer contents] - {:pre [(sequential? contents)]} - (binding [*out* (PrintWriter. writer)] - (doseq [content contents] - (if (string? content) - (println content) - (prn content)) - (newline)))) - -(defn create-file - "Creates a file from a vector of path elements. Writes contents into - the file. Elements of contents may be data, written via prn, or - strings, written directly." - [path contents] - {:pre [(vector? path)]} - (let [^File file (apply io/file path)] - (when-let [parent (.getParentFile file)] - (.mkdirs parent)) - (with-open [wtr (io/writer file)] - (write-contents wtr contents)) - file)) - -(defn- sym->path - "Converts a symbol name into a vector of path parts, not including - file extension." - [symbol] - {:pre [(symbol? symbol)] - :post [(vector? %)]} - (-> (name symbol) - (string/replace \- \_) - (string/split #"\."))) - -(defn- source-path - "Returns a vector of path components for namespace named sym, - with given file extension (keyword)." - [sym extension] - (let [path (sym->path sym) - basename (peek path) - filename (str basename \. (name extension))] - (conj (pop path) filename))) - -(defn create-source - "Creates a file at the correct path under base-dir for a namespace - named sym, with file extension (keyword), containing a ns - declaration which :require's the dependencies (symbols). Optional - contents written after the ns declaration as by write-contents." - ([base-dir sym extension] - (create-source base-dir sym extension nil nil)) - ([base-dir sym extension dependencies] - (create-source base-dir sym extension dependencies nil)) - ([base-dir sym extension dependencies contents] - (let [full-path (into [base-dir] (source-path sym extension)) - ns-decl (if (seq dependencies) - (list 'ns sym (list* :require dependencies)) - (list 'ns sym))] - (create-file full-path (into [ns-decl] contents))))) - -(defn same-files? - "True if files-a and files-b contain the same canonical File's, - regardless of order." - [files-a files-b] - (= (sort (map #(.getCanonicalPath ^File %) files-a)) - (sort (map #(.getCanonicalPath ^File %) files-b)))) - diff --git a/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj b/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj deleted file mode 100644 index 1792beae..00000000 --- a/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj +++ /dev/null @@ -1,10 +0,0 @@ -(ns cognitect.test-runner.sample-property-test - (:require [clojure.test.check :as tc] - [clojure.test.check.generators :as gen] - [clojure.test.check.properties :as prop] - [clojure.test.check.clojure-test :refer [defspec]])) - -(defspec first-element-is-min-after-sorting 100 - (prop/for-all [v (gen/not-empty (gen/vector gen/int))] - (= (apply min v) - (first (sort v))))) diff --git a/test-resources/lib_tests/cognitect/test_runner/samples_test.clj b/test-resources/lib_tests/cognitect/test_runner/samples_test.clj deleted file mode 100644 index e4ec385c..00000000 --- a/test-resources/lib_tests/cognitect/test_runner/samples_test.clj +++ /dev/null @@ -1,14 +0,0 @@ -(ns cognitect.test-runner.samples-test - (:require [clojure.test :as t :refer [deftest is testing]])) - -(deftest math-works - (testing "basic addition and subtraction" - (is (= 42 (+ 40 2))) - (is (= 42 (- 44 2))))) - -(deftest ^:integration test-i - (is (= 1 1))) - - - - diff --git a/test-resources/lib_tests/cognitect/test_runner_test.clj b/test-resources/lib_tests/cognitect/test_runner_test.clj deleted file mode 100644 index e1ea8deb..00000000 --- a/test-resources/lib_tests/cognitect/test_runner_test.clj +++ /dev/null @@ -1,23 +0,0 @@ -(ns cognitect.test-runner-test - (:require - [clojure.test :refer :all] - [cognitect.test-runner :as tr])) - -(deftest ns-filters - (are [ns-names ns-regexes available selected] - (= selected (filter (#'tr/ns-filter {:namespace ns-names :namespace-regex ns-regexes}) available)) - - ;; default settings (no -n / -r, use default for -r) - nil nil nil [] - nil nil '[ns1-test ns2-test] '[ns1-test ns2-test] - nil nil '[ns1-test ns2-test ns3 ns4 ns5] '[ns1-test ns2-test] - - ;; specific namespaces - '#{ns3} nil '[ns1-test ns2-test] '[] - '#{ns3 ns4} nil '[ns1-test ns2-test ns3 ns4 ns5] '[ns3 ns4] - - ;; regexes - nil #{#"ns1.*" #"ns3"} '[ns1-test ns2-test ns3 ns4] '[ns1-test ns3] - - ;; both - '#{ns3} '#{#"ns1.*"} '[ns1-test ns2-test ns3 ns4] '[ns1-test ns3])) \ No newline at end of file From b458d79b29a0643074b841100e00e3ae83efb2ee Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Nov 2022 11:00:35 +0100 Subject: [PATCH 479/550] Switch to use ctx-store for global context --- feature-selmer/babashka/impl/selmer.clj | 2 +- feature-xml/babashka/impl/xml.clj | 4 ++-- src/babashka/impl/clojure/core.clj | 2 +- src/babashka/impl/clojure/test.clj | 4 ++-- src/babashka/impl/common.clj | 5 +++-- src/babashka/impl/nrepl_server.clj | 2 +- src/babashka/impl/patches/datafy.clj | 6 +++--- src/babashka/impl/pods.clj | 11 ++++++----- src/babashka/impl/server.clj | 6 +++--- src/babashka/impl/socket_repl.clj | 2 +- src/babashka/impl/tasks.clj | 6 +++--- src/babashka/impl/test.clj | 2 +- src/babashka/main.clj | 9 +++++---- test/babashka/impl/socket_repl_test.clj | 6 +++--- 14 files changed, 35 insertions(+), 32 deletions(-) diff --git a/feature-selmer/babashka/impl/selmer.clj b/feature-selmer/babashka/impl/selmer.clj index 14ce03c8..32aeba3e 100644 --- a/feature-selmer/babashka/impl/selmer.clj +++ b/feature-selmer/babashka/impl/selmer.clj @@ -60,7 +60,7 @@ (selmer.parser/render-template template context-map))) (defn sci-ns-resolve [ns fqs] - (sci/eval-form @ctx (list 'clojure.core/ns-resolve ns (list 'quote fqs)))) + (sci/eval-form (ctx) (list 'clojure.core/ns-resolve ns (list 'quote fqs)))) (defn force! [x] (if (instance? clojure.lang.IDeref x) @x x)) diff --git a/feature-xml/babashka/impl/xml.clj b/feature-xml/babashka/impl/xml.clj index 123310e5..0018cb70 100644 --- a/feature-xml/babashka/impl/xml.clj +++ b/feature-xml/babashka/impl/xml.clj @@ -40,8 +40,8 @@ #_(assert (<= (count ans)) (pr-str ans)) (let [xn (xml/uri-symbol n) al (symbol (clj-ns-name a))] - (sci/eval-form @ctx `(create-ns (quote ~xn))) - (sci/eval-form @ctx `(alias (quote ~al) (quote ~xn))) + (sci/eval-form (ctx) `(create-ns (quote ~xn))) + (sci/eval-form (ctx) `(alias (quote ~al) (quote ~xn))) (recur rst))))) (def xml-namespace diff --git a/src/babashka/impl/clojure/core.clj b/src/babashka/impl/clojure/core.clj index 1c269aed..fa202d41 100644 --- a/src/babashka/impl/clojure/core.clj +++ b/src/babashka/impl/clojure/core.clj @@ -167,7 +167,7 @@ 'default-data-readers (copy-core-var default-data-readers) 'xml-seq (copy-core-var xml-seq) 'read+string (new-var 'read+string (fn [& args] - (apply read+string @common/ctx args))) + (apply read+string (common/ctx) args))) '*command-line-args* command-line-args '*warn-on-reflection* warn-on-reflection '*compile-files* compile-files diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index b16d16de..422947a2 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -408,7 +408,7 @@ {:added "1.1"} [x] (if (symbol? x) - (when-let [v (second (resolve/lookup @ctx x false))] + (when-let [v (second (resolve/lookup (ctx) x false))] (when-let [value (if (instance? sci.lang.Var v) (get-possibly-unbound-var v) v)] @@ -826,7 +826,7 @@ Because the intent is to run a single test, there is no check for the namespace test-ns-hook." {:added "1.11"} [test-symbol] - (let [test-var (sci/resolve @ctx test-symbol)] + (let [test-var (sci/resolve (ctx) test-symbol)] (cond (nil? test-var) (sci/binding [sci/out sci/err] diff --git a/src/babashka/impl/common.clj b/src/babashka/impl/common.clj index 4a8057d7..ec03b968 100644 --- a/src/babashka/impl/common.clj +++ b/src/babashka/impl/common.clj @@ -1,10 +1,11 @@ (ns babashka.impl.common (:require [clojure.java.io :as io] - [clojure.string :as str])) + [clojure.string :as str] + [sci.ctx-store :as ctx-store])) ;; placeholder for ctx -(def ctx (volatile! nil)) +(defn ctx [] (ctx-store/get-ctx)) (def bb-edn (volatile! nil)) (def debug (volatile! false)) (def version (str/trim (slurp (io/resource "BABASHKA_VERSION")))) diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj index 6340e6d6..5b3569cb 100644 --- a/src/babashka/impl/nrepl_server.clj +++ b/src/babashka/impl/nrepl_server.clj @@ -15,7 +15,7 @@ :describe {"versions" {"babashka" common/version}} :thread-bind [babashka.impl.clojure.core/warn-on-reflection]} opts)] - (server/start-server! @common/ctx opts)))) + (server/start-server! (common/ctx) opts)))) (def nrepl-server-namespace (let [ns-sci (sci/create-ns 'babashka.nrepl.server)] diff --git a/src/babashka/impl/patches/datafy.clj b/src/babashka/impl/patches/datafy.clj index 738e664c..386cb5dc 100644 --- a/src/babashka/impl/patches/datafy.clj +++ b/src/babashka/impl/patches/datafy.clj @@ -34,7 +34,7 @@ Namespace (datafy [n] (with-meta {:name (sci-ns-name n) - :publics (->> n (sci-ns-publics @ctx) sortmap) - :imports (->> n (sci-ns-imports @ctx) sortmap) - :interns (->> n (sci-ns-interns @ctx) sortmap)} + :publics (->> n (sci-ns-publics (ctx)) sortmap) + :imports (->> n (sci-ns-imports (ctx)) sortmap) + :interns (->> n (sci-ns-interns (ctx)) sortmap)} (meta n)))) diff --git a/src/babashka/impl/pods.clj b/src/babashka/impl/pods.clj index 54e7cf22..75752c20 100644 --- a/src/babashka/impl/pods.clj +++ b/src/babashka/impl/pods.clj @@ -1,13 +1,14 @@ (ns babashka.impl.pods {:no-doc true} (:refer-clojure :exclude [read]) - (:require [babashka.impl.common :refer [ctx bb-edn]] - [babashka.pods.sci :as pods] - [sci.core :as sci] - [clojure.java.io :as io])) + (:require + [babashka.impl.common :refer [bb-edn ctx]] + [babashka.pods.sci :as pods] + [clojure.java.io :as io] + [sci.core :as sci])) (defn load-pod [& args] - (apply pods/load-pod @ctx args)) + (apply pods/load-pod (ctx) args)) (defn load-pods-metadata [pods-map opts] (reduce-kv diff --git a/src/babashka/impl/server.clj b/src/babashka/impl/server.clj index 1bb01f2b..78af54c7 100644 --- a/src/babashka/impl/server.clj +++ b/src/babashka/impl/server.clj @@ -7,15 +7,15 @@ (def sns (sci/create-ns 'clojure.core.server nil)) (def prepl (fn [& args] - (apply server/prepl @common/ctx args))) + (apply server/prepl (common/ctx) args))) (def io-prepl (fn [& args] - (apply server/io-prepl @common/ctx args))) + (apply server/io-prepl (common/ctx) args))) (def start-server (fn [& args] - (apply server/start-server @common/ctx args))) + (apply server/start-server (common/ctx) args))) (def clojure-core-server-namespace {'repl (sci/copy-var socket-repl/repl sns) diff --git a/src/babashka/impl/socket_repl.clj b/src/babashka/impl/socket_repl.clj index b5532fec..55ed2ca9 100644 --- a/src/babashka/impl/socket_repl.clj +++ b/src/babashka/impl/socket_repl.clj @@ -11,7 +11,7 @@ ;; this is mapped to clojure.core.server/repl in babashka.main (def repl (fn [] - (repl/repl @common/ctx))) + (repl/repl (common/ctx)))) (defn parse-opts [opts] (let [opts (str/trim opts) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index a5d9592c..99c25162 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -455,15 +455,15 @@ ([task {:keys [:parallel] :or {parallel (:parallel (current-task))}}] (let [[[expr]] (assemble-task task parallel)] - (sci/eval-string* @ctx expr)))) + (sci/eval-string* (ctx) expr)))) (defn exec ([sym] (let [snippet (cli/exec-fn-snippet sym)] - (sci/eval-string* @ctx snippet))) + (sci/eval-string* (ctx) snippet))) ([sym extra-opts] (let [snippet (cli/exec-fn-snippet sym extra-opts)] - (sci/eval-string* @ctx snippet)))) + (sci/eval-string* (ctx) snippet)))) (def tasks-namespace {'shell (sci/copy-var shell sci-ns) diff --git a/src/babashka/impl/test.clj b/src/babashka/impl/test.clj index 2d3e95a5..4566b4ce 100644 --- a/src/babashka/impl/test.clj +++ b/src/babashka/impl/test.clj @@ -5,7 +5,7 @@ (defn contextualize [f] (fn [& args] - (apply f @ctx args))) + (apply f (ctx) args))) (def tns t/tns) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 42ef4266..a4a086e2 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -58,6 +58,7 @@ [hf.depstar.uberjar :as uberjar] [sci.addons :as addons] [sci.core :as sci] + [sci.ctx-store :as ctx-store] [sci.impl.copy-vars :as sci-copy-vars] [sci.impl.io :as sio] [sci.impl.namespaces :as sci-namespaces] @@ -303,7 +304,7 @@ Use bb run --help to show this help output. s (slurp f)] (sci/with-bindings {sci/ns @sci/ns sci/file (.getAbsolutePath f)} - (sci/eval-string* @common/ctx s)))) + (sci/eval-string* (common/ctx) s)))) (defn start-socket-repl! [address ctx] (socket-repl/start-repl! address ctx)) @@ -373,7 +374,7 @@ Use bb run --help to show this help output. 'repl (sci/new-var 'repl (fn [& opts] (let [opts (apply hash-map opts)] - (repl/start-repl! @common/ctx opts))) {:ns clojure-main-ns}) + (repl/start-repl! (common/ctx) opts))) {:ns clojure-main-ns}) 'with-bindings (sci/copy-var clojure-main/with-bindings clojure-main-ns)} 'clojure.test t/clojure-test-namespace 'clojure.math math-namespace @@ -847,7 +848,7 @@ Use bb run --help to show this help output. (when-let [res (cp/source-for-namespace loader namespace nil)] (if uberscript (do (swap! uberscript-sources conj (:source res)) - (uberscript/uberscript {:ctx @common/ctx + (uberscript/uberscript {:ctx (common/ctx) :expressions [(:source res)]}) {}) res))) @@ -882,7 +883,7 @@ Use bb run --help to show this help output. :proxy-fn proxy-fn} opts (addons/future opts) sci-ctx (sci/init opts) - _ (vreset! common/ctx sci-ctx) + _ (ctx-store/reset-ctx! sci-ctx) _ (when-let [pods (:pods @common/bb-edn)] (when-let [pod-metadata (pods/load-pods-metadata pods {:download-only (download-only?)})] diff --git a/test/babashka/impl/socket_repl_test.clj b/test/babashka/impl/socket_repl_test.clj index 5e6e587c..ca0efd7b 100644 --- a/test/babashka/impl/socket_repl_test.clj +++ b/test/babashka/impl/socket_repl_test.clj @@ -48,7 +48,7 @@ (if tu/jvm? (let [ctx (init {:namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx ctx) + (vreset! common/ctx (fn [] ctx)) (start-repl! "0.0.0.0:1666" ctx)) (do (vreset! server-process (p/process ["./bb" "socket-repl" "localhost:1666"])) @@ -81,7 +81,7 @@ :env (atom {}) :namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx ctx) + (vreset! common/ctx (fn [] ctx)) (start-repl! "{:address \"localhost\" :accept clojure.core.server/repl :port 1666}" ctx)) (do (vreset! server-process @@ -105,7 +105,7 @@ :env (atom {}) :namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx ctx) + (vreset! common/ctx (fn [] ctx)) (start-repl! "{:address \"localhost\" :accept clojure.core.server/io-prepl :port 1666}" ctx)) (do (vreset! server-process From 40e0087b59167ec2e06f6bda774c8f608b4f4126 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Nov 2022 11:21:23 +0100 Subject: [PATCH 480/550] Fix socket repl tests --- test/babashka/impl/socket_repl_test.clj | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/babashka/impl/socket_repl_test.clj b/test/babashka/impl/socket_repl_test.clj index ca0efd7b..f43afeb6 100644 --- a/test/babashka/impl/socket_repl_test.clj +++ b/test/babashka/impl/socket_repl_test.clj @@ -10,6 +10,7 @@ [clojure.java.io :as io] [clojure.string :as str] [clojure.test :as t :refer [deftest is testing]] + [sci.ctx-store :as ctx-store] [sci.impl.opts :refer [init]])) (set! *warn-on-reflection* true) @@ -19,7 +20,7 @@ reader (io/reader socket) sw (java.io.StringWriter.) writer (io/writer socket)] - (binding [*out* writer] + (binding [*out* writer] (println (str expr "\n"))) (loop [] (when-let [l (try (.readLine ^java.io.BufferedReader reader) @@ -48,7 +49,7 @@ (if tu/jvm? (let [ctx (init {:namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx (fn [] ctx)) + (ctx-store/reset-ctx! ctx) (start-repl! "0.0.0.0:1666" ctx)) (do (vreset! server-process (p/process ["./bb" "socket-repl" "localhost:1666"])) @@ -68,7 +69,7 @@ (finally (if tu/jvm? (do (stop-repl!) - (vreset! common/ctx nil) + (ctx-store/reset-ctx! nil) (Thread/sleep 100)) (p/destroy-tree @server-process)))))) @@ -81,7 +82,7 @@ :env (atom {}) :namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx (fn [] ctx)) + (ctx-store/reset-ctx! ctx) (start-repl! "{:address \"localhost\" :accept clojure.core.server/repl :port 1666}" ctx)) (do (vreset! server-process @@ -92,7 +93,7 @@ (finally (if tu/jvm? (do (stop-repl!) - (vreset! common/ctx nil) + (ctx-store/reset-ctx! nil) (Thread/sleep 100)) (p/destroy-tree @server-process)))))) From 99f1e948d34573f653f3bc727d361a0e2df01e23 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 19 Nov 2022 11:50:14 +0100 Subject: [PATCH 481/550] Fix pREPL tests --- test/babashka/impl/socket_repl_test.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/babashka/impl/socket_repl_test.clj b/test/babashka/impl/socket_repl_test.clj index f43afeb6..5699b456 100644 --- a/test/babashka/impl/socket_repl_test.clj +++ b/test/babashka/impl/socket_repl_test.clj @@ -106,7 +106,7 @@ :env (atom {}) :namespaces {'clojure.core.server clojure-core-server-namespace} :features #{:bb}})] - (vreset! common/ctx (fn [] ctx)) + (ctx-store/reset-ctx! ctx) (start-repl! "{:address \"localhost\" :accept clojure.core.server/io-prepl :port 1666}" ctx)) (do (vreset! server-process @@ -121,7 +121,7 @@ (finally (if tu/jvm? (do (stop-repl!) - (vreset! common/ctx nil) + (ctx-store/reset-ctx! nil) (Thread/sleep 100)) (p/destroy-tree @server-process)))))) From 058d2071b26d194d966bf564acfade3a3fa8aef5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 20 Nov 2022 11:26:15 +0100 Subject: [PATCH 482/550] Add java.lang.Error --- src/babashka/impl/classes.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 9e8e1792..29ef769f 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -254,6 +254,7 @@ java.lang.ClassNotFoundException java.lang.Comparable java.lang.Double + java.lang.Error java.lang.Exception java.lang.Float java.lang.IllegalArgumentException @@ -663,6 +664,7 @@ ClassNotFoundException java.lang.ClassNotFoundException Comparable java.lang.Comparable Double java.lang.Double + Error java.lang.Error Exception java.lang.Exception ExceptionInInitializerError java.lang.ExceptionInInitializerError IndexOutOfBoundsException java.lang.IndexOutOfBoundsException From eb6745fa869120699cc1605228baf52b90665462 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 20 Nov 2022 11:34:31 +0100 Subject: [PATCH 483/550] changelog [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c57bec7..74df06fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ A preview of the next release can be installed from - [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map - [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek)) - Update nix app example in docs +- Add `java.lang.Error` and `java.net.URLClassLoader` (only for compatibility with the `clojure.java.classpath` lib) +- Deps.clj `deps.clj: 1.11.1.1200` +- Upgrade timbre to `6.0.1` +- Performance improvements in SCI +- SCI: preserve stack information on `throw` expressions ## 1.0.165 (2022-11-01) From 450497619142cf3432a0289fb70fe392c9f05f27 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 21 Nov 2022 20:53:16 +0100 Subject: [PATCH 484/550] Update built-in deps.edn [skip ci] --- resources/META-INF/babashka/deps.edn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 90d20af1..eb07e9a8 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -113,9 +113,11 @@ environ/environ {:mvn/version "1.2.0"} table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"} markdown-clj/markdown-clj {:mvn/version "1.10.8"} - org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"} + org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32", + :git/url "https://github.com/clojure/tools.namespace"} medley/medley {:mvn/version "1.3.0"} - io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"} + io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner", + :git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"} borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"} dev.nubank/docopt {:mvn/version "0.6.1-fix7"} testdoc/testdoc {:mvn/version "1.4.1"} From 0df40a1a9ade37665672bcd2941c7b364a8b3caf Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 22 Nov 2022 11:50:53 +0100 Subject: [PATCH 485/550] Add clojure.data/equality-partition for lambdaisland/deepdiff2 --- src/babashka/impl/data.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/data.clj b/src/babashka/impl/data.clj index e5900b89..6d2e69ba 100644 --- a/src/babashka/impl/data.clj +++ b/src/babashka/impl/data.clj @@ -7,4 +7,5 @@ (def data-ns (sci/create-ns 'clojure.data nil)) (def data-namespace - {'diff (copy-var data/diff data-ns)}) + {'diff (copy-var data/diff data-ns) + 'equality-partition (copy-var data/equality-partition data-ns)}) From 6f8f205609d96f6af9fc54ac0cfb19fe5e3f3772 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 24 Nov 2022 13:15:30 +0100 Subject: [PATCH 486/550] v1.0.166 --- CHANGELOG.md | 2 +- resources/BABASHKA_VERSION | 2 +- sci | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74df06fe..e2588d94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). -## Unreleased +## 1.0.166 (2022-11-24) - Add `run-test` and `run-test-var` to `clojure.test` - Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index f231bfab..9d85ef23 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.166-SNAPSHOT \ No newline at end of file +1.0.166 \ No newline at end of file diff --git a/sci b/sci index 71782ebb..914919f2 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 71782ebbeb43927780570a67a6b119a7b428a495 +Subproject commit 914919f248b7e3fc2ec59c435320145f588899d0 From c67441226ab6433abb7c789b83f32b24f8ebf2ab Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 24 Nov 2022 14:01:06 +0100 Subject: [PATCH 487/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index dd075a7f..9d85ef23 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -1.0.165 \ No newline at end of file +1.0.166 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 9d85ef23..b28cc53d 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.166 \ No newline at end of file +1.0.167-SNAPSHOT \ No newline at end of file From 434ee39ad9d0121990100bdc9a2143a140b43e6c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 24 Nov 2022 14:34:31 +0100 Subject: [PATCH 488/550] CHANGELOG [skip ci] --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2588d94..a42f0160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,14 @@ For a list of breaking changes, check [here](#breaking-changes). A preview of the next release can be installed from [babashka-dev-builds](https://github.com/babashka/babashka-dev-builds). +[Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting + ## 1.0.166 (2022-11-24) -- Add `run-test` and `run-test-var` to `clojure.test` +See the [Running tests with Babashka](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release. + - Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace) +- Add `run-test` and `run-test-var` to `clojure.test` - Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix - [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map - [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek)) From 0671678b604107857dd863d8f488817fe7cafaea Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 24 Nov 2022 15:09:53 +0100 Subject: [PATCH 489/550] Change title of blog post [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a42f0160..12fd0ed3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ A preview of the next release can be installed from ## 1.0.166 (2022-11-24) -See the [Running tests with Babashka](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release. +See the [Testing babashka scripts](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release. - Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace) - Add `run-test` and `run-test-var` to `clojure.test` From 03e50cb17ee447f64c17837ea830c727dd500685 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Nov 2022 13:04:10 +0100 Subject: [PATCH 490/550] SCI: performance improvement --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 914919f2..137a1a1a 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 914919f248b7e3fc2ec59c435320145f588899d0 +Subproject commit 137a1a1a7684cac51cee879a275a258afb9dbd1e From 7d3d38fee1e29eaed7b53c741c32b73e9b969121 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Nov 2022 13:22:06 +0100 Subject: [PATCH 491/550] SCI [skip ci] --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 137a1a1a..de6a9156 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 137a1a1a7684cac51cee879a275a258afb9dbd1e +Subproject commit de6a9156ba2423df3090330cec3ae8690cca94f1 From cb72f8ba17cc0e99384dcf49d97983691f492f94 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 27 Nov 2022 20:41:50 +0100 Subject: [PATCH 492/550] Fix babashka/babashka.nrepl#59 --- babashka.nrepl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/babashka.nrepl b/babashka.nrepl index c8c8a766..ad763a78 160000 --- a/babashka.nrepl +++ b/babashka.nrepl @@ -1 +1 @@ -Subproject commit c8c8a766e026d5f87e0968a179dad70e13aa13ee +Subproject commit ad763a78f1bc327a493ff0b650aa5408ecbf4819 From 6e003540537f5d80c761abaad545d58c87e8d304 Mon Sep 17 00:00:00 2001 From: ikappaki <34983288+ikappaki@users.noreply.github.com> Date: Mon, 28 Nov 2022 09:51:39 +0000 Subject: [PATCH 493/550] Fix 1430: empty tasks names display list (#1431) Co-authored-by: ikappaki --- CHANGELOG.md | 4 ++++ src/babashka/impl/tasks.clj | 23 +++++++++++++++-------- test/babashka/bb_edn_test.clj | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fd0ed3..107b4e57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ A preview of the next release can be installed from [Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting +## Unreleased + +- [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list. + ## 1.0.166 (2022-11-24) See the [Testing babashka scripts](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release. diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 99c25162..f4f1ad6b 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -429,15 +429,22 @@ (iterate zip/right loc)))) (defn list-tasks + "Prints out the task names found in BB-EDN in the original order + alongside their documentation as retrieved with SCI-CTX. + + For a task to be listed + - its name has to be a symbol but should not start with `-`, and + - should not be `:private`." [sci-ctx] - (let [tasks (:tasks @bb-edn)] - (if (seq tasks) - (let [raw-edn (:raw @bb-edn) - names (key-order raw-edn) - names (map str names) - names (remove #(str/starts-with? % "-") names) - names (remove #(:private (get tasks (symbol %))) names) - longest (apply max (map count names)) + (let [tasks (:tasks @bb-edn) + raw-edn (:raw @bb-edn) + names (when (seq tasks) + (->> (key-order raw-edn) + (map str) + (remove #(str/starts-with? % "-")) + (remove #(:private (get tasks (symbol %))))))] + (if (seq names) + (let [longest (apply max (map count names)) fmt (str "%1$-" longest "s")] (println "The following tasks are available:") (println) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 0422fe2b..eb39a5c7 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -307,6 +307,25 @@ (test-utils/with-config {} (let [res (test-utils/bb nil "tasks")] (is (str/includes? res "No tasks found.")))) + (test-utils/with-config '{:tasks {:x 1}} + (let [res (test-utils/bb nil "tasks")] + (is (str/includes? res "No tasks found.")))) + (test-utils/with-config '{:tasks {-xyz 5}} + (let [res (test-utils/bb nil "tasks")] + (is (str/includes? res "No tasks found.")))) + (test-utils/with-config '{:tasks {xyz {:private true}}} + (let [res (test-utils/bb nil "tasks")] + (is (str/includes? res "No tasks found.")))) + (test-utils/with-config '{:tasks {abc 1 xyz 2}} + (let [res (test-utils/bb nil "tasks")] + (is (= "The following tasks are available:\n\nabc\nxyz\n" res)))) + (test-utils/with-config '{:tasks {abc 1 xyz {:doc "some text" :tasks 5} + -xyz 3 qrs {:private true}}} + (let [res (test-utils/bb nil "tasks")] + (is (= "The following tasks are available:\n\nabc\nxyz some text\n" res)))) + (test-utils/with-config '{:tasks {xyz 1 abc 2}} + (let [res (test-utils/bb nil "tasks")] + (is (= "The following tasks are available:\n\nxyz\nabc\n" res)))) (test-utils/with-config "{:paths [\"test-resources/task_scripts\"] :tasks {:requires ([tasks :as t]) task1 From 198722ab7cc43c59fdabdf986094448e86047e67 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 28 Nov 2022 13:21:07 +0100 Subject: [PATCH 494/550] Bump SCI: better error locations for interop --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index de6a9156..05c738b4 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit de6a9156ba2423df3090330cec3ae8690cca94f1 +Subproject commit 05c738b481f56aa77c2f8355aae4ce77aff2344b From cf0f145d1064cb979eb9fe6192486f449d769547 Mon Sep 17 00:00:00 2001 From: LouD Date: Tue, 29 Nov 2022 09:09:23 +0100 Subject: [PATCH 495/550] Add note about BSOD when using WSL1 (#1432) --- CHANGELOG.md | 3 ++- README.md | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 107b4e57..3231fa11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ A preview of the next release can be installed from ## Unreleased -- [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list. +- [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list. +- Add note about BSOD when using WSL1, see [README.md/quickstart](https://github.com/LouDnl/babashka#quickstart) ## 1.0.166 (2022-11-24) diff --git a/README.md b/README.md index 032f8893..fd798b1f 100644 --- a/README.md +++ b/README.md @@ -220,6 +220,14 @@ If scoop does not work for you, then you can also just download the `bb.exe` binary from [Github releases](https://github.com/babashka/babashka/releases) and place it on your path manually. +#### WSL1 +> Note: WSL1 users might experience a BSOD, please use the --static install option when installing +``` shell +$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install +$ chmod +x install +$ ./install --static +``` + ### Installer script Install via the installer script: From bc0b59500bdb58f710ae1c684167cdb188963218 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 30 Nov 2022 14:10:02 +0100 Subject: [PATCH 496/550] Fix #1433: spec source as fallback + built-in (#1435) --- deps.edn | 2 +- .../babashka/babashka/native-image.properties | 3 +- resources/src/babashka/clojure/spec/alpha.clj | 2020 +++++++++++++++++ .../src/babashka/clojure/spec/gen/alpha.clj | 227 ++ .../src/babashka/clojure/spec/test/alpha.clj | 579 +++++ sci | 2 +- script/built_in.clj | 15 + src/babashka/impl/classpath.clj | 10 +- src/babashka/main.clj | 7 + 9 files changed, 2859 insertions(+), 6 deletions(-) create mode 100644 resources/src/babashka/clojure/spec/alpha.clj create mode 100644 resources/src/babashka/clojure/spec/gen/alpha.clj create mode 100644 resources/src/babashka/clojure/spec/test/alpha.clj create mode 100755 script/built_in.clj diff --git a/deps.edn b/deps.edn index eb07e9a8..4e875585 100644 --- a/deps.edn +++ b/deps.edn @@ -63,7 +63,7 @@ :lib-tests {:extra-paths ["process/src" "process/test" "test-resources/lib_tests"] :extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"} - org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha" + #_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha" :sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"} lambdaisland/regal {:mvn/version "0.0.143"} cprop/cprop {:mvn/version "0.1.16"} diff --git a/resources/META-INF/native-image/babashka/babashka/native-image.properties b/resources/META-INF/native-image/babashka/babashka/native-image.properties index 77553bc9..2e6e0571 100644 --- a/resources/META-INF/native-image/babashka/babashka/native-image.properties +++ b/resources/META-INF/native-image/babashka/babashka/native-image.properties @@ -4,8 +4,9 @@ Args=-H:+ReportExceptionStackTraces \ -J-Dborkdude.dynaload.aot=true \ -H:IncludeResources=BABASHKA_VERSION \ -H:IncludeResources=META-INF/babashka/.* \ + -H:IncludeResources=src/babashka/.* \ -H:IncludeResources=SCI_VERSION \ - -H:Log=registerResource: \ + -H:Log=registerResource:3 \ -H:EnableURLProtocols=http,https,jar \ --enable-all-security-services \ -H:+JNI \ diff --git a/resources/src/babashka/clojure/spec/alpha.clj b/resources/src/babashka/clojure/spec/alpha.clj new file mode 100644 index 00000000..9b9772d3 --- /dev/null +++ b/resources/src/babashka/clojure/spec/alpha.clj @@ -0,0 +1,2020 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns + ^{:doc "The spec library specifies the structure of data or functions and provides + operations to validate, conform, explain, describe, and generate data based on + the specs. + + Rationale: https://clojure.org/about/spec + Guide: https://clojure.org/guides/spec"} + clojure.spec.alpha + (:refer-clojure :exclude [+ * and assert or cat def keys merge]) + (:require [clojure.walk :as walk] + [clojure.spec.gen.alpha :as gen] + [clojure.string :as str])) + +(alias 'c 'clojure.core) + +;; added because I didn't want to expose clojure.lang.Compiler in bb +;; see https://ask.clojure.org/index.php/11371/consider-adding-demunge-into-clojure-core +(defmacro if-bb [then & [else]] + (if (System/getProperty "babashka.version") + then + else)) + +(if-bb + (require 'clojure.main)) + +(defn demunge [s] + #_:clj-kondo/ignore + (if-bb (clojure.main/demunge s) + (clojure.lang.Compiler/demunge s))) + +(set! *warn-on-reflection* true) + +(def ^:dynamic *recursion-limit* + "A soft limit on how many times a branching spec (or/alt/*/opt-keys/multi-spec) + can be recursed through during generation. After this a + non-recursive branch will be chosen." + 4) + +(def ^:dynamic *fspec-iterations* + "The number of times an anonymous fn specified by fspec will be (generatively) tested during conform" + 21) + +(def ^:dynamic *coll-check-limit* + "The number of elements validated in a collection spec'ed with 'every'" + 101) + +(def ^:dynamic *coll-error-limit* + "The number of errors reported by explain in a collection spec'ed with 'every'" + 20) + +(defprotocol Spec + (conform* [spec x]) + (unform* [spec y]) + (explain* [spec path via in x]) + (gen* [spec overrides path rmap]) + (with-gen* [spec gfn]) + (describe* [spec])) + +(defonce ^:private registry-ref (atom {})) + +(defn- deep-resolve [reg k] + (loop [spec k] + (if (ident? spec) + (recur (get reg spec)) + spec))) + +(defn- reg-resolve + "returns the spec/regex at end of alias chain starting with k, nil if not found, k if k not ident" + [k] + (if (ident? k) + (let [reg @registry-ref + spec (get reg k)] + (if-not (ident? spec) + spec + (deep-resolve reg spec))) + k)) + +(defn- reg-resolve! + "returns the spec/regex at end of alias chain starting with k, throws if not found, k if k not ident" + [k] + (if (ident? k) + (c/or (reg-resolve k) + (throw (Exception. (str "Unable to resolve spec: " k)))) + k)) + +(defn spec? + "returns x if x is a spec object, else logical false" + [x] + (when (instance? clojure.spec.alpha.Spec x) + x)) + +(defn regex? + "returns x if x is a (clojure.spec) regex op, else logical false" + [x] + (c/and (::op x) x)) + +(defn- with-name [spec name] + (cond + (ident? spec) spec + (regex? spec) (assoc spec ::name name) + + (instance? clojure.lang.IObj spec) + (with-meta spec (assoc (meta spec) ::name name)))) + +(defn- spec-name [spec] + (cond + (ident? spec) spec + + (regex? spec) (::name spec) + + (instance? clojure.lang.IObj spec) + (-> (meta spec) ::name))) + +(declare spec-impl) +(declare regex-spec-impl) + +(defn- maybe-spec + "spec-or-k must be a spec, regex or resolvable kw/sym, else returns nil." + [spec-or-k] + (let [s (c/or (c/and (ident? spec-or-k) (reg-resolve spec-or-k)) + (spec? spec-or-k) + (regex? spec-or-k) + nil)] + (if (regex? s) + (with-name (regex-spec-impl s nil) (spec-name s)) + s))) + +(defn- the-spec + "spec-or-k must be a spec, regex or kw/sym, else returns nil. Throws if unresolvable kw/sym" + [spec-or-k] + (c/or (maybe-spec spec-or-k) + (when (ident? spec-or-k) + (throw (Exception. (str "Unable to resolve spec: " spec-or-k)))))) + +(defprotocol Specize + (specize* [_] [_ form])) + +(defn- fn-sym [^Object f] + (let [[_ f-ns f-n] (re-matches #"(.*)\$(.*?)(__[0-9]+)?" (.. f getClass getName))] + ;; check for anonymous function + (when (c/and (not= "fn" f-n) + (not= "sci.impl.fns$fun" f-ns)) + (symbol (demunge f-ns) (demunge f-n))))) + +(extend-protocol Specize + clojure.lang.Keyword + (specize* ([k] (specize* (reg-resolve! k))) + ([k _] (specize* (reg-resolve! k)))) + + clojure.lang.Symbol + (specize* ([s] (specize* (reg-resolve! s))) + ([s _] (specize* (reg-resolve! s)))) + + clojure.lang.IPersistentSet + (specize* ([s] (spec-impl s s nil nil)) + ([s form] (spec-impl form s nil nil))) + + Object + (specize* ([o] (if (c/and (not (map? o)) (ifn? o)) + (if-let [s (fn-sym o)] + (spec-impl s o nil nil) + (spec-impl ::unknown o nil nil)) + (spec-impl ::unknown o nil nil))) + ([o form] (spec-impl form o nil nil)))) + +(defn- specize + ([s] (c/or (spec? s) (specize* s))) + ([s form] (c/or (spec? s) (specize* s form)))) + +(defn invalid? + "tests the validity of a conform return value" + [ret] + (identical? ::invalid ret)) + +(defn conform + "Given a spec and a value, returns :clojure.spec.alpha/invalid + if value does not match spec, else the (possibly destructured) value." + [spec x] + (conform* (specize spec) x)) + +(defn unform + "Given a spec and a value created by or compliant with a call to + 'conform' with the same spec, returns a value with all conform + destructuring undone." + [spec x] + (unform* (specize spec) x)) + +(defn form + "returns the spec as data" + [spec] + ;;TODO - incorporate gens + (describe* (specize spec))) + +(defn abbrev [form] + (cond + (seq? form) + (walk/postwalk (fn [form] + (cond + (c/and (symbol? form) (namespace form)) + (-> form name symbol) + + (c/and (seq? form) (= 'fn (first form)) (= '[%] (second form))) + (last form) + + :else form)) + form) + + (c/and (symbol? form) (namespace form)) + (-> form name symbol) + + :else form)) + +(defn describe + "returns an abbreviated description of the spec as data" + [spec] + (abbrev (form spec))) + +(defn with-gen + "Takes a spec and a no-arg, generator-returning fn and returns a version of that spec that uses that generator" + [spec gen-fn] + (let [spec (reg-resolve spec)] + (if (regex? spec) + (assoc spec ::gfn gen-fn) + (with-gen* (specize spec) gen-fn)))) + +(defn explain-data* [spec path via in x] + (let [probs (explain* (specize spec) path via in x)] + (when-not (empty? probs) + {::problems probs + ::spec spec + ::value x}))) + +(defn explain-data + "Given a spec and a value x which ought to conform, returns nil if x + conforms, else a map with at least the key ::problems whose value is + a collection of problem-maps, where problem-map has at least :path :pred and :val + keys describing the predicate and the value that failed at that + path." + [spec x] + (explain-data* spec [] (if-let [name (spec-name spec)] [name] []) [] x)) + +(defn explain-printer + "Default printer for explain-data. nil indicates a successful validation." + [ed] + (if ed + (let [problems (->> (::problems ed) + (sort-by #(- (count (:in %)))) + (sort-by #(- (count (:path %)))))] + ;;(prn {:ed ed}) + (doseq [{:keys [path pred val reason via in] :as prob} problems] + (pr val) + (print " - failed: ") + (if reason (print reason) (pr (abbrev pred))) + (when-not (empty? in) + (print (str " in: " (pr-str in)))) + (when-not (empty? path) + (print (str " at: " (pr-str path)))) + (when-not (empty? via) + (print (str " spec: " (pr-str (last via))))) + (doseq [[k v] prob] + (when-not (#{:path :pred :val :reason :via :in} k) + (print "\n\t" (pr-str k) " ") + (pr v))) + (newline))) + (println "Success!"))) + +(def ^:dynamic *explain-out* explain-printer) + +(defn explain-out + "Prints explanation data (per 'explain-data') to *out* using the printer in *explain-out*, + by default explain-printer." + [ed] + (*explain-out* ed)) + +(defn explain + "Given a spec and a value that fails to conform, prints an explanation to *out*." + [spec x] + (explain-out (explain-data spec x))) + +(defn explain-str + "Given a spec and a value that fails to conform, returns an explanation as a string." + ^String [spec x] + (with-out-str (explain spec x))) + +(declare valid?) + +(defn- gensub + [spec overrides path rmap form] + ;;(prn {:spec spec :over overrides :path path :form form}) + (let [spec (specize spec)] + (if-let [g (c/or (when-let [gfn (c/or (get overrides (c/or (spec-name spec) spec)) + (get overrides path))] + (gfn)) + (gen* spec overrides path rmap))] + (gen/such-that #(valid? spec %) g 100) + (let [abbr (abbrev form)] + (throw (ex-info (str "Unable to construct gen at: " path " for: " abbr) + {::path path ::form form ::failure :no-gen})))))) + +(defn gen + "Given a spec, returns the generator for it, or throws if none can + be constructed. Optionally an overrides map can be provided which + should map spec names or paths (vectors of keywords) to no-arg + generator-creating fns. These will be used instead of the generators at those + names/paths. Note that parent generator (in the spec or overrides + map) will supersede those of any subtrees. A generator for a regex + op must always return a sequential collection (i.e. a generator for + s/? should return either an empty sequence/vector or a + sequence/vector with one item in it)" + ([spec] (gen spec nil)) + ([spec overrides] (gensub spec overrides [] {::recursion-limit *recursion-limit*} spec))) + +(defn- ->sym + "Returns a symbol from a symbol or var" + [x] + (if (var? x) + (let [m (meta x) + n (:name m) + ns (:ns m)] + (symbol (str ns) (str n))) + x)) + +(defn- unfn [expr] + (if (c/and (seq? expr) + (symbol? (first expr)) + (= "fn*" (name (first expr)))) + (let [[[s] & form] (rest expr)] + (conj (walk/postwalk-replace {s '%} form) '[%] 'fn)) + expr)) + +(defn- res [form] + (cond + (keyword? form) form + (symbol? form) (cond + (= 'fn form) 'clojure.core/fn ;; make tests pass, fn is not a macro in SCI + (= 'not form) 'clojure.core/not ;; make tests pass, not is not a macro in SCI + :else (c/or (-> form resolve ->sym) form)) + (sequential? form) (walk/postwalk #(if (symbol? %) (res %) %) (unfn form)) + :else form)) + +(defn ^:skip-wiki def-impl + "Do not call this directly, use 'def'" + [k form spec] + (c/assert (c/and (ident? k) (namespace k)) "k must be namespaced keyword or resolvable symbol") + (if (nil? spec) + (swap! registry-ref dissoc k) + (let [spec (if (c/or (spec? spec) (regex? spec) (get @registry-ref spec)) + spec + (spec-impl form spec nil nil))] + (swap! registry-ref assoc k (with-name spec k)))) + k) + +(defn- ns-qualify + "Qualify symbol s by resolving it or using the current *ns*." + [s] + (if-let [ns-sym (some-> s namespace symbol)] + (c/or (some-> (get (ns-aliases *ns*) ns-sym) str (symbol (name s))) + s) + (symbol (str *ns*) (str s)))) + +(defmacro def + "Given a namespace-qualified keyword or resolvable symbol k, and a + spec, spec-name, predicate or regex-op makes an entry in the + registry mapping k to the spec. Use nil to remove an entry in + the registry for k." + [k spec-form] + (let [k (if (symbol? k) (ns-qualify k) k)] + `(def-impl '~k '~(res spec-form) ~spec-form))) + +(defn registry + "returns the registry map, prefer 'get-spec' to lookup a spec by name" + [] + @registry-ref) + +(defn get-spec + "Returns spec registered for keyword/symbol/var k, or nil." + [k] + (get (registry) (if (keyword? k) k (->sym k)))) + +(defmacro spec + "Takes a single predicate form, e.g. can be the name of a predicate, + like even?, or a fn literal like #(< % 42). Note that it is not + generally necessary to wrap predicates in spec when using the rest + of the spec macros, only to attach a unique generator + + Can also be passed the result of one of the regex ops - + cat, alt, *, +, ?, in which case it will return a regex-conforming + spec, useful when nesting an independent regex. + --- + + Optionally takes :gen generator-fn, which must be a fn of no args that + returns a test.check generator. + + Returns a spec." + [form & {:keys [gen]}] + (when form + `(spec-impl '~(res form) ~form ~gen nil))) + +(defmacro multi-spec + "Takes the name of a spec/predicate-returning multimethod and a + tag-restoring keyword or fn (retag). Returns a spec that when + conforming or explaining data will pass it to the multimethod to get + an appropriate spec. You can e.g. use multi-spec to dynamically and + extensibly associate specs with 'tagged' data (i.e. data where one + of the fields indicates the shape of the rest of the structure). + + (defmulti mspec :tag) + + The methods should ignore their argument and return a predicate/spec: + (defmethod mspec :int [_] (s/keys :req-un [::tag ::i])) + + retag is used during generation to retag generated values with + matching tags. retag can either be a keyword, at which key the + dispatch-tag will be assoc'ed, or a fn of generated value and + dispatch-tag that should return an appropriately retagged value. + + Note that because the tags themselves comprise an open set, + the tag key spec cannot enumerate the values, but can e.g. + test for keyword?. + + Note also that the dispatch values of the multimethod will be + included in the path, i.e. in reporting and gen overrides, even + though those values are not evident in the spec. +" + [mm retag] + `(multi-spec-impl '~(res mm) (var ~mm) ~retag)) + +(defmacro keys + "Creates and returns a map validating spec. :req and :opt are both + vectors of namespaced-qualified keywords. The validator will ensure + the :req keys are present. The :opt keys serve as documentation and + may be used by the generator. + + The :req key vector supports 'and' and 'or' for key groups: + + (s/keys :req [::x ::y (or ::secret (and ::user ::pwd))] :opt [::z]) + + There are also -un versions of :req and :opt. These allow + you to connect unqualified keys to specs. In each case, fully + qualified keywords are passed, which name the specs, but unqualified + keys (with the same name component) are expected and checked at + conform-time, and generated during gen: + + (s/keys :req-un [:my.ns/x :my.ns/y]) + + The above says keys :x and :y are required, and will be validated + and generated by specs (if they exist) named :my.ns/x :my.ns/y + respectively. + + In addition, the values of *all* namespace-qualified keys will be validated + (and possibly destructured) by any registered specs. Note: there is + no support for inline value specification, by design. + + Optionally takes :gen generator-fn, which must be a fn of no args that + returns a test.check generator." + [& {:keys [req req-un opt opt-un gen]}] + (let [unk #(-> % name keyword) + req-keys (filterv keyword? (flatten req)) + req-un-specs (filterv keyword? (flatten req-un)) + _ (c/assert (every? #(c/and (keyword? %) (namespace %)) (concat req-keys req-un-specs opt opt-un)) + "all keys must be namespace-qualified keywords") + req-specs (into req-keys req-un-specs) + req-keys (into req-keys (map unk req-un-specs)) + opt-keys (into (vec opt) (map unk opt-un)) + opt-specs (into (vec opt) opt-un) + gx (gensym) + parse-req (fn [rk f] + (map (fn [x] + (if (keyword? x) + `(contains? ~gx ~(f x)) + (walk/postwalk + (fn [y] (if (keyword? y) `(contains? ~gx ~(f y)) y)) + x))) + rk)) + pred-exprs [`(map? ~gx)] + pred-exprs (into pred-exprs (parse-req req identity)) + pred-exprs (into pred-exprs (parse-req req-un unk)) + keys-pred `(fn* [~gx] (c/and ~@pred-exprs)) + pred-exprs (mapv (fn [e] `(fn* [~gx] ~e)) pred-exprs) + pred-forms (walk/postwalk res pred-exprs)] + ;; `(map-spec-impl ~req-keys '~req ~opt '~pred-forms ~pred-exprs ~gen) + `(map-spec-impl {:req '~req :opt '~opt :req-un '~req-un :opt-un '~opt-un + :req-keys '~req-keys :req-specs '~req-specs + :opt-keys '~opt-keys :opt-specs '~opt-specs + :pred-forms '~pred-forms + :pred-exprs ~pred-exprs + :keys-pred ~keys-pred + :gfn ~gen}))) + +(defmacro or + "Takes key+pred pairs, e.g. + + (s/or :even even? :small #(< % 42)) + + Returns a destructuring spec that returns a map entry containing the + key of the first matching pred and the corresponding value. Thus the + 'key' and 'val' functions can be used to refer generically to the + components of the tagged return." + [& key-pred-forms] + (let [pairs (partition 2 key-pred-forms) + keys (mapv first pairs) + pred-forms (mapv second pairs) + pf (mapv res pred-forms)] + (c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "spec/or expects k1 p1 k2 p2..., where ks are keywords") + `(or-spec-impl ~keys '~pf ~pred-forms nil))) + +(defmacro and + "Takes predicate/spec-forms, e.g. + + (s/and even? #(< % 42)) + + Returns a spec that returns the conformed value. Successive + conformed values propagate through rest of predicates." + [& pred-forms] + `(and-spec-impl '~(mapv res pred-forms) ~(vec pred-forms) nil)) + +(defmacro merge + "Takes map-validating specs (e.g. 'keys' specs) and + returns a spec that returns a conformed map satisfying all of the + specs. Unlike 'and', merge can generate maps satisfying the + union of the predicates." + [& pred-forms] + `(merge-spec-impl '~(mapv res pred-forms) ~(vec pred-forms) nil)) + +(defn- res-kind + [opts] + (let [{kind :kind :as mopts} opts] + (->> + (if kind + (assoc mopts :kind `~(res kind)) + mopts) + (mapcat identity)))) + +(defmacro every + "takes a pred and validates collection elements against that pred. + + Note that 'every' does not do exhaustive checking, rather it samples + *coll-check-limit* elements. Nor (as a result) does it do any + conforming of elements. 'explain' will report at most *coll-error-limit* + problems. Thus 'every' should be suitable for potentially large + collections. + + Takes several kwargs options that further constrain the collection: + + :kind - a pred that the collection type must satisfy, e.g. vector? + (default nil) Note that if :kind is specified and :into is + not, this pred must generate in order for every to generate. + :count - specifies coll has exactly this count (default nil) + :min-count, :max-count - coll has count (<= min-count count max-count) (defaults nil) + :distinct - all the elements are distinct (default nil) + + And additional args that control gen + + :gen-max - the maximum coll size to generate (default 20) + :into - one of [], (), {}, #{} - the default collection to generate into + (default: empty coll as generated by :kind pred if supplied, else []) + + Optionally takes :gen generator-fn, which must be a fn of no args that + returns a test.check generator + + See also - coll-of, every-kv +" + [pred & {:keys [into kind count max-count min-count distinct gen-max gen] :as opts}] + (let [desc (::describe opts) + nopts (-> opts + (dissoc :gen ::describe) + (assoc ::kind-form `'~(res (:kind opts)) + ::describe (c/or desc `'(every ~(res pred) ~@(res-kind opts))))) + gx (gensym) + cpreds (cond-> [(list (c/or kind `coll?) gx)] + count (conj `(= ~count (bounded-count ~count ~gx))) + + (c/or min-count max-count) + (conj `(<= (c/or ~min-count 0) + (bounded-count (if ~max-count (inc ~max-count) ~min-count) ~gx) + (c/or ~max-count Integer/MAX_VALUE))) + + distinct + (conj `(c/or (empty? ~gx) (apply distinct? ~gx))))] + `(every-impl '~pred ~pred ~(assoc nopts ::cpred `(fn* [~gx] (c/and ~@cpreds))) ~gen))) + +(defmacro every-kv + "like 'every' but takes separate key and val preds and works on associative collections. + + Same options as 'every', :into defaults to {} + + See also - map-of" + + [kpred vpred & opts] + (let [desc `(every-kv ~(res kpred) ~(res vpred) ~@(res-kind opts))] + `(every (tuple ~kpred ~vpred) ::kfn (fn [i# v#] (nth v# 0)) :into {} ::describe '~desc ~@opts))) + +(defmacro coll-of + "Returns a spec for a collection of items satisfying pred. Unlike + 'every', coll-of will exhaustively conform every value. + + Same options as 'every'. conform will produce a collection + corresponding to :into if supplied, else will match the input collection, + avoiding rebuilding when possible. + + See also - every, map-of" + [pred & opts] + (let [desc `(coll-of ~(res pred) ~@(res-kind opts))] + `(every ~pred ::conform-all true ::describe '~desc ~@opts))) + +(defmacro map-of + "Returns a spec for a map whose keys satisfy kpred and vals satisfy + vpred. Unlike 'every-kv', map-of will exhaustively conform every + value. + + Same options as 'every', :kind defaults to map?, with the addition of: + + :conform-keys - conform keys as well as values (default false) + + See also - every-kv" + [kpred vpred & opts] + (let [desc `(map-of ~(res kpred) ~(res vpred) ~@(res-kind opts))] + `(every-kv ~kpred ~vpred ::conform-all true :kind map? ::describe '~desc ~@opts))) + + +(defmacro * + "Returns a regex op that matches zero or more values matching + pred. Produces a vector of matches iff there is at least one match" + [pred-form] + `(rep-impl '~(res pred-form) ~pred-form)) + +(defmacro + + "Returns a regex op that matches one or more values matching + pred. Produces a vector of matches" + [pred-form] + `(rep+impl '~(res pred-form) ~pred-form)) + +(defmacro ? + "Returns a regex op that matches zero or one value matching + pred. Produces a single value (not a collection) if matched." + [pred-form] + `(maybe-impl ~pred-form '~(res pred-form))) + +(defmacro alt + "Takes key+pred pairs, e.g. + + (s/alt :even even? :small #(< % 42)) + + Returns a regex op that returns a map entry containing the key of the + first matching pred and the corresponding value. Thus the + 'key' and 'val' functions can be used to refer generically to the + components of the tagged return" + [& key-pred-forms] + (let [pairs (partition 2 key-pred-forms) + keys (mapv first pairs) + pred-forms (mapv second pairs) + pf (mapv res pred-forms)] + (c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "alt expects k1 p1 k2 p2..., where ks are keywords") + `(alt-impl ~keys ~pred-forms '~pf))) + +(defmacro cat + "Takes key+pred pairs, e.g. + + (s/cat :e even? :o odd?) + + Returns a regex op that matches (all) values in sequence, returning a map + containing the keys of each pred and the corresponding value." + [& key-pred-forms] + (let [pairs (partition 2 key-pred-forms) + keys (mapv first pairs) + pred-forms (mapv second pairs) + pf (mapv res pred-forms)] + ;;(prn key-pred-forms) + (c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "cat expects k1 p1 k2 p2..., where ks are keywords") + `(cat-impl ~keys ~pred-forms '~pf))) + +(defmacro & + "takes a regex op re, and predicates. Returns a regex-op that consumes + input as per re but subjects the resulting value to the + conjunction of the predicates, and any conforming they might perform." + [re & preds] + (let [pv (vec preds)] + `(amp-impl ~re '~(res re) ~pv '~(mapv res pv)))) + +(defmacro conformer + "takes a predicate function with the semantics of conform i.e. it should return either a + (possibly converted) value or :clojure.spec.alpha/invalid, and returns a + spec that uses it as a predicate/conformer. Optionally takes a + second fn that does unform of result of first" + ([f] `(spec-impl '(conformer ~(res f)) ~f nil true)) + ([f unf] `(spec-impl '(conformer ~(res f) ~(res unf)) ~f nil true ~unf))) + +(defmacro fspec + "takes :args :ret and (optional) :fn kwargs whose values are preds + and returns a spec whose conform/explain take a fn and validates it + using generative testing. The conformed value is always the fn itself. + + See 'fdef' for a single operation that creates an fspec and + registers it, as well as a full description of :args, :ret and :fn + + fspecs can generate functions that validate the arguments and + fabricate a return value compliant with the :ret spec, ignoring + the :fn spec if present. + + Optionally takes :gen generator-fn, which must be a fn of no args + that returns a test.check generator." + + [& {:keys [args ret fn gen] :or {ret `any?}}] + `(fspec-impl (spec ~args) '~(res args) + (spec ~ret) '~(res ret) + (spec ~fn) '~(res fn) ~gen)) + +(defmacro tuple + "takes one or more preds and returns a spec for a tuple, a vector + where each element conforms to the corresponding pred. Each element + will be referred to in paths using its ordinal." + [& preds] + (c/assert (not (empty? preds))) + `(tuple-impl '~(mapv res preds) ~(vec preds))) + +(defn- macroexpand-check + [v args] + (let [fn-spec (get-spec v)] + (when-let [arg-spec (:args fn-spec)] + (when (invalid? (conform arg-spec args)) + (let [ed (assoc (explain-data* arg-spec [] + (if-let [name (spec-name arg-spec)] [name] []) [] args) + ::args args)] + (throw (ex-info + (str "Call to " (->sym v) " did not conform to spec.") + ed))))))) + +(defmacro fdef + "Takes a symbol naming a function, and one or more of the following: + + :args A regex spec for the function arguments as they were a list to be + passed to apply - in this way, a single spec can handle functions with + multiple arities + :ret A spec for the function's return value + :fn A spec of the relationship between args and ret - the + value passed is {:args conformed-args :ret conformed-ret} and is + expected to contain predicates that relate those values + + Qualifies fn-sym with resolve, or using *ns* if no resolution found. + Registers an fspec in the global registry, where it can be retrieved + by calling get-spec with the var or fully-qualified symbol. + + Once registered, function specs are included in doc, checked by + instrument, tested by the runner clojure.spec.test.alpha/check, and (if + a macro) used to explain errors during macroexpansion. + + Note that :fn specs require the presence of :args and :ret specs to + conform values, and so :fn specs will be ignored if :args or :ret + are missing. + + Returns the qualified fn-sym. + + For example, to register function specs for the symbol function: + + (s/fdef clojure.core/symbol + :args (s/alt :separate (s/cat :ns string? :n string?) + :str string? + :sym symbol?) + :ret symbol?)" + [fn-sym & specs] + `(clojure.spec.alpha/def ~fn-sym (clojure.spec.alpha/fspec ~@specs))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; impl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defn- recur-limit? [rmap id path k] + (c/and (> (get rmap id) (::recursion-limit rmap)) + (contains? (set path) k))) + +(defn- inck [m k] + (assoc m k (inc (c/or (get m k) 0)))) + +(defn- dt + ([pred x form] (dt pred x form nil)) + ([pred x form cpred?] + (if pred + (if-let [spec (the-spec pred)] + (conform spec x) + (if (ifn? pred) + (if cpred? + (pred x) + (if (pred x) x ::invalid)) + (throw (Exception. (str (pr-str form) " is not a fn, expected predicate fn"))))) + x))) + +(defn valid? + "Helper function that returns true when x is valid for spec." + ([spec x] + (let [spec (specize spec)] + (not (invalid? (conform* spec x))))) + ([spec x form] + (let [spec (specize spec form)] + (not (invalid? (conform* spec x)))))) + +(defn- pvalid? + "internal helper function that returns true when x is valid for spec." + ([pred x] + (not (invalid? (dt pred x ::unknown)))) + ([pred x form] + (not (invalid? (dt pred x form))))) + +(defn- explain-1 [form pred path via in v] + ;;(prn {:form form :pred pred :path path :in in :v v}) + (let [pred (maybe-spec pred)] + (if (spec? pred) + (explain* pred path (if-let [name (spec-name pred)] (conj via name) via) in v) + [{:path path :pred form :val v :via via :in in}]))) + +(declare or-k-gen and-k-gen) + +(defn- k-gen + "returns a generator for form f, which can be a keyword or a list + starting with 'or or 'and." + [f] + (cond + (keyword? f) (gen/return f) + (= 'or (first f)) (or-k-gen 1 (rest f)) + (= 'and (first f)) (and-k-gen (rest f)))) + +(defn- or-k-gen + "returns a tuple generator made up of generators for a random subset + of min-count (default 0) to all elements in s." + ([s] (or-k-gen 0 s)) + ([min-count s] + (gen/bind (gen/tuple + (gen/choose min-count (count s)) + (gen/shuffle (map k-gen s))) + (fn [[n gens]] + (apply gen/tuple (take n gens)))))) + +(defn- and-k-gen + "returns a tuple generator made up of generators for every element + in s." + [s] + (apply gen/tuple (map k-gen s))) + + +(defn ^:skip-wiki map-spec-impl + "Do not call this directly, use 'spec' with a map argument" + [{:keys [req-un opt-un keys-pred pred-exprs opt-keys req-specs req req-keys opt-specs pred-forms opt gfn] + :as argm}] + (let [k->s (zipmap (concat req-keys opt-keys) (concat req-specs opt-specs)) + keys->specnames #(c/or (k->s %) %) + id (java.util.UUID/randomUUID)] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ m] + (if (keys-pred m) + (let [reg (registry)] + (loop [ret m, [[k v] & ks :as keys] m] + (if keys + (let [sname (keys->specnames k)] + (if-let [s (get reg sname)] + (let [cv (conform s v)] + (if (invalid? cv) + ::invalid + (recur (if (identical? cv v) ret (assoc ret k cv)) + ks))) + (recur ret ks))) + ret))) + ::invalid)) + (unform* [_ m] + (let [reg (registry)] + (loop [ret m, [k & ks :as keys] (c/keys m)] + (if keys + (if (contains? reg (keys->specnames k)) + (let [cv (get m k) + v (unform (keys->specnames k) cv)] + (recur (if (identical? cv v) ret (assoc ret k v)) + ks)) + (recur ret ks)) + ret)))) + (explain* [_ path via in x] + (if-not (map? x) + [{:path path :pred `map? :val x :via via :in in}] + (let [reg (registry)] + (apply concat + (when-let [probs (->> (map (fn [pred form] (when-not (pred x) form)) + pred-exprs pred-forms) + (keep identity) + seq)] + (map + #(identity {:path path :pred % :val x :via via :in in}) + probs)) + (map (fn [[k v]] + (when-not (c/or (not (contains? reg (keys->specnames k))) + (pvalid? (keys->specnames k) v k)) + (explain-1 (keys->specnames k) (keys->specnames k) (conj path k) via (conj in k) v))) + (seq x)))))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (let [rmap (inck rmap id) + rgen (fn [k s] [k (gensub s overrides (conj path k) rmap k)]) + ogen (fn [k s] + (when-not (recur-limit? rmap id path k) + [k (gen/delay (gensub s overrides (conj path k) rmap k))])) + reqs (map rgen req-keys req-specs) + opts (remove nil? (map ogen opt-keys opt-specs))] + (when (every? identity (concat (map second reqs) (map second opts))) + (gen/bind + (gen/tuple + (and-k-gen req) + (or-k-gen opt) + (and-k-gen req-un) + (or-k-gen opt-un)) + (fn [[req-ks opt-ks req-un-ks opt-un-ks]] + (let [qks (flatten (concat req-ks opt-ks)) + unqks (map (comp keyword name) (flatten (concat req-un-ks opt-un-ks)))] + (->> (into reqs opts) + (filter #((set (concat qks unqks)) (first %))) + (apply concat) + (apply gen/hash-map))))))))) + (with-gen* [_ gfn] (map-spec-impl (assoc argm :gfn gfn))) + (describe* [_] (cons `keys + (cond-> [] + req (conj :req req) + opt (conj :opt opt) + req-un (conj :req-un req-un) + opt-un (conj :opt-un opt-un))))))) + + + + +(defn ^:skip-wiki spec-impl + "Do not call this directly, use 'spec'" + ([form pred gfn cpred?] (spec-impl form pred gfn cpred? nil)) + ([form pred gfn cpred? unc] + (cond + (spec? pred) (cond-> pred gfn (with-gen gfn)) + (regex? pred) (regex-spec-impl pred gfn) + (ident? pred) (cond-> (the-spec pred) gfn (with-gen gfn)) + :else + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (let [ret (pred x)] + (if cpred? + ret + (if ret x ::invalid)))) + (unform* [_ x] (if cpred? + (if unc + (unc x) + (throw (IllegalStateException. "no unform fn for conformer"))) + x)) + (explain* [_ path via in x] + (when (invalid? (dt pred x form cpred?)) + [{:path path :pred form :val x :via via :in in}])) + (gen* [_ _ _ _] (if gfn + (gfn) + (gen/gen-for-pred pred))) + (with-gen* [_ gfn] (spec-impl form pred gfn cpred? unc)) + (describe* [_] form))))) + +(defn ^:skip-wiki multi-spec-impl + "Do not call this directly, use 'multi-spec'" + ([form mmvar retag] (multi-spec-impl form mmvar retag nil)) + ([form mmvar retag gfn] + (let [id (java.util.UUID/randomUUID) + predx #(let [^clojure.lang.MultiFn mm @mmvar] + (c/and (.getMethod mm ((.-dispatchFn mm) %)) + (mm %))) + dval #((.-dispatchFn ^clojure.lang.MultiFn @mmvar) %) + tag (if (keyword? retag) + #(assoc %1 retag %2) + retag)] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (if-let [pred (predx x)] + (dt pred x form) + ::invalid)) + (unform* [_ x] (if-let [pred (predx x)] + (unform pred x) + (throw (IllegalStateException. (str "No method of: " form " for dispatch value: " (dval x)))))) + (explain* [_ path via in x] + (let [dv (dval x) + path (conj path dv)] + (if-let [pred (predx x)] + (explain-1 form pred path via in x) + [{:path path :pred form :val x :reason "no method" :via via :in in}]))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (let [gen (fn [[k f]] + (let [p (f nil)] + (let [rmap (inck rmap id)] + (when-not (recur-limit? rmap id path k) + (gen/delay + (gen/fmap + #(tag % k) + (gensub p overrides (conj path k) rmap (list 'method form k)))))))) + gs (->> (methods @mmvar) + (remove (fn [[k]] (invalid? k))) + (map gen) + (remove nil?))] + (when (every? identity gs) + (gen/one-of gs))))) + (with-gen* [_ gfn] (multi-spec-impl form mmvar retag gfn)) + (describe* [_] `(multi-spec ~form ~retag)))))) + +(defn ^:skip-wiki tuple-impl + "Do not call this directly, use 'tuple'" + ([forms preds] (tuple-impl forms preds nil)) + ([forms preds gfn] + (let [specs (delay (mapv specize preds forms)) + cnt (count preds)] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] + (let [specs @specs] + (if-not (c/and (vector? x) + (= (count x) cnt)) + ::invalid + (loop [ret x, i 0] + (if (= i cnt) + ret + (let [v (x i) + cv (conform* (specs i) v)] + (if (invalid? cv) + ::invalid + (recur (if (identical? cv v) ret (assoc ret i cv)) + (inc i))))))))) + (unform* [_ x] + (c/assert (c/and (vector? x) + (= (count x) (count preds)))) + (loop [ret x, i 0] + (if (= i (count x)) + ret + (let [cv (x i) + v (unform (preds i) cv)] + (recur (if (identical? cv v) ret (assoc ret i v)) + (inc i)))))) + (explain* [_ path via in x] + (cond + (not (vector? x)) + [{:path path :pred `vector? :val x :via via :in in}] + + (not= (count x) (count preds)) + [{:path path :pred `(= (count ~'%) ~(count preds)) :val x :via via :in in}] + + :else + (apply concat + (map (fn [i form pred] + (let [v (x i)] + (when-not (pvalid? pred v) + (explain-1 form pred (conj path i) via (conj in i) v)))) + (range (count preds)) forms preds)))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (let [gen (fn [i p f] + (gensub p overrides (conj path i) rmap f)) + gs (map gen (range (count preds)) preds forms)] + (when (every? identity gs) + (apply gen/tuple gs))))) + (with-gen* [_ gfn] (tuple-impl forms preds gfn)) + (describe* [_] `(tuple ~@forms)))))) + +(defn- tagged-ret [tag ret] + (clojure.lang.MapEntry. tag ret)) + +(defn ^:skip-wiki or-spec-impl + "Do not call this directly, use 'or'" + [keys forms preds gfn] + (let [id (java.util.UUID/randomUUID) + kps (zipmap keys preds) + specs (delay (mapv specize preds forms)) + cform (case (count preds) + 2 (fn [x] + (let [specs @specs + ret (conform* (specs 0) x)] + (if (invalid? ret) + (let [ret (conform* (specs 1) x)] + (if (invalid? ret) + ::invalid + (tagged-ret (keys 1) ret))) + (tagged-ret (keys 0) ret)))) + 3 (fn [x] + (let [specs @specs + ret (conform* (specs 0) x)] + (if (invalid? ret) + (let [ret (conform* (specs 1) x)] + (if (invalid? ret) + (let [ret (conform* (specs 2) x)] + (if (invalid? ret) + ::invalid + (tagged-ret (keys 2) ret))) + (tagged-ret (keys 1) ret))) + (tagged-ret (keys 0) ret)))) + (fn [x] + (let [specs @specs] + (loop [i 0] + (if (< i (count specs)) + (let [spec (specs i)] + (let [ret (conform* spec x)] + (if (invalid? ret) + (recur (inc i)) + (tagged-ret (keys i) ret)))) + ::invalid)))))] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (cform x)) + (unform* [_ [k x]] (unform (kps k) x)) + (explain* [this path via in x] + (when-not (pvalid? this x) + (apply concat + (map (fn [k form pred] + (when-not (pvalid? pred x) + (explain-1 form pred (conj path k) via in x))) + keys forms preds)))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (let [gen (fn [k p f] + (let [rmap (inck rmap id)] + (when-not (recur-limit? rmap id path k) + (gen/delay + (gensub p overrides (conj path k) rmap f))))) + gs (remove nil? (map gen keys preds forms))] + (when-not (empty? gs) + (gen/one-of gs))))) + (with-gen* [_ gfn] (or-spec-impl keys forms preds gfn)) + (describe* [_] `(or ~@(mapcat vector keys forms)))))) + +(defn- and-preds [x preds forms] + (loop [ret x + [pred & preds] preds + [form & forms] forms] + (if pred + (let [nret (dt pred ret form)] + (if (invalid? nret) + ::invalid + ;;propagate conformed values + (recur nret preds forms))) + ret))) + +(defn- explain-pred-list + [forms preds path via in x] + (loop [ret x + [form & forms] forms + [pred & preds] preds] + (when pred + (let [nret (dt pred ret form)] + (if (invalid? nret) + (explain-1 form pred path via in ret) + (recur nret forms preds)))))) + +(defn ^:skip-wiki and-spec-impl + "Do not call this directly, use 'and'" + [forms preds gfn] + (let [specs (delay (mapv specize preds forms)) + cform + (case (count preds) + 2 (fn [x] + (let [specs @specs + ret (conform* (specs 0) x)] + (if (invalid? ret) + ::invalid + (conform* (specs 1) ret)))) + 3 (fn [x] + (let [specs @specs + ret (conform* (specs 0) x)] + (if (invalid? ret) + ::invalid + (let [ret (conform* (specs 1) ret)] + (if (invalid? ret) + ::invalid + (conform* (specs 2) ret)))))) + (fn [x] + (let [specs @specs] + (loop [ret x i 0] + (if (< i (count specs)) + (let [nret (conform* (specs i) ret)] + (if (invalid? nret) + ::invalid + ;;propagate conformed values + (recur nret (inc i)))) + ret)))))] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (cform x)) + (unform* [_ x] (reduce #(unform %2 %1) x (reverse preds))) + (explain* [_ path via in x] (explain-pred-list forms preds path via in x)) + (gen* [_ overrides path rmap] (if gfn (gfn) (gensub (first preds) overrides path rmap (first forms)))) + (with-gen* [_ gfn] (and-spec-impl forms preds gfn)) + (describe* [_] `(and ~@forms))))) + +(defn ^:skip-wiki merge-spec-impl + "Do not call this directly, use 'merge'" + [forms preds gfn] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (let [ms (map #(dt %1 x %2) preds forms)] + (if (some invalid? ms) + ::invalid + (apply c/merge ms)))) + (unform* [_ x] (apply c/merge (map #(unform % x) (reverse preds)))) + (explain* [_ path via in x] + (apply concat + (map #(explain-1 %1 %2 path via in x) + forms preds))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (gen/fmap + #(apply c/merge %) + (apply gen/tuple (map #(gensub %1 overrides path rmap %2) + preds forms))))) + (with-gen* [_ gfn] (merge-spec-impl forms preds gfn)) + (describe* [_] `(merge ~@forms)))) + +(defn- coll-prob [x kfn kform distinct count min-count max-count + path via in] + (let [pred (c/or kfn coll?) + kform (c/or kform `coll?)] + (cond + (not (pvalid? pred x)) + (explain-1 kform pred path via in x) + + (c/and count (not= count (bounded-count count x))) + [{:path path :pred `(= ~count (c/count ~'%)) :val x :via via :in in}] + + (c/and (c/or min-count max-count) + (not (<= (c/or min-count 0) + (bounded-count (if max-count (inc max-count) min-count) x) + (c/or max-count Integer/MAX_VALUE)))) + [{:path path :pred `(<= ~(c/or min-count 0) (c/count ~'%) ~(c/or max-count 'Integer/MAX_VALUE)) :val x :via via :in in}] + + (c/and distinct (not (empty? x)) (not (apply distinct? x))) + [{:path path :pred 'distinct? :val x :via via :in in}]))) + +(def ^:private empty-coll {`vector? [], `set? #{}, `list? (), `map? {}}) + +(defn ^:skip-wiki every-impl + "Do not call this directly, use 'every', 'every-kv', 'coll-of' or 'map-of'" + ([form pred opts] (every-impl form pred opts nil)) + ([form pred {conform-into :into + describe-form ::describe + :keys [kind ::kind-form count max-count min-count distinct gen-max ::kfn ::cpred + conform-keys ::conform-all] + :or {gen-max 20} + :as opts} + gfn] + (let [gen-into (if conform-into (empty conform-into) (get empty-coll kind-form)) + spec (delay (specize pred)) + check? #(valid? @spec %) + kfn (c/or kfn (fn [i v] i)) + addcv (fn [ret i v cv] (conj ret cv)) + cfns (fn [x] + ;;returns a tuple of [init add complete] fns + (cond + (c/and (vector? x) (c/or (not conform-into) (vector? conform-into))) + [identity + (fn [ret i v cv] + (if (identical? v cv) + ret + (assoc ret i cv))) + identity] + + (c/and (map? x) (c/or (c/and kind (not conform-into)) (map? conform-into))) + [(if conform-keys empty identity) + (fn [ret i v cv] + (if (c/and (identical? v cv) (not conform-keys)) + ret + (assoc ret (nth (if conform-keys cv v) 0) (nth cv 1)))) + identity] + + (c/or (list? conform-into) (seq? conform-into) (c/and (not conform-into) (c/or (list? x) (seq? x)))) + [(constantly ()) addcv reverse] + + :else [#(empty (c/or conform-into %)) addcv identity]))] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] + (let [spec @spec] + (cond + (not (cpred x)) ::invalid + + conform-all + (let [[init add complete] (cfns x)] + (loop [ret (init x), i 0, [v & vs :as vseq] (seq x)] + (if vseq + (let [cv (conform* spec v)] + (if (invalid? cv) + ::invalid + (recur (add ret i v cv) (inc i) vs))) + (complete ret)))) + + + :else + (if (indexed? x) + (let [step (max 1 (long (/ (c/count x) *coll-check-limit*)))] + (loop [i 0] + (if (>= i (c/count x)) + x + (if (valid? spec (nth x i)) + (recur (c/+ i step)) + ::invalid)))) + (let [limit *coll-check-limit*] + (loop [i 0 [v & vs :as vseq] (seq x)] + (cond + (c/or (nil? vseq) (= i limit)) x + (valid? spec v) (recur (inc i) vs) + :else ::invalid))))))) + (unform* [_ x] + (if conform-all + (let [spec @spec + [init add complete] (cfns x)] + (loop [ret (init x), i 0, [v & vs :as vseq] (seq x)] + (if (>= i (c/count x)) + (complete ret) + (recur (add ret i v (unform* spec v)) (inc i) vs)))) + x)) + (explain* [_ path via in x] + (c/or (coll-prob x kind kind-form distinct count min-count max-count + path via in) + (apply concat + ((if conform-all identity (partial take *coll-error-limit*)) + (keep identity + (map (fn [i v] + (let [k (kfn i v)] + (when-not (check? v) + (let [prob (explain-1 form pred path via (conj in k) v)] + prob)))) + (range) x)))))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (let [pgen (gensub pred overrides path rmap form)] + (gen/bind + (cond + gen-into (gen/return gen-into) + kind (gen/fmap #(if (empty? %) % (empty %)) + (gensub kind overrides path rmap form)) + :else (gen/return [])) + (fn [init] + (gen/fmap + #(if (vector? init) % (into init %)) + (cond + distinct + (if count + (gen/vector-distinct pgen {:num-elements count :max-tries 100}) + (gen/vector-distinct pgen {:min-elements (c/or min-count 0) + :max-elements (c/or max-count (max gen-max (c/* 2 (c/or min-count 0)))) + :max-tries 100})) + + count + (gen/vector pgen count) + + (c/or min-count max-count) + (gen/vector pgen (c/or min-count 0) (c/or max-count (max gen-max (c/* 2 (c/or min-count 0))))) + + :else + (gen/vector pgen 0 gen-max)))))))) + + (with-gen* [_ gfn] (every-impl form pred opts gfn)) + (describe* [_] (c/or describe-form `(every ~(res form) ~@(mapcat identity opts)))))))) + +;;;;;;;;;;;;;;;;;;;;;;; regex ;;;;;;;;;;;;;;;;;;; +;;See: +;; http://matt.might.net/articles/implementation-of-regular-expression-matching-in-scheme-with-derivatives/ +;; http://www.ccs.neu.edu/home/turon/re-deriv.pdf + +;;ctors +(defn- accept [x] {::op ::accept :ret x}) + +(defn- accept? [{:keys [::op]}] + (= ::accept op)) + +(defn- pcat* [{[p1 & pr :as ps] :ps, [k1 & kr :as ks] :ks, [f1 & fr :as forms] :forms, ret :ret, rep+ :rep+}] + (when (every? identity ps) + (if (accept? p1) + (let [rp (:ret p1) + ret (conj ret (if ks {k1 rp} rp))] + (if pr + (pcat* {:ps pr :ks kr :forms fr :ret ret}) + (accept ret))) + {::op ::pcat, :ps ps, :ret ret, :ks ks, :forms forms :rep+ rep+}))) + +(defn- pcat [& ps] (pcat* {:ps ps :ret []})) + +(defn ^:skip-wiki cat-impl + "Do not call this directly, use 'cat'" + [ks ps forms] + (pcat* {:ks ks, :ps ps, :forms forms, :ret {}})) + +(defn- rep* [p1 p2 ret splice form] + (when p1 + (let [r {::op ::rep, :p2 p2, :splice splice, :forms form :id (java.util.UUID/randomUUID)}] + (if (accept? p1) + (assoc r :p1 p2 :ret (conj ret (:ret p1))) + (assoc r :p1 p1, :ret ret))))) + +(defn ^:skip-wiki rep-impl + "Do not call this directly, use '*'" + [form p] (rep* p p [] false form)) + +(defn ^:skip-wiki rep+impl + "Do not call this directly, use '+'" + [form p] + (pcat* {:ps [p (rep* p p [] true form)] :forms `[~form (* ~form)] :ret [] :rep+ form})) + +(defn ^:skip-wiki amp-impl + "Do not call this directly, use '&'" + [re re-form preds pred-forms] + {::op ::amp :p1 re :amp re-form :ps preds :forms pred-forms}) + +(defn- filter-alt [ps ks forms f] + (if (c/or ks forms) + (let [pks (->> (map vector ps + (c/or (seq ks) (repeat nil)) + (c/or (seq forms) (repeat nil))) + (filter #(-> % first f)))] + [(seq (map first pks)) (when ks (seq (map second pks))) (when forms (seq (map #(nth % 2) pks)))]) + [(seq (filter f ps)) ks forms])) + +(defn- alt* [ps ks forms] + (let [[[p1 & pr :as ps] [k1 :as ks] forms] (filter-alt ps ks forms identity)] + (when ps + (let [ret {::op ::alt, :ps ps, :ks ks :forms forms}] + (if (nil? pr) + (if k1 + (if (accept? p1) + (accept (tagged-ret k1 (:ret p1))) + ret) + p1) + ret))))) + +(defn- alts [& ps] (alt* ps nil nil)) +(defn- alt2 [p1 p2] (if (c/and p1 p2) (alts p1 p2) (c/or p1 p2))) + +(defn ^:skip-wiki alt-impl + "Do not call this directly, use 'alt'" + [ks ps forms] (assoc (alt* ps ks forms) :id (java.util.UUID/randomUUID))) + +(defn ^:skip-wiki maybe-impl + "Do not call this directly, use '?'" + [p form] (assoc (alt* [p (accept ::nil)] nil [form ::nil]) :maybe form)) + +(defn- noret? [p1 pret] + (c/or (= pret ::nil) + (c/and (#{::rep ::pcat} (::op (reg-resolve! p1))) ;;hrm, shouldn't know these + (empty? pret)) + nil)) + +(declare preturn) + +(defn- accept-nil? [p] + (let [{:keys [::op ps p1 p2 forms] :as p} (reg-resolve! p)] + (case op + ::accept true + nil nil + ::amp (c/and (accept-nil? p1) + (let [ret (-> (preturn p1) (and-preds ps (next forms)))] + (not (invalid? ret)))) + ::rep (c/or (identical? p1 p2) (accept-nil? p1)) + ::pcat (every? accept-nil? ps) + ::alt (c/some accept-nil? ps)))) + +(declare add-ret) + +(defn- preturn [p] + (let [{[p0 & pr :as ps] :ps, [k :as ks] :ks, :keys [::op p1 ret forms] :as p} (reg-resolve! p)] + (case op + ::accept ret + nil nil + ::amp (let [pret (preturn p1)] + (if (noret? p1 pret) + ::nil + (and-preds pret ps forms))) + ::rep (add-ret p1 ret k) + ::pcat (add-ret p0 ret k) + ::alt (let [[[p0] [k0]] (filter-alt ps ks forms accept-nil?) + r (if (nil? p0) ::nil (preturn p0))] + (if k0 (tagged-ret k0 r) r))))) + +(defn- op-unform [p x] + ;;(prn {:p p :x x}) + (let [{[p0 & pr :as ps] :ps, [k :as ks] :ks, :keys [::op p1 ret forms rep+ maybe] :as p} (reg-resolve! p) + kps (zipmap ks ps)] + (case op + ::accept [ret] + nil [(unform p x)] + ::amp (let [px (reduce #(unform %2 %1) x (reverse ps))] + (op-unform p1 px)) + ::rep (mapcat #(op-unform p1 %) x) + ::pcat (if rep+ + (mapcat #(op-unform p0 %) x) + (mapcat (fn [k] + (when (contains? x k) + (op-unform (kps k) (get x k)))) + ks)) + ::alt (if maybe + [(unform p0 x)] + (let [[k v] x] + (op-unform (kps k) v)))))) + +(defn- add-ret [p r k] + (let [{:keys [::op ps splice] :as p} (reg-resolve! p) + prop #(let [ret (preturn p)] + (if (empty? ret) r ((if splice into conj) r (if k {k ret} ret))))] + (case op + nil r + (::alt ::accept ::amp) + (let [ret (preturn p)] + ;;(prn {:ret ret}) + (if (= ret ::nil) r (conj r (if k {k ret} ret)))) + + (::rep ::pcat) (prop)))) + +(defn- deriv + [p x] + (let [{[p0 & pr :as ps] :ps, [k0 & kr :as ks] :ks, :keys [::op p1 p2 ret splice forms amp] :as p} (reg-resolve! p)] + (when p + (case op + ::accept nil + nil (let [ret (dt p x p)] + (when-not (invalid? ret) (accept ret))) + ::amp (when-let [p1 (deriv p1 x)] + (if (= ::accept (::op p1)) + (let [ret (-> (preturn p1) (and-preds ps (next forms)))] + (when-not (invalid? ret) + (accept ret))) + (amp-impl p1 amp ps forms))) + ::pcat (alt2 (pcat* {:ps (cons (deriv p0 x) pr), :ks ks, :forms forms, :ret ret}) + (when (accept-nil? p0) (deriv (pcat* {:ps pr, :ks kr, :forms (next forms), :ret (add-ret p0 ret k0)}) x))) + ::alt (alt* (map #(deriv % x) ps) ks forms) + ::rep (alt2 (rep* (deriv p1 x) p2 ret splice forms) + (when (accept-nil? p1) (deriv (rep* p2 p2 (add-ret p1 ret nil) splice forms) x))))))) + +(defn- op-describe [p] + (let [{:keys [::op ps ks forms splice p1 rep+ maybe amp] :as p} (reg-resolve! p)] + ;;(prn {:op op :ks ks :forms forms :p p}) + (when p + (case op + ::accept nil + nil p + ::amp (list* 'clojure.spec.alpha/& amp forms) + ::pcat (if rep+ + (list `+ rep+) + (cons `cat (mapcat vector (c/or (seq ks) (repeat :_)) forms))) + ::alt (if maybe + (list `? maybe) + (cons `alt (mapcat vector ks forms))) + ::rep (list (if splice `+ `*) forms))))) + +(defn- op-explain [form p path via in input] + ;;(prn {:form form :p p :path path :input input}) + (let [[x :as input] input + {:keys [::op ps ks forms splice p1 p2] :as p} (reg-resolve! p) + via (if-let [name (spec-name p)] (conj via name) via) + insufficient (fn [path form] + [{:path path + :reason "Insufficient input" + :pred form + :val () + :via via + :in in}])] + (when p + (case op + ::accept nil + nil (if (empty? input) + (insufficient path form) + (explain-1 form p path via in x)) + ::amp (if (empty? input) + (if (accept-nil? p1) + (explain-pred-list forms ps path via in (preturn p1)) + (insufficient path (:amp p))) + (if-let [p1 (deriv p1 x)] + (explain-pred-list forms ps path via in (preturn p1)) + (op-explain (:amp p) p1 path via in input))) + ::pcat (let [pkfs (map vector + ps + (c/or (seq ks) (repeat nil)) + (c/or (seq forms) (repeat nil))) + [pred k form] (if (= 1 (count pkfs)) + (first pkfs) + (first (remove (fn [[p]] (accept-nil? p)) pkfs))) + path (if k (conj path k) path) + form (c/or form (op-describe pred))] + (if (c/and (empty? input) (not pred)) + (insufficient path form) + (op-explain form pred path via in input))) + ::alt (if (empty? input) + (insufficient path (op-describe p)) + (apply concat + (map (fn [k form pred] + (op-explain (c/or form (op-describe pred)) + pred + (if k (conj path k) path) + via + in + input)) + (c/or (seq ks) (repeat nil)) + (c/or (seq forms) (repeat nil)) + ps))) + ::rep (op-explain (if (identical? p1 p2) + forms + (op-describe p1)) + p1 path via in input))))) + +(defn- re-gen [p overrides path rmap f] + ;;(prn {:op op :ks ks :forms forms}) + (let [origp p + {:keys [::op ps ks p1 p2 forms splice ret id ::gfn] :as p} (reg-resolve! p) + rmap (if id (inck rmap id) rmap) + ggens (fn [ps ks forms] + (let [gen (fn [p k f] + ;;(prn {:k k :path path :rmap rmap :op op :id id}) + (when-not (c/and rmap id k (recur-limit? rmap id path k)) + (if id + (gen/delay (re-gen p overrides (if k (conj path k) path) rmap (c/or f p))) + (re-gen p overrides (if k (conj path k) path) rmap (c/or f p)))))] + (map gen ps (c/or (seq ks) (repeat nil)) (c/or (seq forms) (repeat nil)))))] + (c/or (when-let [gfn (c/or (get overrides (spec-name origp)) + (get overrides (spec-name p) ) + (get overrides path))] + (case op + (:accept nil) (gen/fmap vector (gfn)) + (gfn))) + (when gfn + (gfn)) + (when p + (case op + ::accept (if (= ret ::nil) + (gen/return []) + (gen/return [ret])) + nil (when-let [g (gensub p overrides path rmap f)] + (gen/fmap vector g)) + ::amp (re-gen p1 overrides path rmap (op-describe p1)) + ::pcat (let [gens (ggens ps ks forms)] + (when (every? identity gens) + (apply gen/cat gens))) + ::alt (let [gens (remove nil? (ggens ps ks forms))] + (when-not (empty? gens) + (gen/one-of gens))) + ::rep (if (recur-limit? rmap id [id] id) + (gen/return []) + (when-let [g (re-gen p2 overrides path rmap forms)] + (gen/fmap #(apply concat %) + (gen/vector g))))))))) + +(defn- re-conform [p [x & xs :as data]] + ;;(prn {:p p :x x :xs xs}) + (if (empty? data) + (if (accept-nil? p) + (let [ret (preturn p)] + (if (= ret ::nil) + nil + ret)) + ::invalid) + (if-let [dp (deriv p x)] + (recur dp xs) + ::invalid))) + +(defn- re-explain [path via in re input] + (loop [p re [x & xs :as data] input i 0] + ;;(prn {:p p :x x :xs xs :re re}) (prn) + (if (empty? data) + (if (accept-nil? p) + nil ;;success + (op-explain (op-describe p) p path via in nil)) + (if-let [dp (deriv p x)] + (recur dp xs (inc i)) + (if (accept? p) + (if (= (::op p) ::pcat) + (op-explain (op-describe p) p path via (conj in i) (seq data)) + [{:path path + :reason "Extra input" + :pred (op-describe re) + :val data + :via via + :in (conj in i)}]) + (c/or (op-explain (op-describe p) p path via (conj in i) (seq data)) + [{:path path + :reason "Extra input" + :pred (op-describe p) + :val data + :via via + :in (conj in i)}])))))) + +(defn ^:skip-wiki regex-spec-impl + "Do not call this directly, use 'spec' with a regex op argument" + [re gfn] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] + (if (c/or (nil? x) (sequential? x)) + (re-conform re (seq x)) + ::invalid)) + (unform* [_ x] (op-unform re x)) + (explain* [_ path via in x] + (if (c/or (nil? x) (sequential? x)) + (re-explain path via in re (seq x)) + [{:path path :pred (res `#(c/or (nil? %) (sequential? %))) :val x :via via :in in}])) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (re-gen re overrides path rmap (op-describe re)))) + (with-gen* [_ gfn] (regex-spec-impl re gfn)) + (describe* [_] (op-describe re)))) + +;;;;;;;;;;;;;;;;; HOFs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defn- call-valid? + [f specs args] + (let [cargs (conform (:args specs) args)] + (when-not (invalid? cargs) + (let [ret (apply f args) + cret (conform (:ret specs) ret)] + (c/and (not (invalid? cret)) + (if (:fn specs) + (pvalid? (:fn specs) {:args cargs :ret cret}) + true)))))) + +(defn- validate-fn + "returns f if valid, else smallest" + [f specs iters] + (let [g (gen (:args specs)) + prop (gen/for-all* [g] #(call-valid? f specs %))] + (let [ret (gen/quick-check iters prop)] + (if-let [[smallest] (-> ret :shrunk :smallest)] + smallest + f)))) + +(defn ^:skip-wiki fspec-impl + "Do not call this directly, use 'fspec'" + [argspec aform retspec rform fnspec fform gfn] + (let [specs {:args argspec :ret retspec :fn fnspec}] + (reify + clojure.lang.ILookup + (valAt [this k] (get specs k)) + (valAt [_ k not-found] (get specs k not-found)) + + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [this f] (if argspec + (if (ifn? f) + (if (identical? f (validate-fn f specs *fspec-iterations*)) f ::invalid) + ::invalid) + (throw (Exception. (str "Can't conform fspec without args spec: " (pr-str (describe this))))))) + (unform* [_ f] f) + (explain* [_ path via in f] + (if (ifn? f) + (let [args (validate-fn f specs 100)] + (if (identical? f args) ;;hrm, we might not be able to reproduce + nil + (let [ret (try (apply f args) (catch Throwable t t))] + (if (instance? Throwable ret) + ;;TODO add exception data + [{:path path :pred '(apply fn) :val args :reason (.getMessage ^Throwable ret) :via via :in in}] + + (let [cret (dt retspec ret rform)] + (if (invalid? cret) + (explain-1 rform retspec (conj path :ret) via in ret) + (when fnspec + (let [cargs (conform argspec args)] + (explain-1 fform fnspec (conj path :fn) via in {:args cargs :ret cret}))))))))) + [{:path path :pred 'ifn? :val f :via via :in in}])) + (gen* [_ overrides _ _] (if gfn + (gfn) + (gen/return + (fn [& args] + (c/assert (pvalid? argspec args) (with-out-str (explain argspec args))) + (gen/generate (gen retspec overrides)))))) + (with-gen* [_ gfn] (fspec-impl argspec aform retspec rform fnspec fform gfn)) + (describe* [_] `(fspec :args ~aform :ret ~rform :fn ~fform))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; non-primitives ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(clojure.spec.alpha/def ::kvs->map (conformer #(zipmap (map ::k %) (map ::v %)) #(map (fn [[k v]] {::k k ::v v}) %))) + +(defmacro keys* + "takes the same arguments as spec/keys and returns a regex op that matches sequences of key/values, + converts them into a map, and conforms that map with a corresponding + spec/keys call: + + user=> (s/conform (s/keys :req-un [::a ::c]) {:a 1 :c 2}) + {:a 1, :c 2} + user=> (s/conform (s/keys* :req-un [::a ::c]) [:a 1 :c 2]) + {:a 1, :c 2} + + the resulting regex op can be composed into a larger regex: + + user=> (s/conform (s/cat :i1 integer? :m (s/keys* :req-un [::a ::c]) :i2 integer?) [42 :a 1 :c 2 :d 4 99]) + {:i1 42, :m {:a 1, :c 2, :d 4}, :i2 99}" + [& kspecs] + `(let [mspec# (keys ~@kspecs)] + (with-gen (clojure.spec.alpha/& (* (cat ::k keyword? ::v any?)) ::kvs->map mspec#) + (fn [] (gen/fmap (fn [m#] (apply concat m#)) (gen mspec#)))))) + +(defn ^:skip-wiki nonconforming + "takes a spec and returns a spec that has the same properties except + 'conform' returns the original (not the conformed) value. Note, will specize regex ops." + [spec] + (let [spec (delay (specize spec))] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (let [ret (conform* @spec x)] + (if (invalid? ret) + ::invalid + x))) + (unform* [_ x] x) + (explain* [_ path via in x] (explain* @spec path via in x)) + (gen* [_ overrides path rmap] (gen* @spec overrides path rmap)) + (with-gen* [_ gfn] (nonconforming (with-gen* @spec gfn))) + (describe* [_] `(nonconforming ~(describe* @spec)))))) + +(defn ^:skip-wiki nilable-impl + "Do not call this directly, use 'nilable'" + [form pred gfn] + (let [spec (delay (specize pred form))] + (reify + Specize + (specize* [s] s) + (specize* [s _] s) + + Spec + (conform* [_ x] (if (nil? x) nil (conform* @spec x))) + (unform* [_ x] (if (nil? x) nil (unform* @spec x))) + (explain* [_ path via in x] + (when-not (c/or (pvalid? @spec x) (nil? x)) + (conj + (explain-1 form pred (conj path ::pred) via in x) + {:path (conj path ::nil) :pred 'nil? :val x :via via :in in}))) + (gen* [_ overrides path rmap] + (if gfn + (gfn) + (gen/frequency + [[1 (gen/delay (gen/return nil))] + [9 (gen/delay (gensub pred overrides (conj path ::pred) rmap form))]]))) + (with-gen* [_ gfn] (nilable-impl form pred gfn)) + (describe* [_] `(nilable ~(res form)))))) + +(defmacro nilable + "returns a spec that accepts nil and values satisfying pred" + [pred] + (let [pf (res pred)] + `(nilable-impl '~pf ~pred nil))) + +(defn exercise + "generates a number (default 10) of values compatible with spec and maps conform over them, + returning a sequence of [val conformed-val] tuples. Optionally takes + a generator overrides map as per gen" + ([spec] (exercise spec 10)) + ([spec n] (exercise spec n nil)) + ([spec n overrides] + (map #(vector % (conform spec %)) (gen/sample (gen spec overrides) n)))) + +(defn exercise-fn + "exercises the fn named by sym (a symbol) by applying it to + n (default 10) generated samples of its args spec. When fspec is + supplied its arg spec is used, and sym-or-f can be a fn. Returns a + sequence of tuples of [args ret]. " + ([sym] (exercise-fn sym 10)) + ([sym n] (exercise-fn sym n (get-spec sym))) + ([sym-or-f n fspec] + (let [f (if (symbol? sym-or-f) (resolve sym-or-f) sym-or-f)] + (if-let [arg-spec (c/and fspec (:args fspec))] + (for [args (gen/sample (gen arg-spec) n)] + [args (apply f args)]) + (throw (Exception. "No :args spec found, can't generate")))))) + +(defn inst-in-range? + "Return true if inst at or after start and before end" + [start end inst] + (c/and (inst? inst) + (let [t (inst-ms inst)] + (c/and (<= (inst-ms start) t) (< t (inst-ms end)))))) + +(defmacro inst-in + "Returns a spec that validates insts in the range from start +(inclusive) to end (exclusive)." + [start end] + `(let [st# (inst-ms ~start) + et# (inst-ms ~end) + mkdate# (fn [d#] (java.util.Date. ^{:tag ~'long} d#))] + (spec (and inst? #(inst-in-range? ~start ~end %)) + :gen (fn [] + (gen/fmap mkdate# + (gen/large-integer* {:min st# :max et#})))))) + +(defn int-in-range? + "Return true if start <= val, val < end and val is a fixed + precision integer." + [start end val] + (c/and (int? val) (<= start val) (< val end))) + +(defmacro int-in + "Returns a spec that validates fixed precision integers in the + range from start (inclusive) to end (exclusive)." + [start end] + `(spec (and int? #(int-in-range? ~start ~end %)) + :gen #(gen/large-integer* {:min ~start :max (dec ~end)}))) + +(defmacro double-in + "Specs a 64-bit floating point number. Options: + + :infinite? - whether +/- infinity allowed (default true) + :NaN? - whether NaN allowed (default true) + :min - minimum value (inclusive, default none) + :max - maximum value (inclusive, default none)" + [& {:keys [infinite? NaN? min max] + :or {infinite? true NaN? true} + :as m}] + `(spec (and c/double? + ~@(when-not infinite? '[#(not (Double/isInfinite %))]) + ~@(when-not NaN? '[#(not (Double/isNaN %))]) + ~@(when max `[#(<= % ~max)]) + ~@(when min `[#(<= ~min %)])) + :gen #(gen/double* ~m))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; assert ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defonce + ^{:dynamic true + :doc "If true, compiler will enable spec asserts, which are then +subject to runtime control via check-asserts? If false, compiler +will eliminate all spec assert overhead. See 'assert'. + +Initially set to boolean value of clojure.spec.compile-asserts +system property. Defaults to true."} + *compile-asserts* + (not= "false" (System/getProperty "clojure.spec.compile-asserts"))) + +(def ^:private check-spec-asserts (atom true)) + +(defn check-asserts? + "Returns the value set by check-asserts." + [] + @check-spec-asserts) + +(defn check-asserts + "Enable or disable spec asserts that have been compiled +with '*compile-asserts*' true. See 'assert'. + +Initially set to boolean value of clojure.spec.check-asserts +system property. Defaults to false." + [flag] + (reset! check-spec-asserts flag)) + +(defn assert* + "Do not call this directly, use 'assert'." + [spec x] + (if (valid? spec x) + x + (let [ed (c/merge (assoc (explain-data* spec [] [] [] x) + ::failure :assertion-failed))] + (throw (ex-info + (str "Spec assertion failed\n" (with-out-str (explain-out ed))) + ed))))) + +(defmacro assert + "spec-checking assert expression. Returns x if x is valid? according +to spec, else throws an ex-info with explain-data plus ::failure of +:assertion-failed. + +Can be disabled at either compile time or runtime: + +If *compile-asserts* is false at compile time, compiles to x. Defaults +to value of 'clojure.spec.compile-asserts' system property, or true if +not set. + +If (check-asserts?) is false at runtime, always returns x. Defaults to +value of 'clojure.spec.check-asserts' system property, or false if not +set. You can toggle check-asserts? with (check-asserts bool)." + [spec x] + (if *compile-asserts* + `(if @check-spec-asserts + (assert* ~spec ~x) + ~x) + x)) + + diff --git a/resources/src/babashka/clojure/spec/gen/alpha.clj b/resources/src/babashka/clojure/spec/gen/alpha.clj new file mode 100644 index 00000000..c35f9ff1 --- /dev/null +++ b/resources/src/babashka/clojure/spec/gen/alpha.clj @@ -0,0 +1,227 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns clojure.spec.gen.alpha + (:refer-clojure :exclude [boolean bytes cat hash-map list map not-empty set vector + char double int keyword symbol string uuid delay shuffle])) + +(alias 'c 'clojure.core) + +(defonce ^:private dynalock (Object.)) + +(defn- dynaload + [s] + (let [ns (namespace s)] + (assert ns) + (locking dynalock + (require (c/symbol ns))) + (let [v (resolve s)] + (if v + @v + (throw (RuntimeException. (str "Var " s " is not on the classpath"))))))) + +(def ^:private quick-check-ref + (c/delay (dynaload 'clojure.test.check/quick-check))) +(defn quick-check + [& args] + (apply @quick-check-ref args)) + +(def ^:private for-all*-ref + (c/delay (dynaload 'clojure.test.check.properties/for-all*))) +(defn for-all* + "Dynamically loaded clojure.test.check.properties/for-all*." + [& args] + (apply @for-all*-ref args)) + +(let [g? (c/delay (dynaload 'clojure.test.check.generators/generator?)) + g (c/delay (dynaload 'clojure.test.check.generators/generate)) + mkg (c/delay (dynaload 'clojure.test.check.generators/->Generator))] + (defn- generator? + [x] + (@g? x)) + (defn- generator + [gfn] + (@mkg gfn)) + (defn generate + "Generate a single value using generator." + [generator] + (@g generator))) + +(defn ^:skip-wiki delay-impl + [gfnd] + ;;N.B. depends on test.check impl details + (generator (fn [rnd size] + ((:gen @gfnd) rnd size)))) + +(defmacro delay + "given body that returns a generator, returns a + generator that delegates to that, but delays + creation until used." + [& body] + `(delay-impl (c/delay ~@body))) + +(defn gen-for-name + "Dynamically loads test.check generator named s." + [s] + (let [g (dynaload s)] + (if (generator? g) + g + (throw (RuntimeException. (str "Var " s " is not a generator")))))) + +(defmacro ^:skip-wiki lazy-combinator + "Implementation macro, do not call directly." + [s] + (let [fqn (c/symbol "clojure.test.check.generators" (name s)) + doc (str "Lazy loaded version of " fqn)] + `(let [g# (c/delay (dynaload '~fqn))] + (defn ~s + ~doc + [& ~'args] + (apply @g# ~'args))))) + +(defmacro ^:skip-wiki lazy-combinators + "Implementation macro, do not call directly." + [& syms] + `(do + ~@(c/map + (fn [s] (c/list 'lazy-combinator s)) + syms))) + +(lazy-combinators hash-map list map not-empty set vector vector-distinct fmap elements + bind choose fmap one-of such-that tuple sample return + large-integer* double* frequency shuffle) + +(defmacro ^:skip-wiki lazy-prim + "Implementation macro, do not call directly." + [s] + (let [fqn (c/symbol "clojure.test.check.generators" (name s)) + doc (str "Fn returning " fqn)] + `(let [g# (c/delay (dynaload '~fqn))] + (defn ~s + ~doc + [& ~'args] + @g#)))) + +(defmacro ^:skip-wiki lazy-prims + "Implementation macro, do not call directly." + [& syms] + `(do + ~@(c/map + (fn [s] (c/list 'lazy-prim s)) + syms))) + +(lazy-prims any any-printable boolean bytes char char-alpha char-alphanumeric char-ascii double + int keyword keyword-ns large-integer ratio simple-type simple-type-printable + string string-ascii string-alphanumeric symbol symbol-ns uuid) + +(defn cat + "Returns a generator of a sequence catenated from results of +gens, each of which should generate something sequential." + [& gens] + (fmap #(apply concat %) + (apply tuple gens))) + +(defn- qualified? [ident] (not (nil? (namespace ident)))) + +(def ^:private + gen-builtins + (c/delay + (let [simple (simple-type-printable)] + {any? (one-of [(return nil) (any-printable)]) + some? (such-that some? (any-printable)) + number? (one-of [(large-integer) (double)]) + integer? (large-integer) + int? (large-integer) + pos-int? (large-integer* {:min 1}) + neg-int? (large-integer* {:max -1}) + nat-int? (large-integer* {:min 0}) + float? (double) + double? (double) + boolean? (boolean) + string? (string-alphanumeric) + ident? (one-of [(keyword-ns) (symbol-ns)]) + simple-ident? (one-of [(keyword) (symbol)]) + qualified-ident? (such-that qualified? (one-of [(keyword-ns) (symbol-ns)])) + keyword? (keyword-ns) + simple-keyword? (keyword) + qualified-keyword? (such-that qualified? (keyword-ns)) + symbol? (symbol-ns) + simple-symbol? (symbol) + qualified-symbol? (such-that qualified? (symbol-ns)) + uuid? (uuid) + uri? (fmap #(java.net.URI/create (str "http://" % ".com")) (uuid)) + decimal? (fmap #(BigDecimal/valueOf %) + (double* {:infinite? false :NaN? false})) + inst? (fmap #(java.util.Date. %) + (large-integer)) + seqable? (one-of [(return nil) + (list simple) + (vector simple) + (map simple simple) + (set simple) + (string-alphanumeric)]) + indexed? (vector simple) + map? (map simple simple) + vector? (vector simple) + list? (list simple) + seq? (list simple) + char? (char) + set? (set simple) + nil? (return nil) + false? (return false) + true? (return true) + zero? (return 0) + rational? (one-of [(large-integer) (ratio)]) + coll? (one-of [(map simple simple) + (list simple) + (vector simple) + (set simple)]) + empty? (elements [nil '() [] {} #{}]) + associative? (one-of [(map simple simple) (vector simple)]) + sequential? (one-of [(list simple) (vector simple)]) + ratio? (such-that ratio? (ratio)) + bytes? (bytes)}))) + +(defn gen-for-pred + "Given a predicate, returns a built-in generator if one exists." + [pred] + (if (set? pred) + (elements pred) + (get @gen-builtins pred))) + +(comment + (require :reload 'clojure.spec.gen.alpha) + (in-ns 'clojure.spec.gen.alpha) + + ;; combinators, see call to lazy-combinators above for complete list + (generate (one-of [(gen-for-pred integer?) (gen-for-pred string?)])) + (generate (such-that #(< 10000 %) (gen-for-pred integer?))) + (let [reqs {:a (gen-for-pred number?) + :b (gen-for-pred ratio?)} + opts {:c (gen-for-pred string?)}] + (generate (bind (choose 0 (count opts)) + #(let [args (concat (seq reqs) (c/shuffle (seq opts)))] + (->> args + (take (+ % (count reqs))) + (mapcat identity) + (apply hash-map)))))) + (generate (cat (list (gen-for-pred string?)) + (list (gen-for-pred ratio?)))) + + ;; load your own generator + (gen-for-name 'clojure.test.check.generators/int) + + ;; failure modes + (gen-for-name 'unqualified) + (gen-for-name 'clojure.core/+) + (gen-for-name 'clojure.core/name-does-not-exist) + (gen-for-name 'ns.does.not.exist/f) + + ) + + diff --git a/resources/src/babashka/clojure/spec/test/alpha.clj b/resources/src/babashka/clojure/spec/test/alpha.clj new file mode 100644 index 00000000..4f1524ce --- /dev/null +++ b/resources/src/babashka/clojure/spec/test/alpha.clj @@ -0,0 +1,579 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(ns clojure.spec.test.alpha + (:refer-clojure :exclude [test]) + (:require + [clojure.pprint :as pp] + [clojure.spec.alpha :as s] + [clojure.spec.gen.alpha :as gen] + [clojure.string :as str])) + +(in-ns 'clojure.spec.test.check) +(in-ns 'clojure.spec.test.alpha) +(alias 'stc 'clojure.spec.test.check) + +(defn- throwable? + [x] + (instance? Throwable x)) + +(defn ->sym + [x] + (@#'s/->sym x)) + +(defn- ->var + [s-or-v] + (if (var? s-or-v) + s-or-v + (let [v (and (symbol? s-or-v) (resolve s-or-v))] + (if (var? v) + v + (throw (IllegalArgumentException. (str (pr-str s-or-v) " does not name a var"))))))) + +(defn- collectionize + [x] + (if (symbol? x) + (list x) + x)) + +(defn enumerate-namespace + "Given a symbol naming an ns, or a collection of such symbols, +returns the set of all symbols naming vars in those nses." + [ns-sym-or-syms] + (into + #{} + (mapcat (fn [ns-sym] + (map + (fn [name-sym] + (symbol (name ns-sym) (name name-sym))) + (keys (ns-interns ns-sym))))) + (collectionize ns-sym-or-syms))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instrument ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(def ^:private ^:dynamic *instrument-enabled* + "if false, instrumented fns call straight through" + true) + +(defn- fn-spec? + "Fn-spec must include at least :args or :ret specs." + [m] + (or (:args m) (:ret m))) + +(defmacro with-instrument-disabled + "Disables instrument's checking of calls, within a scope." + [& body] + `(binding [*instrument-enabled* nil] + ~@body)) + +(defn- thunk-frame? [s] + (str/includes? s "--KVS--EMULATION--THUNK--")) + +(defn- interpret-stack-trace-element + "Given the vector-of-syms form of a stacktrace element produced +by e.g. Throwable->map, returns a map form that adds some keys +guessing the original Clojure names. Returns a map with + + :class class name symbol from stack trace + :method method symbol from stack trace + :file filename from stack trace + :line line number from stack trace + :var-scope optional Clojure var symbol scoping fn def + :local-fn optional local Clojure symbol scoping fn def + +For non-Clojure fns, :scope and :local-fn will be absent." + [[cls method file line]] + (let [clojure? (contains? '#{invoke invokeStatic} method) + demunge #(s/demunge %) + degensym #(str/replace % #"--.*" "") + [ns-sym name-sym local] (when clojure? + (->> (str/split (str cls) #"\$" 3) + (map demunge)))] + (merge {:file file + :line line + :method method + :class cls} + (when (and ns-sym name-sym) + {:var-scope (symbol ns-sym name-sym)}) + (when local + {:local-fn (symbol (degensym local)) + :thunk? (thunk-frame? local)})))) + +(defn- stacktrace-relevant-to-instrument + "Takes a coll of stack trace elements (as returned by +StackTraceElement->vec) and returns a coll of maps as per +interpret-stack-trace-element that are relevant to a +failure in instrument." + [elems] + (let [plumbing? (fn [{:keys [var-scope thunk?]}] + (or thunk? + (contains? '#{clojure.spec.test.alpha/spec-checking-fn + clojure.core/apply} + var-scope)))] + (sequence (comp (map StackTraceElement->vec) + (map interpret-stack-trace-element) + (filter :var-scope) + (drop-while plumbing?)) + elems))) + +(defn- spec-checking-fn + "Takes a function name, a function f, and an fspec and returns a thunk that + first conforms the arguments given then calls f with those arguments if + the conform succeeds. Otherwise, an exception is thrown containing information + about the conform failure." + [fn-name f fn-spec] + (let [fn-spec (@#'s/maybe-spec fn-spec) + conform! (fn [fn-name role spec data args] + (let [conformed (s/conform spec data)] + (if (= ::s/invalid conformed) + (let [caller (->> (.getStackTrace (Thread/currentThread)) + stacktrace-relevant-to-instrument + first) + ed (merge (assoc (s/explain-data* spec [] [] [] data) + ::s/fn fn-name + ::s/args args + ::s/failure :instrument) + (when caller + {::caller (dissoc caller :class :method)}))] + (throw (ex-info + (str "Call to " fn-name " did not conform to spec.") + ed))) + conformed)))] + (fn + [& args] + (if *instrument-enabled* + (with-instrument-disabled + (when (:args fn-spec) (conform! fn-name :args (:args fn-spec) args args)) + (binding [*instrument-enabled* true] + (.applyTo ^clojure.lang.IFn f args))) + (.applyTo ^clojure.lang.IFn f args))))) + +(defn- no-fspec + [v spec] + (ex-info (str "Fn at " v " is not spec'ed.") + {:var v :spec spec ::s/failure :no-fspec})) + +(defonce ^:private instrumented-vars (atom {})) + +(defn- find-varargs-decl + "Takes an arglist and returns the restargs binding form if found, else nil." + [arglist] + (let [[_ decl :as restargs] (->> arglist + (split-with (complement #{'&})) + second)] + (and (= 2 (count restargs)) + decl))) + +(defn- has-kwargs? [arglists] + (->> arglists (some find-varargs-decl) map?)) + +(defn- kwargs->kvs + "Takes the restargs of a kwargs function call and checks for a trailing element. + If found, that element is flattened into a sequence of key->value pairs and + concatenated onto the preceding arguments." + [args] + (if (even? (count args)) + args + (concat (butlast args) + (reduce-kv (fn [acc k v] (->> acc (cons v) (cons k))) + () + (last args))))) + +(defn- gen-fixed-args-syms + "Takes an arglist and generates a vector of names corresponding to the fixed + args found." + [arglist] + (->> arglist (take-while (complement #{'&})) (map (fn [_] (gensym))) vec)) + +(defn- build-kwargs-body + "Takes a function name fn-name and arglist and returns code for a function body that + handles kwargs by calling fn-name with any fixed followed by its restargs transformed + from kwargs to kvs." + [fn-name arglist] + (let [alias (gensym "kwargs") + head-args (gen-fixed-args-syms arglist)] + (list (conj head-args '& alias) + `(apply ~fn-name ~@head-args (@#'kwargs->kvs ~alias))))) + +(defn- build-varargs-body + "Takes a function name fn-name and arglist and returns code for a function body that + handles varargs by calling fn-name with any fixed args followed by its rest args." + [fn-name arglist] + (let [head-args (gen-fixed-args-syms arglist) + alias (gensym "restargs")] + (list (conj head-args '& alias) + `(apply ~fn-name ~@head-args ~alias)))) + +(defn- build-fixed-args-body + "Takes a function name fn-name and arglist and returns code for a function body that + handles fixed args by calling fn-name with its fixed args." + [fn-name arglist] + (let [arglist (gen-fixed-args-syms arglist)] + (list arglist + `(~fn-name ~@arglist)))) + +(defn- build-flattener-code + "Takes argslists and generates code for a HOF that given a function, returns a forwarding thunk + of analogous arglists that ensures that kwargs are passed as kvs to the original function." + [arglists] + (let [closed-over-name (gensym "inner")] + `(fn [~closed-over-name] + (fn ~'--KVS--EMULATION--THUNK-- + ~@(map (fn [arglist] + (let [varargs-decl (find-varargs-decl arglist)] + (cond (map? varargs-decl) (build-kwargs-body closed-over-name arglist) + varargs-decl (build-varargs-body closed-over-name arglist) + :default (build-fixed-args-body closed-over-name arglist)))) + (or arglists + '([& args]))))))) + +(comment + ;; Given a function with the arglists (([a]) ([a b]) ([a b & kvs])) + ;; the flattener generated is below (with some gensym name cleanup for readability) + (fn [inner] + (fn + ([G__a] (inner G__a)) + ([G__a G__b] (inner G__a G__b)) + ([G__a G__b & G__kvs] + (apply inner G__a G__b (if (even? (count G__kvs)) + G__kvs + (reduce-kv (fn [acc k v] + (->> acc (cons v) (cons k))) + (butlast G__kvs) + (last G__kvs))))))) +) + +(defn- maybe-wrap-kvs-emulation + "Takes an argslist and function f and returns f except when arglists + contains a kwargs binding, else wraps f with a forwarding thunk that + flattens a trailing map into kvs if present in the kwargs call." + [f arglists] + (if (has-kwargs? arglists) + (let [flattener-code (build-flattener-code arglists) + kvs-emu (eval flattener-code)] + (kvs-emu f)) + f)) + +(defn- instrument-choose-fn + "Helper for instrument." + [f spec sym {over :gen :keys [stub replace]}] + (if (some #{sym} stub) + (-> spec (s/gen over) gen/generate) + (get replace sym f))) + +(defn- instrument-choose-spec + "Helper for instrument" + [spec sym {overrides :spec}] + (get overrides sym spec)) + +(defn- instrument-1 + [s opts] + (when-let [v (resolve s)] + (when-not (-> v meta :macro) + (let [spec (s/get-spec v) + {:keys [raw wrapped]} (get @instrumented-vars v) + current @v + to-wrap (if (= wrapped current) raw current) + ospec (or (instrument-choose-spec spec s opts) + (throw (no-fspec v spec))) + ofn (instrument-choose-fn to-wrap ospec s opts) + checked (spec-checking-fn (->sym v) ofn ospec) + arglists (->> v meta :arglists (sort-by count) seq) + wrapped (maybe-wrap-kvs-emulation checked arglists)] + (alter-var-root v (constantly wrapped)) + (swap! instrumented-vars assoc v {:raw to-wrap :wrapped wrapped}) + (->sym v))))) + +(defn- unstrument-1 + [s] + (when-let [v (resolve s)] + (when-let [{:keys [raw wrapped]} (get @instrumented-vars v)] + (swap! instrumented-vars dissoc v) + (let [current @v] + (when (= wrapped current) + (alter-var-root v (constantly raw)) + (->sym v)))))) + +(defn- opt-syms + "Returns set of symbols referenced by 'instrument' opts map" + [opts] + (reduce into #{} [(:stub opts) (keys (:replace opts)) (keys (:spec opts))])) + +(defn- fn-spec-name? + [s] + (and (symbol? s) + (not (some-> (resolve s) meta :macro)))) + +(defn instrumentable-syms + "Given an opts map as per instrument, returns the set of syms +that can be instrumented." + ([] (instrumentable-syms nil)) + ([opts] + (assert (every? ident? (keys (:gen opts))) "instrument :gen expects ident keys") + (reduce into #{} [(filter fn-spec-name? (keys (s/registry))) + (keys (:spec opts)) + (:stub opts) + (keys (:replace opts))]))) + +(defn instrument + "Instruments the vars named by sym-or-syms, a symbol or collection +of symbols, or all instrumentable vars if sym-or-syms is not +specified. + +If a var has an :args fn-spec, sets the var's root binding to a +fn that checks arg conformance (throwing an exception on failure) +before delegating to the original fn. + +The opts map can be used to override registered specs, and/or to +replace fn implementations entirely. Opts for symbols not included +in sym-or-syms are ignored. This facilitates sharing a common +options map across many different calls to instrument. + +The opts map may have the following keys: + + :spec a map from var-name symbols to override specs + :stub a set of var-name symbols to be replaced by stubs + :gen a map from spec names to generator overrides + :replace a map from var-name symbols to replacement fns + +:spec overrides registered fn-specs with specs your provide. Use +:spec overrides to provide specs for libraries that do not have +them, or to constrain your own use of a fn to a subset of its +spec'ed contract. + +:stub replaces a fn with a stub that checks :args, then uses the +:ret spec to generate a return value. + +:gen overrides are used only for :stub generation. + +:replace replaces a fn with a fn that checks args conformance, then +invokes the fn you provide, enabling arbitrary stubbing and mocking. + +:spec can be used in combination with :stub or :replace. + +Returns a collection of syms naming the vars instrumented." + ([] (instrument (instrumentable-syms))) + ([sym-or-syms] (instrument sym-or-syms nil)) + ([sym-or-syms opts] + (locking instrumented-vars + (into + [] + (comp (filter (instrumentable-syms opts)) + (distinct) + (map #(instrument-1 % opts)) + (remove nil?)) + (collectionize sym-or-syms))))) + +(defn unstrument + "Undoes instrument on the vars named by sym-or-syms, specified +as in instrument. With no args, unstruments all instrumented vars. +Returns a collection of syms naming the vars unstrumented." + ([] (unstrument (map ->sym (keys @instrumented-vars)))) + ([sym-or-syms] + (locking instrumented-vars + (into + [] + (comp (filter symbol?) + (map unstrument-1) + (remove nil?)) + (collectionize sym-or-syms))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; testing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defn- explain-check + [args spec v role] + (ex-info + "Specification-based check failed" + (when-not (s/valid? spec v nil) + (assoc (s/explain-data* spec [role] [] [] v) + ::args args + ::val v + ::s/failure :check-failed)))) + +(defn- check-call + "Returns true if call passes specs, otherwise *returns* an exception +with explain-data + ::s/failure." + [f specs args] + (let [cargs (when (:args specs) (s/conform (:args specs) args))] + (if (= cargs ::s/invalid) + (explain-check args (:args specs) args :args) + (let [ret (apply f args) + cret (when (:ret specs) (s/conform (:ret specs) ret))] + (if (= cret ::s/invalid) + (explain-check args (:ret specs) ret :ret) + (if (and (:args specs) (:ret specs) (:fn specs)) + (if (s/valid? (:fn specs) {:args cargs :ret cret}) + true + (explain-check args (:fn specs) {:args cargs :ret cret} :fn)) + true)))))) + +(defn- quick-check + [f specs {gen :gen opts ::stc/opts}] + (let [{:keys [num-tests] :or {num-tests 1000}} opts + g (try (s/gen (:args specs) gen) (catch Throwable t t))] + (if (throwable? g) + {:result g} + (let [prop (gen/for-all* [g] #(check-call f specs %))] + (apply gen/quick-check num-tests prop (mapcat identity opts)))))) + +(defn- make-check-result + "Builds spec result map." + [check-sym spec test-check-ret] + (merge {:spec spec + ::stc/ret test-check-ret} + (when check-sym + {:sym check-sym}) + (when-let [result (-> test-check-ret :result)] + (when-not (true? result) {:failure result})) + (when-let [shrunk (-> test-check-ret :shrunk)] + {:failure (:result shrunk)}))) + +(defn- check-1 + [{:keys [s f v spec]} opts] + (let [re-inst? (and v (seq (unstrument s)) true) + f (or f (when v @v)) + specd (s/spec spec)] + (try + (cond + (or (nil? f) (some-> v meta :macro)) + {:failure (ex-info "No fn to spec" {::s/failure :no-fn}) + :sym s :spec spec} + + (:args specd) + (let [tcret (quick-check f specd opts)] + (make-check-result s spec tcret)) + + :default + {:failure (ex-info "No :args spec" {::s/failure :no-args-spec}) + :sym s :spec spec}) + (finally + (when re-inst? (instrument s)))))) + +(defn- sym->check-map + [s] + (let [v (resolve s)] + {:s s + :v v + :spec (when v (s/get-spec v))})) + +(defn- validate-check-opts + [opts] + (assert (every? ident? (keys (:gen opts))) "check :gen expects ident keys")) + +(defn check-fn + "Runs generative tests for fn f using spec and opts. See +'check' for options and return." + ([f spec] (check-fn f spec nil)) + ([f spec opts] + (validate-check-opts opts) + (check-1 {:f f :spec spec} opts))) + +(defn checkable-syms + "Given an opts map as per check, returns the set of syms that +can be checked." + ([] (checkable-syms nil)) + ([opts] + (validate-check-opts opts) + (reduce into #{} [(filter fn-spec-name? (keys (s/registry))) + (keys (:spec opts))]))) + +(defn check + "Run generative tests for spec conformance on vars named by +sym-or-syms, a symbol or collection of symbols. If sym-or-syms +is not specified, check all checkable vars. + +The opts map includes the following optional keys, where stc +aliases clojure.spec.test.check: + +::stc/opts opts to flow through test.check/quick-check +:gen map from spec names to generator overrides + +The ::stc/opts include :num-tests in addition to the keys +documented by test.check. Generator overrides are passed to +spec/gen when generating function args. + +Returns a lazy sequence of check result maps with the following +keys + +:spec the spec tested +:sym optional symbol naming the var tested +:failure optional test failure +::stc/ret optional value returned by test.check/quick-check + +The value for :failure can be any exception. Exceptions thrown by +spec itself will have an ::s/failure value in ex-data: + +:check-failed at least one checked return did not conform +:no-args-spec no :args spec provided +:no-fn no fn provided +:no-fspec no fspec provided +:no-gen unable to generate :args +:instrument invalid args detected by instrument +" + ([] (check (checkable-syms))) + ([sym-or-syms] (check sym-or-syms nil)) + ([sym-or-syms opts] + (->> (collectionize sym-or-syms) + (filter (checkable-syms opts)) + (pmap + #(check-1 (sym->check-map %) opts))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check reporting ;;;;;;;;;;;;;;;;;;;;;;;; + +(defn- failure-type + [x] + (::s/failure (ex-data x))) + +(defn- unwrap-failure + [x] + (if (failure-type x) + (ex-data x) + x)) + +(defn- result-type + "Returns the type of the check result. This can be any of the +::s/failure keywords documented in 'check', or: + + :check-passed all checked fn returns conformed + :check-threw checked fn threw an exception" + [ret] + (let [failure (:failure ret)] + (cond + (nil? failure) :check-passed + (failure-type failure) (failure-type failure) + :default :check-threw))) + +(defn abbrev-result + "Given a check result, returns an abbreviated version +suitable for summary use." + [x] + (if (:failure x) + (-> (dissoc x ::stc/ret) + (update :spec s/describe) + (update :failure unwrap-failure)) + (dissoc x :spec ::stc/ret))) + +(defn summarize-results + "Given a collection of check-results, e.g. from 'check', pretty +prints the summary-result (default abbrev-result) of each. + +Returns a map with :total, the total number of results, plus a +key with a count for each different :type of result." + ([check-results] (summarize-results check-results abbrev-result)) + ([check-results summary-result] + (reduce + (fn [summary result] + (pp/pprint (summary-result result)) + (-> summary + (update :total inc) + (update (result-type result) (fnil inc 0)))) + {:total 0} + check-results))) + + + diff --git a/sci b/sci index 05c738b4..3d0a6e0b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 05c738b481f56aa77c2f8355aae4ce77aff2344b +Subproject commit 3d0a6e0ba050c288c5e5985423b77735eef9cf05 diff --git a/script/built_in.clj b/script/built_in.clj new file mode 100755 index 00000000..743b2b02 --- /dev/null +++ b/script/built_in.clj @@ -0,0 +1,15 @@ +#!/usr/bin/env bb + +(ns built-in + (:require [babashka.fs :as fs] + [babashka.process :refer [shell]])) + +;; copy clojure spec as built-in +(fs/with-temp-dir [tmp-dir {}] + (let [tmp-dir (fs/file tmp-dir)] + (shell {:dir tmp-dir} "git clone https://github.com/babashka/spec.alpha") + (let [spec-dir (fs/file tmp-dir "spec.alpha")] + (shell {:dir spec-dir} "git reset 1d9df099be4fbfd30b9b903642ad376373c16298 --hard") + (fs/copy-tree (fs/file spec-dir "src" "main" "clojure") (fs/file "resources" "src" "babashka"))))) + + diff --git a/src/babashka/impl/classpath.clj b/src/babashka/impl/classpath.clj index 1506b80e..11691390 100644 --- a/src/babashka/impl/classpath.clj +++ b/src/babashka/impl/classpath.clj @@ -66,14 +66,18 @@ entries (keep part->entry parts)] (Loader. entries))) -(defn source-for-namespace [loader namespace opts] +(defn resource-paths [namespace] (let [ns-str (name namespace) - ^String ns-str (munge ns-str) + ^String ns-str (namespace-munge ns-str) ;; do NOT pick the platform specific file separator here, since that doesn't work for searching in .jar files ;; (io/file "foo" "bar/baz") does work on Windows, despite the forward slash base-path (.replace ns-str "." "/") resource-paths (mapv #(str base-path %) [".bb" ".clj" ".cljc"])] - (getResource loader resource-paths opts))) + resource-paths)) + +(defn source-for-namespace [loader namespace opts] + (let [rps (resource-paths namespace)] + (getResource loader rps opts))) (defn main-ns [manifest-resource] (with-open [is (io/input-stream manifest-resource)] diff --git a/src/babashka/main.clj b/src/babashka/main.clj index a4a086e2..e2f44565 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -89,6 +89,7 @@ (def signal-ns {'pipe-signal-received? (sci/copy-var pipe-signal-received? (sci/create-ns 'babashka.signal nil))}) +(sci/enable-unrestricted-access!) (sci/alter-var-root sci/in (constantly *in*)) (sci/alter-var-root sci/out (constantly *out*)) (sci/alter-var-root sci/err (constantly *err*)) @@ -852,6 +853,12 @@ Use bb run --help to show this help output. :expressions [(:source res)]}) {}) res))) + (let [rps (cp/resource-paths namespace) + rps (mapv #(str "src/babashka/" %) rps)] + (when-let [url (some #(io/resource %) rps)] + (let [source (slurp url)] + {:file (str url) + :source source}))) (case namespace clojure.spec.alpha (binding [*out* *err*] From ade5ca1ba724288717b5aac9ce1444b58e2044dd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 30 Nov 2022 14:23:01 +0100 Subject: [PATCH 497/550] v1.0.167 --- CHANGELOG.md | 9 ++++++++- resources/BABASHKA_VERSION | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3231fa11..3fee9ca9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,17 @@ A preview of the next release can be installed from [Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting -## Unreleased +## 1.0.167 (2022-11-30) +- [#1433](https://github.com/babashka/babashka/issues/1433): spec source as built-in fallback. When not including the + [clojure.spec.alpha](https://github.com/babashka/spec.alpha) fork as a + library, babashka loads a bundled version, when `clojure.spec.alpha` is required. - [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list. - Add note about BSOD when using WSL1, see [README.md/quickstart](https://github.com/LouDnl/babashka#quickstart) +- SCI: performance improvements +- Better error locations for interop ([@bobisageek](https://github.com/bobisageek)) +- Fix [babashka/babashka.nrepl#59](https://github.com/babashka/babashka.nrepl/issues/59): do not output extra new line with cider pprint +- Use `namespace-munge` instead of `munge` for doing ns -> file lookup ## 1.0.166 (2022-11-24) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index b28cc53d..e3f10d17 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.167-SNAPSHOT \ No newline at end of file +1.0.167 \ No newline at end of file From 2a56f2e5ef549513b8b0e6c76c919bab3c860ea7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 30 Nov 2022 14:37:58 +0100 Subject: [PATCH 498/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index 9d85ef23..e3f10d17 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -1.0.166 \ No newline at end of file +1.0.167 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index e3f10d17..d36abba9 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.167 \ No newline at end of file +1.0.168-SNAPSHOT \ No newline at end of file From d53d05c856a149301b7b4ea0a0475e569042c0ad Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 30 Nov 2022 16:51:52 +0100 Subject: [PATCH 499/550] Add articles to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fd798b1f..51733a49 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,8 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Manage git hooks with babashka tasks](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy +- [Messing around with babashka](https://ian-muge.medium.com/messing-around-with-babashka-f181a9003faa) by Ian Muge - [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller - [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund - [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover From eb740c7c9bb394ee23678d1871c8cd37f80eb405 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Dec 2022 13:30:05 +0100 Subject: [PATCH 500/550] loop* as special form --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 3d0a6e0b..d509d47a 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 3d0a6e0ba050c288c5e5985423b77735eef9cf05 +Subproject commit d509d47a60bffb7d186be9fd41c43962d34c05f9 From 7b6a69f2b3f264018954ca40cd9e59f175e6e11e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 2 Dec 2022 19:50:58 +0100 Subject: [PATCH 501/550] SCI: fn, defn and defmacro as macros (#1437) --- resources/META-INF/babashka/deps.edn | 2 +- sci | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index eb07e9a8..4e875585 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -63,7 +63,7 @@ :lib-tests {:extra-paths ["process/src" "process/test" "test-resources/lib_tests"] :extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"} - org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha" + #_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha" :sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"} lambdaisland/regal {:mvn/version "0.0.143"} cprop/cprop {:mvn/version "0.1.16"} diff --git a/sci b/sci index d509d47a..165462e1 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit d509d47a60bffb7d186be9fd41c43962d34c05f9 +Subproject commit 165462e1abffc6a061c7e05025b7ba9bde0e529e From 9305417edcc41d910ca4ac2059f1fca61923195d Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 3 Dec 2022 14:16:40 +0100 Subject: [PATCH 502/550] and and or as macros --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 165462e1..e0063192 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 165462e1abffc6a061c7e05025b7ba9bde0e529e +Subproject commit e006319235193c68ace8f82c2d0bf1085e318026 From d681f9bc7f1397f94cd7f535c867a940428d6371 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 3 Dec 2022 14:27:47 +0100 Subject: [PATCH 503/550] SCI notes --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index e0063192..62a16eb6 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit e006319235193c68ace8f82c2d0bf1085e318026 +Subproject commit 62a16eb620bb6e8ae072f9f17baa3de5546f0902 From a92ebfe68a63b66eb4aa48fb6b2f0e32e12e4594 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Dec 2022 20:20:41 +0100 Subject: [PATCH 504/550] Update process --- .clj-kondo/config.edn | 3 ++- process | 2 +- src/babashka/impl/process.clj | 8 +++++++- src/babashka/impl/tasks.clj | 36 ++++++----------------------------- 4 files changed, 16 insertions(+), 33 deletions(-) diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 2f0de4a9..2e9b6f40 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -5,4 +5,5 @@ babashka.impl.File/gen-wrapper-fn-2 clojure.core/def babashka.impl.Pattern/gen-wrapper-fn-2 clojure.core/def babashka.impl.Pattern/gen-constants clojure.core/declare} - :linters {:unsorted-required-namespaces {:level :warning}}} + :linters {:unsorted-required-namespaces {:level :warning}} + :hooks {:analyze-call {clojure.core/requiring-resolve hooks.mine/req-resolve}}} diff --git a/process b/process index be047624..36b2295b 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit be047624edac65c3c648adace291bba38cd1a933 +Subproject commit 36b2295bc5cdf10e7f2a09c53916c22b91fc8521 diff --git a/src/babashka/impl/process.clj b/src/babashka/impl/process.clj index b463562a..33d77ea3 100644 --- a/src/babashka/impl/process.clj +++ b/src/babashka/impl/process.clj @@ -8,6 +8,10 @@ (def defaults (sci/copy-var process/*defaults* tns)) +(defn process* [& args] + (binding [process/*defaults* @defaults] + (apply process/process* args))) + (defn process [& args] (binding [process/*defaults* @defaults] (apply process/process args))) @@ -17,7 +21,9 @@ (apply process/pb args))) (def process-namespace - {'process (copy-var process tns) + {'parse-args (copy-var process/parse-args tns) + 'process* (copy-var process/process* tns) + 'process (copy-var process tns) 'check (copy-var process/check tns) 'pb (copy-var pb tns) 'start (copy-var process/start tns) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index f4f1ad6b..f2775b8f 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -59,37 +59,13 @@ :err :inherit :shutdown p/destroy-tree}) -(defn shell [cmd & args] - (let [[prev cmd args] - (if (and (map? cmd) - (:proc cmd)) - [cmd (first args) (rest args)] - [nil cmd args]) - [opts cmd args] - (if (map? cmd) - [cmd (first args) (rest args)] - [nil cmd args]) - opts (if-let [o (:out opts)] - (if (string? o) - (update opts :out io/file) - opts) - opts) - opts (if-let [o (:err opts)] - (if (string? o) - (update opts :err io/file) - opts) - opts) - opts (if prev - (assoc opts :in nil) - opts) - cmd (if (.exists (io/file cmd)) - [cmd] - (p/tokenize cmd)) - cmd (into cmd args) - local-log-level (:log-level opts)] +(defn shell [& args] + (let [{:keys [prev cmd opts]} (p/parse-args args) + local-log-level (:log-level opts) + opts (merge default-opts opts)] (sci/binding [log-level (or local-log-level @log-level)] - (apply log-info cmd) - (handle-non-zero (pp/process prev cmd (merge default-opts opts)) opts)))) + (apply log-info args) + (handle-non-zero (pp/process* {:opts opts :cmd cmd :prev prev}) opts)))) (defn clojure [cmd & args] (let [[opts cmd args] From 952a6952340d3c8e3a6d6e33a43bf6de97fe5c89 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Dec 2022 20:33:54 +0100 Subject: [PATCH 505/550] Update process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 36b2295b..79069a2d 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 36b2295bc5cdf10e7f2a09c53916c22b91fc8521 +Subproject commit 79069a2ddb17a76cb121bfa02ba672484157d0f7 From c81babad9a49282a328544677d0cde2d8d8b5920 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Dec 2022 20:51:08 +0100 Subject: [PATCH 506/550] Bump process --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 79069a2d..e2ca36b0 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 79069a2ddb17a76cb121bfa02ba672484157d0f7 +Subproject commit e2ca36b0d112c418ba8dc44453a9450da4a9e124 From 9087cf6311ad3c346a964d89ccad328909c42ffa Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 4 Dec 2022 21:43:31 +0100 Subject: [PATCH 507/550] Fix process test for bb --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index e2ca36b0..eddc515d 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit e2ca36b0d112c418ba8dc44453a9450da4a9e124 +Subproject commit eddc515d5a86335601697e3b39b1f196e11764dc From 43375d49a22ef61f8fc45af55ac160547676f113 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Dec 2022 15:14:52 +0100 Subject: [PATCH 508/550] Allow deps/clojure to be called with new syntax --- process | 2 +- src/babashka/deps.clj | 55 +++++++++++++++++++------------------ src/babashka/impl/tasks.clj | 36 ++++++++++++++++++++---- test/babashka/deps_test.clj | 8 ++++++ 4 files changed, 68 insertions(+), 33 deletions(-) diff --git a/process b/process index eddc515d..f277204a 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit eddc515d5a86335601697e3b39b1f196e11764dc +Subproject commit f277204a46e0c09440968b6ee88b641bf0c1e58e diff --git a/src/babashka/deps.clj b/src/babashka/deps.clj index d37218f2..328dd1c7 100644 --- a/src/babashka/deps.clj +++ b/src/babashka/deps.clj @@ -1,8 +1,9 @@ (ns babashka.deps - (:require [babashka.impl.process :as pp] - [babashka.process :as p] - [borkdude.deps :as deps] - [sci.core :as sci])) + (:require + [babashka.impl.process :as pp] + [babashka.process :as p] + [borkdude.deps :as deps] + [sci.core :as sci])) (defn clojure "Starts clojure similar to CLI. Use `rlwrap bb` for `clj`-like invocation. @@ -27,25 +28,27 @@ (-> @(clojure) :exit) starts a clojure REPL, waits for it to finish and returns the exit code from the process." - ([] (clojure [])) - ([args] (clojure args nil)) - ([args opts] - (let [opts (merge {:in :inherit - :out :inherit - :err :inherit - :shutdown p/destroy-tree} - opts)] - (binding [*in* @sci/in - *out* @sci/out - *err* @sci/err - deps/*dir* (:dir opts) - deps/*env* (:env opts) - deps/*extra-env* (:extra-env opts) - deps/*process-fn* (fn - ([cmd] (pp/process cmd opts)) - ([cmd _] (pp/process cmd opts))) - deps/*exit-fn* (fn - ([_]) - ([_exit-code msg] - (throw (Exception. msg))))] - (apply deps/-main (map str args)))))) + [& args] + (let [{:keys [cmd opts prev]} (p/parse-args args) + opts (merge {:in :inherit + :out :inherit + :err :inherit + :shutdown p/destroy-tree} + opts)] + (binding [*in* @sci/in + *out* @sci/out + *err* @sci/err + deps/*dir* (:dir opts) + deps/*env* (:env opts) + deps/*extra-env* (:extra-env opts) + deps/*process-fn* (fn + ([cmd] + (pp/process* {:cmd cmd :opts opts :prev prev})) + ([cmd _] + (pp/process* {:cmd cmd :opts opts :prev prev}))) + deps/*exit-fn* (fn + ([_]) + ([_exit-code msg] + (throw (Exception. msg))))] + ;; (.println System/err (str :args (str/join " " (map str args)))) + (apply deps/-main (map str cmd))))) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index f2775b8f..f4f1ad6b 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -59,13 +59,37 @@ :err :inherit :shutdown p/destroy-tree}) -(defn shell [& args] - (let [{:keys [prev cmd opts]} (p/parse-args args) - local-log-level (:log-level opts) - opts (merge default-opts opts)] +(defn shell [cmd & args] + (let [[prev cmd args] + (if (and (map? cmd) + (:proc cmd)) + [cmd (first args) (rest args)] + [nil cmd args]) + [opts cmd args] + (if (map? cmd) + [cmd (first args) (rest args)] + [nil cmd args]) + opts (if-let [o (:out opts)] + (if (string? o) + (update opts :out io/file) + opts) + opts) + opts (if-let [o (:err opts)] + (if (string? o) + (update opts :err io/file) + opts) + opts) + opts (if prev + (assoc opts :in nil) + opts) + cmd (if (.exists (io/file cmd)) + [cmd] + (p/tokenize cmd)) + cmd (into cmd args) + local-log-level (:log-level opts)] (sci/binding [log-level (or local-log-level @log-level)] - (apply log-info args) - (handle-non-zero (pp/process* {:opts opts :cmd cmd :prev prev}) opts)))) + (apply log-info cmd) + (handle-non-zero (pp/process prev cmd (merge default-opts opts)) opts)))) (defn clojure [cmd & args] (let [[opts cmd args] diff --git a/test/babashka/deps_test.clj b/test/babashka/deps_test.clj index d3edade2..3b86ff50 100644 --- a/test/babashka/deps_test.clj +++ b/test/babashka/deps_test.clj @@ -67,6 +67,14 @@ true (p/check) :out) ")))) + (testing "new syntax" + (is (= "6\n" (test-utils/normalize (bb " +(require '[babashka.deps :as deps]) +(require '[babashka.process :as p]) +(-> (babashka.deps/clojure {:out :string} \"-M\" \"-e\" \"(+ 1 2 3)\") + (p/check) + :out) +"))))) (when-not test-utils/native? (is (thrown-with-msg? Exception #"Option changed" (bb " (require '[babashka.deps :as deps]) From bd857ae3e1d4a1d7b8bda4680cd5abd70158a6d5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 5 Dec 2022 17:46:43 +0100 Subject: [PATCH 509/550] Partially revert, will revisit --- process | 2 +- src/babashka/deps.clj | 55 ++++++++++++++++++------------------- src/babashka/impl/tasks.clj | 36 ++++-------------------- test/babashka/deps_test.clj | 8 ------ 4 files changed, 33 insertions(+), 68 deletions(-) diff --git a/process b/process index f277204a..14e1259b 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit f277204a46e0c09440968b6ee88b641bf0c1e58e +Subproject commit 14e1259bb7caff3882921d6f6c71e6f08739113f diff --git a/src/babashka/deps.clj b/src/babashka/deps.clj index 328dd1c7..d37218f2 100644 --- a/src/babashka/deps.clj +++ b/src/babashka/deps.clj @@ -1,9 +1,8 @@ (ns babashka.deps - (:require - [babashka.impl.process :as pp] - [babashka.process :as p] - [borkdude.deps :as deps] - [sci.core :as sci])) + (:require [babashka.impl.process :as pp] + [babashka.process :as p] + [borkdude.deps :as deps] + [sci.core :as sci])) (defn clojure "Starts clojure similar to CLI. Use `rlwrap bb` for `clj`-like invocation. @@ -28,27 +27,25 @@ (-> @(clojure) :exit) starts a clojure REPL, waits for it to finish and returns the exit code from the process." - [& args] - (let [{:keys [cmd opts prev]} (p/parse-args args) - opts (merge {:in :inherit - :out :inherit - :err :inherit - :shutdown p/destroy-tree} - opts)] - (binding [*in* @sci/in - *out* @sci/out - *err* @sci/err - deps/*dir* (:dir opts) - deps/*env* (:env opts) - deps/*extra-env* (:extra-env opts) - deps/*process-fn* (fn - ([cmd] - (pp/process* {:cmd cmd :opts opts :prev prev})) - ([cmd _] - (pp/process* {:cmd cmd :opts opts :prev prev}))) - deps/*exit-fn* (fn - ([_]) - ([_exit-code msg] - (throw (Exception. msg))))] - ;; (.println System/err (str :args (str/join " " (map str args)))) - (apply deps/-main (map str cmd))))) + ([] (clojure [])) + ([args] (clojure args nil)) + ([args opts] + (let [opts (merge {:in :inherit + :out :inherit + :err :inherit + :shutdown p/destroy-tree} + opts)] + (binding [*in* @sci/in + *out* @sci/out + *err* @sci/err + deps/*dir* (:dir opts) + deps/*env* (:env opts) + deps/*extra-env* (:extra-env opts) + deps/*process-fn* (fn + ([cmd] (pp/process cmd opts)) + ([cmd _] (pp/process cmd opts))) + deps/*exit-fn* (fn + ([_]) + ([_exit-code msg] + (throw (Exception. msg))))] + (apply deps/-main (map str args)))))) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index f4f1ad6b..f2775b8f 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -59,37 +59,13 @@ :err :inherit :shutdown p/destroy-tree}) -(defn shell [cmd & args] - (let [[prev cmd args] - (if (and (map? cmd) - (:proc cmd)) - [cmd (first args) (rest args)] - [nil cmd args]) - [opts cmd args] - (if (map? cmd) - [cmd (first args) (rest args)] - [nil cmd args]) - opts (if-let [o (:out opts)] - (if (string? o) - (update opts :out io/file) - opts) - opts) - opts (if-let [o (:err opts)] - (if (string? o) - (update opts :err io/file) - opts) - opts) - opts (if prev - (assoc opts :in nil) - opts) - cmd (if (.exists (io/file cmd)) - [cmd] - (p/tokenize cmd)) - cmd (into cmd args) - local-log-level (:log-level opts)] +(defn shell [& args] + (let [{:keys [prev cmd opts]} (p/parse-args args) + local-log-level (:log-level opts) + opts (merge default-opts opts)] (sci/binding [log-level (or local-log-level @log-level)] - (apply log-info cmd) - (handle-non-zero (pp/process prev cmd (merge default-opts opts)) opts)))) + (apply log-info args) + (handle-non-zero (pp/process* {:opts opts :cmd cmd :prev prev}) opts)))) (defn clojure [cmd & args] (let [[opts cmd args] diff --git a/test/babashka/deps_test.clj b/test/babashka/deps_test.clj index 3b86ff50..d3edade2 100644 --- a/test/babashka/deps_test.clj +++ b/test/babashka/deps_test.clj @@ -67,14 +67,6 @@ true (p/check) :out) ")))) - (testing "new syntax" - (is (= "6\n" (test-utils/normalize (bb " -(require '[babashka.deps :as deps]) -(require '[babashka.process :as p]) -(-> (babashka.deps/clojure {:out :string} \"-M\" \"-e\" \"(+ 1 2 3)\") - (p/check) - :out) -"))))) (when-not test-utils/native? (is (thrown-with-msg? Exception #"Option changed" (bb " (require '[babashka.deps :as deps]) From cf01d7f24d6a57e662cc25d7897f205b1e73b06d Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 6 Dec 2022 05:01:52 -0500 Subject: [PATCH 510/550] #1438: httpkit.client functions (#1439) * expose query-string function from org.httpkit.client * add url-encode from httpkit client ns * cleanup and changelog --- CHANGELOG.md | 3 +++ .../babashka/impl/httpkit_client.clj | 4 +++- test-resources/lib_tests/httpkit/client_test.clj | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fee9ca9..c680d51f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ A preview of the next release can be installed from [Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting +## Unreleased +- [#1438](https://github.com/babashka/babashka/issues/1438): expose `query-string` and `url-encode` functions from org.httpkit.client ([@bobisageek](https://github.com/bobisageek)) + ## 1.0.167 (2022-11-30) - [#1433](https://github.com/babashka/babashka/issues/1433): spec source as built-in fallback. When not including the diff --git a/feature-httpkit-client/babashka/impl/httpkit_client.clj b/feature-httpkit-client/babashka/impl/httpkit_client.clj index f51ccaf8..645aaa97 100644 --- a/feature-httpkit-client/babashka/impl/httpkit_client.clj +++ b/feature-httpkit-client/babashka/impl/httpkit_client.clj @@ -72,7 +72,9 @@ 'acl (copy-var acl cns) 'unlock (copy-var unlock cns) 'default-client (copy-var client/default-client cns) - '*default-client* default-client}) + '*default-client* default-client + 'query-string (copy-var client/query-string cns) + 'url-encode (copy-var client/url-encode cns)}) (def sni-client-namespace {'ssl-configurer (copy-var sni-client/ssl-configurer sns) diff --git a/test-resources/lib_tests/httpkit/client_test.clj b/test-resources/lib_tests/httpkit/client_test.clj index 8a15d811..546ff867 100644 --- a/test-resources/lib_tests/httpkit/client_test.clj +++ b/test-resources/lib_tests/httpkit/client_test.clj @@ -58,3 +58,14 @@ (deftest alter-var-root-test (is (alter-var-root (var client/*default-client*) (constantly sni/default-client)))) + +(deftest query-string-test + (is (= (client/query-string {:k1 "v1" :k2 "v2" :k3 nil :k4 ["v4a" "v4b"] :k5 []}) + "k1=v1&k2=v2&k3=&k4=v4a&k4=v4b&k5=")) + (is (= (client/query-string {:k1 \v :k2 'v2}) + "k1=v&k2=v2"))) + +(deftest url-encode-test + (is (= "AbC" (client/url-encode "AbC"))) + (is (= "%3C%3E%21%40%23%24%25%5E" + (client/url-encode "<>!@#$%^")))) From 6acd912a344400ffb754587055cdd4134517a39e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Dec 2022 11:12:35 +0100 Subject: [PATCH 511/550] Add java.util.InputMismatchException --- src/babashka/impl/classes.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 29ef769f..5be3651b 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -431,6 +431,7 @@ java.util.Date java.util.HashMap java.util.IdentityHashMap + java.util.InputMismatchException java.util.List java.util.Locale java.util.Map From cd3252796e3c7ff9ec6143566f3e5a3447c110e7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 6 Dec 2022 11:39:19 +0100 Subject: [PATCH 512/550] Add blog [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 51733a49..0c3f0138 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,7 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices.html) by Kari Marttila - [Manage git hooks with babashka tasks](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy - [Messing around with babashka](https://ian-muge.medium.com/messing-around-with-babashka-f181a9003faa) by Ian Muge - [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller From 69db7105e5701fbb80f1567c2c59dd680c6935db Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 10:04:40 +0100 Subject: [PATCH 513/550] Support new syntax in babashka.deps/clojure (#1440) --- src/babashka/deps.clj | 47 ++++++++++++++++++++----------------- test/babashka/deps_test.clj | 8 +++++++ 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/babashka/deps.clj b/src/babashka/deps.clj index d37218f2..ea8daa59 100644 --- a/src/babashka/deps.clj +++ b/src/babashka/deps.clj @@ -27,25 +27,28 @@ (-> @(clojure) :exit) starts a clojure REPL, waits for it to finish and returns the exit code from the process." - ([] (clojure [])) - ([args] (clojure args nil)) - ([args opts] - (let [opts (merge {:in :inherit - :out :inherit - :err :inherit - :shutdown p/destroy-tree} - opts)] - (binding [*in* @sci/in - *out* @sci/out - *err* @sci/err - deps/*dir* (:dir opts) - deps/*env* (:env opts) - deps/*extra-env* (:extra-env opts) - deps/*process-fn* (fn - ([cmd] (pp/process cmd opts)) - ([cmd _] (pp/process cmd opts))) - deps/*exit-fn* (fn - ([_]) - ([_exit-code msg] - (throw (Exception. msg))))] - (apply deps/-main (map str args)))))) + [& args] + (let [{:keys [cmd opts prev]} (p/parse-args args) + opts (merge {:in :inherit + :out :inherit + :err :inherit + :shutdown p/destroy-tree} + opts)] + (binding [*in* @sci/in + *out* @sci/out + *err* @sci/err + deps/*dir* (:dir opts) + deps/*env* (:env opts) + deps/*extra-env* (:extra-env opts) + deps/*process-fn* (fn + ([cmd] (pp/process* {:cmd cmd + :prev prev + :opts opts})) + ([cmd _] (pp/process* {:cmd cmd + :prev prev + :opts opts}))) + deps/*exit-fn* (fn + ([_]) + ([_exit-code msg] + (throw (Exception. msg))))] + (apply deps/-main cmd)))) diff --git a/test/babashka/deps_test.clj b/test/babashka/deps_test.clj index d3edade2..e130e680 100644 --- a/test/babashka/deps_test.clj +++ b/test/babashka/deps_test.clj @@ -66,6 +66,14 @@ true (-> (babashka.deps/clojure [\"-M\" \"-e\" \"(+ 1 2 3)\"] {:out :string}) (p/check) :out) +")))) + (is (= "6\n" (test-utils/normalize (bb " +(require '[babashka.deps :as deps]) +(require '[babashka.process :as p]) + +(-> (babashka.deps/clojure {:out :string} \"-M\" \"-e\" \"(+ 1 2 3)\") + (p/check) + :out) ")))) (when-not test-utils/native? (is (thrown-with-msg? Exception #"Option changed" (bb " From 7cc94ea6a1d31ac3e81b594622cac962b5caabae Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 11:10:41 +0100 Subject: [PATCH 514/550] fs: don't touch dirs in split-ext --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 5098aa71..965ca67e 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 5098aa7187ddb7b6eaf159a5d3dfd95796c7329f +Subproject commit 965ca67eb1b1ef26c412fa494ce31268fd456c8e From 419b71e7c6f9cf67e0ef961b4962dba624b78a23 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 11:16:22 +0100 Subject: [PATCH 515/550] v1.0.168 --- CHANGELOG.md | 7 ++++++- resources/BABASHKA_VERSION | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c680d51f..13e87948 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,13 @@ A preview of the next release can be installed from [Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting -## Unreleased +## 1.0.168 (2022-12-07) + +- `loop*`, `fn*` are now special forms and `loop`, `fn`, `defn`, `defmacro`, `and` and `or` are implemented as macros. This restores compatibility with [rcf](https://github.com/borkdude/hyperfiddle-rcf) +- fs: don't touch dirs in `split-ext` +- Update to babashka process to v0.4.13: support `(process opts? & args)` syntax everywhere - [#1438](https://github.com/babashka/babashka/issues/1438): expose `query-string` and `url-encode` functions from org.httpkit.client ([@bobisageek](https://github.com/bobisageek)) +- Add `java.util.InputMismatchException` ## 1.0.167 (2022-11-30) diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index d36abba9..6aafafcc 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.168-SNAPSHOT \ No newline at end of file +1.0.168 \ No newline at end of file From facb65734eaa56c94847d8268f2ade36ce3659fb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 11:33:01 +0100 Subject: [PATCH 516/550] Version bump --- resources/BABASHKA_RELEASED_VERSION | 2 +- resources/BABASHKA_VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/BABASHKA_RELEASED_VERSION b/resources/BABASHKA_RELEASED_VERSION index e3f10d17..6aafafcc 100644 --- a/resources/BABASHKA_RELEASED_VERSION +++ b/resources/BABASHKA_RELEASED_VERSION @@ -1 +1 @@ -1.0.167 \ No newline at end of file +1.0.168 \ No newline at end of file diff --git a/resources/BABASHKA_VERSION b/resources/BABASHKA_VERSION index 6aafafcc..a3361b37 100644 --- a/resources/BABASHKA_VERSION +++ b/resources/BABASHKA_VERSION @@ -1 +1 @@ -1.0.168 \ No newline at end of file +1.0.169-SNAPSHOT \ No newline at end of file From 531b9383f2d7a30505dac992341340d85b2fb3b5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 11:33:40 +0100 Subject: [PATCH 517/550] Remove reference to survey --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 0c3f0138..92cf4c2d 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,6 @@ @laheadle on Clojurians Slack -
    - -Please leave some feedback about babashka in the [Q1 Survey](https://forms.gle/ko3NjDg2SwXeEoNQ9)! - -
    - ## Introduction Babashka is a native Clojure interpreter for scripting with fast startup. Its From 3bdeee8bee86912635d601fc70a56b11ecd77d13 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 7 Dec 2022 17:05:47 +0100 Subject: [PATCH 518/550] sync process [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 14e1259b..9e19562e 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 14e1259bb7caff3882921d6f6c71e6f08739113f +Subproject commit 9e19562e108381be7bced275a9065dc182ec1c62 From 46b6dfd3c34612b3b0127986ea93eac34cf34713 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 8 Dec 2022 13:34:30 +0100 Subject: [PATCH 519/550] Update fs: better fix for splitting on extension --- fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs b/fs index 965ca67e..d3226ccc 160000 --- a/fs +++ b/fs @@ -1 +1 @@ -Subproject commit 965ca67eb1b1ef26c412fa494ce31268fd456c8e +Subproject commit d3226cccd9898eba5adb50dfcc30a7223ff5c8cc From c931fbe294cec64c03b2e6ac7255bcaeb86a0c8a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 8 Dec 2022 15:00:40 +0100 Subject: [PATCH 520/550] sync process [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index 9e19562e..dbfa8146 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit 9e19562e108381be7bced275a9065dc182ec1c62 +Subproject commit dbfa814648869ed99b37ef716b6f432b5e913add From 9dff25d36b45cf424d4da9b21b2288f56694cd7c Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 8 Dec 2022 15:05:08 +0100 Subject: [PATCH 521/550] process [skip ci] --- process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process b/process index dbfa8146..fa7e470a 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit dbfa814648869ed99b37ef716b6f432b5e913add +Subproject commit fa7e470a4ecd1511cba5109a2ed91cdb98cf803a From 5ac048157a3680632f41dff0e2d877a99e86a2cb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Thu, 8 Dec 2022 23:26:54 +0100 Subject: [PATCH 522/550] sci: speed up case --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 62a16eb6..f77b9d02 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 62a16eb620bb6e8ae072f9f17baa3de5546f0902 +Subproject commit f77b9d02959b1d994eb4abf4b30b0c66380148dd From 683752c6028da94b6a0968b67d3fe5123283d567 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Dec 2022 12:51:33 +0100 Subject: [PATCH 523/550] Always install static binary on linux amd64 --- install | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/install b/install index cb680842..a9c0090d 100755 --- a/install +++ b/install @@ -94,7 +94,12 @@ case "$(uname -m)" in arch="aarch64" fi ;; - *) arch=amd64;; + *) arch=amd64 + # always use static image on linux + if [[ "$platform" == "linux" ]]; then + static_binary="true" + fi + ;; esac if [[ 10#$vernum -le 10#000002013 ]]; then From 7d5083ac0a50c6eba16a31e107bed70bf5916522 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Dec 2022 13:05:29 +0100 Subject: [PATCH 524/550] Fix #1434, document installing on Alpine --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 92cf4c2d..afc47b97 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,11 @@ Upgrade: You can find more documentation on how to use babashka with nix [here](./doc/nix.md). +### Alpine + +On Alpine it's recommended to install via the `install` [bash +script](https://github.com/babashka/babashka#installer-script). + ### Arch (Linux) `babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as @@ -224,7 +229,7 @@ $ ./install --static ### Installer script -Install via the installer script: +Install via the installer script for linux and macOS: ``` shell $ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install From f7b235635a6266c4e0e6ff87e1654f2c174308b4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Dec 2022 13:08:03 +0100 Subject: [PATCH 525/550] doc improvement --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index afc47b97..72e9b7c6 100644 --- a/README.md +++ b/README.md @@ -176,8 +176,9 @@ You can find more documentation on how to use babashka with nix [here](./doc/nix ### Alpine -On Alpine it's recommended to install via the `install` [bash -script](https://github.com/babashka/babashka#installer-script). +On Alpine it's recommended to download the binary manually from [Github +Releases](https://github.com/babashka/babashka/releases) and use the static +linux binary. ### Arch (Linux) From 58dbd2b6aab1e6f29f66f8190ef27da81217a27b Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Fri, 9 Dec 2022 12:22:24 +0000 Subject: [PATCH 526/550] Update zlib to version 1.2.13 --- Dockerfile | 5 +++-- script/setup-musl | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 573142ce..f9ad88b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,8 +7,9 @@ WORKDIR "/opt" ENV GRAALVM_VERSION="22.3.0" ARG TARGETARCH -ENV BABASHKA_ARCH=${TARGETARCH} -ENV GRAALVM_ARCH=${TARGETARCH} +# Do not set those directly, use TARGETARCH instead +ENV BABASHKA_ARCH= +ENV GRAALVM_ARCH= RUN if [ "${TARGETARCH}" = "" ] || [ "${TARGETARCH}" = "amd64" ]; then \ export GRAALVM_ARCH=amd64; export BABASHKA_ARCH=x86_64; \ elif [ "${TARGETARCH}" = "arm64" ]; then \ diff --git a/script/setup-musl b/script/setup-musl index ad055064..dcb552e5 100755 --- a/script/setup-musl +++ b/script/setup-musl @@ -19,8 +19,8 @@ fi apt-get update -y && apt-get install musl-tools -y -ZLIB_VERSION="1.2.11" -ZLIB_SHA256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" +ZLIB_VERSION="1.2.13" +ZLIB_SHA256="b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30" # stable archive path curl -O -sL --fail --show-error "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" From c7ccc6fedb593526c4908f1297baaa3371464fd2 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Dec 2022 18:39:43 +0100 Subject: [PATCH 527/550] Fix #1446: add pprint/code-dispatch --- sci | 2 +- src/babashka/impl/pprint.clj | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sci b/sci index f77b9d02..df37fdea 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit f77b9d02959b1d994eb4abf4b30b0c66380148dd +Subproject commit df37fdeafbc9ed8d4f089b1ecaabc1e6eef02cc0 diff --git a/src/babashka/impl/pprint.clj b/src/babashka/impl/pprint.clj index 0c0e815f..88ada2e6 100644 --- a/src/babashka/impl/pprint.clj +++ b/src/babashka/impl/pprint.clj @@ -208,6 +208,7 @@ 'init-navigator (sci/copy-var pprint/init-navigator pprint-ns) 'execute-format (sci/copy-var execute-format pprint-ns) 'with-pprint-dispatch (sci/copy-var pprint/with-pprint-dispatch pprint-ns) + 'code-dispatch (sci/copy-var pprint/code-dispatch pprint-ns) '*print-pprint-dispatch* print-pprint-dispatch '*print-miser-width* print-miser-width 'get-pretty-writer (sci/copy-var get-pretty-writer pprint-ns) From d721b925f4ec3b5808061c9c0a82495f528fdb73 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 9 Dec 2022 19:12:16 +0100 Subject: [PATCH 528/550] Support --dev-build flag --- install | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/install b/install index a9c0090d..349405b0 100755 --- a/install +++ b/install @@ -8,6 +8,7 @@ static_binary="false" default_install_dir="/usr/local/bin" install_dir="$default_install_dir" download_dir="" +dev_build="" print_help() { echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin." @@ -56,6 +57,10 @@ do static_binary="true" shift ;; + --dev-build) + dev_build="true" + shift + ;; *) # unknown option print_help shift @@ -74,7 +79,11 @@ if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then fi if [[ "$version" == "" ]]; then - version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)" + if [[ "$dev_build" == "true" ]]; then + version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)" + else + version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)" + fi fi case "$(uname -s)" in From ba328f2387998477a8f1d569add61b895987d5f5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 11:48:29 +0100 Subject: [PATCH 529/550] ns as macro (#1447) --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index df37fdea..68e793bc 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit df37fdeafbc9ed8d4f089b1ecaabc1e6eef02cc0 +Subproject commit 68e793bc21cc5605bfafec9e258b549a4b8c5e8b From f9131b2979642ea2e5568c5fcc1cace0fb9fd8fb Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 12:04:28 +0100 Subject: [PATCH 530/550] lazy-seq as macro --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 68e793bc..0b4cc442 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 68e793bc21cc5605bfafec9e258b549a4b8c5e8b +Subproject commit 0b4cc4423ff639aff1a553a87f7ef7e6b2b54043 From b9fa877cd7658fb726227c91a71116e1d766d439 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 12:22:22 +0100 Subject: [PATCH 531/550] Constructor of LazySeq --- src/babashka/impl/classes.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index 5be3651b..b7e46ad9 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -120,7 +120,8 @@ clojure.lang.APersistentVector {:methods [{:name "indexOf"}]} clojure.lang.LazySeq - {:methods [{:name "indexOf"}]} + {:allPublicConstructors true, + :methods [{:name "indexOf"}]} clojure.lang.ILookup {:methods [{:name "valAt"}]} clojure.lang.IPersistentMap From 44dbc57cda79759fefcdb0fad9842ea873040041 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 14:41:29 +0100 Subject: [PATCH 532/550] Restore inlined functions --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 0b4cc442..b7b9772b 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 0b4cc4423ff639aff1a553a87f7ef7e6b2b54043 +Subproject commit b7b9772b873c43ef408f0e94c4ce9e6d00f8fe69 From 38dc526680701221692122bccf14cda4e5a7b9d4 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 15:18:15 +0100 Subject: [PATCH 533/550] Fix inlined alength --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index b7b9772b..5b2c94bb 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit b7b9772b873c43ef408f0e94c4ce9e6d00f8fe69 +Subproject commit 5b2c94bb979a7c79d69322d1336ecdfdddfac2d4 From e619a896a1526282c91d0f29c0abf7d1b7e636b8 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 10 Dec 2022 20:55:31 +0100 Subject: [PATCH 534/550] restore init --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 5b2c94bb..280865a9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 5b2c94bb979a7c79d69322d1336ecdfdddfac2d4 +Subproject commit 280865a9850d3befd5239bf42b3aa016230bc0c4 From 5570c416e94c4c02fe659f3143b81ca3db665c72 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 11 Dec 2022 18:06:23 +0100 Subject: [PATCH 535/550] v0.6.41 --- deps.edn | 2 +- project.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 4e875585..692d7724 100644 --- a/deps.edn +++ b/deps.edn @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.5.40"}} + org.babashka/cli {:mvn/version "0.6.41"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile diff --git a/project.clj b/project.clj index 106731db..f5794d71 100644 --- a/project.clj +++ b/project.clj @@ -32,7 +32,7 @@ [com.github.clj-easy/graal-build-time "0.1.0"] [rewrite-clj/rewrite-clj "1.1.45"] [insn/insn "0.5.2"] - [org.babashka/cli "0.5.40"]] + [org.babashka/cli "0.6.41"]] :plugins [[org.kipz/lein-meta-bom "0.1.1"]] :metabom {:jar-name "metabom.jar"} :profiles {:feature/xml {:source-paths ["feature-xml"] From 72377d090fee865e8d8d057429d159aed9c88477 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 11 Dec 2022 18:17:12 +0100 Subject: [PATCH 536/550] Bump built-in deps.edn [skip ci] --- resources/META-INF/babashka/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/META-INF/babashka/deps.edn b/resources/META-INF/babashka/deps.edn index 4e875585..692d7724 100644 --- a/resources/META-INF/babashka/deps.edn +++ b/resources/META-INF/babashka/deps.edn @@ -50,7 +50,7 @@ org.clojure/data.priority-map {:mvn/version "1.1.0"} insn/insn {:mvn/version "0.5.2"} org.clojure/core.rrb-vector {:mvn/version "0.1.2"} - org.babashka/cli {:mvn/version "0.5.40"}} + org.babashka/cli {:mvn/version "0.6.41"}} :aliases {:babashka/dev {:main-opts ["-m" "babashka.main"]} :profile From df24cf287dbbab42b13b375912aa924419d98308 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 12 Dec 2022 21:19:23 +0100 Subject: [PATCH 537/550] Update deps.clj --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index a195e410..5b5c1ba6 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit a195e410bfd61b3befcab40915cf6c2e54b0b7ca +Subproject commit 5b5c1ba63a909653fdc9830329560d84c418a63f From dc2502ebae0c58034d9307b7000a735d63ad3388 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 14 Dec 2022 14:46:42 +0100 Subject: [PATCH 538/550] deps.clj --- deps.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.clj b/deps.clj index 5b5c1ba6..2d185718 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 5b5c1ba63a909653fdc9830329560d84c418a63f +Subproject commit 2d185718ba2871c96e6cb4a4181d1dcf9d8fde86 From 965c177bca31ae9882c975ef7db448e12f59984e Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 14 Dec 2022 15:57:07 +0200 Subject: [PATCH 539/550] Fix #1280: babashka REPL doesn't quit right after ctrl-d (#1450) the problem is that parser/parse-next waits for an enter before returning an object we can use peek-char to pre-emptively react to any EOF at the start of the line in case of not-start-of-line, parse-next takes over Co-authored-by: Alice Margatroid --- src/babashka/impl/repl.clj | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/babashka/impl/repl.clj b/src/babashka/impl/repl.clj index e1083b5b..11dcf370 100644 --- a/src/babashka/impl/repl.clj +++ b/src/babashka/impl/repl.clj @@ -63,13 +63,14 @@ (eval-form sci-ctx `(apply require (quote ~m/repl-requires))))) :read (or read (fn [_request-prompt request-exit] - (let [v (parser/parse-next sci-ctx in)] - (skip-if-eol in) - (if (or (identical? :repl/quit v) - (identical? :repl/exit v) - (identical? parser/eof v)) - request-exit - v)))) + (if (nil? (r/peek-char in)) + request-exit + (let [v (parser/parse-next sci-ctx in)] + (skip-if-eol in) + (if (or (identical? :repl/quit v) + (identical? :repl/exit v)) + request-exit + v))))) :eval (or eval (fn [expr] (sci/with-bindings {sci/file "" From 2535299be885d9eb98e5ac39b76d3e24cd34b8dc Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 18 Dec 2022 12:04:30 +0100 Subject: [PATCH 540/550] README [skip ci] --- README.md | 2 ++ process | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 72e9b7c6..aac0669c 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,8 @@ handling of SIGINT and SIGPIPE. This can be done by setting ## Articles, podcasts and videos +- [Babashka: How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746) by Michiel Borkent +- [Adding Prompts To Your Babashka Scripts With Dialog](https://www.pixelated-noise.com/blog/2022/12/09/dialog-and-babashka/index.html) by A.C. Danvers - [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices.html) by Kari Marttila - [Manage git hooks with babashka tasks](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy - [Messing around with babashka](https://ian-muge.medium.com/messing-around-with-babashka-f181a9003faa) by Ian Muge diff --git a/process b/process index fa7e470a..90e4cf0b 160000 --- a/process +++ b/process @@ -1 +1 @@ -Subproject commit fa7e470a4ecd1511cba5109a2ed91cdb98cf803a +Subproject commit 90e4cf0b0cc7856f8c39591c3350cdf156d11042 From 37e2da9f5bc7fcfd7da122230ae90fbafe65c701 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 19 Dec 2022 14:41:13 +0100 Subject: [PATCH 541/550] minor README --- README.md | 5 +++-- sci | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aac0669c..75a23601 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ anywhere on the path. Then you're ready to go: ``` shellsession -$ ls | bb -i '(filter #(-> % io/file .isDirectory) *input*)' +$ ls | bb -i '(filter fs/directory? *input*)' ("doc" "resources" "sci" "script" "src" "target" "test") bb took 4ms. ``` @@ -109,7 +109,8 @@ $ bb '(vec (dedupe *input*))' <<< '[1 1 1 1 2]' [1 2] ``` -Read more about input and output flags [here](https://book.babashka.org/#_input_and_output_flags). +Read more about `*input*` and in- and output flags +[here](https://book.babashka.org/#_input_and_output_flags). Execute a script. E.g. print the current time in California using the `java.time` API: diff --git a/sci b/sci index 280865a9..79f905cc 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 280865a9850d3befd5239bf42b3aa016230bc0c4 +Subproject commit 79f905cc7cb2a323d080bec7805df0c9eb8e65d0 From d9aad85476376a2992aa15bb9e160a36ec3f95ab Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 19 Dec 2022 23:04:57 +0100 Subject: [PATCH 542/550] SCI: remove intermediate code for static method call --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 79f905cc..9707e306 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 79f905cc7cb2a323d080bec7805df0c9eb8e65d0 +Subproject commit 9707e3069931902dad76c7d209d55d9bd5b24492 From 62916fa292cfe7ea6211c765322611c235b9f8ac Mon Sep 17 00:00:00 2001 From: Matthew Downey Date: Tue, 20 Dec 2022 13:41:36 -0500 Subject: [PATCH 543/550] Fix #1451: Allow passing explicit file and line number to clojure.test --- src/babashka/impl/clojure/test.clj | 2 +- test/babashka/test_test.clj | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/babashka/impl/clojure/test.clj b/src/babashka/impl/clojure/test.clj index 422947a2..8903e911 100644 --- a/src/babashka/impl/clojure/test.clj +++ b/src/babashka/impl/clojure/test.clj @@ -297,7 +297,7 @@ current assertion." {:added "1.1"} [m] - (let [{:keys [:file :line]} (meta (first @testing-vars))] + (let [{:keys [:file :line]} (merge m (meta (first @testing-vars)))] (str ;; Uncomment to include namespace in failure report: ;;(ns-name (:ns (meta (first *testing-vars*)))) "/ " diff --git a/test/babashka/test_test.clj b/test/babashka/test_test.clj index 08a58249..b0ad6da5 100644 --- a/test/babashka/test_test.clj +++ b/test/babashka/test_test.clj @@ -112,3 +112,9 @@ (deftest line-number-test (is (str/includes? (bb "test-resources/line_number_test_test.clj") "line_number_test_test.clj:4"))) + +(deftest testing-vars-str-test + (is (str/includes? + (bb "(clojure.test/testing-vars-str {:file \"x\" :line 1})") + "() (x:1)") + "includes explicit line number + file name in test report")) From 935c8da5359dc6b3936e9c29f75e1de854597fc7 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 20 Dec 2022 19:43:23 +0100 Subject: [PATCH 544/550] Changelog + SCI update --- CHANGELOG.md | 4 ++++ sci | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13e87948..0b81ac96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ A preview of the next release can be installed from [Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting +## Unreleased + +- [#1451](https://github.com/babashka/babashka/issues/1451): Allow passing explicit file and line number to clojure.test ([@matthewdowney](https://github.com/matthewdowney)) + ## 1.0.168 (2022-12-07) - `loop*`, `fn*` are now special forms and `loop`, `fn`, `defn`, `defmacro`, `and` and `or` are implemented as macros. This restores compatibility with [rcf](https://github.com/borkdude/hyperfiddle-rcf) diff --git a/sci b/sci index 9707e306..9293e65c 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 9707e3069931902dad76c7d209d55d9bd5b24492 +Subproject commit 9293e65c77a4c288e89a8f9d2988c678ef335b8b From 01eea0babbbbf1a8c88bb9b880b5a74c2ba82004 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 20 Dec 2022 19:48:18 +0100 Subject: [PATCH 545/550] changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b81ac96..cbedc7a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,12 @@ A preview of the next release can be installed from ## Unreleased +- Implement `ns`, `lazy-seq` as macro +- Support `--dev-build` flag in installation script - [#1451](https://github.com/babashka/babashka/issues/1451): Allow passing explicit file and line number to clojure.test ([@matthewdowney](https://github.com/matthewdowney)) +- [#1280](https://github.com/babashka/babashka/issues/1280): babashka REPL doesn't quit right after Ctrl-d ([@formerly-a-trickster](https://github.com/formerly-a-trickster) and Alice Margatroid) +- [#1446](https://github.com/babashka/babashka/issues/1446): add `pprint/code-dispatch` +- Update zlib to version `1.2.13` ([@thiagokokada](https://github.com/thiagokokada)) ## 1.0.168 (2022-12-07) From df24d04f73e2cc8034e669dcbb7961817e110c8f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 21 Dec 2022 12:06:10 +0100 Subject: [PATCH 546/550] SCI: minor perf boost for zero args --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 9293e65c..7b2580b9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 9293e65c77a4c288e89a8f9d2988c678ef335b8b +Subproject commit 7b2580b94f5285622a4a992c12fbe875fa231fe5 From 61950b87e289fc0891c4655d1f9db81002f32ab0 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 21 Dec 2022 12:28:47 +0100 Subject: [PATCH 547/550] SCI: faster field access --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 7b2580b9..4e3befa9 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 7b2580b94f5285622a4a992c12fbe875fa231fe5 +Subproject commit 4e3befa99858c57125a422edcf567345d57ba74d From 8b39f67700e5885d249bb3a9cf56e3bf8b0fd146 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Dec 2022 14:32:13 +0100 Subject: [PATCH 548/550] SCI: cache Java interop methods (#1455) --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 4e3befa9..8884529f 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 4e3befa99858c57125a422edcf567345d57ba74d +Subproject commit 8884529f67c6af50a7d001211027f47ccc684775 From 68a6e2451624be3640b43c6c2f4ad915b9ba423f Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Fri, 23 Dec 2022 14:44:52 +0100 Subject: [PATCH 549/550] Fix #1454: include babashka process in print-deps output --- CHANGELOG.md | 1 + src/babashka/impl/print_deps.clj | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbedc7a6..473540ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ A preview of the next release can be installed from - [#1280](https://github.com/babashka/babashka/issues/1280): babashka REPL doesn't quit right after Ctrl-d ([@formerly-a-trickster](https://github.com/formerly-a-trickster) and Alice Margatroid) - [#1446](https://github.com/babashka/babashka/issues/1446): add `pprint/code-dispatch` - Update zlib to version `1.2.13` ([@thiagokokada](https://github.com/thiagokokada)) +- [#1454](https://github.com/babashka/babashka/issues/1454): Add `babashka.process` to `print-deps` output ## 1.0.168 (2022-12-07) diff --git a/src/babashka/impl/print_deps.clj b/src/babashka/impl/print_deps.clj index 45e2b3f8..0e9d0288 100644 --- a/src/babashka/impl/print_deps.clj +++ b/src/babashka/impl/print_deps.clj @@ -14,10 +14,11 @@ edn/read-string) deps (:deps deps) deps (assoc deps - 'babashka/fs {:mvn/version "0.1.2"} - 'babashka/babashka.curl {:mvn/version "0.1.1"} + 'babashka/fs {:mvn/version "0.2.12"} + 'babashka/babashka.curl {:mvn/version "0.1.2"} 'babashka/babashka.core {:git/url "https://github.com/babashka/babashka.core" - :git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"}) + :git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"} + 'babashka/process {:mvn/version "0.4.13"}) deps (dissoc deps 'borkdude/sci 'org.babashka/sci From 4223f1432d5414ebf75e2bdfcd8d349f5109fd8a Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sun, 25 Dec 2022 12:24:23 +0100 Subject: [PATCH 550/550] SCI sync --- sci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sci b/sci index 8884529f..92a07126 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 8884529f67c6af50a7d001211027f47ccc684775 +Subproject commit 92a071269f1a4e3f4fda262b33b47ec827be3d4e