Merge branch 'master' into spec1 [skip ci]
This commit is contained in:
commit
2d5424949a
12 changed files with 144 additions and 55 deletions
16
CHANGELOG.md
16
CHANGELOG.md
|
|
@ -16,10 +16,20 @@ A preview of the next release can be installed from
|
|||
|
||||
- [#1216](https://github.com/babashka/babashka/issues/1216): support `core.async/alts!` using polyfill
|
||||
- [#1220](https://github.com/babashka/babashka/issues/1220): add reflection on java.util.concurrent.Future
|
||||
|
||||
## 0.7.9-SNAPSHOT
|
||||
|
||||
- [#1211](https://github.com/babashka/babashka/issues/1211): return exit code 130 on sigint
|
||||
- [#1224](https://github.com/babashka/babashka/issues/1224): add `proxy` support for `java.io.PipedInputStream` and `java.io.PipedOutputStream`. Add reflection for `java.utils.Scanner`.
|
||||
- [babashka.curl#43](https://github.com/babashka/babashka.curl/issues/43) fix: last set-cookie headers on a page overwrites the ones before
|
||||
- #1216: fix `core.async` alts example with polyfill
|
||||
- SCI: support `let*` special form
|
||||
- Add compatibility with GraalVM 22.1
|
||||
- Bump timbre
|
||||
- Bump Clojure to 1.11.0
|
||||
- Pods: support Rosetta2 fallback
|
||||
- Process: fix for pprint
|
||||
- Fs: improvement for which: do not match on local paths
|
||||
- Proxy support for PipedInputStream and PipedOutputStream
|
||||
- Expose `java.util.Scanner` for interop
|
||||
- Bump Selmer
|
||||
|
||||
## 0.7.8 (2022-03-13)
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 3d3d117ea0f8a143a06e3cace92e4e8b6a5782df
|
||||
Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178
|
||||
2
sci
2
sci
|
|
@ -1 +1 @@
|
|||
Subproject commit 2e7dd0d1bc23f4d158ea592adf23dac971d4d8d4
|
||||
Subproject commit 4e6d8e215a379e3c1a36e39dce43148c8ab0915b
|
||||
|
|
@ -5,7 +5,8 @@
|
|||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[sci.core :as sci])
|
||||
(:import [java.util.jar JarFile Manifest]))
|
||||
(:import [java.util.jar JarFile Manifest]
|
||||
(java.net URL)))
|
||||
|
||||
(set! *warn-on-reflection* true)
|
||||
|
||||
|
|
@ -106,11 +107,11 @@
|
|||
[]
|
||||
(:cp @cp-state))
|
||||
|
||||
(defn resource [path]
|
||||
(when-let [st @cp-state]
|
||||
(let [loader (:loader st)]
|
||||
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
|
||||
(getResource loader [path] true)))))
|
||||
(defn resource
|
||||
(^URL [path] (when-let [st @cp-state] (resource (:loader st) path)))
|
||||
(^URL [loader path]
|
||||
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
|
||||
(getResource loader [path] true))))
|
||||
|
||||
(def cns (sci/create-ns 'babashka.classpath nil))
|
||||
|
||||
|
|
@ -126,5 +127,5 @@
|
|||
(def cp "src:feature-xml:feature-core-async:feature-yaml:feature-csv:feature-transit:feature-java-time:feature-java-nio:sci/src:babashka.curl/src:babashka.pods/src:resources:sci/resources:/Users/borkdude/.m2/repository/com/cognitect/transit-java/1.0.343/transit-java-1.0.343.jar:/Users/borkdude/.m2/repository/org/clojure/clojure/1.10.2-alpha1/clojure-1.10.2-alpha1.jar:/Users/borkdude/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer/1.0.0/tools.analyzer-1.0.0.jar:/Users/borkdude/.m2/repository/org/clojure/tools.logging/0.6.0/tools.logging-0.6.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.jar:/Users/borkdude/.m2/repository/org/clojure/spec.alpha/0.2.187/spec.alpha-0.2.187.jar:/Users/borkdude/.m2/repository/org/clojure/tools.cli/1.0.194/tools.cli-1.0.194.jar:/Users/borkdude/.m2/repository/org/clojure/tools.analyzer.jvm/1.0.0/tools.analyzer.jvm-1.0.0.jar:/Users/borkdude/.m2/repository/borkdude/graal.locking/0.0.2/graal.locking-0.0.2.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.10.2/jackson-dataformat-cbor-2.10.2.jar:/Users/borkdude/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar:/Users/borkdude/.m2/repository/org/flatland/ordered/1.5.9/ordered-1.5.9.jar:/Users/borkdude/.m2/repository/org/postgresql/postgresql/42.2.12/postgresql-42.2.12.jar:/Users/borkdude/.m2/repository/fipp/fipp/0.6.22/fipp-0.6.22.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.10.2/jackson-core-2.10.2.jar:/Users/borkdude/.m2/repository/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar:/Users/borkdude/.m2/repository/org/ow2/asm/asm/5.2/asm-5.2.jar:/Users/borkdude/.gitlibs/libs/clj-commons/conch/9aa7724e925cb8bf163e0b62486dd420b84e5f0b/src:/Users/borkdude/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/Users/borkdude/.m2/repository/seancorfield/next.jdbc/1.0.424/next.jdbc-1.0.424.jar:/Users/borkdude/.m2/repository/org/clojure/data.xml/0.2.0-alpha6/data.xml-0.2.0-alpha6.jar:/Users/borkdude/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar:/Users/borkdude/.m2/repository/borkdude/edamame/0.0.11-alpha.9/edamame-0.0.11-alpha.9.jar:/Users/borkdude/.m2/repository/org/clojure/data.csv/1.0.0/data.csv-1.0.0.jar:/Users/borkdude/.m2/repository/com/cognitect/transit-clj/1.0.324/transit-clj-1.0.324.jar:/Users/borkdude/.m2/repository/clj-commons/clj-yaml/0.7.1/clj-yaml-0.7.1.jar:/Users/borkdude/.m2/repository/org/clojure/core.rrb-vector/0.1.1/core.rrb-vector-0.1.1.jar:/Users/borkdude/.m2/repository/persistent-sorted-set/persistent-sorted-set/0.1.2/persistent-sorted-set-0.1.2.jar:/Users/borkdude/.m2/repository/cheshire/cheshire/5.10.0/cheshire-5.10.0.jar:/Users/borkdude/.m2/repository/tigris/tigris/0.1.2/tigris-0.1.2.jar:/Users/borkdude/.m2/repository/org/clojure/tools.reader/1.3.2/tools.reader-1.3.2.jar:/Users/borkdude/.m2/repository/datascript/datascript/0.18.11/datascript-0.18.11.jar:/Users/borkdude/.m2/repository/org/hsqldb/hsqldb/2.4.0/hsqldb-2.4.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.memoize/0.8.2/core.memoize-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.priority-map/0.0.7/data.priority-map-0.0.7.jar:/Users/borkdude/.m2/repository/org/clojure/java.data/1.0.64/java.data-1.0.64.jar:/Users/borkdude/.m2/repository/borkdude/sci.impl.reflector/0.0.1/sci.impl.reflector-0.0.1.jar:/Users/borkdude/.m2/repository/nrepl/bencode/1.1.0/bencode-1.1.0.jar:/Users/borkdude/.m2/repository/org/clojure/core.cache/0.8.2/core.cache-0.8.2.jar:/Users/borkdude/.m2/repository/org/clojure/core.async/1.1.587/core.async-1.1.587.jar:/Users/borkdude/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.10.2/jackson-dataformat-smile-2.10.2.jar:/Users/borkdude/.m2/repository/org/clojure/data.codec/0.1.0/data.codec-0.1.0.jar:/Users/borkdude/.m2/repository/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar")
|
||||
(def l (loader cp))
|
||||
(source-for-namespace l 'babashka.impl.cheshire nil)
|
||||
(time (:file (source-for-namespace l 'cheshire.core nil))) ;; 20ms -> 2.25ms
|
||||
)
|
||||
(time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
(throw (IllegalArgumentException.
|
||||
(str (-> coord keys first)
|
||||
" is not a supported pod coordinate type. "
|
||||
"Use :version for registry-hosted pods or :local/root "
|
||||
"Use :version for registry-hosted pods or :path "
|
||||
"for pods on your local filesystem."))))))
|
||||
{} pods-map))
|
||||
|
||||
|
|
|
|||
|
|
@ -12,4 +12,4 @@
|
|||
(reify SignalHandler
|
||||
(handle [_ _]
|
||||
;; This is needed to run shutdown hooks on interrupt, System/exit triggers those
|
||||
(System/exit 0))))))
|
||||
(System/exit 130))))))
|
||||
|
|
|
|||
|
|
@ -52,11 +52,11 @@
|
|||
[hf.depstar.uberjar :as uberjar]
|
||||
[sci.addons :as addons]
|
||||
[sci.core :as sci]
|
||||
[sci.impl.io :as sio]
|
||||
[sci.impl.namespaces :as sci-namespaces]
|
||||
[sci.impl.types :as sci-types]
|
||||
[sci.impl.unrestrict :refer [*unrestricted*]]
|
||||
[sci.impl.vars :as vars]
|
||||
[sci.impl.io :as sio])
|
||||
[sci.impl.vars :as vars])
|
||||
(:gen-class))
|
||||
|
||||
(def windows?
|
||||
|
|
@ -663,6 +663,15 @@ Use bb run --help to show this help output.
|
|||
[options opts-map])
|
||||
[options opts-map])))
|
||||
|
||||
(defn parse-file-opt
|
||||
[options opts-map]
|
||||
(let [opt (first options)
|
||||
opts-key (if (str/ends-with? opt ".jar")
|
||||
:jar :file)]
|
||||
(assoc opts-map
|
||||
opts-key opt
|
||||
:command-line-args (next options))))
|
||||
|
||||
(defn parse-opts
|
||||
([options] (parse-opts options nil))
|
||||
([options opts-map]
|
||||
|
|
@ -672,19 +681,18 @@ Use bb run --help to show this help output.
|
|||
;; FILE > TASK > SUBCOMMAND
|
||||
(cond
|
||||
(.isFile (io/file opt))
|
||||
(if (str/ends-with? opt ".jar")
|
||||
(assoc opts-map
|
||||
:jar opt
|
||||
:command-line-args (next options))
|
||||
(assoc opts-map
|
||||
:file opt
|
||||
:command-line-args (next options)))
|
||||
(if (or (:file opts-map) (:jar opts-map))
|
||||
opts-map ; we've already parsed the file opt
|
||||
(parse-file-opt options opts-map))
|
||||
|
||||
(contains? tasks opt)
|
||||
(assoc opts-map
|
||||
:run opt
|
||||
:command-line-args (next options))
|
||||
|
||||
(command? opt)
|
||||
(recur (cons (str "--" opt) (next options)) opts-map)
|
||||
|
||||
:else
|
||||
(parse-args options opts-map))))))
|
||||
|
||||
|
|
@ -757,16 +765,25 @@ Use bb run --help to show this help output.
|
|||
:expressions [(:source res)]})
|
||||
{})
|
||||
res))))
|
||||
(when-let [pod (get @pod-namespaces namespace)]
|
||||
(pods/load-pod (:pod-spec pod) (:opts pod)))
|
||||
(case namespace
|
||||
clojure.spec.alpha
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha"))
|
||||
clojure.core.specs.alpha
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency."))
|
||||
nil)))
|
||||
(if-let [pod (get @pod-namespaces namespace)]
|
||||
(if uberscript
|
||||
(do
|
||||
(swap! uberscript-sources conj
|
||||
(format
|
||||
"(babashka.pods/load-pod '%s \"%s\" '%s)\n"
|
||||
(:pod-spec pod) (:version (:opts pod))
|
||||
(dissoc (:opts pod)
|
||||
:version :metadata)))
|
||||
{})
|
||||
(pods/load-pod (:pod-spec pod) (:opts pod)))
|
||||
(case namespace
|
||||
clojure.spec.alpha
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: Use the babashka-compatible version of clojure.spec.alpha, available here: https://github.com/babashka/spec.alpha"))
|
||||
clojure.core.specs.alpha
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: clojure.core.specs.alpha is removed from the classpath, unless you explicitly add the dependency."))
|
||||
nil))))
|
||||
main (if (and jar (not main))
|
||||
(when-let [res (cp/getResource
|
||||
(cp/loader jar)
|
||||
|
|
@ -920,11 +937,20 @@ Use bb run --help to show this help output.
|
|||
(spit uberscript-out expression :append true)))
|
||||
(when uberjar
|
||||
(if-let [cp (cp/get-classpath)]
|
||||
(uberjar/run {:dest uberjar
|
||||
:jar :uber
|
||||
:classpath cp
|
||||
:main-class main
|
||||
:verbose debug})
|
||||
(let [uber-params {:dest uberjar
|
||||
:jar :uber
|
||||
:classpath cp
|
||||
:main-class main
|
||||
:verbose debug}]
|
||||
(if-let [bb-edn-pods (:pods @common/bb-edn)]
|
||||
(fs/with-temp-dir [bb-edn-dir {}]
|
||||
(let [bb-edn-resource (fs/file bb-edn-dir "META-INF" "bb.edn")]
|
||||
(fs/create-dirs (fs/parent bb-edn-resource))
|
||||
(->> {:pods bb-edn-pods} pr-str (spit bb-edn-resource))
|
||||
(let [cp-with-bb-edn (str bb-edn-dir cp/path-sep cp)]
|
||||
(uberjar/run (assoc uber-params
|
||||
:classpath cp-with-bb-edn)))))
|
||||
(uberjar/run uber-params)))
|
||||
(throw (Exception. "The uberjar task needs a classpath."))))
|
||||
exit-code))))
|
||||
|
||||
|
|
@ -939,12 +965,16 @@ Use bb run --help to show this help output.
|
|||
|
||||
(defn main [& args]
|
||||
(let [[args global-opts] (parse-global-opts args)
|
||||
{:keys [:jar] :as file-opt} (when (some-> args first io/file .isFile)
|
||||
(parse-file-opt args global-opts))
|
||||
config (:config global-opts)
|
||||
bb-edn-file (or config
|
||||
"bb.edn")
|
||||
bb-edn (when (fs/exists? bb-edn-file)
|
||||
(System/setProperty "babashka.config"
|
||||
(.getAbsolutePath (io/file bb-edn-file)))
|
||||
abs-path #(-> % io/file .getAbsolutePath)
|
||||
bb-edn-file (cond
|
||||
config (when (fs/exists? config) (abs-path config))
|
||||
jar (some-> jar cp/loader (cp/resource "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 (edn/read-string raw-string)
|
||||
edn (assoc edn
|
||||
|
|
@ -961,7 +991,7 @@ Use bb run --help to show this help output.
|
|||
(binding [*out* *err*]
|
||||
(println (str "WARNING: this project requires babashka "
|
||||
min-bb-version " or newer, but you have: " version)))))
|
||||
(exec (parse-opts args global-opts))))
|
||||
(exec (parse-opts args (merge global-opts file-opt)))))
|
||||
|
||||
(def musl?
|
||||
"Captured at compile time, to know if we are running inside a
|
||||
|
|
|
|||
5
test-resources/babashka/uberjar/src/my/main_pod.clj
Normal file
5
test-resources/babashka/uberjar/src/my/main_pod.clj
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
(ns my.main-pod
|
||||
(:require [pod.babashka.go-sqlite3 :as sqlite]))
|
||||
|
||||
(defn -main [& _args]
|
||||
(sqlite/query ":memory:" ["SELECT 1 + 2 as sum"]))
|
||||
6
test-resources/babashka/uberscript/src/my/main_pod.clj
Normal file
6
test-resources/babashka/uberscript/src/my/main_pod.clj
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
(ns my.main-pod
|
||||
(:require [my.other-ns-with-pod]
|
||||
[pod.babashka.go-sqlite3 :as sqlite]))
|
||||
|
||||
(defn -main [& _args]
|
||||
(sqlite/query ":memory:" ["SELECT 1 + 2 as sum"]))
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
(ns my.other-ns-with-pod
|
||||
(:require [pod.babashka.go-sqlite3]))
|
||||
|
|
@ -1,16 +1,23 @@
|
|||
(ns babashka.uberjar-test
|
||||
(:require
|
||||
[babashka.main :as main]
|
||||
[babashka.test-utils :as tu]
|
||||
[clojure.string :as str]
|
||||
[clojure.test :as t :refer [deftest is testing]]))
|
||||
[babashka.fs :as fs]
|
||||
[babashka.main :as main]
|
||||
[babashka.test-utils :as tu]
|
||||
[clojure.edn :as edn]
|
||||
[clojure.string :as str]
|
||||
[clojure.test :as t :refer [deftest is testing]])
|
||||
(:import (java.io File InputStreamReader PushbackReader)
|
||||
(java.util.jar JarFile)))
|
||||
|
||||
(defn jar-entries [jar]
|
||||
(with-open [jar-file (JarFile. jar)]
|
||||
(doall (enumeration-seq (.entries jar-file)))))
|
||||
|
||||
(defn count-entries [jar]
|
||||
(with-open [jar-file (java.util.jar.JarFile. jar)]
|
||||
(count (map #_prn
|
||||
identity
|
||||
(enumeration-seq
|
||||
(.entries jar-file))))))
|
||||
(-> jar jar-entries count))
|
||||
|
||||
(defn get-entry [^File jar entry-name]
|
||||
(-> jar JarFile. (.getEntry entry-name)))
|
||||
|
||||
(deftest uberjar-test
|
||||
(testing "uberjar with --main"
|
||||
|
|
@ -54,6 +61,24 @@
|
|||
;; Only a manifest entry is added
|
||||
(is (< (count-entries path) 3)))))
|
||||
|
||||
(deftest uberjar-with-pods-test
|
||||
(testing "jar contains bb.edn w/ only :pods when bb.edn has :pods"
|
||||
(let [tmp-file (java.io.File/createTempFile "uber" ".jar")
|
||||
path (.getPath tmp-file)]
|
||||
(.deleteOnExit tmp-file)
|
||||
(let [config {:paths ["test-resources/babashka/uberjar/src"]
|
||||
:deps '{local/deps {:local/root "test-resources/babashka/uberjar"}}
|
||||
:pods (cond-> '{org.babashka/go-sqlite3 {:version "0.1.0"}}
|
||||
(not (fs/windows?)) (assoc 'pod/test-pod {:path "test-resources/pod"}))}]
|
||||
(tu/with-config config
|
||||
(tu/bb nil "uberjar" path "-m" "my.main-pod")
|
||||
(let [bb-edn-entry (get-entry tmp-file "META-INF/bb.edn")
|
||||
bb-edn (-> path JarFile. (.getInputStream bb-edn-entry)
|
||||
InputStreamReader. PushbackReader. edn/read)]
|
||||
(is (= #{:pods} (-> bb-edn keys set)))
|
||||
(is (= (:pods config) (:pods bb-edn))))
|
||||
(is (str/includes? (tu/bb nil "--jar" path) "3")))))))
|
||||
|
||||
(deftest throw-on-empty-classpath
|
||||
;; this test fails the windows native test in CI
|
||||
(when-not main/windows?
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
(ns babashka.uberscript-test
|
||||
(:require
|
||||
[babashka.test-utils :as tu]
|
||||
[clojure.test :as t :refer [deftest is]]))
|
||||
[clojure.test :as t :refer [deftest is]]
|
||||
[clojure.string :as str]))
|
||||
|
||||
(deftest basic-test
|
||||
(let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]
|
||||
|
|
@ -23,3 +24,12 @@
|
|||
(is (= ":clojure.string/foo\ntrue\n(\"1\" \"2\" \"3\" \"4\")\n"
|
||||
(tu/bb nil "--file" (.getPath tmp-file) "1" "2" "3" "4"))))))
|
||||
|
||||
(deftest pods-test
|
||||
(let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]
|
||||
(.deleteOnExit tmp-file)
|
||||
(tu/with-config (pr-str '{:paths ["test-resources/babashka/uberscript/src"]
|
||||
:pods {org.babashka/go-sqlite3 {:version "0.1.0"}}})
|
||||
(is (empty? (tu/bb nil "uberscript" (.getPath tmp-file) "-m" "my.main-pod")))
|
||||
(is (= 1 (count (re-seq #"load-pod 'org.babashka/go-sqlite3"
|
||||
(str/join (str/split-lines (slurp tmp-file))))))))
|
||||
(is (str/includes? (tu/bb nil "--file" (.getPath tmp-file)) "3"))))
|
||||
|
|
|
|||
Loading…
Reference in a new issue