From 4886fe48aef6d6f5b430b8fcddca27b1ed897d49 Mon Sep 17 00:00:00 2001 From: Wes Morgan Date: Sun, 3 Apr 2022 12:28:00 -0600 Subject: [PATCH 001/322] 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 002/322] 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 003/322] 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 004/322] 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 005/322] 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 006/322] 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 007/322] 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 008/322] 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 009/322] 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 010/322] 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 011/322] 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 012/322] 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 013/322] 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 014/322] 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 015/322] [#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 016/322] 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 017/322] 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 018/322] 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 019/322] 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 020/322] 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 021/322] 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 022/322] 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 023/322] 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 024/322] 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 025/322] 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 026/322] 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 027/322] 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 028/322] 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 029/322] 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 030/322] 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 031/322] 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 032/322] 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 033/322] 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 034/322] 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 035/322] 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 036/322] 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 037/322] 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 038/322] 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 039/322] 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 040/322] 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 041/322] 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 042/322] 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 043/322] 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 044/322] 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 045/322] 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 046/322] 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 047/322] 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 048/322] 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 049/322] 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 050/322] 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 051/322] 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 052/322] 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 053/322] 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 054/322] 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 055/322] 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 056/322] 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 057/322] 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 058/322] 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 059/322] 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 060/322] 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 061/322] 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 062/322] 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 063/322] 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 064/322] 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 065/322] 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 066/322] 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 067/322] 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 068/322] 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 069/322] 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 070/322] 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 071/322] 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 072/322] 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 073/322] 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 074/322] 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 075/322] 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 076/322] 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 077/322] 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 078/322] 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 079/322] 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 080/322] 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 081/322] 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 082/322] 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 083/322] 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 084/322] 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 085/322] 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 086/322] 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 087/322] 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 088/322] 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 089/322] 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 090/322] 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 091/322] 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 092/322] 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 093/322] 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 094/322] 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 095/322] 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 096/322] 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 097/322] 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 098/322] 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 099/322] 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 100/322] 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 101/322] 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 102/322] 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 103/322] 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 104/322] 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 105/322] 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 106/322] 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 107/322] 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 108/322] 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 109/322] 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 110/322] 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 111/322] 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 112/322] 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 113/322] 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 114/322] 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 115/322] 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 116/322] 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 117/322] 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 118/322] 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 119/322] 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 120/322] 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 121/322] 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 122/322] 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 123/322] 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 124/322] 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 125/322] 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 126/322] 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 127/322] 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 128/322] 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 129/322] 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 130/322] 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 131/322] 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 132/322] 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 133/322] 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 134/322] 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 135/322] 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 136/322] 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 137/322] 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 138/322] 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 139/322] 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 140/322] 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 141/322] 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 142/322] 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 143/322] 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 144/322] 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 145/322] 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 146/322] 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 147/322] 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 148/322] 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 149/322] 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 150/322] 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 151/322] 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 152/322] 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 153/322] 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 154/322] 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 155/322] 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 156/322] 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 157/322] 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 158/322] 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 159/322] 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 160/322] 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 161/322] 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 162/322] 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 163/322] 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 164/322] 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 165/322] 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 166/322] 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 167/322] 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 168/322] 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 169/322] 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 170/322] 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 171/322] 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 172/322] 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 173/322] 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 174/322] 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 175/322] 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 176/322] 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 177/322] 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 178/322] 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 179/322] 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 180/322] 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 181/322] 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 182/322] 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 183/322] 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 184/322] 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 185/322] 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 186/322] 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 187/322] 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 188/322] 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 189/322] 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 190/322] 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 191/322] 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 192/322] 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 193/322] 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 194/322] 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 195/322] 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 196/322] 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 197/322] 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 198/322] 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 199/322] 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 200/322] 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 201/322] -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 202/322] 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 203/322] 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 204/322] 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 205/322] 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 206/322] 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 207/322] 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 208/322] 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 209/322] 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 210/322] 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 211/322] 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 212/322] 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 213/322] 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 214/322] 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 215/322] 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 216/322] 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 217/322] 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 218/322] 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 219/322] 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 220/322] 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 221/322] 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 222/322] 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 223/322] 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 224/322] 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 225/322] 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 226/322] 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 227/322] 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 228/322] 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 229/322] 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 230/322] 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 231/322] 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 232/322] 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 233/322] 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 234/322] 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 235/322] 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 236/322] 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 237/322] 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 238/322] 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 239/322] 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 240/322] 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 241/322] 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 242/322] 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 243/322] 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 244/322] 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 245/322] 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 246/322] 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 247/322] 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 248/322] 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 249/322] 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 250/322] 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 251/322] 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 252/322] 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 253/322] 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 254/322] 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 255/322] 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 256/322] 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 257/322] 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 258/322] 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 259/322] 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 260/322] 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 261/322] 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 262/322] 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 263/322] 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 264/322] 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 265/322] 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 266/322] 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 267/322] 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 268/322] 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 269/322] 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 270/322] 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 271/322] 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 272/322] 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 273/322] 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 274/322] 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 275/322] 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 276/322] 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 277/322] 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 278/322] 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 279/322] 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 280/322] 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 281/322] 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 282/322] 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 283/322] 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 284/322] 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 285/322] 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 286/322] 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 287/322] 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 288/322] 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 289/322] 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 290/322] 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 291/322] 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 292/322] 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 293/322] 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 294/322] 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 295/322] 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 296/322] 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 297/322] 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 298/322] 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 299/322] 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 300/322] 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 301/322] 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 302/322] 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 303/322] 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 304/322] 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 305/322] 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 306/322] 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 307/322] 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 308/322] 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 309/322] 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 310/322] 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 311/322] 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 312/322] #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 313/322] 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 314/322] 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 315/322] 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 316/322] 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 317/322] 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 318/322] 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 319/322] 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 320/322] 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 321/322] 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 322/322] 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"]]}