Compare commits
407 commits
pod-metada
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8052618fa8 | ||
|
|
238a98d9b2 | ||
|
|
57b799e63d | ||
|
|
dad646ce38 | ||
|
|
35696b7c0b | ||
|
|
00d56900e8 | ||
|
|
1fc8ef6adb | ||
|
|
158b36c645 | ||
|
|
b5c65f46e1 | ||
|
|
7e64ce5dd1 | ||
|
|
73b806dbd2 | ||
|
|
0579d6a0ec | ||
|
|
cfee65101f | ||
|
|
4da643cf63 | ||
|
|
aa15e5212a | ||
|
|
e23a222fdb | ||
|
|
6c0cfde92f | ||
|
|
5f6befc577 | ||
|
|
d7b0f9155d | ||
|
|
28c2f6947f | ||
|
|
5c4fb1ccc1 | ||
|
|
5b7678f309 | ||
|
|
f33c68293b | ||
|
|
fd69206933 | ||
|
|
689148b99c | ||
|
|
3db67a5574 | ||
|
|
8191e09314 | ||
|
|
e784f4ae8a | ||
|
|
774fe99a83 | ||
|
|
f9aafc9d96 | ||
|
|
4037154a28 | ||
|
|
35e904b547 | ||
|
|
08d60112ed | ||
|
|
a9060f0027 | ||
|
|
597f180d32 | ||
|
|
007209c0d2 | ||
|
|
1b2682b67a | ||
|
|
4a2a305e38 | ||
|
|
e3908a1306 | ||
|
|
f967e10bdd | ||
|
|
4c6fe98236 | ||
|
|
28c7c42c2a | ||
|
|
6d5fc67467 | ||
|
|
50fc2e2582 | ||
|
|
a45f76b029 | ||
|
|
9ed0507030 | ||
|
|
f9935def7e | ||
|
|
d053a3c0c5 | ||
|
|
cdcf9deb1c | ||
|
|
6f43c47f2a | ||
|
|
63a51ff669 | ||
|
|
d7c80012b1 | ||
|
|
eddf51529f | ||
|
|
d1dbafc49b | ||
|
|
bc8cd6d358 | ||
|
|
b01ee6d87d | ||
|
|
a43b55bf5c | ||
|
|
4358428464 | ||
|
|
7998e50045 | ||
|
|
8d3806a6e7 | ||
|
|
455728092c | ||
|
|
da3eff0305 | ||
|
|
51b44ba2ed | ||
|
|
3cddc33334 | ||
|
|
d8521888cc | ||
|
|
1a62a619e3 | ||
|
|
ecbdbba8d4 | ||
|
|
e186726fd9 | ||
|
|
2a50af8f68 | ||
|
|
c7a5c6c6bc | ||
|
|
024f1d5515 | ||
|
|
142e9eae06 | ||
|
|
3d909f04b8 | ||
|
|
c9b9ad64fc | ||
|
|
9070db46df | ||
|
|
b16ecfdf6c | ||
|
|
1874da1d2d | ||
|
|
c89ac0bd7f | ||
|
|
def5d8fd37 | ||
|
|
2932d82a65 | ||
|
|
d8d6876832 | ||
|
|
c538d5edbd | ||
|
|
a5ec09087e | ||
|
|
5e4ce8e093 | ||
|
|
c1412f9b31 | ||
|
|
f5d7c1bb6e | ||
|
|
1deae725ae | ||
|
|
42b9ff8f25 | ||
|
|
3442f1e505 | ||
|
|
f0943d8a14 | ||
|
|
dff3b526e9 | ||
|
|
afb566f600 | ||
|
|
3cc45ec8a7 | ||
|
|
d670bbb245 | ||
|
|
62cab79ce6 | ||
|
|
f4292e1038 | ||
|
|
286e03ee24 | ||
|
|
cd362fbf01 | ||
|
|
ccebfa630f | ||
|
|
5ab8b3f975 | ||
|
|
2df2e7661b | ||
|
|
7121253f75 | ||
|
|
e5dde61ba8 | ||
|
|
6a5c13a6f8 | ||
|
|
b981921a00 | ||
|
|
eaf760d62f | ||
|
|
b59bfcb7e6 | ||
|
|
0138990139 | ||
|
|
5acf04dcf1 | ||
|
|
aabd35eeaa | ||
|
|
ec6a6a5cdb | ||
|
|
b19d5f9bff | ||
|
|
5902852ff9 | ||
|
|
24c644d9f0 | ||
|
|
01cb6112f9 | ||
|
|
7ff62d91a2 | ||
|
|
89eed2ed44 | ||
|
|
ed8aa97d34 | ||
|
|
34b5e71465 | ||
|
|
1d5a777b81 | ||
|
|
2519a284f4 | ||
|
|
0f9a0fe622 | ||
|
|
b6f844ba0c | ||
|
|
ab1ee96335 | ||
|
|
a535a5faec | ||
|
|
4715d13f71 | ||
|
|
8b46e030ca | ||
|
|
6ca28c642c | ||
|
|
c3c2c8b108 | ||
|
|
bc1c35790e | ||
|
|
50e8a74321 | ||
|
|
70b3e5c999 | ||
|
|
31a5ec5c71 | ||
|
|
96807375e0 | ||
|
|
c402c01861 | ||
|
|
08a08ef957 | ||
|
|
6a420c9bfd | ||
|
|
030d6ba889 | ||
|
|
15f5918e58 | ||
|
|
0c6f8b6806 | ||
|
|
7128d65de7 | ||
|
|
2bf95f60e7 | ||
|
|
0685424ac3 | ||
|
|
ecb0fa5cac | ||
|
|
e0a303c484 | ||
|
|
5bc1df73af | ||
|
|
ca26b22bf9 | ||
|
|
aa566ed15c | ||
|
|
2492e71dcc | ||
|
|
bbf9933941 | ||
|
|
ea660e956f | ||
|
|
bc413b654b | ||
|
|
a415139b3b | ||
|
|
0147195e8c | ||
|
|
d226fe785a | ||
|
|
2bb865917a | ||
|
|
16eebb60a3 | ||
|
|
da9fcbf10d | ||
|
|
cdfc664682 | ||
|
|
93e398f288 | ||
|
|
880b4ebe3f | ||
|
|
366cbed689 | ||
|
|
d17a5342d2 | ||
|
|
1372b3d8a0 | ||
|
|
b144c81fbb | ||
|
|
0527f6a372 | ||
|
|
e258358170 | ||
|
|
58def24712 | ||
|
|
f335fe51ff | ||
|
|
83918c4b80 | ||
|
|
2da875c8f9 | ||
|
|
7abd0000c7 | ||
|
|
19804e4bc7 | ||
|
|
af3ae5fa79 | ||
|
|
bf183a33a8 | ||
|
|
616de196f8 | ||
|
|
c3c0bf3cef | ||
|
|
ea2c3f06ec | ||
|
|
3068428578 | ||
|
|
702fdf8108 | ||
|
|
7e8e51b882 | ||
|
|
976d0fcb6d | ||
|
|
c60d139dbf | ||
|
|
116ee1191c | ||
|
|
035a8268ba | ||
|
|
5cd2b9d6e6 | ||
|
|
82291325de | ||
|
|
fa0be7ecbf | ||
|
|
6d4737ce77 | ||
|
|
da44bd4940 | ||
|
|
b47a5cc21d | ||
|
|
ba35032253 | ||
|
|
11610d6ebe | ||
|
|
37849d72ad | ||
|
|
375c9d3550 | ||
|
|
d7499210ec | ||
|
|
3d671ffcb6 | ||
|
|
4d1984410b | ||
|
|
0d4096dcd1 | ||
|
|
1e4236e22d | ||
|
|
717084a71d | ||
|
|
3608c6ab81 | ||
|
|
67d8e04db5 | ||
|
|
71c5e7c45b | ||
|
|
3cca11f8d1 | ||
|
|
655760d2a9 | ||
|
|
7b84a9d256 | ||
|
|
1a454b10bb | ||
|
|
81819deb0a | ||
|
|
8a0f66f3c1 | ||
|
|
b53e265af3 | ||
|
|
7530e6a57f | ||
|
|
2ee8185269 | ||
|
|
ff59956602 | ||
|
|
a176584eda | ||
|
|
43d9816bd6 | ||
|
|
e1a12037cd | ||
|
|
86ac0c2431 | ||
|
|
67ae82ee18 | ||
|
|
d8e0c6b476 | ||
|
|
12c89f79c6 | ||
|
|
67dc3af22d | ||
|
|
1f0f932c5e | ||
|
|
fa579b74df | ||
|
|
e7d964bb0a | ||
|
|
771f69d922 | ||
|
|
3e4c5861e7 | ||
|
|
68e8ac6e10 | ||
|
|
32078f8259 | ||
|
|
c9a63af40f | ||
|
|
87f9f6f206 | ||
|
|
df477adbb0 | ||
|
|
35e17bd46a | ||
|
|
9da2afc4b5 | ||
|
|
f24c75a054 | ||
|
|
30534691ba | ||
|
|
6dc3110b3c | ||
|
|
ecbbd7ab84 | ||
|
|
4ae9d27171 | ||
|
|
86ec03e2f4 | ||
|
|
39a9ed69d6 | ||
|
|
9653435460 | ||
|
|
d467bf53c8 | ||
|
|
6bfb2374b8 | ||
|
|
fe940c73c9 | ||
|
|
ea2c439369 | ||
|
|
c48d2f7a90 | ||
|
|
b337e032b6 | ||
|
|
2166c42de2 | ||
|
|
d85c86af2c | ||
|
|
5b471cb5e2 | ||
|
|
629c338b14 | ||
|
|
ab28e4c465 | ||
|
|
54ea4b460d | ||
|
|
bf7f42ce73 | ||
|
|
53d16eb9a0 | ||
|
|
eb69baeaa7 | ||
|
|
6052b9ba35 | ||
|
|
4a1b26a6be | ||
|
|
28f9879e40 | ||
|
|
0e1694f586 | ||
|
|
2ee7a0d12e | ||
|
|
4af5f1fd61 | ||
|
|
fc19382b5e | ||
|
|
9e1452867e | ||
|
|
2a432d3e80 | ||
|
|
1dbffac334 | ||
|
|
aa654a9ead | ||
|
|
9ded5fea0d | ||
|
|
6353ab9de9 | ||
|
|
ce403671be | ||
|
|
cedbff7696 | ||
|
|
15cff2eb7b | ||
|
|
2e23471612 | ||
|
|
6b52831a21 | ||
|
|
fdd2d68e1d | ||
|
|
838608647a | ||
|
|
e746593f14 | ||
|
|
3735135c05 | ||
|
|
7ebe96773d | ||
|
|
2fcf9c682a | ||
|
|
36e9732549 | ||
|
|
a5e4dfe663 | ||
|
|
9da7af58b3 | ||
|
|
f1084c1f36 | ||
|
|
e0598470be | ||
|
|
d854de883e | ||
|
|
80a8097a63 | ||
|
|
5bb98159be | ||
|
|
69b83c3678 | ||
|
|
857ecc3111 | ||
|
|
dbc766f58a | ||
|
|
79a133ee13 | ||
|
|
7ecd2fe59e | ||
|
|
0b892ad8e5 | ||
|
|
66b29b9061 | ||
|
|
1dff46699a | ||
|
|
ae01170f92 | ||
|
|
996c96761e | ||
|
|
ef5d2fdf3a | ||
|
|
9ae36491b7 | ||
|
|
d1580f1a72 | ||
|
|
8788a3c482 | ||
|
|
5cab060bbb | ||
|
|
d984eda226 | ||
|
|
c8324ac887 | ||
|
|
e938a58e06 | ||
|
|
c04b83811c | ||
|
|
6c1a66e853 | ||
|
|
ef50677275 | ||
|
|
8a8c2dcb46 | ||
|
|
7c5a2775df | ||
|
|
0b61f4d3ab | ||
|
|
e14af7b629 | ||
|
|
bc5e6b6d52 | ||
|
|
c2c7053120 | ||
|
|
6467316dc8 | ||
|
|
ad4935077d | ||
|
|
ad6cd5989f | ||
|
|
b1d2dc599b | ||
|
|
af507b2894 | ||
|
|
c91ccc7b93 | ||
|
|
2eed1b810b | ||
|
|
ce9a0f71e5 | ||
|
|
0d20cdf696 | ||
|
|
6bee6b6a89 | ||
|
|
dac6dcd6d5 | ||
|
|
d8c41351f5 | ||
|
|
c1b82db587 | ||
|
|
26c6c5ce18 | ||
|
|
3ded3b9546 | ||
|
|
10c315663f | ||
|
|
5f82d40fe6 | ||
|
|
81d260e473 | ||
|
|
1881a75a1d | ||
|
|
f470dba671 | ||
|
|
09bbd9eb34 | ||
|
|
7dc6b713d0 | ||
|
|
42d9d77e76 | ||
|
|
df5b115aab | ||
|
|
2ee0df4909 | ||
|
|
ea4ebab807 | ||
|
|
666ce9adc9 | ||
|
|
601e6e82cd | ||
|
|
6e088272b7 | ||
|
|
2353827e43 | ||
|
|
a8e7d35dfa | ||
|
|
b6e8f86595 | ||
|
|
3370d7a063 | ||
|
|
d1e36be9d9 | ||
|
|
83c02cb58b | ||
|
|
4c7bbeeb3b | ||
|
|
560369e294 | ||
|
|
94c5141a3e | ||
|
|
b749563003 | ||
|
|
af0937f060 | ||
|
|
85ecdab0a5 | ||
|
|
3b251c1b38 | ||
|
|
657adff336 | ||
|
|
a2f70d8324 | ||
|
|
fb3fa03074 | ||
|
|
de06c199f1 | ||
|
|
85eef7d6f7 | ||
|
|
bf306bb407 | ||
|
|
056254dc9d | ||
|
|
e3228fe358 | ||
|
|
1010b7f114 | ||
|
|
bef5ccf229 | ||
|
|
6760a2b844 | ||
|
|
fa10070013 | ||
|
|
fb3e04cffe | ||
|
|
7b7feb7034 | ||
|
|
c3cf8f5330 | ||
|
|
caf05979c3 | ||
|
|
9356653a09 | ||
|
|
aa7fb0c62a | ||
|
|
45ff85e1a0 | ||
|
|
9ff8003c1b | ||
|
|
b46fc49a5d | ||
|
|
9edce22ea7 | ||
|
|
56f5378702 | ||
|
|
a2398705bf | ||
|
|
c74d9a6f0a | ||
|
|
d27287b837 | ||
|
|
d677a2b65a | ||
|
|
efb947ec03 | ||
|
|
a8c9526be1 | ||
|
|
0d1ffd0c9f | ||
|
|
bfcec721c9 | ||
|
|
3ade21918f | ||
|
|
ddfc93d7e5 | ||
|
|
b44167e5c0 | ||
|
|
8a0fe19ab3 | ||
|
|
a3eb37e4a6 | ||
|
|
44465990a8 | ||
|
|
236768cada | ||
|
|
0f85b02a82 | ||
|
|
b1a5f4e8df | ||
|
|
0e47d7f7a6 | ||
|
|
41e5e0c484 | ||
|
|
fe989f7233 | ||
|
|
7f8ec567e6 | ||
|
|
342cedbcfa | ||
|
|
b22092a318 | ||
|
|
3da2c9f75f | ||
|
|
2e3bd2d3f0 | ||
|
|
555c11eca2 |
120 changed files with 4256 additions and 1975 deletions
|
|
@ -62,6 +62,7 @@
|
|||
(let [base-cmd ["docker" "buildx" "build"
|
||||
"-t" (str image-name ":" image-tag)
|
||||
"--platform" platform
|
||||
"--progress" "plain"
|
||||
"--push"
|
||||
"-f" docker-file]]
|
||||
(exec (concat base-cmd label-args ["."]))))
|
||||
|
|
@ -75,6 +76,7 @@
|
|||
(let [base-cmd ["docker" "buildx" "build"
|
||||
"-t" (str ghcr-image-name ":" image-tag)
|
||||
"--platform" platform
|
||||
"--progress" "plain"
|
||||
"--push"
|
||||
"-f" docker-file]]
|
||||
(exec (concat base-cmd label-args ["."]))))
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
[clojure.string :as str]
|
||||
[flatland.ordered.map :refer [ordered-map]]))
|
||||
|
||||
(def graalvm-version "24")
|
||||
|
||||
(defn run
|
||||
([cmd-name cmd]
|
||||
(run cmd-name cmd nil))
|
||||
|
|
@ -56,7 +58,7 @@
|
|||
(gen-job
|
||||
shorted?
|
||||
(ordered-map
|
||||
:machine {:image "ubuntu-2004:202111-01"}
|
||||
:machine {:image "ubuntu-2004:2024.05.1"}
|
||||
:steps
|
||||
(gen-steps
|
||||
shorted?
|
||||
|
|
@ -80,8 +82,10 @@
|
|||
:working_directory "~/repo"
|
||||
:environment {:LEIN_ROOT "true"
|
||||
:BABASHKA_PLATFORM "linux"
|
||||
:GRAALVM_VERSION "22.3.1"
|
||||
:GRAALVM_HOME graalvm-home}
|
||||
:GRAALVM_VERSION graalvm-version
|
||||
:GRAALVM_HOME graalvm-home
|
||||
:BABASHKA_TEST_ENV "jvm"
|
||||
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
|
||||
:resource_class "large"
|
||||
:steps
|
||||
(gen-steps
|
||||
|
|
@ -97,7 +101,6 @@
|
|||
"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
|
||||
|
|
@ -119,13 +122,14 @@ 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.3.1"
|
||||
:GRAALVM_VERSION graalvm-version
|
||||
:GRAALVM_HOME graalvm-home
|
||||
:BABASHKA_PLATFORM (if (= "mac" platform)
|
||||
"macos"
|
||||
platform)
|
||||
:BABASHKA_TEST_ENV "native"
|
||||
:BABASHKA_XMX "-J-Xmx6500m"}
|
||||
:BABASHKA_XMX "-J-Xmx6500m"
|
||||
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
|
||||
env (if (= "aarch64" arch)
|
||||
(assoc env :BABASHKA_ARCH arch)
|
||||
env)
|
||||
|
|
@ -160,6 +164,8 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl
|
|||
(run "Pull Submodules" "git submodule init\ngit submodule update")
|
||||
{:restore_cache
|
||||
{:keys [cache-key]}}
|
||||
(when (= "mac" platform)
|
||||
(run "Install Rosetta" "sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license"))
|
||||
(run "Install Clojure" "sudo script/install-clojure")
|
||||
(when (= "mac" platform)
|
||||
(run "Install Leiningen" "script/install-leiningen"))
|
||||
|
|
@ -169,13 +175,19 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl
|
|||
(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 "Download iprof" "curl -sLO 'https://github.com/babashka/pgo-profiles/releases/download/2023.10.11/default.iprof'")
|
||||
(run "Build binary" (if (= "aarch64" arch)
|
||||
"script/uberjar\nscript/compile -H:PageSize=64K # --pgo=default.iprof"
|
||||
"script/uberjar\nscript/compile # --pgo=default.iprof") "30m")
|
||||
(run "Release" ".circleci/script/release")
|
||||
{:persist_to_workspace {:root "/tmp"
|
||||
:paths ["release"]}}
|
||||
(run "Run tests" "script/test\nscript/run_lib_tests")
|
||||
(run "Release + publish"
|
||||
(str/join "\n" ["export BABASHKA_RELEASE=true"
|
||||
".circleci/script/release"]))
|
||||
{:save_cache
|
||||
{:paths ["~/.m2" "~/graalvm-ce-java19-22.3.1"]
|
||||
{:paths ["~/.m2" "~/graalvm"]
|
||||
:key cache-key}}
|
||||
{:store_artifacts {:path "/tmp/release"
|
||||
:destination "release"}}
|
||||
|
|
@ -185,10 +197,10 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl
|
|||
(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 "14.0.0"}}
|
||||
linux-graalvm-home "/home/circleci/graalvm-ce-java19-22.3.1"
|
||||
mac-graalvm-home "/Users/distiller/graalvm-ce-java19-22.3.1/Contents/Home"]
|
||||
machine-executor-conf {:machine {:image "ubuntu-2004:2024.05.1"}}
|
||||
mac-executor-conf {:macos {:xcode "13.4.1"}}
|
||||
linux-graalvm-home (str "/home/circleci/graalvm-" graalvm-version)
|
||||
mac-graalvm-home (format "/Users/distiller/graalvm-%s/Contents/Home" graalvm-version)]
|
||||
(ordered-map
|
||||
:version 2.1
|
||||
:commands
|
||||
|
|
@ -205,7 +217,7 @@ java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$refl
|
|||
(unix shorted? true true "amd64" docker-executor-conf "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 "amd64" mac-executor-conf "large" mac-graalvm-home "mac")
|
||||
:mac (unix shorted? false false "amd64" mac-executor-conf "macos.m1.medium.gen1" mac-graalvm-home "mac")
|
||||
:deploy (deploy shorted?)
|
||||
:docker (docker shorted?))
|
||||
:workflows (ordered-map
|
||||
|
|
|
|||
|
|
@ -29,7 +29,9 @@ tar zcvf "$archive" bb # bbk
|
|||
|
||||
cd -
|
||||
|
||||
./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive"
|
||||
if [ "$BABASHKA_RELEASE" = "true" ]; then
|
||||
./bb --config .build/bb.edn --deps-root . release-artifact "/tmp/release/$archive"
|
||||
fi
|
||||
|
||||
## cleanup
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ task:
|
|||
skip: "changesIncludeOnly('logo/*', '**.md')"
|
||||
env:
|
||||
LEIN_ROOT: "true"
|
||||
GRAALVM_VERSION: "22.3.1"
|
||||
GRAALVM_HOME: ${HOME}/graalvm-ce-java19-22.3.1/Contents/Home
|
||||
GRAALVM_VERSION: "24"
|
||||
GRAALVM_HOME: ${HOME}/graalvm-${GRAALVM_VERSION}/Contents/Home
|
||||
BABASHKA_PLATFORM: macos # used in release script
|
||||
BABASHKA_ARCH: aarch64
|
||||
BABASHKA_TEST_ENV: native
|
||||
|
|
@ -24,8 +24,11 @@ task:
|
|||
sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||
java -version
|
||||
|
||||
export BABASHKA_SHA=$(git rev-parse HEAD)
|
||||
|
||||
script/uberjar
|
||||
script/compile
|
||||
# curl -sLO 'https://github.com/babashka/pgo-profiles/releases/download/2023.10.11/default.iprof'
|
||||
script/compile # --pgo=default.iprof
|
||||
|
||||
# script/test
|
||||
# script/run_lib_tests
|
||||
|
|
|
|||
99
.github/workflows/build-windows.yml
vendored
Normal file
99
.github/workflows/build-windows.yml
vendored
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
- "logo/**"
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
- "logo/**"
|
||||
|
||||
# TODO: Add deploy if needed
|
||||
jobs:
|
||||
native:
|
||||
if: "!contains(github.event.head_commit.message, 'skip ci')"
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-2022
|
||||
name: windows
|
||||
static: false
|
||||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
LEIN_ROOT: "true"
|
||||
GRAALVM_VERSION: "24"
|
||||
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
|
||||
BABASHKA_TEST_ENV: native
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BABASHKA_SHA: ${{ github.sha }}
|
||||
steps:
|
||||
- name: Git checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: 'true'
|
||||
|
||||
- name: Cache deps
|
||||
uses: actions/cache@v4
|
||||
id: cache-deps
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('project.clj') }}
|
||||
restore-keys: ${{ runner.os }}-maven-
|
||||
|
||||
- name: Setup GraalVM
|
||||
if: "matrix.static == false"
|
||||
uses: graalvm/setup-graalvm@v1.3.3
|
||||
with:
|
||||
java-version: '24'
|
||||
distribution: 'graalvm'
|
||||
components: 'native-image'
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Install clojure tools
|
||||
uses: DeLaGuardo/setup-clojure@13.2
|
||||
with:
|
||||
cli: latest
|
||||
# lein: latest -- skipped because this uses some PS bullshit
|
||||
|
||||
- name: Babashka version
|
||||
id: babashka-version
|
||||
shell: bash
|
||||
run: |
|
||||
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
|
||||
echo "##[set-output name=version;]${BABASHKA_VERSION}"
|
||||
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
powershell -Command "(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat', 'lein.bat')"
|
||||
call lein self-install
|
||||
|
||||
set GRAALVM_HOME=%JAVA_HOME%
|
||||
call script/uberjar.bat
|
||||
|
||||
call script/compile.bat
|
||||
|
||||
echo Creating zip archive
|
||||
|
||||
set zip=babashka-%BABASHKA_VERSION%-windows-amd64.zip
|
||||
|
||||
jar -cMf %zip% bb.exe
|
||||
|
||||
bb --config .build/bb.edn --deps-root . release-artifact %zip%
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: bb.exe
|
||||
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-amd64
|
||||
|
||||
- name: Test binary and libs
|
||||
shell: cmd
|
||||
run: |
|
||||
set BABASHKA_CLASSPATH=
|
||||
set BABASHKA_TEST_ENV=native
|
||||
call script/test.bat :windows
|
||||
call script/run_lib_tests.bat
|
||||
53
.github/workflows/build.yml
vendored
53
.github/workflows/build.yml
vendored
|
|
@ -24,6 +24,7 @@ jobs:
|
|||
LEIN_ROOT: "true"
|
||||
BABASHKA_PLATFORM: linux # could be used in jar name
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BABASHKA_SHA: ${{ github.sha }}
|
||||
steps:
|
||||
- name: Git checkout
|
||||
uses: actions/checkout@v2
|
||||
|
|
@ -32,7 +33,7 @@ jobs:
|
|||
submodules: 'true'
|
||||
|
||||
- name: Cache deps
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
id: cache-deps
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
|
|
@ -59,9 +60,6 @@ jobs:
|
|||
script/test
|
||||
script/run_lib_tests
|
||||
|
||||
- name: Run as lein command
|
||||
run: echo '{:a 1}' | lein bb '(:a *in*)'
|
||||
|
||||
- name: Build uberjar
|
||||
run: |
|
||||
mkdir -p /tmp/release
|
||||
|
|
@ -80,7 +78,7 @@ jobs:
|
|||
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
|
||||
echo "##[set-output name=version;]${BABASHKA_VERSION}"
|
||||
|
||||
- uses: actions/upload-artifact@v1
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
||||
path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
||||
|
|
@ -90,7 +88,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- os: macos-12
|
||||
- os: macos-13
|
||||
name: macos
|
||||
static: false
|
||||
#- os: ubuntu-latest
|
||||
|
|
@ -102,11 +100,12 @@ jobs:
|
|||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
LEIN_ROOT: "true"
|
||||
GRAALVM_VERSION: "22.3.1"
|
||||
GRAALVM_VERSION: "24"
|
||||
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
|
||||
BABASHKA_TEST_ENV: native
|
||||
BABASHKA_XMX: "-J-Xmx6500m"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BABASHKA_SHA: ${{ github.sha }}
|
||||
steps:
|
||||
- name: Git checkout
|
||||
uses: actions/checkout@v2
|
||||
|
|
@ -115,7 +114,7 @@ jobs:
|
|||
submodules: 'true'
|
||||
|
||||
- name: Cache deps
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v4
|
||||
id: cache-deps
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
|
|
@ -126,8 +125,8 @@ jobs:
|
|||
if: "matrix.static == false"
|
||||
uses: graalvm/setup-graalvm@v1
|
||||
with:
|
||||
version: '22.3.1'
|
||||
java-version: '19'
|
||||
java-version: '24'
|
||||
distribution: 'graalvm'
|
||||
components: 'native-image'
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
|
@ -135,8 +134,8 @@ jobs:
|
|||
if: "matrix.static == true"
|
||||
uses: graalvm/setup-graalvm@v1
|
||||
with:
|
||||
version: '22.3.1'
|
||||
java-version: '19'
|
||||
version: '24'
|
||||
distribution: 'graalvm'
|
||||
components: 'native-image'
|
||||
native-image-musl: true
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -173,6 +172,19 @@ jobs:
|
|||
BABASHKA_MUSL: "true"
|
||||
run: script/compile
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
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@v4
|
||||
with:
|
||||
path: bb
|
||||
name: babashka-${{ steps.babashka-version.outputs.version }}-${{ matrix.name }}-static-amd64
|
||||
|
||||
- name: Test binary and libs
|
||||
run: |
|
||||
script/test
|
||||
|
|
@ -181,19 +193,6 @@ jobs:
|
|||
- 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: ${{ false }} # Disabled
|
||||
# if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
|
||||
|
|
@ -217,13 +216,13 @@ jobs:
|
|||
run: mkdir -p /tmp/release
|
||||
|
||||
- name: Download linux binary
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip
|
||||
path: /tmp/release
|
||||
|
||||
- name: Download static linux binary
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
|
||||
path: /tmp/release-static
|
||||
|
|
|
|||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -37,3 +37,5 @@ target
|
|||
.nrepl-port
|
||||
.DS_Store
|
||||
.portal
|
||||
default.iprof
|
||||
scratch.clj
|
||||
|
|
|
|||
287
CHANGELOG.md
287
CHANGELOG.md
|
|
@ -7,13 +7,288 @@ A preview of the next release can be installed from
|
|||
|
||||
[Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting
|
||||
|
||||
[Babashka-conf](https://babashka.org/conf/) is happening June 10th in
|
||||
Berlin. Save the date and/or submit your babashka/clojure-related talk or workshop
|
||||
in the CfP!
|
||||
|
||||
## Unreleased
|
||||
|
||||
- [#1818](https://github.com/babashka/babashka/issues/1818): wrong argument order in `clojure.java.io/resource` implementation
|
||||
- Add `java.text.BreakIterator`
|
||||
- Bump `fs` to `0.5.25`
|
||||
- Bump `jsoup` to `1.20.1`
|
||||
- Bump `edamame` to `1.4.30`
|
||||
- [#1815](https://github.com/babashka/babashka/issues/1815): Make install-script wget-compatible ([@eval](https://github.com/eval))
|
||||
|
||||
|
||||
## 1.12.200 (2025-04-26)
|
||||
|
||||
- Improve Java reflection based on provided type hints (read blog post [here](https://blog.michielborkent.nl/babashka-java-reflection-type-hints.html))
|
||||
- Add compatibility with the [fusebox](https://github.com/potetm/fusebox) library
|
||||
- Fix virtual `ThreadBuilder` interop
|
||||
- Add `java.util.concurrent.ThreadLocalRandom`
|
||||
- Add `java.util.concurrent.locks.ReentrantLock`
|
||||
- Add classes:
|
||||
- `java.time.chrono.ChronoLocalDate`
|
||||
- `java.time.temporal.TemporalUnit`
|
||||
- `java.time.chrono.ChronoLocalDateTime`
|
||||
- `java.time.chrono.ChronoZonedDateTime`
|
||||
- `java.time.chrono.Chronology`
|
||||
|
||||
## 1.12.199 (2025-04-18)
|
||||
|
||||
- [#1806](https://github.com/babashka/babashka/issues/1806): Add `cheshire.factory` namespace ([@lread](https://github.com/lread))
|
||||
|
||||
## 1.12.198 (2025-04-17)
|
||||
|
||||
- Bump GraalVM to `24`
|
||||
- Bump SCI to `0.9.45`
|
||||
- Bump edamame to `1.4.28`
|
||||
- [#1801](https://github.com/babashka/babashka/issues/1801): Add `java.util.regex.PatternSyntaxException`
|
||||
- Bump core.async to `1.8.735`
|
||||
- Bump cheshire to `6.0.0`
|
||||
- Bump babashka.cli to `0.8.65`
|
||||
|
||||
## 1.12.197 (2025-02-28)
|
||||
|
||||
- [#1785](https://github.com/babashka/babashka/issues/1785): Allow subclasses of `Throwable` to have instance methods invoked ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1791](https://github.com/babashka/babashka/issues/1791): interop problem on Jsoup form element
|
||||
- [#1793](https://github.com/babashka/babashka/issues/1793): Bump `rewrite-clj` to `1.1.49` (fixes parsing of `foo//` among other things)
|
||||
- Bump `deps.clj`
|
||||
- Bump `fs`
|
||||
|
||||
## 1.12.196 (2024-12-24)
|
||||
|
||||
- [#1771](https://github.com/babashka/babashka/issues/1771): `*e*` in REPL should contain exception thrown by user, not a wrapped one
|
||||
- [#1777](https://github.com/babashka/babashka/issues/1777) Add `java.nio.file.attribute.UserDefinedFileAttributeView`
|
||||
- [#1776](https://github.com/babashka/babashka/issues/1776) `Add java.nio.file.attribute.PosixFileAttributes`
|
||||
- [#1761](https://github.com/babashka/babashka/issues/1761) Support calling `clojure.lang.RT/iter`
|
||||
- [#1760](https://github.com/babashka/babashka/issues/1760) For compatibility with [Fireworks v0.10.3](https://github.com/paintparty/fireworks), added the following to `:instance-checks` entry in `babashka.impl.classes/classes`([@paintparty](https://github.com/paintparty))
|
||||
- `clojure.lang.PersistentArrayMap$TransientArrayMap`
|
||||
- `clojure.lang.PersistentHashMap$TransientHashMap`
|
||||
- `clojure.lang.PersistentVector$TransientVector`
|
||||
- `java.lang.NoSuchFieldException`
|
||||
- `java.util.AbstractMap`
|
||||
- `java.util.AbstractSet`
|
||||
- `java.util.AbstractList`
|
||||
- [#1760](https://github.com/babashka/babashka/issues/1760) For compatibility with [Fireworks v0.10.3](https://github.com/paintparty/fireworks), added `volatile?` entry to `babashka.impl.clojure.core/core-extras`([@paintparty](https://github.com/paintparty))
|
||||
- Bump `babashka.cli` to `0.8.61`
|
||||
- Bump `clj-yaml` to `1.0.29`
|
||||
- [#1768](https://github.com/babashka/babashka/issues/1768): Add `taoensso.timbre` `color-str` function
|
||||
- Add classes:
|
||||
- `javax.crypto.KeyAgreement`
|
||||
- `java.security.KeyPairGenerator`
|
||||
- `java.security.KeyPair`
|
||||
- `java.security.spec.ECGenParameterSpec`
|
||||
- `java.security.spec.PKCS8EncodedKeySpec`
|
||||
- `java.security.spec.X509EncodedKeySpec`
|
||||
- `java.security.Signature`
|
||||
- Add `java.util.concurrent.CompletionStage`
|
||||
- Bump `core.async` to `1.7.701`
|
||||
- Bump `org.babashka/cli` to `0.8.162`
|
||||
|
||||
## 1.12.195 (2024-11-12)
|
||||
|
||||
- Include [jsoup](https://jsoup.org/) for HTML parsing. This makes bb compatible with the [hickory](https://github.com/clj-commons/hickory) library (and possibly other libraries?).
|
||||
- [#1752](https://github.com/babashka/babashka/issues/1752): include `java.lang.SecurityException` for `java.net.http.HttpClient` support ([@grzm](https://github.com/grzm))
|
||||
- [#1748](https://github.com/babashka/babashka/issues/1748): add `clojure.core/ensure`
|
||||
- Upgrade `taoensso/timbre`to `v6.6.0`
|
||||
- Upgrade `babashka.http-client` to `v0.4.22`
|
||||
- Add `:git/sha` from build to `bb describe` output ([@lispyclouds](https://github.com/lispyclouds))
|
||||
- Fix NPE with determining if executing from self-contained executable
|
||||
|
||||
## 1.12.194 (2024-10-12)
|
||||
|
||||
- Upgrade to GraalVM 23
|
||||
- [#1743](https://github.com/babashka/babashka/issues/1743): fix new fully qualified instance method in call position with GraalVM 23
|
||||
|
||||
## 1.12.193 (2024-10-11)
|
||||
|
||||
- Clojure 1.12 interop: method thunks, FI coercion, array notation (see below)
|
||||
- Upgrade SCI reflector based on clojure 1.12 and remove specific workaround for
|
||||
`Thread/sleep` interop
|
||||
- Add `tools.reader.edn/read`
|
||||
- Fix [#1741](https://github.com/babashka/babashka/issues/1741): `(taoensso.timbre/spy)` now relies on macros from `taoensso.encore` previously not available in bb
|
||||
|
||||
Examples of the new Clojure interop:
|
||||
|
||||
``` clojure
|
||||
;; Qualified methods in call position:
|
||||
(String/.length "123") ;;=> 3
|
||||
(String/new "123") ;;=> "123"
|
||||
|
||||
;; Qualified methods in value position, as functions:
|
||||
(map Integer/parseInt ["1" "22" "333"]) ;;=> (1 22 333)
|
||||
(map String/.length ["1" "22" "333"]) ;;=> (1 2 3)
|
||||
(map String/new ["1" "22" "333"]) ;;=> ("1" "22" "333")
|
||||
|
||||
;; Typed multi-dimensional array class notation:
|
||||
long/1 ;;=> 1-dimensional long array class
|
||||
String/2 ;;=> 2-dimensional String array class
|
||||
|
||||
;; Pass Clojure IFn to Java where `java.util.function.Predicate`, etc. is expected:
|
||||
(into [] (doto (java.util.ArrayList. [1 2 3]) (.removeIf even?))) ;;=> [1 3]
|
||||
(.computeIfAbsent (java.util.HashMap.) "abc" #(str % %)) ;;=> "abcabc"
|
||||
```
|
||||
|
||||
## 1.4.192 (2024-09-12)
|
||||
|
||||
- Upgrade Clojure to `1.12.0`
|
||||
- [#1722](https://github.com/babashka/babashka/issues/1722): add new clojure 1.12 vars
|
||||
- [#1720](https://github.com/babashka/babashka/issues/1720): include new clojure 1.12's `clojure.java.process`
|
||||
- [#1719](https://github.com/babashka/babashka/issues/1719): add new clojure 1.12 `clojure.repl.deps` namespace. Only calls with explicit versions are supported.
|
||||
- [#1598](https://github.com/babashka/babashka/issues/1598): use Rosetta on CircleCI to build x64 images
|
||||
- [#1716](https://github.com/babashka/babashka/issues/1716): expose `babashka.http-client.interceptors` namespace
|
||||
- [#1707](https://github.com/babashka/babashka/issues/1707): support `aset` on primitive array
|
||||
- [#1676](https://github.com/babashka/babashka/issues/1676): restore compatibility with newest [at-at](https://github.com/overtone/at-at/) version (1.3.58)
|
||||
- Bump SCI
|
||||
- Bump `fs`
|
||||
- Bump `process`
|
||||
- Bump `deps.clj`
|
||||
- Bump `http-client`
|
||||
- Bump `clj-yaml`
|
||||
- Bump `edamame`
|
||||
- Bump `rewrite-clj`
|
||||
- Add `java.io.LineNumberReader`
|
||||
|
||||
## 1.3.191 (2024-06-19)
|
||||
|
||||
- Fix [#1688](https://github.com/babashka/babashka/issues/1688): `use-fixtures` should add metadata to `*ns*`
|
||||
- Fix [#1692](https://github.com/babashka/babashka/issues/1692): Add support for `ITransientSet` and `org.flatland/ordered-set`
|
||||
- Bump org.flatland/ordered to `1.15.12`.
|
||||
- Partially Fix [#1695](https://github.com/babashka/babashka/issues/1695): `--repl` arg handling should consume only one arg (itself) ([@bobisageek](https://github.com/bobisageek))
|
||||
- Partially Fix [#1695](https://github.com/babashka/babashka/issues/1695): make `*command-line-args*` value available in the REPL ([@bobisageek](https://github.com/bobisageek))
|
||||
- Fix [#1686](https://github.com/babashka/babashka/issues/1686): do not fetch dependencies/invoke java for `version`, `help`, and `describe` options ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.lang.DynamicClassLoader` constructors ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.core/*source-path*` (points to the same sci var as `*file*`) ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.main/with-read-known` ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1696](https://github.com/babashka/babashka/issues/1696): add `clojure.core.server/repl-read` ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1696](https://github.com/babashka/babashka/issues/1696): make the `cognitect-labs/transcriptor` library work ([@bobisageek](https://github.com/bobisageek))
|
||||
- [#1700](https://github.com/babashka/babashka/issues/1700): catch exceptions from resolving symbolic links during `bb.edn` lookup ([@bobisageek](https://github.com/bobisageek))
|
||||
- Support `java.nio.channels.ByteChannel` + several other related interop
|
||||
- Bump `nrepl/bencode` to `1.2.0`
|
||||
- Bump `babashka/fs`
|
||||
- Bump `org.babashka/http-client` to `0.4.18`
|
||||
|
||||
## 1.3.190 (2024-04-17)
|
||||
|
||||
- Fix [#1679](https://github.com/babashka/babashka/issues/1679): bump timbre and fix wrapping `timbre/log!`
|
||||
- Add `java.util.concurrent.CountDownLatch`
|
||||
- Add `java.lang.ThreadLocal`
|
||||
- Bump `babashka.process`
|
||||
- Bump httpkit to `2.8.0-RC1`
|
||||
- Bump clojure to `1.11.2`
|
||||
- Bump deps.clj
|
||||
- Bump `babashka.cli`
|
||||
- Bump `cheshire` to `5.13.0`
|
||||
- Bump `http-client` to `0.4.17`
|
||||
|
||||
## 1.3.189 (2024-02-22)
|
||||
|
||||
- [#1660](https://github.com/babashka/babashka/issues/1660): add `:deps-root` as part of hash to avoid caching issue with `deps.clj`
|
||||
- [#1632](https://github.com/babashka/babashka/issues/1632): fix `(.readPassword (System/console))` by upgrading GraalVM to `21.0.2`
|
||||
- [#1661](https://github.com/babashka/babashka/issues/1661): follow symlink when reading adjacent bb.edn
|
||||
- [#1665](https://github.com/babashka/babashka/issues/1665): `read-string` should use non-indexing reader for compatibilty with Clojure
|
||||
- Bump edamame to 1.4.24
|
||||
- Bump http-client to 0.4.16
|
||||
- Bump babashka.cli to 0.8.57
|
||||
- Uberjar task: support reader conditional in .cljc file
|
||||
- Support reader conditional in .cljc file when creating uberjar
|
||||
- Add more `javax.net.ssl` classes
|
||||
- [#1675](https://github.com/babashka/babashka/issues/1675): add `hash-unordered-coll`
|
||||
|
||||
## 1.3.188 (2024-01-12)
|
||||
|
||||
- [#1658](https://github.com/babashka/babashka/issues/1658): fix command line parsing for scripts that parse `--version` or `version` etc
|
||||
|
||||
## 1.3.187 (2024-01-09)
|
||||
|
||||
- Add `clojure.reflect/reflect`
|
||||
- Add `java.util.ScheduledFuture`, `java.time.temporal.WeekFields`
|
||||
- Support `Runnable` to be used without import
|
||||
- Allow `catch` to be used as var name
|
||||
- [#1646](https://github.com/babashka/babashka/issues/1646): command-line-args are dropped when file exists with same name
|
||||
- [#1645](https://github.com/babashka/babashka/issues/1645): Support for `clojure.lang.LongRange`
|
||||
- [#1652](https://github.com/babashka/babashka/issues/1652): allow `bb.edn` to be empty
|
||||
- [#1586](https://github.com/babashka/babashka/issues/1586): warn when config file doesn't exist and `--debug` is enabled
|
||||
- [#1410](https://github.com/babashka/babashka/issues/1410): better error message when exec fn doesn't exist
|
||||
- Bump `babashka.cli` to `0.8.55` which contains subcommand improvements
|
||||
- Bump `deps.clj` to `1.11.1.1435`
|
||||
- Bump `babashka.fs` to `0.5.20`
|
||||
- Compatibility with `plumbing.core`
|
||||
- Compatibility with `shadow.css` by improving `tools.reader` compatibility
|
||||
- [#1647](https://github.com/babashka/babashka/issues/1647): Allow capturing env vars at build time (only relevant for building bb)
|
||||
|
||||
## 1.3.186 (2023-11-02)
|
||||
|
||||
- [Support self-contained binaries as uberjars!](https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar)
|
||||
- Add `java.security.KeyFactory`, `java.security.spec.PKCS8EncodedKeySpec`, `java.net.URISyntaxException`, `javax.crypto.spec.IvParameterSpec`
|
||||
- Fix babashka.process/exec wrt `babashka.process/*defaults*`
|
||||
- [#1632](https://github.com/babashka/babashka/issues/1632): Partial fix for `(.readPassword (System/console))`
|
||||
- Enable producing self-contained binaries using [uberjars](https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar)
|
||||
- Bump httpkit to `2.8.0-beta3` (fixes GraalVM issue with virtual threads)
|
||||
- Bump `deps.clj` and `fs`
|
||||
- Expose `taoensso.timbre.appenders.core`
|
||||
- nREPL: implement `ns-list` op
|
||||
- SCI: optimize `swap!`, `deref` and `reset!` for normal atoms (rather than user-created `IAtom`s)
|
||||
- Add test for [#1639](https://github.com/babashka/babashka/issues/1639)
|
||||
- Upgrade to GraalVM 21.0.1
|
||||
|
||||
## 1.3.185 (2023-09-28)
|
||||
|
||||
- [#1624](https://github.com/babashka/babashka/pull/1624): Use Oracle GraalVM 21 ([@lispyclouds](https://github.com/lispyclouds))
|
||||
- Use PGO to speed up loops (now 2-3x faster for `(time (loop [val 0 cnt 10000000] (if (pos? cnt) (recur (inc val) (dec cnt)) val)))`!)
|
||||
- Bump babashka.http-client to v0.4.15
|
||||
- Bump rewrite-clj to v0.1.1.47
|
||||
- [#1619](https://github.com/babashka/babashka/issues/1619): Fix reflection issue with `Thread/sleep` in `core.async/timeout`
|
||||
- Support interop on `java.util.stream.IntStream`
|
||||
- [#1513](https://github.com/babashka/babashka/issues/1513): Fix interop on `Thread/sleep` with numbers that aren't already longs
|
||||
- Bump babashka.cli to 0.7.53
|
||||
- Fix [#babashka.nrepl/66](https://github.com/babashka/babashka.nrepl/issues/66)
|
||||
- Various nREPL server improvements (classpath op, file lookup information for `cider-find-var`)
|
||||
- Bump cheshire to 5.12.0
|
||||
|
||||
## 1.3.184 (2023-08-22)
|
||||
|
||||
- Remove leftover debugging output from deps.clj
|
||||
|
||||
## 1.3.183 (2023-08-22)
|
||||
|
||||
- [#1592](https://github.com/babashka/babashka/issues/1592): expose `sci.core` in babashka
|
||||
- [#1596](https://github.com/babashka/babashka/issues/1596): Fix `clojure.java.browse/browse-url` truncates URLs with multiple query parameters on Windows
|
||||
- [#1599](https://github.com/babashka/babashka/issues/1599): propagate error from `run` when task does not exist
|
||||
- Bump clj-yaml to `1.0.27`
|
||||
- [#1604](https://github.com/babashka/babashka/issues/1604): throw `FileNotFoundException` when requiring namespace whose file cannot be found (as JVM Clojure does)
|
||||
- Bump integrant CI tests
|
||||
- [#1600](https://github.com/babashka/babashka/issues/1600): use pagesize of 64K on linux aarch64, so it works on Asahi linux
|
||||
- Expose `selmer.parser/resolve-arg`
|
||||
- [#1610](https://github.com/babashka/babashka/issues/1610): expose `babashka.http-client.websocket` namespace
|
||||
- Bump `babashka.http-client` to `0.4.14`
|
||||
- [#1568](https://github.com/babashka/babashka/issues/1568): warn when task overrides built-in command
|
||||
|
||||
## 1.3.182 (2023-07-20)
|
||||
|
||||
- [#1579](https://github.com/babashka/babashka/issues/1579): add `clojure.tools.reader/resolve-symbol`
|
||||
- [#1581](https://github.com/babashka/babashka/issues/1581): `bb print-deps`: sort dependencies ([@teodorlu](https://github.com/teodorlu))
|
||||
- Upgrade `babashka.http-client` to `0.4.12`, fixes `:insecure` option
|
||||
- Bump [edamame](https://github.com/borkdude/edamame) to `1.3.23`: fixes infinite loop with reader conditional expression
|
||||
- Bump [Selmer](https://github.com/yogthos/Selmer) to Bumping to `1.12.59`
|
||||
- Bump [deps.clj](https://github.com/borkdude/deps.clj) with more fixes which should make downloading/installation of tools jar more robust
|
||||
- Add `javax.net.ssl.X509ExtendedTrustManager` class
|
||||
- Bump [babashka.process](https://github.com/babashka/process): accept path or file as `:dir` argument
|
||||
- Bump [hiccup](https://github.com/weavejester/hiccup) to `2.0.0-RC1`
|
||||
|
||||
## 1.3.181 (2023-06-13)
|
||||
|
||||
- [#1575](https://github.com/babashka/babashka/issues/1575): fix command line parsing problem with `-e` + `*command-line-args*`
|
||||
- [#1576](https://github.com/babashka/babashka/issues/1576): make downloading/unzipping of deps.clj tools .zip file more robust
|
||||
|
||||
## 1.3.180 (2023-05-28)
|
||||
|
||||
- [#1524](https://github.com/babashka/babashka/issues/1524): Remove dynamic builds for linux-aarch64 ([@lispyclouds](https://github.com/lispyclouds))
|
||||
- [#1577](https://github.com/babashka/babashka/issues/1557): Add support for `babashka.process/exec` after namespace reload of `babashka.process` ([@lread](https://github.com/lread))
|
||||
- [#1548](https://github.com/babashka/babashka/issues/1548): shell and sh should respect `babashka.process/*defaults*`
|
||||
- [#1524](https://github.com/babashka/babashka/issues/1524): deprecate (remove) linux-aarch64 dynamic binary build
|
||||
- Expose `org.graalvm.nativeimage.ProcessProperties/exec`
|
||||
- Bump `babashka.http-client` to `0.3.11`
|
||||
- Bump `babashka.fs` to `0.4.19`
|
||||
- Bump `babashka.process` to `0.5.21`
|
||||
|
||||
## 1.3.179 (2023-04-26)
|
||||
|
||||
|
|
@ -754,7 +1029,7 @@ Babashka.pods:
|
|||
- Add `babashka.task` `System` property [#837](https://github.com/babashka/babashka/issues/837)
|
||||
- Allow thread-first with `shell` like `babashka.process` [#829](https://github.com/babashka/babashka/issues/829)
|
||||
|
||||
## 0.4.0
|
||||
## 0.4.0 (2021-05-08)
|
||||
|
||||
Babashka proper:
|
||||
|
||||
|
|
@ -764,7 +1039,7 @@ Babashka proper:
|
|||
[jasentaa](https://github.com/rm-hull/jasentaa) parser combinator library
|
||||
- Update Selmer to 1.12.40
|
||||
|
||||
Sci:
|
||||
SCI:
|
||||
|
||||
- Better error msg for protocol not found or class
|
||||
|
||||
|
|
|
|||
13
Dockerfile
13
Dockerfile
|
|
@ -5,24 +5,25 @@ RUN apt update
|
|||
RUN apt install --no-install-recommends -yy build-essential zlib1g-dev
|
||||
WORKDIR "/opt"
|
||||
|
||||
ENV GRAALVM_VERSION="22.3.1"
|
||||
ENV GRAALVM_VERSION="24"
|
||||
ARG TARGETARCH
|
||||
# Do not set those directly, use TARGETARCH instead
|
||||
ENV BABASHKA_ARCH=
|
||||
ENV GRAALVM_ARCH=
|
||||
RUN if [ "${TARGETARCH}" = "" ] || [ "${TARGETARCH}" = "amd64" ]; then \
|
||||
export GRAALVM_ARCH=amd64; export BABASHKA_ARCH=x86_64; \
|
||||
export GRAALVM_ARCH=x64; export BABASHKA_ARCH=x86_64; \
|
||||
elif [ "${TARGETARCH}" = "arm64" ]; then \
|
||||
export GRAALVM_ARCH=aarch64; \
|
||||
fi && \
|
||||
echo "Installing GraalVM for ${GRAALVM_ARCH}" && \
|
||||
curl -sLO https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${GRAALVM_VERSION}/graalvm-ce-java19-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz && \
|
||||
tar -xzf graalvm-ce-java19-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz
|
||||
curl -sLO https://download.oracle.com/graalvm/${GRAALVM_VERSION}/archive/graalvm-jdk-${GRAALVM_VERSION}_linux-${GRAALVM_ARCH}_bin.tar.gz && \
|
||||
mkdir "graalvm-$GRAALVM_VERSION" && \
|
||||
tar -xzf graalvm-jdk-${GRAALVM_VERSION}_linux-${GRAALVM_ARCH}_bin.tar.gz -C graalvm-$GRAALVM_VERSION --strip-components 1
|
||||
|
||||
ARG BABASHKA_XMX="-J-Xmx4500m"
|
||||
|
||||
ENV GRAALVM_HOME="/opt/graalvm-ce-java19-${GRAALVM_VERSION}"
|
||||
ENV JAVA_HOME="/opt/graalvm-ce-java19-${GRAALVM_VERSION}/bin"
|
||||
ENV GRAALVM_HOME="/opt/graalvm-$GRAALVM_VERSION"
|
||||
ENV JAVA_HOME="$GRAALVM_HOME/bin"
|
||||
ENV PATH="$JAVA_HOME:$PATH"
|
||||
ENV BABASHKA_XMX=$BABASHKA_XMX
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,10 @@ RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswit
|
|||
|
||||
# TODO: Run actual native tests when they are ported
|
||||
|
||||
RUN bb -e "(curl/get \"https://clojure.org\")" # cURL http test
|
||||
RUN curl --version
|
||||
# RUN bb -e '(prn (java.io.File/createTempFile "babashka.curl" ".headers"))'
|
||||
# RUN bb -e '(spit (java.io.File/createTempFile "babashka.curl" ".headers") "hello")'
|
||||
# RUN bb -e "(curl/get \"https://clojure.org\")" # cURL http test
|
||||
RUN bb -e "(require '[org.httpkit.client :as http]) (when-let [error (:error @(http/get \"https://clojure.org\"))] (throw error))" # JVM http test
|
||||
RUN bb -e "(.length \"Hello, Babashka\")" # Java interop test
|
||||
RUN bb -e "(require '[babashka.pods :as pods]) (pods/load-pod 'org.babashka/go-sqlite3 \"0.0.1\") (require '[pod.babashka.go-sqlite3 :as sqlite]) (sqlite/execute! \"/tmp/foo.db\" [\"SELECT 1 + 1\"])" # Pod test
|
||||
|
|
|
|||
136
README.md
136
README.md
|
|
@ -4,7 +4,7 @@
|
|||
[](https://app.slack.com/client/T03RZGPFR/CLX41ASCS)
|
||||
[](https://opencollective.com/babashka) [](https://clojars.org/babashka/babashka)
|
||||
[](https://twitter.com/search?q=%23babashka&src=typed_query&f=live)
|
||||
[](https://book.babashka.org)
|
||||
[](https://book.babashka.org) [](https://gurubase.io/g/babashka)
|
||||
|
||||
<blockquote class="twitter-tweet" data-lang="en">
|
||||
<p lang="en" dir="ltr">Life's too short to remember how to write Bash code. I feel liberated.</p>
|
||||
|
|
@ -40,10 +40,10 @@ As one user described it:
|
|||
## Quickstart
|
||||
|
||||
For installation options check [Installation](https://github.com/babashka/babashka#installation).
|
||||
For quick installation use:
|
||||
For quick installation using `bash`, use:
|
||||
|
||||
``` shell
|
||||
$ bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install)
|
||||
bash < <(curl -s https://raw.githubusercontent.com/babashka/babashka/master/install)
|
||||
```
|
||||
|
||||
or grab a binary from [Github
|
||||
|
|
@ -53,9 +53,12 @@ anywhere on the path.
|
|||
Then you're ready to go:
|
||||
|
||||
``` shellsession
|
||||
$ ls | bb -i '(filter fs/directory? *input*)'
|
||||
("doc" "resources" "sci" "script" "src" "target" "test")
|
||||
bb took 4ms.
|
||||
time bb -e '(->> (fs/list-dir ".") (filter fs/directory?) (map fs/normalize) (map str) (take 3))'
|
||||
```
|
||||
|
||||
``` clojure
|
||||
(".build" "feature-lanterna" ".repl")
|
||||
bb -e 0,01s user 0,01s system 70% cpu 0,017 total
|
||||
```
|
||||
|
||||
## Support :heart:
|
||||
|
|
@ -115,50 +118,10 @@ To get an overview of babashka, you can watch this talk ([slides](https://speake
|
|||
The [babashka book](https://book.babashka.org) contains detailed information
|
||||
about how to get the most out of babashka scripting.
|
||||
|
||||
If you're a fan of [Clojure for the Brave and
|
||||
True](https://www.braveclojure.com/clojure-for-the-brave-and-true/), you might
|
||||
enjoy [Babashka Babooka](https://www.braveclojure.com/quests/babooka/), a book
|
||||
by the same author, Daniel Higginbotham!
|
||||
|
||||
## Examples
|
||||
|
||||
Read the output from a shell command as a lazy seq of strings:
|
||||
|
||||
``` shell
|
||||
$ ls | bb -i '(take 2 *input*)'
|
||||
("CHANGES.md" "Dockerfile")
|
||||
```
|
||||
|
||||
Read EDN from stdin and write the result to stdout:
|
||||
|
||||
``` shell
|
||||
$ bb '(vec (dedupe *input*))' <<< '[1 1 1 1 2]'
|
||||
[1 2]
|
||||
```
|
||||
|
||||
Read more about `*input*` and in- and output flags
|
||||
[here](https://book.babashka.org/#_input_and_output_flags).
|
||||
|
||||
Execute a script. E.g. print the current time in California using the
|
||||
`java.time` API:
|
||||
|
||||
File `pst.clj`:
|
||||
``` clojure
|
||||
#!/usr/bin/env bb
|
||||
|
||||
(def now (java.time.ZonedDateTime/now))
|
||||
(def LA-timezone (java.time.ZoneId/of "America/Los_Angeles"))
|
||||
(def LA-time (.withZoneSameInstant now LA-timezone))
|
||||
(def pattern (java.time.format.DateTimeFormatter/ofPattern "HH:mm"))
|
||||
(println (.format LA-time pattern))
|
||||
```
|
||||
|
||||
``` shell
|
||||
$ pst.clj
|
||||
05:17
|
||||
```
|
||||
|
||||
More examples can be found [here](examples/README.md).
|
||||
There is also the book [Babashka Babooka](https://www.braveclojure.com/quests/babooka/),
|
||||
by Daniel Higginbotham, who has also helped a lot of people learn Clojure with
|
||||
[Clojure for the Brave and
|
||||
True](https://www.braveclojure.com/clojure-for-the-brave-and-true/).
|
||||
|
||||
## Try online
|
||||
|
||||
|
|
@ -212,13 +175,25 @@ linux binary.
|
|||
|
||||
### asdf
|
||||
|
||||
[asdf](https://github.com/asdf-vm/asdf) is an extendable version manager for linux and macOS.
|
||||
[asdf](https://github.com/asdf-vm/asdf) is an extendable version manager for linux and macOS. Note that asdf will add significant startup time to any babashka script, consider using [mise](#mise) instead.
|
||||
|
||||
Babashka can be installed using a plugin as follows:
|
||||
|
||||
asdf plugin add babashka https://github.com/pitch-io/asdf-babashka
|
||||
asdf install babashka latest
|
||||
|
||||
### mise
|
||||
|
||||
[mise](https://mise.jdx.dev/) is a development environment setup tool for linux and macOS.
|
||||
|
||||
Install:
|
||||
|
||||
mise use --global babashka@latest
|
||||
|
||||
Upgrade:
|
||||
|
||||
mise upgrade babashka
|
||||
|
||||
### Windows
|
||||
|
||||
#### Scoop
|
||||
|
|
@ -257,6 +232,8 @@ Install via the installer script for linux and macOS:
|
|||
|
||||
``` shell
|
||||
$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
|
||||
# or
|
||||
$ wget -qO install https://raw.githubusercontent.com/babashka/babashka/master/install
|
||||
$ chmod +x install
|
||||
$ ./install
|
||||
```
|
||||
|
|
@ -328,63 +305,16 @@ 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.
|
||||
|
||||
## Badges
|
||||
<!-- note to editor: it seems a blank line must appear before code blocks within <details> -->
|
||||
|
||||
[](https://babashka.org)
|
||||
|
||||
The babashka compatible badge indicates that a [library can be used as babashka dependency](doc/projects.md).
|
||||
|
||||
[](https://book.babashka.org#badges)
|
||||
The babashka compatible badge indicates that a library can be used as babashka dependency.
|
||||
If this is the case for your library, we encourage you to proudly display this badge.
|
||||
|
||||
<details><summary>Markdown</summary>
|
||||
|
||||
```markdown
|
||||
[](https://babashka.org)
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>AsciiDoc</summary>
|
||||
|
||||
```asciidoc
|
||||
https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/badge.svg[bb compatible]]
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>HTML</summary>
|
||||
|
||||
```html
|
||||
<a href="https://babashka.org" rel="nofollow"><img src="https://github.com/babashka/babashka/raw/master/logo/badge.svg" alt="bb compatible" style="max-width: 100%;"></a>
|
||||
```
|
||||
</details>
|
||||
<br/>
|
||||
|
||||
[](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.
|
||||
|
||||
[](https://book.babashka.org#badges)
|
||||
The babashka built-in badge means that a library has been built directly into babashka and requires no extra dependencies to use it.
|
||||
If this rare honor belongs to your library, you should display this badge.
|
||||
|
||||
<details><summary>Markdown</summary>
|
||||
|
||||
```markdown
|
||||
[](https://babashka.org)
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>AsciiDoc</summary>
|
||||
|
||||
```asciidoc
|
||||
https://babashka.org[image:https://raw.githubusercontent.com/babashka/babashka/master/logo/built-in-badge.svg[bb built-in]]
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>HTML</summary>
|
||||
|
||||
```html
|
||||
<a href="https://babashka.org" rel="nofollow"><img src="https://github.com/babashka/babashka/raw/master/logo/built-in-badge.svg" alt="bb built-in" style="max-width: 100%;"></a>
|
||||
```
|
||||
</details>
|
||||
</br>
|
||||
See [the babashka book for details](https://book.babashka.org#badges).
|
||||
|
||||
## Swag
|
||||
|
||||
|
|
|
|||
16
appveyor.yml
16
appveyor.yml
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
version: "v-{build}"
|
||||
|
||||
image: Visual Studio 2019
|
||||
image: Visual Studio 2022
|
||||
|
||||
clone_folder: C:\projects\babashka
|
||||
|
||||
environment:
|
||||
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java19-22.3.1
|
||||
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java19-22.3.1
|
||||
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
|
||||
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
|
||||
BABASHKA_XMX: "-J-Xmx5g"
|
||||
|
||||
skip_commits:
|
||||
|
|
@ -23,6 +23,9 @@ cache:
|
|||
|
||||
clone_script:
|
||||
- cmd: git config --global core.autocrlf true
|
||||
|
||||
- cmd: git config --global core.symlinks true
|
||||
|
||||
- ps: >-
|
||||
if(-not $env:APPVEYOR_PULL_REQUEST_NUMBER) {
|
||||
git clone -q --branch=$env:APPVEYOR_REPO_BRANCH https://github.com/$env:APPVEYOR_REPO_NAME.git $env:APPVEYOR_BUILD_FOLDER
|
||||
|
|
@ -36,9 +39,12 @@ clone_script:
|
|||
}
|
||||
- cmd: git submodule update --init --recursive
|
||||
|
||||
- cmd: git reset --hard
|
||||
|
||||
build_script:
|
||||
# TODO: Extract the zip by removing the top level folder to remove the hardcoded path for GRAALVM_HOME
|
||||
- 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.3.1/graalvm-ce-java19-windows-amd64-22.3.1.zip', 'graalvm.zip') }"
|
||||
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24_windows-x64_bin.zip', 'graalvm.zip') }"
|
||||
|
||||
powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }"
|
||||
|
||||
|
|
@ -55,7 +61,7 @@ build_script:
|
|||
# see https://github.com/quarkusio/quarkus/pull/7663
|
||||
|
||||
- cmd: >-
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
|
||||
set BABASHKA_SHA=%APPVEYOR_REPO_COMMIT%
|
||||
|
||||
call script/uberjar.bat
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 605788cd42dc35dc03a0276c9e9e5cc4e78e9a0b
|
||||
Subproject commit edd3d613bfb9bf3adabfd0bda5c3f5c6ee85ec20
|
||||
2
deps.clj
2
deps.clj
|
|
@ -1 +1 @@
|
|||
Subproject commit 334776a067c058b88423711f7b70b70d319e8359
|
||||
Subproject commit 976cf7b0e54901ada3f7e83f12a4c0aed039adc9
|
||||
43
deps.edn
43
deps.edn
|
|
@ -18,42 +18,41 @@
|
|||
"deps.clj/src" "deps.clj/resources"
|
||||
"resources" "sci/resources"
|
||||
"impl-java/src"],
|
||||
:deps {org.clojure/clojure {:mvn/version "1.11.1"},
|
||||
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
|
||||
org.babashka/sci {:local/root "sci"}
|
||||
org.babashka/babashka.impl.java {:mvn/version "0.1.8"}
|
||||
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
|
||||
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"}
|
||||
borkdude/graal.locking {:mvn/version "0.0.2"},
|
||||
org.clojure/core.async {:mvn/version "1.6.673"},
|
||||
org.clojure/core.async {:mvn/version "1.8.741"},
|
||||
org.clojure/tools.cli {:mvn/version "1.0.214"},
|
||||
org.clojure/data.csv {:mvn/version "1.0.0"},
|
||||
cheshire/cheshire {:mvn/version "5.11.0"}
|
||||
cheshire/cheshire {:mvn/version "6.0.0"}
|
||||
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
|
||||
clj-commons/clj-yaml {:mvn/version "1.0.26"}
|
||||
clj-commons/clj-yaml {:mvn/version "1.0.29"}
|
||||
com.cognitect/transit-clj {:mvn/version "1.0.333"}
|
||||
org.clojure/test.check {:mvn/version "1.1.1"}
|
||||
nrepl/bencode {:mvn/version "1.1.0"}
|
||||
nrepl/bencode {:mvn/version "1.2.0"}
|
||||
seancorfield/next.jdbc {:mvn/version "1.1.610"}
|
||||
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.6.0-RC1"}
|
||||
http-kit/http-kit {:mvn/version "2.8.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"}
|
||||
rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}
|
||||
selmer/selmer {:mvn/version "1.12.50"}
|
||||
com.taoensso/timbre {:mvn/version "6.0.1"}
|
||||
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
|
||||
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
|
||||
selmer/selmer {:mvn/version "1.12.59"}
|
||||
com.taoensso/timbre {:mvn/version "6.6.0"}
|
||||
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.7.51"}
|
||||
org.babashka/http-client {:mvn/version "0.2.9"}
|
||||
;; native image bloat with ordered 1.5.10
|
||||
org.flatland/ordered {:mvn/version "1.5.9"}}
|
||||
org.babashka/cli {:mvn/version "0.8.65"}
|
||||
org.babashka/http-client {:mvn/version "0.4.22"}
|
||||
org.flatland/ordered {:mvn/version "1.15.12"}
|
||||
org.jsoup/jsoup {:mvn/version "1.20.1"}}
|
||||
:aliases {:babashka/dev
|
||||
{:main-opts ["-m" "babashka.main"]}
|
||||
:profile
|
||||
|
|
@ -109,7 +108,7 @@
|
|||
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
||||
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
||||
expound/expound {:mvn/version "0.8.10"}
|
||||
integrant/integrant {:mvn/version "0.8.0"}
|
||||
integrant/integrant {:git/url "https://github.com/weavejester/integrant", :git/sha "a9fd7c02bd7201f36344b47142badc3c3ef22f88"}
|
||||
com.stuartsierra/dependency {:mvn/version "1.0.0"}
|
||||
listora/again {:mvn/version "1.0.0"}
|
||||
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
||||
|
|
@ -171,7 +170,15 @@
|
|||
:deps/manifest :deps}
|
||||
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
|
||||
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
|
||||
:deps/manifest :deps}}
|
||||
:deps/manifest :deps}
|
||||
prismatic/plumbing {:git/url "https://github.com/plumatic/plumbing",
|
||||
:git/sha "424bc704f2db422de34269c139a5494314b3a43b"}
|
||||
org.clj-commons/hickory {:git/url "https://github.com/clj-commons/hickory"
|
||||
:git/sha "9385b6708ef35f161732d8464b3a3aa57dd79f30"}
|
||||
com.potetm/fusebox {:git/url "https://github.com/potetm/fusebox"
|
||||
:git/sha "ac6d6a0a69510b009b3c1bb2247cd110fd9f7246"}
|
||||
net.sekao/odoyle-rules {:git/url "https://github.com/oakes/odoyle-rules"
|
||||
:git/sha "0b1d825ec45a998c4d3481dfb292e08ce6a47f0b"}}
|
||||
:classpath-overrides {org.clojure/clojure nil
|
||||
org.clojure/spec.alpha nil}}
|
||||
:clj-nvd
|
||||
|
|
|
|||
2
depstar
2
depstar
|
|
@ -1 +1 @@
|
|||
Subproject commit c419b8c82041855d55593c5b561fc7cea8234712
|
||||
Subproject commit 2bf9d3c9f15298d7dd9de033674a42f830e23d6f
|
||||
|
|
@ -3,24 +3,24 @@
|
|||
## Prerequisites
|
||||
|
||||
- Install [lein](https://leiningen.org/) for producing uberjars
|
||||
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java19-22.3.1*.
|
||||
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *Oracle GraalVM 24*.
|
||||
- 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-java19-22.3.1/Contents/Home
|
||||
export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1/Contents/Home
|
||||
```
|
||||
|
||||
On linux:
|
||||
|
||||
``` shell
|
||||
export GRAALVM_HOME=~/Downloads/graalvm-ce-java19-22.3.1
|
||||
export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1
|
||||
```
|
||||
|
||||
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-java19-22.3.1
|
||||
set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-jdk-21.0.0.1
|
||||
```
|
||||
If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using:
|
||||
```
|
||||
|
|
|
|||
46
doc/dev.md
46
doc/dev.md
|
|
@ -22,6 +22,9 @@ agreement, the PR will be merged.
|
|||
Each bug fix, change or new feature should be tested well to prevent future
|
||||
regressions.
|
||||
|
||||
If possible, tests should use public APIs. If the bug is in private/internal
|
||||
code, try to trigger it from a public API.
|
||||
|
||||
### Force-push
|
||||
|
||||
Please do not use `git push --force` on your PR branch for the following
|
||||
|
|
@ -37,7 +40,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 java19-22.3.1.
|
||||
You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use Oracle GraalVM 24.
|
||||
|
||||
## Clone repository
|
||||
|
||||
|
|
@ -111,6 +114,47 @@ If the library you want to add doesn't work automatically, you can manually do t
|
|||
Note: If you have to modify any test file or configuration to have it work with
|
||||
bb, add an inline comment with prefix `BB-TEST-PATCH:` explaining what you did.
|
||||
|
||||
## Windows
|
||||
We have corresponding `.bat` scripts for Windows, examples from a CMD Shell:
|
||||
|
||||
```shell
|
||||
script\test.bat
|
||||
script\run_lib_tests.bat
|
||||
set BABASHKA_TEST_ENV=native
|
||||
script\run_lib_tests.bat
|
||||
```
|
||||
|
||||
### Enable Windows Symbolic Links
|
||||
You'll need to **enable symbolic links**.
|
||||
You must do this before you git clone babashka otherwise some tests will fail.
|
||||
There seems to be many ways to achieve this; I found the following worked from PowerShell:
|
||||
```shell
|
||||
Install-Module -Name Carbon -Force
|
||||
Import-Module Carbon
|
||||
Grant-CPrivilege -Identity lee -Privilege SeCreateSymbolicLinkPrivilege
|
||||
```
|
||||
You'll need to reboot:
|
||||
```shell
|
||||
shutdown /r /t 0
|
||||
```
|
||||
After reboot, verify the new privilege via:
|
||||
```shell
|
||||
whoami /priv
|
||||
```
|
||||
Test if you can create a symbolic link via:
|
||||
```
|
||||
mklink foofoo barbar
|
||||
```
|
||||
|
||||
> **TIP**: Symbolic links are not supported in some folder-sharing technologies.
|
||||
For example, if you are running Windows as a VirtualBox guest, sharing babashka
|
||||
source folders from your host OS will not share the symbolic links as symbolic links.
|
||||
One solution is to re-clone babashka to a non-shared folder on Windows.
|
||||
|
||||
### Git for Windows
|
||||
Install [Git for Windows](https://gitforwindows.org/).
|
||||
It includes a version of `cat` that babashka tests currently rely on.
|
||||
|
||||
## Build
|
||||
|
||||
See [build.md](build.md).
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ borkdude/missing.test.assertions,https://github.com/borkdude/missing.test.assert
|
|||
borkdude/rewrite-edn,https://github.com/borkdude/rewrite-edn
|
||||
camel-snake-kebab/camel-snake-kebab,https://github.com/clj-commons/camel-snake-kebab
|
||||
cc.qbits/auspex,https://github.com/mpenet/auspex
|
||||
cheshire/cheshire,https://github.com/dakrone/cheshire
|
||||
circleci/bond,https://github.com/circleci/bond
|
||||
cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git
|
||||
clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml
|
||||
|
|
|
|||
|
34
doc/news.md
34
doc/news.md
|
|
@ -5,6 +5,40 @@ you have anything to add. Also see
|
|||
[#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on
|
||||
Twitter.
|
||||
|
||||
## 2023-05 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-05-01%20until%3A2023-06-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
|
||||
|
||||
### Releases
|
||||
|
||||
1.3.178
|
||||
|
||||
Mostly a boring maintenance release with lib upgrades!
|
||||
|
||||
### Events
|
||||
|
||||
- [Babashka-conf](https://babashka.org/conf/) is happening June 10th in
|
||||
Berlin. Only a few tickets left! See the [schedule](https://babashka.org/conf/schedule.html). Also you can buy a [conf t-shirt](https://www.etsy.com/listing/1475981599/babashka-conf-berlin-2023-t-shirt) now! See Nikita wearing it [here](https://twitter.com/nikitonsky/status/1658066530800742400)!
|
||||
|
||||
Thanks to conference sponsors:
|
||||
|
||||
<img src="https://pbs.twimg.com/media/Fw5h-0_XwA4DTIj?format=jpg&name=medium" width="200px">
|
||||
|
||||
- Babashka is going to the [Strange Loop](https://www.thestrangeloop.com/) conference!
|
||||
|
||||
### Projects
|
||||
|
||||
- [beep-boop](https://github.com/pesterhazy/beep-boop): Audible and visual feedback for test runs
|
||||
- [panas.example](https://github.com/keychera/panas.example): All htmx examples ported to babashka!
|
||||
- [utility-scripts](https://github.com/somecho/utility-scripts): A collection of helper scripts for Clojure, Java, Ledger and Taskwarrior. Written in Clojure
|
||||
- [bb-scripts](https://github.com/techconative/bb-scripts): Babashka scripts for common utilities
|
||||
- [Launching bb tasks from emacs](https://mastodon.social/@mykhaylo@fosstodon.org/110456087708592838)
|
||||
|
||||
### Articles
|
||||
|
||||
- [Clojure in security: Docker](https://www.juxt.pro/blog/clojure-in-docker/): mentions babashka and clj-kondo
|
||||
- [Changing my mind: Converting a script from bash to Babashka](https://blog.agical.se/en/posts/changing-my-mind--converting-a-script-from-bash-to-babashka/)
|
||||
- [How to create a really simple ClojureCLR dependency tool](https://blog.agical.se/en/posts/how-to-create-a-really-simple-clojureclr-dependency-tool/) with babashka
|
||||
- [Making a resume with Node.js babashka (nbb)](https://yogthos.net/posts/2023-05-12-nbb-resume.html)
|
||||
|
||||
## 2023-04 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-04-01%20until%3A2023-05-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
|
||||
|
||||
[Babashka-conf](https://babashka.org/conf/) is happening June 10th in
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ The following libraries and projects are known to work with babashka.
|
|||
- [Meander](#meander)
|
||||
- [Schema](#schema)
|
||||
- [Sluj](#sluj)
|
||||
- [malli-cli](#malli-cli)
|
||||
- [Pods](#pods)
|
||||
- [Projects](#projects-1)
|
||||
- [babashka-test-action](#babashka-test-action)
|
||||
|
|
@ -833,6 +834,10 @@ Clojure(Script) library for declarative data description and validation
|
|||
|
||||
Sluj is a very small library for converting strings of UTF-16 text to slugs. A slug is a piece of text that is URL safe.
|
||||
|
||||
### [malli-cli](https://github.com/piotr-yuxuan/malli-cli)
|
||||
|
||||
Configuration and CLI powertool with `metosin/malli`.
|
||||
|
||||
## Pods
|
||||
|
||||
[Babashka pods](https://github.com/babashka/babashka.pods) are programs that can
|
||||
|
|
|
|||
|
|
@ -3,9 +3,8 @@
|
|||
[clojure.tools.logging.impl :as impl]
|
||||
[clojure.tools.logging.readable]
|
||||
[sci.core :as sci]
|
||||
[taoensso.encore :as enc :refer [have]]
|
||||
[taoensso.timbre :as timbre]
|
||||
[taoensso.timbre.appenders.core :as appenders]))
|
||||
[taoensso.encore :as encore :refer [have]]
|
||||
[taoensso.timbre :as timbre]))
|
||||
|
||||
;;;; timbre
|
||||
|
||||
|
|
@ -13,56 +12,80 @@
|
|||
|
||||
(defn- fline [and-form] (:line (meta and-form)))
|
||||
|
||||
(defonce callsite-counter
|
||||
(encore/counter))
|
||||
|
||||
(defmacro log! ; Public wrapper around `-log!`
|
||||
"Core low-level log macro. Useful for tooling, etc.
|
||||
"Core low-level log macro. Useful for tooling/library authors, etc.
|
||||
|
||||
* `level` - must eval to a valid logging level
|
||||
* `msg-type` - must eval to e/o #{:p :f nil}
|
||||
* `opts` - ks e/o #{:config :?err :?ns-str :?file :?line :?base-data :spying?}
|
||||
* `args` - arguments seq (ideally vec) for logging call
|
||||
* `opts` - ks e/o #{:config ?err ?base-data spying?
|
||||
:?ns-str :?file :?line :?column}
|
||||
|
||||
Supports compile-time elision when compile-time const vals
|
||||
provided for `level` and/or `?ns-str`."
|
||||
[level msg-type args & [opts]]
|
||||
(have [:or nil? sequential?] args) ; To allow -> (delay [~@args])
|
||||
(let [{:keys [?ns-str] :or {?ns-str (str @sci/ns)}} opts]
|
||||
;; level, ns may/not be compile-time consts:
|
||||
(when-not (timbre/-elide? level ?ns-str)
|
||||
(let [{:keys [config ?err ?file ?line ?base-data spying?]
|
||||
:or {config 'taoensso.timbre/*config*
|
||||
?err :auto ; => Extract as err-type v0
|
||||
?file @sci/file
|
||||
;; NB waiting on CLJ-865:
|
||||
?line (fline &form)}} opts
|
||||
provided for `level` and/or `?ns-str`.
|
||||
|
||||
?file (when (not= ?file "NO_SOURCE_PATH") ?file)
|
||||
Logging wrapper examples:
|
||||
|
||||
;; Identifies this particular macro expansion; note that this'll
|
||||
;; be fixed for any fns wrapping `log!` (notably `tools.logging`,
|
||||
;; `slf4j-timbre`, etc.):
|
||||
callsite-id
|
||||
(hash [level msg-type args ; Unevaluated args (arg forms)
|
||||
?ns-str ?file ?line (rand)])]
|
||||
(defn log-wrapper-fn [& args] (timbre/log! :info :p args))
|
||||
(defmacro log-wrapper-macro [& args] (timbre/keep-callsite `(timbre/log! :info :p ~args)))"
|
||||
|
||||
`(taoensso.timbre/-log! ~config ~level ~?ns-str ~?file ~?line ~msg-type ~?err
|
||||
(delay [~@args]) ~?base-data ~callsite-id ~spying?)))))
|
||||
([{:as opts
|
||||
:keys [loc level msg-type args vargs
|
||||
config ?err ?base-data spying?]
|
||||
:or
|
||||
{config 'taoensso.timbre/*config*
|
||||
?err :auto}}]
|
||||
|
||||
(have [:or nil? sequential? symbol?] args)
|
||||
(let [callsite-id (callsite-counter)
|
||||
{:keys [line column]} (merge (meta &form) loc)
|
||||
{:keys [ns file line column]} {:ns @sci/ns :file @sci/file :line line :column column}
|
||||
ns (or (get opts :?ns-str) ns)
|
||||
file (or (get opts :?file) file)
|
||||
line (or (get opts :?line) line)
|
||||
column (or (get opts :?column) column)
|
||||
|
||||
elide? (and #_(enc/const-forms? level ns) (timbre/-elide? level ns))]
|
||||
|
||||
(when-not elide?
|
||||
(let [vargs-form
|
||||
(or vargs
|
||||
(if (symbol? args)
|
||||
`(taoensso.timbre/-ensure-vec ~args)
|
||||
`[ ~@args]))]
|
||||
|
||||
;; Note pre-resolved expansion
|
||||
`(taoensso.timbre/-log! ~config ~level ~ns ~file ~line ~column ~msg-type ~?err
|
||||
(delay ~vargs-form) ~?base-data ~callsite-id ~spying?
|
||||
~(get opts :instant)
|
||||
~(get opts :may-log?))))))
|
||||
|
||||
([level msg-type args & [opts]]
|
||||
(let [{:keys [line column]} (merge (meta &form))
|
||||
{:keys [ns file line column]} {:ns @sci/ns :file @sci/file :line line :column column}
|
||||
loc {:ns ns :file file :line line :column column}
|
||||
opts (assoc (conj {:loc loc} opts)
|
||||
:level level, :msg-type msg-type, :args args)]
|
||||
`(taoensso.timbre/log! ~opts))))
|
||||
|
||||
(defn make-ns [ns sci-ns ks]
|
||||
(reduce (fn [ns-map [var-name var]]
|
||||
(let [m (meta var)
|
||||
no-doc (:no-doc m)
|
||||
doc (:doc m)
|
||||
arglists (:arglists m)]
|
||||
(if no-doc ns-map
|
||||
(assoc ns-map var-name
|
||||
(sci/new-var (symbol var-name) @var
|
||||
(cond-> {:ns sci-ns
|
||||
:name (:name m)}
|
||||
(:macro m) (assoc :macro true)
|
||||
doc (assoc :doc doc)
|
||||
arglists (assoc :arglists arglists)))))))
|
||||
arglists (assoc :arglists arglists))))))
|
||||
{}
|
||||
(select-keys (ns-publics ns) ks)))
|
||||
|
||||
(def atomic-println @#'appenders/atomic-println)
|
||||
|
||||
(defn println-appender
|
||||
"Returns a simple `println` appender for Clojure/Script.
|
||||
Use with ClojureScript requires that `cljs.core/*print-fn*` be set.
|
||||
|
|
@ -92,7 +115,7 @@
|
|||
:*err* @sci/err
|
||||
stream)]
|
||||
(binding [*out* stream]
|
||||
(atomic-println (force output_)))))}))
|
||||
(encore/println-atomic (force output_)))))}))
|
||||
|
||||
(def default-config (assoc-in timbre/*config* [:appenders :println]
|
||||
(println-appender {:stream :auto})))
|
||||
|
|
@ -105,7 +128,7 @@
|
|||
|
||||
(defn set-level! [level] (swap-config! (fn [m] (assoc m :min-level level))))
|
||||
|
||||
(defn merge-config! [m] (swap-config! (fn [old] (enc/nested-merge old m))))
|
||||
(defn merge-config! [m] (swap-config! (fn [old] (encore/nested-merge old m))))
|
||||
|
||||
(defmacro -log-and-rethrow-errors [?line & body]
|
||||
`(try (do ~@body)
|
||||
|
|
@ -120,14 +143,27 @@
|
|||
'info 'infof 'warn 'warnf
|
||||
'error 'errorf
|
||||
'-log! 'with-level
|
||||
'spit-appender '-spy 'spy])
|
||||
'spit-appender '-spy 'spy
|
||||
'color-str])
|
||||
'log! (sci/copy-var log! tns)
|
||||
'*config* config
|
||||
'swap-config! (sci/copy-var swap-config! tns)
|
||||
'merge-config! (sci/copy-var merge-config! tns)
|
||||
'set-level! (sci/copy-var set-level! tns)
|
||||
'println-appender (sci/copy-var println-appender tns)
|
||||
'-log-and-rethrow-errors (sci/copy-var -log-and-rethrow-errors tns)))
|
||||
'-log-and-rethrow-errors (sci/copy-var -log-and-rethrow-errors tns)
|
||||
'-ensure-vec (sci/copy-var encore/ensure-vec tns)))
|
||||
|
||||
(def enc-ns (sci/create-ns 'taoensso.encore))
|
||||
|
||||
(def encore-namespace
|
||||
{'catching (sci/copy-var encore/catching enc-ns)
|
||||
'try* (sci/copy-var encore/try* enc-ns)})
|
||||
|
||||
(def timbre-appenders-namespace
|
||||
(let [tan (sci/create-ns 'taoensso.timbre.appenders.core nil)]
|
||||
{'println-appender (sci/copy-var println-appender tan)
|
||||
'spit-appender (sci/copy-var #_:clj-kondo/ignore timbre/spit-appender tan)}))
|
||||
|
||||
;;;; clojure.tools.logging
|
||||
|
||||
|
|
@ -160,7 +196,7 @@
|
|||
#'clojure.tools.logging/*logger-factory*
|
||||
(fn [_]
|
||||
(LoggerFactory.
|
||||
(enc/memoize (fn [logger-ns] (Logger. (str logger-ns) config))))))
|
||||
(encore/memoize (fn [logger-ns] (Logger. (str logger-ns) config))))))
|
||||
|
||||
(def lns (sci/create-ns 'clojure.tools.logging nil))
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
[babashka.impl.common :refer [ctx]]
|
||||
[sci.core :as sci]
|
||||
[selmer.filters :as filters]
|
||||
[selmer.filter-parser :as fp]
|
||||
[selmer.parser]
|
||||
[selmer.tags :as tags]
|
||||
[selmer.util :as util]
|
||||
|
|
@ -83,12 +84,31 @@
|
|||
(apply merge)
|
||||
(selmer.parser/render ~s)))
|
||||
|
||||
(defn resolve-arg
|
||||
"Resolves an arg as passed to an add-tag! handler using the provided
|
||||
context-map.
|
||||
|
||||
A custom tag handler will receive a seq of args as its first argument.
|
||||
With this function, you can selectively resolve one or more of those args
|
||||
so that if they contain literals, the literal value is returned, and if they
|
||||
contain templates of any sort, which can itself have variables, filters or
|
||||
tags in it, they will be returned resolved, applied and rendered.
|
||||
|
||||
Example:
|
||||
(resolve-arg {{header-name|upper}} {:header-name \"My Page\"})
|
||||
=> \"MY PAGE\""
|
||||
[arg context-map]
|
||||
(if (fp/literal? arg)
|
||||
(fp/parse-literal arg)
|
||||
(render arg context-map)))
|
||||
|
||||
(def selmer-parser-namespace
|
||||
(-> selmer-parser-ns
|
||||
(assoc 'render-file (sci/copy-var render-file spns)
|
||||
'render (sci/copy-var render spns)
|
||||
'render-template (sci/copy-var render-template spns)
|
||||
'resolve-var-from-kw (sci/copy-var resolve-var-from-kw spns)
|
||||
'resolve-arg (sci/copy-var resolve-arg spns )
|
||||
'<< (sci/copy-var << spns))))
|
||||
|
||||
(def stns (sci/create-ns 'selmer.tags nil))
|
||||
|
|
@ -105,7 +125,9 @@
|
|||
|
||||
(def selmer-filters-namespace
|
||||
{'add-filter! (sci/copy-var filters/add-filter! sfns)
|
||||
'remove-filter! (sci/copy-var filters/remove-filter! sfns)})
|
||||
'remove-filter! (sci/copy-var filters/remove-filter! sfns)
|
||||
'get-filter (sci/copy-var filters/get-filter sfns)
|
||||
'filters (sci/copy-var filters/filters sfns)})
|
||||
|
||||
(defn turn-off-escaping! []
|
||||
(sci/alter-var-root escape-variables (constantly false)))
|
||||
|
|
|
|||
|
|
@ -1,9 +1,14 @@
|
|||
(ns babashka.impl.ordered
|
||||
{:no-doc true}
|
||||
(:require [flatland.ordered.map :as omap]
|
||||
[flatland.ordered.set :as oset]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(def omap-ns (sci/create-ns 'flatland.ordered.map nil))
|
||||
(def oset-ns (sci/create-ns 'flatland.ordered.set nil))
|
||||
|
||||
(def ordered-map-ns
|
||||
{'ordered-map (sci/copy-var omap/ordered-map omap-ns)})
|
||||
|
||||
(def ordered-set-ns
|
||||
{'ordered-set (sci/copy-var oset/ordered-set oset-ns)})
|
||||
|
|
|
|||
2
fs
2
fs
|
|
@ -1 +1 @@
|
|||
Subproject commit ceb8f7f48d4a1438a434ffc16238d5f1883bb4ac
|
||||
Subproject commit fdd5780bc4df4931332b56082c6c3a5c3c85066d
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
[clojure.tools.build.api :as b]))
|
||||
|
||||
(def lib 'org.babashka/babashka.impl.java)
|
||||
(def version "0.1.8")
|
||||
(def version "0.1.10")
|
||||
(def class-dir "target/classes")
|
||||
(def basis (b/create-basis {:project "deps.edn"}))
|
||||
(def jar-file (format "target/%s-%s.jar" (name lib) version))
|
||||
|
|
@ -17,7 +17,8 @@
|
|||
(defn compile-java [_]
|
||||
(b/javac {:src-dirs ["src-java"]
|
||||
:class-dir class-dir
|
||||
:basis basis}))
|
||||
:basis basis
|
||||
:javac-opts ["--release" "8"]}))
|
||||
|
||||
(defn jar [_]
|
||||
(compile-java nil)
|
||||
|
|
@ -26,7 +27,12 @@
|
|||
:lib lib
|
||||
:version version
|
||||
:basis basis
|
||||
:src-dirs ["src"]})
|
||||
:src-dirs ["src"]
|
||||
:pom-data
|
||||
[[:licenses
|
||||
[:license
|
||||
[:name "MIT License"]
|
||||
[:url "https://opensource.org/license/mit/"]]]]})
|
||||
(b/copy-dir {:src-dirs ["src"]
|
||||
:target-dir class-dir})
|
||||
(b/jar {:class-dir class-dir
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
:aliases
|
||||
{:build ;; added by neil
|
||||
{:paths ["." "build" "src"]
|
||||
:deps {io.github.clojure/tools.build {:git/tag "v0.8.1" :git/sha "7d40500"}
|
||||
:deps {io.github.clojure/tools.build {:git/tag "v0.9.6" :git/sha "8e78bcc"}
|
||||
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"}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
(ns babashka.impl.reify2.interfaces)
|
||||
|
||||
(def interfaces [java.nio.file.FileVisitor
|
||||
java.nio.file.DirectoryStream$Filter
|
||||
java.io.FileFilter
|
||||
java.io.FilenameFilter
|
||||
clojure.lang.Associative
|
||||
|
|
|
|||
42
install
42
install
|
|
@ -29,6 +29,32 @@ print_help() {
|
|||
exit 1
|
||||
}
|
||||
|
||||
has() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
fetch() {
|
||||
local url=$1
|
||||
local outfile=${2:-}
|
||||
|
||||
if has wget; then
|
||||
if [[ -n $outfile ]]; then
|
||||
wget -qO "$outfile" "$url"
|
||||
else
|
||||
wget -qO - "$url"
|
||||
fi
|
||||
elif has curl; then
|
||||
if [[ -n $outfile ]]; then
|
||||
curl -fsSL "$url" -o "$outfile"
|
||||
else
|
||||
curl -fsSL "$url"
|
||||
fi
|
||||
else
|
||||
>&2 echo "Either 'wget' or 'curl' needs to be on PATH!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
key="$1"
|
||||
|
|
@ -80,9 +106,9 @@ fi
|
|||
|
||||
if [[ "$version" == "" ]]; then
|
||||
if [[ "$dev_build" == "true" ]]; then
|
||||
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
|
||||
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
|
||||
else
|
||||
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
|
||||
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -96,7 +122,11 @@ IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
|
|||
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
|
||||
|
||||
case "$(uname -m)" in
|
||||
aarch64) arch=aarch64;;
|
||||
aarch64) arch=aarch64
|
||||
if [[ "$platform" == "linux" ]]; then
|
||||
static_binary="true"
|
||||
fi
|
||||
;;
|
||||
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
|
||||
arch="amd64"
|
||||
else
|
||||
|
|
@ -140,9 +170,9 @@ 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 available by default (others have both)
|
||||
if command -v sha256sum >/dev/null; then
|
||||
if has sha256sum; then
|
||||
sha256sum_cmd="sha256sum"
|
||||
elif command -v shasum >/dev/null; then
|
||||
elif has shasum; then
|
||||
sha256sum_cmd="shasum -a 256"
|
||||
else
|
||||
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
|
||||
|
|
@ -155,7 +185,7 @@ mkdir -p "$download_dir" && (
|
|||
cd "$download_dir"
|
||||
echo -e "Downloading $download_url to $download_dir"
|
||||
|
||||
curl -o "$filename" -sL "$download_url"
|
||||
fetch "$download_url" "$filename"
|
||||
if [[ -n "$checksum" ]]; then
|
||||
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
|
||||
>&2 echo "Failed checksum on $filename"
|
||||
|
|
|
|||
2
pods
2
pods
|
|
@ -1 +1 @@
|
|||
Subproject commit 64ecb94de888a34aeb023eb7f50bfa1a34943f24
|
||||
Subproject commit 717cef7af5cb1c1b091bd10e012b2e71b7b8b9bc
|
||||
2
process
2
process
|
|
@ -1 +1 @@
|
|||
Subproject commit 84919a6bad41fc1d0e3f045cc54aab6174bbf4b5
|
||||
Subproject commit 2058c79fb63f80ca71917432eddea73e0c58717c
|
||||
41
project.clj
41
project.clj
|
|
@ -21,31 +21,31 @@
|
|||
:non-flaky (complement :flaky)
|
||||
:flaky :flaky}
|
||||
:jvm-opts ["--enable-preview"]
|
||||
:dependencies [[org.clojure/clojure "1.11.1"]
|
||||
[borkdude/edamame "1.3.22"]
|
||||
[borkdude/graal.locking "0.0.2"]
|
||||
:dependencies [[org.clojure/clojure "1.12.0"]
|
||||
[borkdude/edamame "1.4.30"]
|
||||
[org.clojure/tools.cli "1.0.214"]
|
||||
[cheshire "5.11.0"]
|
||||
[nrepl/bencode "1.1.0"]
|
||||
[borkdude/sci.impl.reflector "0.0.1"]
|
||||
[cheshire "6.0.0"]
|
||||
[nrepl/bencode "1.2.0"]
|
||||
[borkdude/sci.impl.reflector "0.0.4"]
|
||||
[org.babashka/sci.impl.types "0.0.2"]
|
||||
[org.babashka/babashka.impl.java "0.1.8"]
|
||||
[org.clojure/core.async "1.6.673"]
|
||||
[org.babashka/babashka.impl.java "0.1.10"]
|
||||
[org.clojure/core.async "1.8.741"]
|
||||
[org.clojure/test.check "1.1.1"]
|
||||
[com.github.clj-easy/graal-build-time "0.1.0"]
|
||||
[rewrite-clj/rewrite-clj "1.1.46"]
|
||||
[rewrite-clj/rewrite-clj "1.1.49"]
|
||||
[insn/insn "0.5.2"]
|
||||
[org.babashka/cli "0.7.51"]
|
||||
[org.babashka/http-client "0.2.9"]]
|
||||
[org.babashka/cli "0.8.65"]
|
||||
[org.babashka/http-client "0.4.22"]
|
||||
[org.jsoup/jsoup "1.20.1"]
|
||||
[borkdude/graal.locking "0.0.2"]]
|
||||
: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-alpha8"]]}
|
||||
:feature/yaml {:source-paths ["feature-yaml"]
|
||||
:dependencies [[clj-commons/clj-yaml "1.0.26"
|
||||
:dependencies [[clj-commons/clj-yaml "1.0.29"
|
||||
:exclusions [org.flatland/ordered]#_#_clj-commons/clj-yaml "0.7.110"]
|
||||
;; 1.15.10 cause native image bloat problem
|
||||
[org.flatland/ordered "1.5.9"]]}
|
||||
[org.flatland/ordered "1.15.12"]]}
|
||||
: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"]]}]
|
||||
|
|
@ -60,21 +60,21 @@
|
|||
:feature/datascript {:source-paths ["feature-datascript"]
|
||||
:dependencies [[datascript "1.3.10"]]}
|
||||
:feature/httpkit-client {:source-paths ["feature-httpkit-client"]
|
||||
:dependencies [[http-kit "2.6.0-RC1"]]}
|
||||
:dependencies [[http-kit "2.8.0-RC1"]]}
|
||||
:feature/httpkit-server {:source-paths ["feature-httpkit-server"]
|
||||
:dependencies [[http-kit "2.6.0-RC1"]]}
|
||||
:dependencies [[http-kit "2.8.0-RC1"]]}
|
||||
:feature/lanterna {:source-paths ["feature-lanterna"]
|
||||
:dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]}
|
||||
:feature/core-match {:source-paths ["feature-core-match"]
|
||||
:dependencies [[org.clojure/core.match "1.0.0"]]}
|
||||
:feature/hiccup {:source-paths ["feature-hiccup"]
|
||||
:dependencies [[hiccup/hiccup "2.0.0-alpha2"]]}
|
||||
:dependencies [[hiccup/hiccup "2.0.0-RC1"]]}
|
||||
:feature/test-check {:source-paths ["feature-test-check"]}
|
||||
:feature/spec-alpha {:source-paths ["feature-spec-alpha"]}
|
||||
:feature/selmer {:source-paths ["feature-selmer"]
|
||||
:dependencies [[selmer/selmer "1.12.50"]]}
|
||||
:dependencies [[selmer/selmer "1.12.59"]]}
|
||||
:feature/logging {:source-paths ["feature-logging"]
|
||||
:dependencies [[com.taoensso/timbre "6.0.4"]
|
||||
:dependencies [[com.taoensso/timbre "6.6.0"]
|
||||
[org.clojure/tools.logging "1.1.0"]]}
|
||||
:feature/priority-map {:source-paths ["feature-priority-map"]
|
||||
:dependencies [[org.clojure/data.priority-map "1.1.0"]]}
|
||||
|
|
@ -98,7 +98,8 @@
|
|||
:feature/logging
|
||||
:feature/priority-map
|
||||
:feature/rrb-vector
|
||||
{:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
|
||||
{:dependencies [[borkdude/rewrite-edn "0.4.6"]
|
||||
[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
|
||||
[com.opentable.components/otj-pg-embedded "0.13.3"]
|
||||
[nubank/matcher-combinators "3.6.0"]]}]
|
||||
:uberjar {:global-vars {*assert* false}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
1.3.179
|
||||
1.12.200
|
||||
|
|
@ -1 +1 @@
|
|||
1.3.180-SNAPSHOT
|
||||
1.12.201-SNAPSHOT
|
||||
|
|
@ -18,42 +18,41 @@
|
|||
"deps.clj/src" "deps.clj/resources"
|
||||
"resources" "sci/resources"
|
||||
"impl-java/src"],
|
||||
:deps {org.clojure/clojure {:mvn/version "1.11.1"},
|
||||
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
|
||||
org.babashka/sci {:local/root "sci"}
|
||||
org.babashka/babashka.impl.java {:mvn/version "0.1.8"}
|
||||
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
|
||||
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"}
|
||||
borkdude/graal.locking {:mvn/version "0.0.2"},
|
||||
org.clojure/core.async {:mvn/version "1.6.673"},
|
||||
org.clojure/core.async {:mvn/version "1.8.741"},
|
||||
org.clojure/tools.cli {:mvn/version "1.0.214"},
|
||||
org.clojure/data.csv {:mvn/version "1.0.0"},
|
||||
cheshire/cheshire {:mvn/version "5.11.0"}
|
||||
cheshire/cheshire {:mvn/version "6.0.0"}
|
||||
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
|
||||
clj-commons/clj-yaml {:mvn/version "1.0.26"}
|
||||
clj-commons/clj-yaml {:mvn/version "1.0.29"}
|
||||
com.cognitect/transit-clj {:mvn/version "1.0.333"}
|
||||
org.clojure/test.check {:mvn/version "1.1.1"}
|
||||
nrepl/bencode {:mvn/version "1.1.0"}
|
||||
nrepl/bencode {:mvn/version "1.2.0"}
|
||||
seancorfield/next.jdbc {:mvn/version "1.1.610"}
|
||||
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.6.0-RC1"}
|
||||
http-kit/http-kit {:mvn/version "2.8.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"}
|
||||
rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}
|
||||
selmer/selmer {:mvn/version "1.12.50"}
|
||||
com.taoensso/timbre {:mvn/version "6.0.1"}
|
||||
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
|
||||
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
|
||||
selmer/selmer {:mvn/version "1.12.59"}
|
||||
com.taoensso/timbre {:mvn/version "6.6.0"}
|
||||
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.7.51"}
|
||||
org.babashka/http-client {:mvn/version "0.2.9"}
|
||||
;; native image bloat with ordered 1.5.10
|
||||
org.flatland/ordered {:mvn/version "1.5.9"}}
|
||||
org.babashka/cli {:mvn/version "0.8.65"}
|
||||
org.babashka/http-client {:mvn/version "0.4.22"}
|
||||
org.flatland/ordered {:mvn/version "1.15.12"}
|
||||
org.jsoup/jsoup {:mvn/version "1.20.1"}}
|
||||
:aliases {:babashka/dev
|
||||
{:main-opts ["-m" "babashka.main"]}
|
||||
:profile
|
||||
|
|
@ -109,7 +108,7 @@
|
|||
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
||||
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
||||
expound/expound {:mvn/version "0.8.10"}
|
||||
integrant/integrant {:mvn/version "0.8.0"}
|
||||
integrant/integrant {:git/url "https://github.com/weavejester/integrant", :git/sha "a9fd7c02bd7201f36344b47142badc3c3ef22f88"}
|
||||
com.stuartsierra/dependency {:mvn/version "1.0.0"}
|
||||
listora/again {:mvn/version "1.0.0"}
|
||||
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
||||
|
|
@ -171,7 +170,15 @@
|
|||
:deps/manifest :deps}
|
||||
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
|
||||
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
|
||||
:deps/manifest :deps}}
|
||||
:deps/manifest :deps}
|
||||
prismatic/plumbing {:git/url "https://github.com/plumatic/plumbing",
|
||||
:git/sha "424bc704f2db422de34269c139a5494314b3a43b"}
|
||||
org.clj-commons/hickory {:git/url "https://github.com/clj-commons/hickory"
|
||||
:git/sha "9385b6708ef35f161732d8464b3a3aa57dd79f30"}
|
||||
com.potetm/fusebox {:git/url "https://github.com/potetm/fusebox"
|
||||
:git/sha "ac6d6a0a69510b009b3c1bb2247cd110fd9f7246"}
|
||||
net.sekao/odoyle-rules {:git/url "https://github.com/oakes/odoyle-rules"
|
||||
:git/sha "0b1d825ec45a998c4d3481dfb292e08ce6a47f0b"}}
|
||||
:classpath-overrides {org.clojure/clojure nil
|
||||
org.clojure/spec.alpha nil}}
|
||||
:clj-nvd
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ Args=-H:+ReportExceptionStackTraces \
|
|||
-H:IncludeResources=src/babashka/.* \
|
||||
-H:IncludeResources=SCI_VERSION \
|
||||
-H:Log=registerResource:3 \
|
||||
-H:EnableURLProtocols=http,https,jar,unix \
|
||||
--enable-url-protocols=http,https,jar,unix \
|
||||
--enable-all-security-services \
|
||||
-H:+JNI \
|
||||
--no-server \
|
||||
|
|
@ -26,4 +26,32 @@ Args=-H:+ReportExceptionStackTraces \
|
|||
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader \
|
||||
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter \
|
||||
-H:ServiceLoaderFeatureExcludeServices=java.net.ContentHandlerFactory \
|
||||
-H:ServiceLoaderFeatureExcludeServices=java.nio.charset.spi.CharsetProvider
|
||||
-H:ServiceLoaderFeatureExcludeServices=java.nio.charset.spi.CharsetProvider \
|
||||
-EBABASHKA_STATIC \
|
||||
-EBABASHKA_MUSL \
|
||||
-EBABASHKA_FEATURE_YAML \
|
||||
-EBABASHKA_FEATURE_XML \
|
||||
-EBABASHKA_FEATURE_CSV \
|
||||
-EBABASHKA_FEATURE_TRANSIT \
|
||||
-EBABASHKA_FEATURE_JAVA_TIME \
|
||||
-EBABASHKA_FEATURE_JAVA_NET_HTTP \
|
||||
-EBABASHKA_FEATURE_JAVA_NIO \
|
||||
-EBABASHKA_FEATURE_HTTPKIT_CLIENT \
|
||||
-EBABASHKA_FEATURE_HTTPKIT_SERVER \
|
||||
-EBABASHKA_FEATURE_CORE_MATCH \
|
||||
-EBABASHKA_FEATURE_HICCUP \
|
||||
-EBABASHKA_FEATURE_TEST_CHECK \
|
||||
-EBABASHKA_FEATURE_SELMER \
|
||||
-EBABASHKA_FEATURE_LOGGING \
|
||||
-EBABASHKA_FEATURE_PRIORITY_MAP \
|
||||
-EBABASHKA_FEATURE_JDBC \
|
||||
-EBABASHKA_FEATURE_SQLITE \
|
||||
-EBABASHKA_FEATURE_POSTGRESQL \
|
||||
-EBABASHKA_FEATURE_ORACLEDB \
|
||||
-EBABASHKA_FEATURE_HSQLDB \
|
||||
-EBABASHKA_FEATURE_DATASCRIPT \
|
||||
-EBABASHKA_FEATURE_LANTERNA \
|
||||
-EBABASHKA_FEATURE_SPEC_ALPHA \
|
||||
-EBABASHKA_FEATURE_RRB_VECTOR \
|
||||
-EBABASHKA_REQUIRE_SCAN \
|
||||
-EBABASHKA_SHA
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
[{
|
||||
"interfaces": [
|
||||
"java.util.function.Predicate"
|
||||
]
|
||||
},
|
||||
{
|
||||
"interfaces": [
|
||||
"java.util.function.Function"
|
||||
]
|
||||
},
|
||||
{
|
||||
"interfaces": [
|
||||
"java.io.FileFilter"
|
||||
]
|
||||
},
|
||||
{
|
||||
"interfaces": [
|
||||
"java.nio.file.DirectoryStream$Filter"
|
||||
]
|
||||
},
|
||||
{
|
||||
"interfaces": [
|
||||
"java.util.function.Supplier"
|
||||
]
|
||||
},
|
||||
{
|
||||
"interfaces": [
|
||||
"java.util.function.UnaryOperator"
|
||||
]
|
||||
}
|
||||
]
|
||||
31
resources/src/babashka/clojure/repl/deps.clj
Normal file
31
resources/src/babashka/clojure/repl/deps.clj
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
(ns clojure.repl.deps
|
||||
(:require [babashka.deps :as deps]))
|
||||
|
||||
(defn add-libs
|
||||
"Given lib-coords, a map of lib to coord, will resolve all transitive deps for the libs
|
||||
together and add them to the repl classpath, unlike separate calls to add-lib."
|
||||
{:added "1.12"}
|
||||
[lib-coords]
|
||||
(deps/add-deps {:deps lib-coords})
|
||||
nil)
|
||||
|
||||
(defn add-lib
|
||||
"Given a lib that is not yet on the repl classpath, make it available by
|
||||
downloading the library if necessary and adding it to the classloader.
|
||||
Libs already on the classpath are not updated. Requires a valid parent
|
||||
DynamicClassLoader.
|
||||
|
||||
lib - symbol identifying a library, for Maven: groupId/artifactId
|
||||
coord - optional map of location information specific to the procurer,
|
||||
or latest if not supplied
|
||||
|
||||
Returns coll of libs loaded, including transitive (or nil if none).
|
||||
|
||||
For info on libs, coords, and versions, see:
|
||||
https://clojure.org/reference/deps_and_cli"
|
||||
{:added "1.12"}
|
||||
([lib coord]
|
||||
(add-libs {lib coord}))
|
||||
([lib]
|
||||
(throw (ex-info "add-lib without explicit version isn't supported in babashka (yet)" {:lib lib}))))
|
||||
|
||||
2
sci
2
sci
|
|
@ -1 +1 @@
|
|||
Subproject commit 7c59b7f6dcb192d9f43e8bc3106ec3c3110d7b13
|
||||
Subproject commit e85433a0214114fdceb4ca896e1b9c27b1bdf713
|
||||
|
|
@ -45,8 +45,8 @@
|
|||
"appveyor.yml"
|
||||
"project.clj"
|
||||
"script/bump_graal_version.clj"
|
||||
".circleci/script/short_ci.clj"
|
||||
".cirrus.yml"])
|
||||
".cirrus.yml"
|
||||
"script/install-graalvm"])
|
||||
|
||||
;; We might have to keep changing these from
|
||||
;; time to time whenever the version is bumped
|
||||
|
|
@ -54,8 +54,7 @@
|
|||
;; OR
|
||||
;;
|
||||
;; We could have them as environment variables
|
||||
(def current-graal-version "22.3.1")
|
||||
(def current-java-version "java19")
|
||||
(def current-graal-version "24")
|
||||
|
||||
(def cl-options
|
||||
[["-g" "--graal VERSION" "graal version"]
|
||||
|
|
@ -91,19 +90,12 @@
|
|||
[args]
|
||||
(when (empty? args)
|
||||
(display-help))
|
||||
(let [new-graal-version (:graal args)
|
||||
new-java-version (:java args)]
|
||||
(let [new-graal-version (:graal args)]
|
||||
(when (not (nil? new-graal-version))
|
||||
(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 nil)
|
||||
(do
|
||||
(println "Performing Java bump...")
|
||||
(bump-current current-java-version new-java-version))
|
||||
(show-error new-java-version)))))
|
||||
(show-error new-graal-version)))))
|
||||
|
||||
(exec-script cl-args)
|
||||
|
|
|
|||
|
|
@ -39,26 +39,29 @@ args=("-jar" "$BABASHKA_JAR"
|
|||
# "-H:DashboardDump=reports/dump"
|
||||
# "-H:+DashboardPretty"
|
||||
# "-H:+DashboardJson"
|
||||
"-H:ReportAnalysisForbiddenType=java.awt.Toolkit:InHeap,Allocated"
|
||||
# "-H:ReportAnalysisForbiddenType=java.awt.Toolkit:Instantiated"
|
||||
"--verbose"
|
||||
"--no-fallback"
|
||||
"--native-image-info"
|
||||
"--install-exit-handlers"
|
||||
# --trace-class-initialization=jdk.internal.net.http.common.DebugLogger,jdk.internal.net.http.websocket.WebSocketImpl,jdk.internal.net.http.common.Utils
|
||||
"$BABASHKA_XMX"
|
||||
"--enable-preview")
|
||||
"--enable-preview"
|
||||
"-march=compatibility" # necessary for compatibility with older machines, e.g. see https://github.com/borkdude/deps.clj/actions/runs/6337277754/job/17212028399
|
||||
"-O1")
|
||||
|
||||
BABASHKA_STATIC=${BABASHKA_STATIC:-}
|
||||
BABASHKA_MUSL=${BABASHKA_MUSL:-}
|
||||
|
||||
if [ "$BABASHKA_STATIC" = "true" ]; then
|
||||
args+=("--static")
|
||||
if [ "$BABASHKA_MUSL" = "true" ]; then
|
||||
args+=("--static")
|
||||
args+=("--libc=musl"
|
||||
# see https://github.com/oracle/graal/issues/3398
|
||||
"-H:CCompilerOption=-Wl,-z,stack-size=2097152")
|
||||
else
|
||||
# see https://github.com/oracle/graal/issues/3737
|
||||
args+=("-H:+UnlockExperimentalVMOptions")
|
||||
args+=("-H:+StaticExecutableWithDynamicLibC")
|
||||
fi
|
||||
fi
|
||||
|
|
@ -104,4 +107,14 @@ then
|
|||
export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}"
|
||||
fi
|
||||
|
||||
if [[ -z "${BABASHKA_SHA:-}" ]]
|
||||
then
|
||||
sha=$(git rev-parse HEAD)
|
||||
if [[ $? -eq 0 ]]; then
|
||||
export BABASHKA_SHA=$sha
|
||||
fi
|
||||
fi
|
||||
|
||||
"$GRAALVM_HOME/bin/native-image" "${args[@]}" "$@"
|
||||
|
||||
./"$BABASHKA_BINARY" describe
|
||||
|
|
|
|||
|
|
@ -23,6 +23,13 @@ Rem -H:EnableURLProtocols=jar,http,https is also not supported.
|
|||
|
||||
call %GRAALVM_HOME%\bin\gu.cmd install native-image
|
||||
|
||||
if "%BABASHKA_SHA%"=="" (
|
||||
for /f %%i in ('git rev-parse HEAD') do set sha=%%i
|
||||
if not errorlevel 1 (
|
||||
set BABASHKA_SHA=%sha%
|
||||
)
|
||||
)
|
||||
|
||||
call %GRAALVM_HOME%\bin\native-image.cmd ^
|
||||
"-jar" "target/babashka-%BABASHKA_VERSION%-standalone.jar" ^
|
||||
"-H:Name=bb" ^
|
||||
|
|
@ -31,8 +38,12 @@ call %GRAALVM_HOME%\bin\native-image.cmd ^
|
|||
"--no-fallback" ^
|
||||
"--enable-preview" ^
|
||||
"--install-exit-handlers" ^
|
||||
"%BABASHKA_XMX%"
|
||||
"-march=compatibility" ^
|
||||
"-O1" ^
|
||||
"%BABASHKA_XMX%" ^
|
||||
%*
|
||||
|
||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||
|
||||
call bb "(+ 1 2 3)"
|
||||
call bb describe
|
||||
|
|
|
|||
|
|
@ -4,37 +4,33 @@ set -euo pipefail
|
|||
|
||||
INSTALL_DIR="${1:-$HOME}"
|
||||
|
||||
GRAALVM_VERSION="${GRAALVM_VERSION:-21.2.0}"
|
||||
GRAALVM_VERSION="${GRAALVM_VERSION:-24}"
|
||||
|
||||
case "$BABASHKA_PLATFORM" in
|
||||
macos)
|
||||
GRAALVM_PLATFORM="darwin"
|
||||
;;
|
||||
linux)
|
||||
GRAALVM_PLATFORM="linux"
|
||||
;;
|
||||
esac
|
||||
GRAALVM_PLATFORM=$BABASHKA_PLATFORM
|
||||
|
||||
case "${BABASHKA_ARCH:-}" in
|
||||
aarch64)
|
||||
GRAALVM_ARCH="aarch64"
|
||||
;;
|
||||
*)
|
||||
GRAALVM_ARCH="amd64"
|
||||
GRAALVM_ARCH="x64"
|
||||
;;
|
||||
esac
|
||||
|
||||
GRAALVM_FILENAME="graalvm-ce-java19-$GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION.tar.gz"
|
||||
GRAALVM_DIR_NAME="graalvm-$GRAALVM_VERSION"
|
||||
GRAALVM_FILENAME="graalvm-jdk-${GRAALVM_VERSION}_${GRAALVM_PLATFORM}-${GRAALVM_ARCH}_bin.tar.gz"
|
||||
DOWNLOAD_URL="https://download.oracle.com/graalvm/${GRAALVM_VERSION}/archive/${GRAALVM_FILENAME}"
|
||||
|
||||
pushd "$INSTALL_DIR" >/dev/null
|
||||
|
||||
if ! [ -d "graalvm-ce-java19-$GRAALVM_VERSION" ]; then
|
||||
if ! [ -d "$GRAALVM_DIR_NAME" ]; then
|
||||
echo "Downloading GraalVM $GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION on '$PWD'..."
|
||||
echo "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-$GRAALVM_VERSION/$GRAALVM_FILENAME"
|
||||
curl -LO "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-$GRAALVM_VERSION/$GRAALVM_FILENAME"
|
||||
echo "$DOWNLOAD_URL"
|
||||
curl --fail -LO "$DOWNLOAD_URL"
|
||||
ls -la
|
||||
tar xzvf "$GRAALVM_FILENAME"
|
||||
ls -la "graalvm-ce-java19-$GRAALVM_VERSION"
|
||||
mkdir "$GRAALVM_DIR_NAME"
|
||||
tar xzvf "$GRAALVM_FILENAME" -C "$GRAALVM_DIR_NAME" --strip-components 1
|
||||
ls -la "$GRAALVM_DIR_NAME"
|
||||
fi
|
||||
|
||||
popd >/dev/null
|
||||
|
|
|
|||
|
|
@ -2,12 +2,18 @@
|
|||
|
||||
set -eo pipefail
|
||||
|
||||
: "${BABASHKA_TEST_ENV:=jvm}"
|
||||
export BABASHKA_TEST_ENV
|
||||
|
||||
if [ "$BABASHKA_TEST_ENV" = "native" ]; then
|
||||
BB_CMD="./bb"
|
||||
else
|
||||
BB_CMD="lein bb"
|
||||
fi
|
||||
|
||||
export PATH
|
||||
PATH=$(pwd)/process/target/test/on-path:$PATH
|
||||
|
||||
export BABASHKA_CLASSPATH
|
||||
BABASHKA_CLASSPATH=$(clojure -Spath -A:lib-tests)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
if not defined BABASHKA_TEST_ENV set BABASHKA_TEST_ENV=jvm
|
||||
|
||||
if "%BABASHKA_TEST_ENV%" EQU "native" (set BB_CMD=.\bb) else (set BB_CMD=lein bb)
|
||||
|
||||
set EDN=lib_tests.edn
|
||||
|
||||
set PATH=%CD%\process\target\test\on-path;%PATH%
|
||||
|
||||
.\bb -f script/lib_tests/bb_edn_from_deps.clj %EDN%
|
||||
|
||||
%BB_CMD% --config %EDN% --deps-root . -f test-resources/lib_tests/babashka/run_all_libtests.clj %*
|
||||
|
|
|
|||
|
|
@ -175,6 +175,9 @@ else
|
|||
BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector"
|
||||
fi
|
||||
|
||||
#lein with-profiles "$BABASHKA_LEIN_PROFILES,+reflection,-uberjar" deps :tree
|
||||
#exit 0
|
||||
|
||||
mkdir -p resources/META-INF/babashka
|
||||
cp deps.edn resources/META-INF/babashka/deps.edn
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
(ns aaaa-this-has-to-be-first.because-patches
|
||||
;; we need pprint loaded first, it patches pprint to not bloat the GraalVM binary
|
||||
(:require [babashka.impl.patches.datafy]
|
||||
[babashka.impl.pprint]))
|
||||
[babashka.impl.pprint]
|
||||
))
|
||||
|
||||
;; Enable this for scanning requiring usage:
|
||||
(def enable-require-scan
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
Examples:
|
||||
|
||||
(-> (clojure '[-M -e (+ 1 2 3)] {:out :string}) deref :out) returns
|
||||
(-> (clojure {:out :string} '-M '-e '(+ 1 2 3)]) deref :out) returns
|
||||
\"6\n\".
|
||||
|
||||
(-> @(clojure) :exit) starts a clojure REPL, waits for it
|
||||
|
|
@ -38,17 +38,13 @@
|
|||
*out* @sci/out
|
||||
*err* @sci/err
|
||||
deps/*dir* (:dir opts)
|
||||
deps/*env* (:env opts)
|
||||
deps/*extra-env* (:extra-env opts)
|
||||
deps/*process-fn* (fn
|
||||
([cmd] (pp/process* {:cmd cmd
|
||||
deps/*aux-process-fn* (fn [{:keys [cmd out]}]
|
||||
(pp/shell (assoc opts :out out :cmd cmd)))
|
||||
deps/*clojure-process-fn* (fn [{:keys [cmd]}]
|
||||
(pp/process* {:cmd cmd
|
||||
:prev prev
|
||||
:opts opts}))
|
||||
([cmd _] (pp/process* {:cmd cmd
|
||||
:prev prev
|
||||
:opts opts})))
|
||||
deps/*exit-fn* (fn
|
||||
([_])
|
||||
([_exit-code msg]
|
||||
(throw (Exception. msg))))]
|
||||
deps/*exit-fn* (fn [{:keys [message]}]
|
||||
(when message
|
||||
(throw (Exception. message))))]
|
||||
(apply deps/-main cmd))))
|
||||
|
|
|
|||
8
src/babashka/dude.clj
Normal file
8
src/babashka/dude.clj
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
(ns babashka.dude
|
||||
(:require [clojure-csv.core :as csv]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as string]))
|
||||
|
||||
csv/x
|
||||
io/x
|
||||
string/x
|
||||
|
|
@ -1,25 +1,120 @@
|
|||
(ns babashka.impl.cheshire
|
||||
{:no-doc true}
|
||||
(:require [cheshire.core :as json]
|
||||
[cheshire.factory :as fact]
|
||||
[sci.core :as sci :refer [copy-var]]))
|
||||
|
||||
(def tns (sci/create-ns 'cheshire.core nil))
|
||||
(def fns (sci/create-ns 'cheshire.factory nil))
|
||||
|
||||
(def json-factory (sci/new-dynamic-var '*json-factory* nil {:ns fns}))
|
||||
|
||||
;; wrap cheshire fns to support `*json-factory*` dynamic var
|
||||
|
||||
(defn generate-string
|
||||
([obj]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/generate-string obj)))
|
||||
([obj opt-map]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/generate-string obj opt-map))))
|
||||
|
||||
(defn generate-stream
|
||||
([obj writer]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/generate-stream obj writer)))
|
||||
([obj writer opt-map]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/generate-stream obj writer opt-map))))
|
||||
|
||||
(defn parse-string
|
||||
([string]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string string))))
|
||||
([string key-fn]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string string key-fn))))
|
||||
([^String string key-fn array-coerce-fn]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string string key-fn array-coerce-fn)))))
|
||||
|
||||
(defn parse-string-strict
|
||||
([string]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string-strict string))))
|
||||
([string key-fn]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string-strict string key-fn))))
|
||||
([^String string key-fn array-coerce-fn]
|
||||
(when string
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-string-strict string key-fn array-coerce-fn)))))
|
||||
|
||||
(defn parse-stream
|
||||
([rdr]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream rdr))))
|
||||
([rdr key-fn]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream rdr key-fn))))
|
||||
([rdr key-fn array-coerce-fn]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream rdr key-fn array-coerce-fn)))))
|
||||
|
||||
(defn parse-stream-strict
|
||||
([rdr]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream-strict rdr))))
|
||||
([rdr key-fn]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream-strict rdr key-fn))))
|
||||
([rdr key-fn array-coerce-fn]
|
||||
(when rdr
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parse-stream-strict rdr key-fn array-coerce-fn)))))
|
||||
|
||||
(defn parsed-seq
|
||||
([reader]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parsed-seq reader)))
|
||||
([reader key-fn]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parsed-seq reader key-fn)))
|
||||
([reader key-fn array-coerce-fn]
|
||||
(binding [fact/*json-factory* @json-factory]
|
||||
(json/parsed-seq reader key-fn array-coerce-fn))))
|
||||
|
||||
(def cheshire-core-namespace
|
||||
{'encode (copy-var json/encode tns)
|
||||
'generate-string (copy-var json/generate-string tns)
|
||||
'encode-stream (copy-var json/encode-stream tns)
|
||||
'generate-stream (copy-var json/generate-stream tns)
|
||||
{'encode (copy-var generate-string tns)
|
||||
'generate-string (copy-var generate-string tns)
|
||||
'encode-stream (copy-var generate-stream tns)
|
||||
'generate-stream (copy-var generate-stream tns)
|
||||
;;'encode-smile (copy-var json/encode-smile tns)
|
||||
;;'generate-smile (copy-var json/generate-smile tns)
|
||||
'decode (copy-var json/decode tns)
|
||||
'parse-string (copy-var json/parse-string tns)
|
||||
'parse-string-strict (copy-var json/parse-string-strict tns)
|
||||
'decode (copy-var parse-string tns)
|
||||
'parse-string (copy-var parse-string tns)
|
||||
'parse-string-strict (copy-var parse-string-strict tns)
|
||||
;;'parse-smile (copy-var json/parse-smile tns)
|
||||
'parse-stream (copy-var json/parse-stream tns)
|
||||
'parse-stream-strict (copy-var json/parse-stream-strict tns)
|
||||
'parsed-seq (copy-var json/parsed-seq tns)
|
||||
'parse-stream (copy-var parse-stream tns)
|
||||
'parse-stream-strict (copy-var parse-stream-strict tns)
|
||||
'parsed-seq (copy-var parsed-seq tns)
|
||||
;;'parsed-smile-seq (copy-var json/parsed-smile-seq tns)
|
||||
;;'decode-smile (copy-var json/decode-smile tns)
|
||||
'default-pretty-print-options (copy-var json/default-pretty-print-options tns)
|
||||
'create-pretty-printer (copy-var json/create-pretty-printer tns)})
|
||||
|
||||
(def cheshire-factory-namespace
|
||||
{'*json-factory* json-factory
|
||||
'default-factory-options (copy-var fact/default-factory-options fns)
|
||||
'json-factory (copy-var fact/json-factory fns)
|
||||
'make-json-factory (copy-var fact/make-json-factory fns)})
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
[sci.core :as sci]
|
||||
[sci.impl.types :as t]))
|
||||
|
||||
(set! *warn-on-reflection* true)
|
||||
|
||||
(def has-of-virtual?
|
||||
(some #(= "ofVirtual" (.getName ^java.lang.reflect.Method %))
|
||||
(.getMethods Thread)))
|
||||
|
|
@ -15,6 +17,9 @@
|
|||
(def has-domain-sockets?
|
||||
(resolve 'java.net.UnixDomainSocketAddress))
|
||||
|
||||
(def has-graal-process-properties?
|
||||
(resolve 'org.graalvm.nativeimage.ProcessProperties))
|
||||
|
||||
(def base-custom-map
|
||||
`{clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
|
||||
:allPublicMethods true}
|
||||
|
|
@ -86,7 +91,8 @@
|
|||
java.util.Arrays
|
||||
{:methods [{:name "copyOf"}
|
||||
{:name "copyOfRange"}
|
||||
{:name "equals"}]}
|
||||
{:name "equals"}
|
||||
{:name "fill"}]}
|
||||
;; this fixes clojure.lang.Reflector for Java 11
|
||||
java.lang.reflect.AccessibleObject
|
||||
{:methods [{:name "canAccess"}]}
|
||||
|
|
@ -122,6 +128,7 @@
|
|||
{:methods [{:name "aget"}
|
||||
{:name "aset"}
|
||||
{:name "aclone"}
|
||||
{:name "iter"}
|
||||
;; we expose this via the Compiler/LOADER dynamic var
|
||||
{:name "baseLoader"}]}
|
||||
clojure.lang.Compiler
|
||||
|
|
@ -182,7 +189,11 @@
|
|||
`java.util.ResourceBundle
|
||||
{:methods [{:name "getBundle"
|
||||
:parameterTypes ["java.lang.String","java.util.Locale",
|
||||
"java.lang.ClassLoader"]}]})))
|
||||
"java.lang.ClassLoader"]}]})
|
||||
|
||||
has-graal-process-properties?
|
||||
(assoc `org.graalvm.nativeimage.ProcessProperties
|
||||
{:methods [{:name "exec"}]})))
|
||||
|
||||
(def java-net-http-classes
|
||||
"These classes must be initialized at run time since GraalVM 22.1"
|
||||
|
|
@ -213,11 +224,14 @@
|
|||
java.net.http.WebSocket$Listener
|
||||
java.security.cert.X509Certificate
|
||||
java.security.cert.CertificateFactory
|
||||
java.security.Signature
|
||||
javax.crypto.Cipher
|
||||
javax.crypto.KeyAgreement
|
||||
javax.crypto.Mac
|
||||
javax.crypto.SecretKey
|
||||
javax.crypto.SecretKeyFactory
|
||||
javax.crypto.spec.GCMParameterSpec
|
||||
javax.crypto.spec.IvParameterSpec
|
||||
javax.crypto.spec.PBEKeySpec
|
||||
javax.crypto.spec.SecretKeySpec
|
||||
javax.net.ssl.HostnameVerifier ;; clj-http-lite
|
||||
|
|
@ -230,6 +244,9 @@
|
|||
javax.net.ssl.TrustManager
|
||||
javax.net.ssl.TrustManagerFactory
|
||||
javax.net.ssl.X509TrustManager
|
||||
javax.net.ssl.X509ExtendedTrustManager
|
||||
javax.net.ssl.SSLSocket
|
||||
javax.net.ssl.SSLSocketFactory
|
||||
jdk.internal.net.http.HttpClientBuilderImpl
|
||||
jdk.internal.net.http.HttpClientFacade
|
||||
jdk.internal.net.http.HttpRequestBuilderImpl
|
||||
|
|
@ -238,6 +255,10 @@
|
|||
jdk.internal.net.http.websocket.BuilderImpl
|
||||
jdk.internal.net.http.websocket.WebSocketImpl])
|
||||
|
||||
(def thread-builder
|
||||
(try (Class/forName "java.lang.Thread$Builder")
|
||||
(catch Exception _ nil)))
|
||||
|
||||
(def classes
|
||||
`{:all [clojure.lang.ArityException
|
||||
clojure.lang.BigInt
|
||||
|
|
@ -262,6 +283,7 @@
|
|||
java.io.FileOutputStream
|
||||
java.io.FileReader
|
||||
java.io.FileWriter
|
||||
java.io.LineNumberReader
|
||||
java.io.RandomAccessFile
|
||||
java.io.InputStream
|
||||
java.io.IOException
|
||||
|
|
@ -313,13 +335,17 @@
|
|||
java.lang.ProcessBuilder$Redirect
|
||||
java.lang.Runtime
|
||||
java.lang.RuntimeException
|
||||
java.lang.SecurityException
|
||||
java.lang.Short
|
||||
java.lang.StackTraceElement
|
||||
java.lang.String
|
||||
java.lang.StringBuilder
|
||||
java.lang.System
|
||||
java.lang.Throwable
|
||||
java.lang.ThreadLocal
|
||||
java.lang.Thread$UncaughtExceptionHandler
|
||||
~@(when thread-builder
|
||||
'[java.lang.Thread$Builder])
|
||||
java.lang.UnsupportedOperationException
|
||||
java.lang.ref.WeakReference
|
||||
java.lang.ref.ReferenceQueue
|
||||
|
|
@ -343,6 +369,7 @@
|
|||
'[java.net.UnixDomainSocketAddress])
|
||||
java.net.UnknownHostException
|
||||
java.net.URI
|
||||
java.net.URISyntaxException
|
||||
;; java.net.URL, see custom map
|
||||
java.net.URLConnection
|
||||
java.net.URLEncoder
|
||||
|
|
@ -356,8 +383,12 @@
|
|||
java.nio.MappedByteBuffer
|
||||
java.nio.file.OpenOption
|
||||
java.nio.file.StandardOpenOption
|
||||
java.nio.channels.ByteChannel
|
||||
java.nio.channels.Channels
|
||||
java.nio.channels.FileChannel
|
||||
java.nio.channels.FileChannel$MapMode
|
||||
java.nio.channels.ReadableByteChannel
|
||||
java.nio.channels.WritableByteChannel
|
||||
java.nio.channels.ServerSocketChannel
|
||||
java.nio.channels.SocketChannel
|
||||
java.nio.charset.Charset
|
||||
|
|
@ -373,6 +404,7 @@
|
|||
java.nio.file.FileVisitOption
|
||||
java.nio.file.FileVisitResult
|
||||
java.nio.file.Files
|
||||
java.nio.file.DirectoryStream$Filter
|
||||
java.nio.file.LinkOption
|
||||
java.nio.file.NoSuchFileException
|
||||
java.nio.file.Path
|
||||
|
|
@ -382,19 +414,28 @@
|
|||
java.nio.file.attribute.BasicFileAttributes
|
||||
java.nio.file.attribute.FileAttribute
|
||||
java.nio.file.attribute.FileTime
|
||||
java.nio.file.attribute.PosixFileAttributes
|
||||
java.nio.file.attribute.PosixFilePermission
|
||||
java.nio.file.attribute.PosixFilePermissions])
|
||||
java.security.MessageDigest
|
||||
java.nio.file.attribute.PosixFilePermissions
|
||||
java.nio.file.attribute.UserDefinedFileAttributeView])
|
||||
java.security.DigestInputStream
|
||||
java.security.Provider
|
||||
java.security.KeyFactory
|
||||
java.security.KeyPairGenerator
|
||||
java.security.KeyPair
|
||||
java.security.KeyStore
|
||||
java.security.MessageDigest
|
||||
java.security.Provider
|
||||
java.security.SecureRandom
|
||||
java.security.Security
|
||||
java.security.spec.ECGenParameterSpec
|
||||
java.security.spec.PKCS8EncodedKeySpec
|
||||
java.security.spec.X509EncodedKeySpec
|
||||
java.sql.Date
|
||||
java.text.ParseException
|
||||
java.text.ParsePosition
|
||||
;; adds about 200kb, same functionality provided by java.time:
|
||||
java.text.SimpleDateFormat
|
||||
java.text.BreakIterator
|
||||
~@(when features/java-time?
|
||||
`[java.time.format.DateTimeFormatter
|
||||
java.time.Clock
|
||||
|
|
@ -429,25 +470,33 @@
|
|||
java.time.temporal.TemporalAdjusters
|
||||
java.time.temporal.TemporalAmount
|
||||
java.time.temporal.TemporalField
|
||||
java.time.temporal.WeekFields
|
||||
~(symbol "[Ljava.time.temporal.TemporalField;")
|
||||
java.time.format.TextStyle
|
||||
java.time.temporal.Temporal
|
||||
java.time.temporal.TemporalAccessor
|
||||
java.time.temporal.TemporalAdjuster
|
||||
java.time.temporal.TemporalQuery
|
||||
~(symbol "[Ljava.time.temporal.TemporalQuery;")])
|
||||
~(symbol "[Ljava.time.temporal.TemporalQuery;")
|
||||
java.time.chrono.ChronoLocalDate
|
||||
java.time.temporal.TemporalUnit
|
||||
java.time.chrono.ChronoLocalDateTime
|
||||
java.time.chrono.ChronoZonedDateTime
|
||||
java.time.chrono.Chronology])
|
||||
java.util.concurrent.atomic.AtomicInteger
|
||||
java.util.concurrent.atomic.AtomicLong
|
||||
java.util.concurrent.atomic.AtomicReference
|
||||
java.util.concurrent.Callable
|
||||
java.util.concurrent.CancellationException
|
||||
java.util.concurrent.CompletionException
|
||||
java.util.concurrent.CountDownLatch
|
||||
java.util.concurrent.ExecutionException
|
||||
java.util.concurrent.Executor
|
||||
java.util.concurrent.ExecutorService
|
||||
java.util.concurrent.BlockingQueue
|
||||
java.util.concurrent.ArrayBlockingQueue
|
||||
java.util.concurrent.LinkedBlockingQueue
|
||||
java.util.concurrent.ScheduledFuture
|
||||
java.util.concurrent.ScheduledThreadPoolExecutor
|
||||
java.util.concurrent.Semaphore
|
||||
java.util.concurrent.ThreadFactory
|
||||
|
|
@ -463,6 +512,10 @@
|
|||
java.util.concurrent.CompletableFuture
|
||||
java.util.concurrent.Executors
|
||||
java.util.concurrent.TimeUnit
|
||||
java.util.concurrent.CompletionStage
|
||||
java.util.concurrent.locks.ReentrantLock
|
||||
java.util.concurrent.ThreadLocalRandom
|
||||
java.util.concurrent.ConcurrentHashMap
|
||||
java.util.jar.Attributes
|
||||
java.util.jar.Attributes$Name
|
||||
java.util.jar.JarFile
|
||||
|
|
@ -473,9 +526,11 @@
|
|||
java.util.jar.Manifest
|
||||
java.util.stream.BaseStream
|
||||
java.util.stream.Stream
|
||||
java.util.stream.IntStream
|
||||
java.util.Random
|
||||
java.util.regex.Matcher
|
||||
java.util.regex.Pattern
|
||||
java.util.regex.PatternSyntaxException
|
||||
java.util.ArrayDeque
|
||||
java.util.ArrayList
|
||||
java.util.Collections
|
||||
|
|
@ -485,6 +540,7 @@
|
|||
java.util.Base64$Encoder
|
||||
java.util.Date
|
||||
java.util.HashMap
|
||||
java.util.HashSet
|
||||
java.util.IdentityHashMap
|
||||
java.util.InputMismatchException
|
||||
java.util.List
|
||||
|
|
@ -505,6 +561,8 @@
|
|||
java.util.function.BiFunction
|
||||
java.util.function.Predicate
|
||||
java.util.function.Supplier
|
||||
java.util.zip.CheckedInputStream
|
||||
java.util.zip.CRC32
|
||||
java.util.zip.Inflater
|
||||
java.util.zip.InflaterInputStream
|
||||
java.util.zip.Deflater
|
||||
|
|
@ -534,8 +592,22 @@
|
|||
~(symbol "[Ljava.util.regex.Pattern;")
|
||||
~(symbol "[Lclojure.core$range;")])
|
||||
~@(when features/yaml? '[org.yaml.snakeyaml.error.YAMLException])
|
||||
~@(when features/hsqldb? '[org.hsqldb.jdbcDriver])]
|
||||
~@(when features/hsqldb? '[org.hsqldb.jdbcDriver])
|
||||
org.jsoup.Jsoup
|
||||
org.jsoup.nodes.Attribute
|
||||
org.jsoup.nodes.Attributes
|
||||
org.jsoup.nodes.Comment
|
||||
org.jsoup.nodes.DataNode
|
||||
org.jsoup.nodes.Document
|
||||
org.jsoup.nodes.DocumentType
|
||||
org.jsoup.nodes.Element
|
||||
org.jsoup.nodes.Node
|
||||
org.jsoup.nodes.TextNode
|
||||
org.jsoup.nodes.XmlDeclaration
|
||||
org.jsoup.parser.Tag
|
||||
org.jsoup.parser.Parser]
|
||||
:constructors [clojure.lang.Delay
|
||||
clojure.lang.DynamicClassLoader
|
||||
clojure.lang.LineNumberingPushbackReader
|
||||
java.io.EOFException]
|
||||
:methods [borkdude.graal.LockFix] ;; support for locking
|
||||
|
|
@ -575,13 +647,18 @@
|
|||
clojure.lang.IRef
|
||||
clojure.lang.ISeq
|
||||
clojure.lang.IPersistentVector
|
||||
clojure.lang.ITransientSet
|
||||
clojure.lang.ITransientVector
|
||||
clojure.lang.Iterate
|
||||
clojure.lang.LispReader$Resolver
|
||||
clojure.lang.LongRange
|
||||
clojure.lang.Named
|
||||
clojure.lang.Keyword
|
||||
clojure.lang.PersistentArrayMap
|
||||
clojure.lang.PersistentArrayMap$TransientArrayMap
|
||||
clojure.lang.PersistentHashMap$TransientHashMap
|
||||
clojure.lang.PersistentHashSet
|
||||
clojure.lang.PersistentHashSet$TransientHashSet
|
||||
clojure.lang.PersistentList
|
||||
clojure.lang.PersistentList$EmptyList
|
||||
clojure.lang.PersistentQueue
|
||||
|
|
@ -589,6 +666,7 @@
|
|||
clojure.lang.PersistentTreeMap
|
||||
clojure.lang.PersistentTreeSet
|
||||
clojure.lang.PersistentVector
|
||||
clojure.lang.PersistentVector$TransientVector
|
||||
clojure.lang.Range
|
||||
clojure.lang.Ratio
|
||||
clojure.lang.ReaderConditional
|
||||
|
|
@ -607,10 +685,14 @@
|
|||
java.lang.LinkageError
|
||||
java.lang.ThreadDeath
|
||||
java.lang.VirtualMachineError
|
||||
java.lang.NoSuchFieldException
|
||||
java.sql.Timestamp
|
||||
java.util.concurrent.TimeoutException
|
||||
java.util.Collection
|
||||
java.util.Map$Entry
|
||||
java.util.AbstractMap
|
||||
java.util.AbstractSet
|
||||
java.util.AbstractList
|
||||
~@(when features/xml? ['clojure.data.xml.node.Element])]
|
||||
:custom ~custom-map})
|
||||
|
||||
|
|
@ -623,13 +705,22 @@
|
|||
(:instance-checks classes))
|
||||
m (apply hash-map
|
||||
(for [c classes
|
||||
c [(list 'quote c) c]]
|
||||
c [(list 'quote c) (cond-> `{:class ~c}
|
||||
(= 'java.lang.Class c)
|
||||
(assoc :static-methods
|
||||
{(list 'quote 'forName)
|
||||
`(fn
|
||||
([_# ^String class-name#]
|
||||
(Class/forName class-name#))
|
||||
([_# ^String class-name# initialize# ^java.lang.ClassLoader clazz-loader#]
|
||||
(Class/forName class-name#)))}))]]
|
||||
c))
|
||||
m (assoc m :public-class
|
||||
(fn [v]
|
||||
;; (prn :v v)
|
||||
;; NOTE: a series of instance check, so far, is still cheaper
|
||||
;; than piggybacking on defmulti or defprotocol
|
||||
(cond (instance? java.lang.Process v)
|
||||
(let [res (cond (instance? java.lang.Process v)
|
||||
java.lang.Process
|
||||
(instance? java.lang.ProcessHandle v)
|
||||
java.lang.ProcessHandle
|
||||
|
|
@ -656,6 +747,10 @@
|
|||
java.nio.file.FileSystem
|
||||
(instance? java.nio.file.PathMatcher v)
|
||||
java.nio.file.PathMatcher
|
||||
(instance? java.util.stream.Stream v)
|
||||
java.util.stream.Stream
|
||||
(instance? java.util.stream.IntStream v)
|
||||
java.util.stream.IntStream
|
||||
(instance? java.util.stream.BaseStream v)
|
||||
java.util.stream.BaseStream
|
||||
(instance? java.nio.ByteBuffer v)
|
||||
|
|
@ -683,10 +778,12 @@
|
|||
java.net.URLClassLoader
|
||||
(instance? java.lang.ClassLoader v)
|
||||
java.lang.ClassLoader
|
||||
(instance? java.io.Closeable v)
|
||||
java.io.Closeable
|
||||
(instance? java.nio.file.attribute.PosixFileAttributes v)
|
||||
java.nio.file.attribute.PosixFileAttributes
|
||||
(instance? java.nio.file.attribute.BasicFileAttributes v)
|
||||
java.nio.file.attribute.BasicFileAttributes
|
||||
(instance? java.nio.file.attribute.UserDefinedFileAttributeView v)
|
||||
java.nio.file.attribute.UserDefinedFileAttributeView
|
||||
(instance? java.util.concurrent.Future v)
|
||||
java.util.concurrent.Future
|
||||
(instance? java.util.concurrent.ScheduledExecutorService v)
|
||||
|
|
@ -697,12 +794,43 @@
|
|||
java.util.Iterator
|
||||
(instance? javax.crypto.SecretKey v)
|
||||
javax.crypto.SecretKey
|
||||
(instance? javax.net.ssl.SSLSocketFactory v)
|
||||
javax.net.ssl.SSLSocketFactory
|
||||
(instance? javax.net.ssl.SSLSocket v)
|
||||
javax.net.ssl.SSLSocket
|
||||
(instance? java.lang.Thread v)
|
||||
java.lang.Thread
|
||||
(instance? java.util.concurrent.ThreadFactory v)
|
||||
java.util.concurrent.ThreadFactory
|
||||
(instance? java.security.cert.X509Certificate v)
|
||||
java.security.cert.X509Certificate
|
||||
(instance? java.io.Console v)
|
||||
java.io.Console
|
||||
(instance? java.security.KeyPairGenerator v)
|
||||
java.security.KeyPairGenerator
|
||||
(instance? java.security.Signature v)
|
||||
java.security.Signature
|
||||
(instance? java.security.Key v)
|
||||
java.security.Key
|
||||
(instance? java.util.Set v)
|
||||
java.util.Set
|
||||
(instance? java.io.Closeable v)
|
||||
java.io.Closeable
|
||||
(instance? java.util.Collection v)
|
||||
java.util.Collection
|
||||
(instance? java.lang.Throwable v)
|
||||
java.lang.Throwable
|
||||
(instance? org.jsoup.nodes.Element v)
|
||||
org.jsoup.nodes.Element
|
||||
(and thread-builder
|
||||
(instance? thread-builder v))
|
||||
thread-builder
|
||||
(instance? java.text.BreakIterator v)
|
||||
java.text.BreakIterator
|
||||
;; keep commas for merge friendliness
|
||||
,,,)))
|
||||
,)]
|
||||
;; (prn :res res)
|
||||
res)))
|
||||
m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)
|
||||
m (assoc m (list 'quote 'clojure.lang.Namespace) 'sci.lang.Namespace)]
|
||||
m))
|
||||
|
|
@ -713,6 +841,14 @@
|
|||
allowed to be initialized at build time."
|
||||
(gen-class-map))
|
||||
|
||||
#_(let [class-name (str c)]
|
||||
(cond-> (Class/forName class-name)
|
||||
(= "java.lang.Class" class-name)
|
||||
(->> (hash-map :static-methods {'forName (fn [class-name]
|
||||
(prn :class-for)
|
||||
(Class/forName class-name))}
|
||||
:class))))
|
||||
|
||||
(def class-map
|
||||
"A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1"
|
||||
(delay (persistent! (reduce (fn [acc c]
|
||||
|
|
@ -746,6 +882,8 @@
|
|||
Integer java.lang.Integer
|
||||
InterruptedException java.lang.InterruptedException
|
||||
Iterable java.lang.Iterable
|
||||
;; NOTE: in hindsight File never belonged to the default imports of Clojure,
|
||||
;; but it's been here to long to remove probably
|
||||
File java.io.File
|
||||
Float java.lang.Float
|
||||
Long java.lang.Long
|
||||
|
|
@ -755,22 +893,26 @@
|
|||
Number java.lang.Number
|
||||
NumberFormatException java.lang.NumberFormatException
|
||||
Object java.lang.Object
|
||||
Runnable java.lang.Runnable
|
||||
Runtime java.lang.Runtime
|
||||
RuntimeException java.lang.RuntimeException
|
||||
Process java.lang.Process
|
||||
ProcessBuilder java.lang.ProcessBuilder
|
||||
SecurityException java.lang.SecurityException
|
||||
Short java.lang.Short
|
||||
StackTraceElement java.lang.StackTraceElement
|
||||
String java.lang.String
|
||||
StringBuilder java.lang.StringBuilder
|
||||
System java.lang.System
|
||||
Thread java.lang.Thread
|
||||
ThreadLocal java.lang.ThreadLocal
|
||||
Thread$UncaughtExceptionHandler java.lang.Thread$UncaughtExceptionHandler
|
||||
Throwable java.lang.Throwable
|
||||
VirtualMachineError java.lang.VirtualMachineError
|
||||
ThreadDeath java.lang.ThreadDeath
|
||||
UnsupportedOperationException java.lang.UnsupportedOperationException
|
||||
})
|
||||
UnsupportedOperationException java.lang.UnsupportedOperationException})
|
||||
|
||||
;; (eval (vec (keys imports)))
|
||||
|
||||
(defn reflection-file-entries []
|
||||
(let [entries (vec (for [c (sort (concat (:all classes)
|
||||
|
|
@ -812,13 +954,13 @@
|
|||
"resources/META-INF/native-image/babashka/babashka/reflect-config.json")
|
||||
(json/generate-string all-entries {:pretty true}))))
|
||||
|
||||
(defn public-declared-method? [c m]
|
||||
(defn public-declared-method? [^Class c ^java.lang.reflect.Method m]
|
||||
(and (= c (.getDeclaringClass m))
|
||||
(not (.getAnnotation m Deprecated))))
|
||||
|
||||
(defn public-declared-method-names [c]
|
||||
(defn public-declared-method-names [^Class c]
|
||||
(->> (.getMethods c)
|
||||
(keep (fn [m]
|
||||
(keep (fn [^java.lang.reflect.Method m]
|
||||
(when (public-declared-method? c m)
|
||||
{:class c
|
||||
:name (.getName m)})))
|
||||
|
|
@ -846,6 +988,4 @@
|
|||
(public-declared-method-names java.net.URL)
|
||||
(public-declared-method-names java.util.Properties)
|
||||
|
||||
(all-classes)
|
||||
|
||||
)
|
||||
(all-classes))
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
(defn split-classpath
|
||||
"Returns the classpath as a seq of strings, split by the platform
|
||||
specific path separator."
|
||||
([^String cp] (vec (.split cp path-sep))))
|
||||
([^String cp] (vec (when cp (.split cp path-sep)))))
|
||||
|
||||
(defn get-classpath
|
||||
"Returns the current classpath as set by --classpath, BABASHKA_CLASSPATH and add-classpath."
|
||||
|
|
@ -84,8 +84,8 @@
|
|||
cp)))
|
||||
|
||||
(defn resource
|
||||
(^URL [path] (resource @the-url-loader path))
|
||||
(^URL [loader path]
|
||||
(^URL [path] (resource path @the-url-loader))
|
||||
(^URL [path loader]
|
||||
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
|
||||
(getResource loader [path] true))))
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@
|
|||
(let [extra-opts '%s
|
||||
sym `%s
|
||||
the-var (requiring-resolve sym)
|
||||
_ (when-not the-var
|
||||
(throw (ex-info (str \"Could not resolve sym to a function: \" sym) {:babashka/exit 1})))
|
||||
the-var-meta (meta the-var)
|
||||
ns (:ns (meta the-var))
|
||||
ns-meta (meta ns)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
(:refer-clojure :exclude [future read+string clojure-version with-precision
|
||||
send-via send send-off sync into-array])
|
||||
(:require [babashka.impl.common :as common]
|
||||
[borkdude.graal.locking :as locking]
|
||||
[clojure.core :as c]
|
||||
[clojure.string :as str]
|
||||
[sci.core :as sci]
|
||||
|
|
@ -12,18 +11,6 @@
|
|||
[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))
|
||||
|
||||
(defn time*
|
||||
"Evaluates expr and prints the time it took. Returns the value of
|
||||
expr."
|
||||
[_ _ expr]
|
||||
`(let [start# (. System (nanoTime))
|
||||
ret# ~expr]
|
||||
(prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs"))
|
||||
ret#))
|
||||
|
||||
(defn core-dynamic-var
|
||||
([sym] (core-dynamic-var sym nil))
|
||||
([sym init-val] (sci/new-dynamic-var sym init-val {:ns clojure-core-ns})))
|
||||
|
|
@ -36,6 +23,7 @@
|
|||
(def math-context (core-dynamic-var '*math-context*))
|
||||
(def compile-path (core-dynamic-var '*compile-path* *compile-path*))
|
||||
(def compiler-options (core-dynamic-var '*compiler-options*))
|
||||
(def repl (core-dynamic-var '*repl* true)) ;; set to true, basically just a dummy for now
|
||||
|
||||
(defn read+string
|
||||
"Added for compatibility. Must be used with
|
||||
|
|
@ -64,7 +52,7 @@
|
|||
The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,
|
||||
HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP."
|
||||
[precision & exprs]
|
||||
(let [[body rm] (if (= (first exprs) :rounding)
|
||||
(let [[body rm] (if (= :rounding (first exprs))
|
||||
[(next (next exprs))
|
||||
`((. java.math.RoundingMode ~(second exprs)))]
|
||||
[exprs nil])]
|
||||
|
|
@ -130,7 +118,7 @@
|
|||
:static true}
|
||||
([aseq]
|
||||
(try (clojure.lang.RT/seqToTypedArray (seq aseq))
|
||||
(catch IllegalArgumentException _
|
||||
(catch Throwable _
|
||||
(clojure.lang.RT/seqToTypedArray Object (seq aseq)))))
|
||||
([type aseq]
|
||||
(clojure.lang.RT/seqToTypedArray type (seq aseq))))
|
||||
|
|
@ -156,11 +144,9 @@
|
|||
'file-seq (copy-core-var file-seq)
|
||||
'promise (copy-core-var promise)
|
||||
'deliver (copy-core-var deliver)
|
||||
'locking (macrofy 'locking locking*)
|
||||
'shutdown-agents (copy-core-var shutdown-agents)
|
||||
'slurp (copy-core-var slurp)
|
||||
'spit (copy-core-var spit)
|
||||
'time (macrofy 'time time*)
|
||||
'Throwable->map (copy-core-var Throwable->map)
|
||||
'tap> (copy-core-var tap>)
|
||||
'add-tap (copy-core-var add-tap)
|
||||
|
|
@ -177,6 +163,7 @@
|
|||
'*math-context* math-context
|
||||
'*compiler-options* compiler-options
|
||||
'*compile-path* compile-path
|
||||
'*source-path* sci/file
|
||||
'with-precision (sci/copy-var with-precision clojure-core-ns)
|
||||
'-with-precision (sci/copy-var -with-precision clojure-core-ns)
|
||||
;; STM
|
||||
|
|
@ -187,6 +174,8 @@
|
|||
'sync (sci/copy-var sync clojure-core-ns)
|
||||
'ref (sci/copy-var ref clojure-core-ns)
|
||||
'ref-set (sci/copy-var ref-set clojure-core-ns)
|
||||
'ensure (sci/copy-var ensure clojure-core-ns)
|
||||
;; end STM
|
||||
'update-vals (sci/copy-var update-vals clojure-core-ns)
|
||||
'update-keys (sci/copy-var update-keys clojure-core-ns)
|
||||
'parse-boolean (sci/copy-var parse-boolean clojure-core-ns)
|
||||
|
|
@ -204,5 +193,15 @@
|
|||
'print-dup (sci/copy-var print-dup clojure-core-ns)
|
||||
'PrintWriter-on (sci/copy-var PrintWriter-on clojure-core-ns)
|
||||
'set-agent-send-executor! (sci/copy-var set-agent-send-executor! clojure-core-ns)
|
||||
'set-agent-send-off-executor! (sci/copy-var set-agent-send-off-executor! clojure-core-ns)}
|
||||
'set-agent-send-off-executor! (sci/copy-var set-agent-send-off-executor! clojure-core-ns)
|
||||
;; 1.12
|
||||
'splitv-at (sci/copy-var splitv-at clojure-core-ns)
|
||||
'stream-transduce! (sci/copy-var stream-transduce! clojure-core-ns)
|
||||
'partitionv (sci/copy-var partitionv clojure-core-ns)
|
||||
'stream-into! (sci/copy-var stream-into! clojure-core-ns)
|
||||
'stream-reduce! (sci/copy-var stream-reduce! clojure-core-ns)
|
||||
'stream-seq! (sci/copy-var stream-seq! clojure-core-ns)
|
||||
'partitionv-all (sci/copy-var partitionv-all clojure-core-ns)
|
||||
'*repl* repl
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,11 +2,39 @@
|
|||
{:no-doc true}
|
||||
(:require [clojure.core.async :as async]
|
||||
[clojure.core.async.impl.protocols :as protocols]
|
||||
[clojure.core.async.impl.dispatch :as dispatch]
|
||||
[sci.core :as sci :refer [copy-var]]
|
||||
[sci.impl.copy-vars :refer [macrofy]]
|
||||
[sci.impl.vars :as vars]))
|
||||
[sci.impl.vars :as vars])
|
||||
(:import [java.util.concurrent Executors ExecutorService ThreadFactory]))
|
||||
|
||||
(def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor)
|
||||
(set! *warn-on-reflection* true)
|
||||
|
||||
#_(def ^java.util.concurrent.Executor executor @#'async/thread-macro-executor)
|
||||
(def executor-for
|
||||
"Given a workload tag, returns an ExecutorService instance and memoizes the result. By
|
||||
default, core.async will defer to a user factory (if provided via sys prop) or construct
|
||||
a specialized ExecutorService instance for each tag :io, :compute, and :mixed. When
|
||||
given the tag :core-async-dispatch it will default to the executor service for :io."
|
||||
(memoize
|
||||
(fn ^ExecutorService [workload]
|
||||
(let [sysprop-factory nil #_(when-let [esf (System/getProperty "clojure.core.async.executor-factory")]
|
||||
(requiring-resolve (symbol esf)))
|
||||
sp-exec (and sysprop-factory (sysprop-factory workload))]
|
||||
(or sp-exec
|
||||
(if (= workload :core-async-dispatch)
|
||||
(executor-for :io)
|
||||
(@#'dispatch/create-default-executor workload)))))))
|
||||
|
||||
(alter-var-root #'dispatch/executor-for (constantly executor-for))
|
||||
|
||||
#_#_(defn exec
|
||||
[^Runnable r workload]
|
||||
(prn :r r :w workload)
|
||||
(let [^ExecutorService e (executor-for workload)]
|
||||
(.execute e r)))
|
||||
|
||||
(alter-var-root #'dispatch/exec (constantly exec))
|
||||
|
||||
(def ^java.util.concurrent.Executor virtual-executor
|
||||
(try (eval '(java.util.concurrent.Executors/newVirtualThreadPerTaskExecutor))
|
||||
|
|
@ -15,20 +43,25 @@
|
|||
(defn thread-call
|
||||
"Executes f in another thread, returning immediately to the calling
|
||||
thread. Returns a channel which will receive the result of calling
|
||||
f when completed, then close."
|
||||
[f]
|
||||
(let [c (async/chan 1)]
|
||||
(let [binds (vars/get-thread-binding-frame)]
|
||||
(.execute executor
|
||||
(fn []
|
||||
(vars/reset-thread-binding-frame binds)
|
||||
(try
|
||||
(let [ret (f)]
|
||||
(when-not (nil? ret)
|
||||
(async/>!! c ret)))
|
||||
(finally
|
||||
(async/close! c))))))
|
||||
c))
|
||||
f when completed, then close. workload is a keyword that describes
|
||||
the work performed by f, where:
|
||||
|
||||
:io - may do blocking I/O but must not do extended computation
|
||||
:compute - must not ever block
|
||||
:mixed - anything else (default)
|
||||
|
||||
when workload not supplied, defaults to :mixed"
|
||||
([f] (thread-call f :mixed))
|
||||
([f workload]
|
||||
(let [c (async/chan 1)
|
||||
returning-to-chan (fn [bf]
|
||||
#(try
|
||||
(when-some [ret (bf)]
|
||||
(async/>!! c ret))
|
||||
(finally (async/close! c))))
|
||||
f (vars/binding-conveyor-fn f)]
|
||||
(-> f #_bound-fn* returning-to-chan (dispatch/exec workload))
|
||||
c)))
|
||||
|
||||
(defn -vthread-call
|
||||
"Executes f in another virtual thread, returning immediately to the calling
|
||||
|
|
@ -36,21 +69,23 @@
|
|||
f when completed, then close."
|
||||
[f]
|
||||
(let [c (async/chan 1)]
|
||||
(let [binds (vars/get-thread-binding-frame)]
|
||||
(let [returning-to-chan (fn [bf]
|
||||
#(try
|
||||
(when-some [ret (bf)]
|
||||
(async/>!! c ret))
|
||||
(finally (async/close! c))))
|
||||
f (vars/binding-conveyor-fn f)]
|
||||
(.execute virtual-executor
|
||||
(fn []
|
||||
(vars/reset-thread-binding-frame binds)
|
||||
(try
|
||||
(let [ret (f)]
|
||||
(when-not (nil? ret)
|
||||
(async/>!! c ret)))
|
||||
(finally
|
||||
(async/close! c))))))
|
||||
(-> f returning-to-chan)))
|
||||
c))
|
||||
|
||||
(defn thread
|
||||
[_ _ & body]
|
||||
`(~'clojure.core.async/thread-call (fn [] ~@body)))
|
||||
`(~'clojure.core.async/thread-call (fn [] ~@body) :mixed))
|
||||
|
||||
(defn io-thread
|
||||
[_ _ & body]
|
||||
`(~'clojure.core.async/thread-call (fn [] ~@body) :io))
|
||||
|
||||
(defn -vthread
|
||||
[_ _ & body]
|
||||
|
|
@ -72,7 +107,7 @@
|
|||
(if virtual-executor
|
||||
(let [chan (async/chan nil)]
|
||||
(.execute virtual-executor (fn []
|
||||
(Thread/sleep ms)
|
||||
(Thread/sleep (long ms))
|
||||
(async/close! chan)))
|
||||
chan)
|
||||
(async/timeout ms)))
|
||||
|
|
@ -126,6 +161,7 @@
|
|||
'take! (copy-var async/take! core-async-namespace)
|
||||
'tap (copy-var async/tap core-async-namespace)
|
||||
'thread (macrofy 'thread thread core-async-namespace)
|
||||
'io-thread (macrofy 'io-thread io-thread core-async-namespace)
|
||||
'thread-call (copy-var thread-call core-async-namespace)
|
||||
'-vthread-call (copy-var -vthread-call core-async-namespace)
|
||||
'timeout (copy-var timeout core-async-namespace)
|
||||
|
|
@ -157,3 +193,4 @@
|
|||
(def async-protocols-namespace
|
||||
{:obj async-protocols-ns
|
||||
'ReadPort (copy-var protocols/ReadPort async-protocols-ns)})
|
||||
;; trigger CI
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
(case os
|
||||
:mac (sh "open" url)
|
||||
:linux (sh "xdg-open" url)
|
||||
:windows (sh "cmd" "/C" "start" url)))))
|
||||
:windows (sh "cmd" "/C" "start" (.replace url "&" "^&"))))))
|
||||
|
||||
(def browse-namespace
|
||||
{'*open-url-script* open-url-script
|
||||
|
|
|
|||
6
src/babashka/impl/clojure/java/process.clj
Normal file
6
src/babashka/impl/clojure/java/process.clj
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
(ns babashka.impl.clojure.java.process
|
||||
(:require [clojure.java.process]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(def cjp (sci/create-ns 'clojure.java.process nil))
|
||||
(def cjp-namespace (sci/copy-ns clojure.java.process cjp))
|
||||
|
|
@ -55,6 +55,13 @@ by default when a new command-line REPL is started."} repl-requires
|
|||
'[[clojure.repl :refer (source apropos pst dir doc find-doc)]
|
||||
[clojure.pprint :refer (pp pprint)]])
|
||||
|
||||
(defmacro with-read-known
|
||||
"Evaluates body with *read-eval* set to a \"known\" value,
|
||||
i.e. substituting true for :unknown if necessary."
|
||||
[& body]
|
||||
`(binding [*read-eval* (if (= :unknown *read-eval*) true *read-eval*)]
|
||||
~@body))
|
||||
|
||||
(defn repl
|
||||
"Generic, reusable, read-eval-print loop. By default, reads from *in*,
|
||||
writes to *out*, and prints exception summaries to *err*. If you use the
|
||||
|
|
@ -111,8 +118,9 @@ by default when a new command-line REPL is started."} repl-requires
|
|||
:file "<repl>"
|
||||
:type :sci/error) e)))))))
|
||||
(catch Throwable e
|
||||
(let [e' (ex-cause e)]
|
||||
(caught e)
|
||||
(set! *e e))))]
|
||||
(set! *e e')))))]
|
||||
(with-bindings
|
||||
(try
|
||||
(init)
|
||||
|
|
|
|||
7
src/babashka/impl/clojure/reflect.clj
Normal file
7
src/babashka/impl/clojure/reflect.clj
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
(ns babashka.impl.clojure.reflect
|
||||
(:require [clojure.reflect]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(def rns (sci/create-ns 'clojure.reflect))
|
||||
|
||||
(def reflect-namespace {'reflect (sci/copy-var clojure.reflect/reflect rns)})
|
||||
|
|
@ -660,14 +660,12 @@
|
|||
|
||||
;;; DEFINING FIXTURES
|
||||
|
||||
(def ^:private ns->fixtures (atom {}))
|
||||
|
||||
(defn- add-ns-meta
|
||||
"Adds elements in coll to the current namespace metadata as the
|
||||
value of key."
|
||||
{:added "1.1"}
|
||||
[key coll]
|
||||
(swap! ns->fixtures assoc-in [(sci-namespaces/sci-ns-name @sci/ns) key] coll))
|
||||
(alter-meta! @sci/ns assoc key coll))
|
||||
|
||||
(defmulti use-fixtures
|
||||
"Wrap test runs in a fixture function to perform setup and
|
||||
|
|
@ -677,10 +675,10 @@
|
|||
(fn [fixture-type & args] fixture-type))
|
||||
|
||||
(defmethod use-fixtures :each [fixture-type & args]
|
||||
(add-ns-meta ::each-fixtures args))
|
||||
(add-ns-meta :clojure.test/each-fixtures args))
|
||||
|
||||
(defmethod use-fixtures :once [fixture-type & args]
|
||||
(add-ns-meta ::once-fixtures args))
|
||||
(add-ns-meta :clojure.test/once-fixtures args))
|
||||
|
||||
(defn- default-fixture
|
||||
"The default, empty, fixture function. Just calls its argument."
|
||||
|
|
@ -731,10 +729,8 @@
|
|||
[vars]
|
||||
(doseq [[ns vars] (group-by (comp :ns meta) vars)
|
||||
:when ns]
|
||||
(let [ns-name (sci-namespaces/sci-ns-name ns)
|
||||
fixtures (get @ns->fixtures ns-name)
|
||||
once-fixture-fn (join-fixtures (::once-fixtures fixtures))
|
||||
each-fixture-fn (join-fixtures (::each-fixtures fixtures))]
|
||||
(let [once-fixture-fn (join-fixtures (:clojure.test/once-fixtures (meta ns)))
|
||||
each-fixture-fn (join-fixtures (:clojure.test/each-fixtures (meta ns)))]
|
||||
(once-fixture-fn
|
||||
(fn []
|
||||
(doseq [v vars]
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
(ns babashka.impl.clojure.tools.reader
|
||||
(:refer-clojure :exclude [read])
|
||||
(:refer-clojure :exclude [read read-string])
|
||||
(:require
|
||||
[clojure.tools.reader.reader-types :as rt]
|
||||
[edamame.core :as e]
|
||||
[sci.core :as sci]
|
||||
[clojure.tools.reader.reader-types :as rt]))
|
||||
[sci.ctx-store :as ctx]
|
||||
[sci.impl.parser :as p]))
|
||||
|
||||
(def rns (sci/create-ns 'clojure.tools.reader))
|
||||
|
||||
|
|
@ -15,6 +17,15 @@
|
|||
:location? seq?
|
||||
:end-location false}))
|
||||
|
||||
(def default-data-reader-fn (sci/new-dynamic-var '*default-data-reader-fn* nil {:ns rns}))
|
||||
(def alias-map (sci/new-dynamic-var '*alias-map* nil {:ns rns}))
|
||||
|
||||
(defn resolve-tag [sym]
|
||||
;; https://github.com/clojure/tools.reader/blob/ff18b1b872398a99e3e2941a0ed9abc0c2dec151/src/main/clojure/clojure/tools/reader.clj#L858
|
||||
(or (default-data-readers sym)
|
||||
(when-let [f @default-data-reader-fn]
|
||||
(f sym))))
|
||||
|
||||
;; Added for compatibility with tools.namespace
|
||||
(defn read
|
||||
"Reads the first object from an IPushbackReader or a java.io.PushbackReader.
|
||||
|
|
@ -38,7 +49,17 @@
|
|||
([{eof :eof :as opts :or {eof :eofthrow}} reader]
|
||||
(let [opts (assoc default-opts
|
||||
:read-cond (:read-cond opts)
|
||||
:features (:features opts))
|
||||
:features (:features opts)
|
||||
:readers (fn [sym]
|
||||
(resolve-tag sym))
|
||||
:auto-resolve (fn [alias]
|
||||
(if (= :current alias)
|
||||
(symbol (str @sci/ns))
|
||||
(or (when-let [alias-map @alias-map]
|
||||
(@alias-map alias))
|
||||
(sci/eval-form (ctx/get-ctx)
|
||||
(list 'get '(ns-aliases *ns*)
|
||||
(list 'quote alias)))))))
|
||||
v (e/parse-next reader opts)]
|
||||
(if (identical? ::e/eof v)
|
||||
(if (identical? :eofthrow eof)
|
||||
|
|
@ -53,4 +74,18 @@
|
|||
sentinel)
|
||||
v))))
|
||||
|
||||
(def reader-namespace {'read (sci/copy-var read rns)})
|
||||
(defn read-string
|
||||
([s] (read-string nil s))
|
||||
([opts s]
|
||||
(when (and s (not (identical? s "")))
|
||||
(read opts (rt/string-push-back-reader s)))))
|
||||
|
||||
(defn resolve-symbol [sym]
|
||||
(p/fully-qualify (ctx/get-ctx) sym))
|
||||
|
||||
(def reader-namespace
|
||||
{'read (sci/copy-var read rns)
|
||||
'read-string (sci/copy-var read-string rns)
|
||||
'resolve-symbol (sci/copy-var resolve-symbol rns)
|
||||
'*default-data-reader-fn* default-data-reader-fn
|
||||
'*alias-map* alias-map})
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@
|
|||
[clojure.tools.reader.reader-types :as rt]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(def edn-namespace {'read-string (sci/copy-var edn/read-string (sci/create-ns 'clojure.tools.reader.edn))})
|
||||
(def tr-edn-ns (sci/create-ns 'clojure.tools.reader.edn))
|
||||
|
||||
(def edn-namespace {'read-string (sci/copy-var edn/read-string tr-edn-ns)
|
||||
'read (sci/copy-var edn/read tr-edn-ns)})
|
||||
|
||||
(def rtns (sci/create-ns 'clojure.tools.reader.reader-types))
|
||||
|
||||
|
|
@ -14,4 +17,5 @@
|
|||
'read-char (sci/copy-var rt/read-char rtns)
|
||||
'unread (sci/copy-var rt/unread rtns)
|
||||
'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)
|
||||
'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)})
|
||||
'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)
|
||||
'string-push-back-reader (sci/copy-var rt/string-push-back-reader rtns)})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
[babashka.fs :as fs]
|
||||
[babashka.impl.classpath :as cp]
|
||||
[babashka.impl.common :refer [bb-edn]]
|
||||
[babashka.process :as process]
|
||||
[borkdude.deps :as deps]
|
||||
[clojure.string :as str]
|
||||
[sci.core :as sci]))
|
||||
|
|
@ -75,7 +76,14 @@
|
|||
;; paths are added manually above
|
||||
;; extra-paths are added as :paths in tasks
|
||||
:paths :tasks :raw :file :deps-root
|
||||
:min-bb-version)]
|
||||
:min-bb-version)
|
||||
;; associate deps-root to avoid cache conflict between different
|
||||
;; bb.edns with relative local/roots by the same name NOTE:
|
||||
;; deps-root is nil when bb.edn isn't used, so clashes may still
|
||||
;; happen with dynamic add-deps, but at least we don't invoke
|
||||
;; clojure CLI's java process each time we call a script from a
|
||||
;; different directory.
|
||||
deps-map (assoc deps-map :deps-root (str deps-root))]
|
||||
(binding [*print-namespace-maps* false]
|
||||
(let [deps-map (assoc-in deps-map [:aliases :org.babashka/defaults]
|
||||
{:replace-paths [] ;; babashka sets paths manually
|
||||
|
|
@ -91,12 +99,16 @@
|
|||
args (if force (cons "-Sforce" args) args)
|
||||
args (concat args [(str "-A:" (str/join ":" (cons ":org.babashka/defaults" aliases)))])
|
||||
bindings (cond->
|
||||
{#'deps/*env* env
|
||||
#'deps/*extra-env* extra-env
|
||||
#'deps/*exit-fn* (fn
|
||||
([_])
|
||||
([_exit-code msg]
|
||||
(throw (Exception. msg))))}
|
||||
{#'deps/*aux-process-fn* (fn [{:keys [cmd out]}]
|
||||
(process/shell
|
||||
{:cmd cmd
|
||||
:out out
|
||||
:env env
|
||||
:dir (when deps-root (str deps-root))
|
||||
:extra-env extra-env}))
|
||||
#'deps/*exit-fn* (fn [{:keys [message]}]
|
||||
(when message
|
||||
(throw (Exception. message))))}
|
||||
deps-root (assoc #'deps/*dir* (str deps-root)))
|
||||
cp (with-out-str (with-bindings bindings
|
||||
(apply deps/-main args)))
|
||||
|
|
|
|||
|
|
@ -1,10 +1,19 @@
|
|||
(ns babashka.impl.http-client
|
||||
(:require
|
||||
[babashka.http-client]
|
||||
[babashka.http-client.interceptors]
|
||||
[babashka.http-client.websocket]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(def hns (sci/create-ns 'babashka.http-client))
|
||||
(def wns (sci/create-ns 'babashka.http-client.websocket))
|
||||
(def ins (sci/create-ns 'babashka.http-client.interceptors))
|
||||
|
||||
(def http-client-namespace
|
||||
(sci/copy-ns babashka.http-client hns))
|
||||
|
||||
(def http-client-websocket-namespace
|
||||
(sci/copy-ns babashka.http-client.websocket wns))
|
||||
|
||||
(def http-client-interceptors-namespace
|
||||
(sci/copy-ns babashka.http-client.interceptors ins))
|
||||
|
|
|
|||
|
|
@ -1,11 +1,18 @@
|
|||
(ns babashka.impl.nrepl-server
|
||||
{:no-doc true}
|
||||
(:require
|
||||
[babashka.impl.classpath :as cp]
|
||||
[babashka.impl.clojure.core :as core-extras]
|
||||
[babashka.impl.common :as common]
|
||||
[babashka.nrepl.impl.server :refer [process-msg]]
|
||||
[babashka.nrepl.server :as server]
|
||||
[sci.core :as sci]))
|
||||
|
||||
(defmethod process-msg :classpath [rf result m]
|
||||
(rf result {:response {"status" ["done"]
|
||||
"classpath" (cp/split-classpath (cp/get-classpath))}
|
||||
:response-for (:msg m)}))
|
||||
|
||||
(defn start-server!
|
||||
([]
|
||||
(start-server! nil))
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
{:no-doc true}
|
||||
(:require [clojure.pprint :as pprint]
|
||||
[sci.core :as sci]
|
||||
[sci.pprint]))
|
||||
[sci.pprint]
|
||||
[babashka.impl.clojure.core.async]))
|
||||
|
||||
(defonce patched? (volatile! false))
|
||||
|
||||
|
|
|
|||
|
|
@ -14,11 +14,11 @@
|
|||
edn/read-string)
|
||||
deps (:deps deps)
|
||||
deps (assoc deps
|
||||
'babashka/fs {:mvn/version "0.3.17"}
|
||||
'babashka/fs {:mvn/version "0.5.25"}
|
||||
'babashka/babashka.curl {:mvn/version "0.1.2"}
|
||||
'babashka/babashka.core {:git/url "https://github.com/babashka/babashka.core"
|
||||
:git/sha "52a6037bd4b632bffffb04394fb4efd0cdab6b1e"}
|
||||
'babashka/process {:mvn/version "0.5.17"})
|
||||
'babashka/process {:mvn/version "0.6.23"})
|
||||
deps (dissoc deps
|
||||
'borkdude/sci
|
||||
'org.babashka/sci
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
'org.hsqldb/hsqldb)
|
||||
bb-edn-deps (:deps @common/bb-edn)
|
||||
deps (merge deps bb-edn-deps)
|
||||
deps (into (sorted-map) deps)
|
||||
paths (:paths @common/bb-edn)
|
||||
deps {:deps deps}
|
||||
deps (cond-> deps
|
||||
|
|
|
|||
|
|
@ -28,6 +28,10 @@
|
|||
(binding [process/*defaults* @defaults]
|
||||
(apply process/shell args)))
|
||||
|
||||
(defn exec [& args]
|
||||
(binding [process/*defaults* @defaults]
|
||||
(apply process/exec args)))
|
||||
|
||||
(def process-namespace
|
||||
{'parse-args (copy-var process/parse-args tns)
|
||||
'process* (copy-var process/process* tns)
|
||||
|
|
@ -42,6 +46,6 @@
|
|||
'*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 exec tns)
|
||||
'shell (copy-var shell tns)
|
||||
'alive? (copy-var process/alive? tns)})
|
||||
|
|
|
|||
|
|
@ -79,6 +79,18 @@
|
|||
(handle [sig]
|
||||
((method-or-bust methods 'handle) this sig)))
|
||||
|
||||
["java.io.InputStream" #{}]
|
||||
(proxy [java.io.InputStream] []
|
||||
(available [] ((method-or-bust methods 'available) this))
|
||||
(close [] ((method-or-bust methods 'close) this))
|
||||
(read
|
||||
([]
|
||||
((method-or-bust methods 'read) this))
|
||||
([bs]
|
||||
((method-or-bust methods 'read) this bs))
|
||||
([bs off len]
|
||||
((method-or-bust methods 'read) this bs off len))))
|
||||
|
||||
["java.io.PipedInputStream" #{}]
|
||||
(proxy [java.io.PipedInputStream] []
|
||||
(available [] ((method-or-bust methods 'available) this))
|
||||
|
|
@ -112,6 +124,24 @@
|
|||
((method-or-bust methods 'write) this b))
|
||||
([b off len]
|
||||
((method-or-bust methods 'write) this b off len))))
|
||||
["javax.net.ssl.X509ExtendedTrustManager" #{}]
|
||||
(proxy [javax.net.ssl.X509ExtendedTrustManager] []
|
||||
(checkClientTrusted
|
||||
([x y]
|
||||
((method-or-bust methods 'checkClientTrusted) this x y))
|
||||
([x y z]
|
||||
((method-or-bust methods 'checkClientTrusted) this x y z)))
|
||||
(checkServerTrusted
|
||||
([x y]
|
||||
((method-or-bust methods 'checkServerTrusted) this x y))
|
||||
([x y z]
|
||||
((method-or-bust methods 'checkServerTrusted) this x y z)))
|
||||
(getAcceptedIssuers [] ((method-or-bust methods 'getAcceptedIssuers) this)))
|
||||
|
||||
["java.lang.ThreadLocal" #{}]
|
||||
(proxy [java.lang.ThreadLocal] []
|
||||
(initialValue []
|
||||
((method-or-bust methods 'initialValue) this)))
|
||||
, ;; keep this for merge friendliness
|
||||
)))
|
||||
|
||||
|
|
@ -124,7 +154,9 @@
|
|||
{:methods [{:name "connectFailed"}
|
||||
{:name "select"}]}
|
||||
(class-sym (class (proxy-fn {:class javax.net.ssl.HostnameVerifier})))
|
||||
{:methods [{:name "verify"}]}})
|
||||
{:methods [{:name "verify"}]}
|
||||
(class-sym (class (proxy-fn {:class java.lang.ThreadLocal})))
|
||||
{:methods [{:name "get"}]}})
|
||||
|
||||
;;; Scratch
|
||||
|
||||
|
|
|
|||
|
|
@ -187,5 +187,4 @@
|
|||
|
||||
sun.misc.SignalHandler
|
||||
{handle [[this signal]]}
|
||||
|
||||
}))
|
||||
|
|
|
|||
|
|
@ -43,9 +43,19 @@
|
|||
"Inspired by skip-if-eol from clojure.main."
|
||||
[s]
|
||||
(let [c (r/read-char s)]
|
||||
(when-not (= c \newline)
|
||||
(when-not (= \newline c )
|
||||
(r/unread s c))))
|
||||
|
||||
(defn repl-read [sci-ctx in-stream _request-prompt request-exit]
|
||||
(if (nil? (r/peek-char in-stream))
|
||||
request-exit
|
||||
(let [v (parser/parse-next sci-ctx in-stream)]
|
||||
(skip-if-eol in-stream)
|
||||
(if (or (identical? :repl/quit v)
|
||||
(identical? :repl/exit v))
|
||||
request-exit
|
||||
v))))
|
||||
|
||||
(defn repl
|
||||
"REPL with predefined hooks for attachable socket server."
|
||||
([sci-ctx] (repl sci-ctx nil))
|
||||
|
|
@ -68,15 +78,8 @@
|
|||
(sio/println))
|
||||
(eval-form sci-ctx `(apply require (quote ~m/repl-requires)))))
|
||||
:read (or read
|
||||
(fn [_request-prompt request-exit]
|
||||
(if (nil? (r/peek-char in))
|
||||
request-exit
|
||||
(let [v (parser/parse-next sci-ctx in)]
|
||||
(skip-if-eol in)
|
||||
(if (or (identical? :repl/quit v)
|
||||
(identical? :repl/exit v))
|
||||
request-exit
|
||||
v)))))
|
||||
(fn [request-prompt request-exit]
|
||||
(repl-read sci-ctx in request-prompt request-exit)))
|
||||
:eval (or eval
|
||||
(fn [expr]
|
||||
(sci/with-bindings {sci/file "<repl>"
|
||||
|
|
|
|||
52
src/babashka/impl/sci.clj
Normal file
52
src/babashka/impl/sci.clj
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
(ns babashka.impl.sci
|
||||
{:no-doc true}
|
||||
(:require [sci.core :as sci]
|
||||
[sci.ctx-store :as store]))
|
||||
|
||||
(def sns (sci/create-ns 'sci.core nil))
|
||||
|
||||
(defmacro copy-ns
|
||||
"Returns map of names to SCI vars as a result of copying public
|
||||
Clojure vars from ns-sym (a symbol). Attaches sci-ns (result of
|
||||
sci/create-ns) to meta. Copies :name, :macro :doc, :no-doc
|
||||
and :argslists metadata.
|
||||
|
||||
Options:
|
||||
|
||||
- :exclude: a seqable of names to exclude from the
|
||||
namespace. Defaults to none.
|
||||
|
||||
- :copy-meta: a seqable of keywords to copy from the original var
|
||||
meta. Use :all instead of a seqable to copy all. Defaults
|
||||
to [:doc :arglists :macro].
|
||||
|
||||
- :exclude-when-meta: seqable of keywords; vars with meta matching
|
||||
these keys are excluded. Defaults to [:no-doc :skip-wiki]
|
||||
|
||||
The selection of vars is done at compile time which is mostly
|
||||
important for ClojureScript to not pull in vars into the compiled
|
||||
JS. Any additional vars can be added after the fact with sci/copy-var
|
||||
manually."
|
||||
([ns-sym sci-ns] `(sci.core/copy-ns ~ns-sym ~sci-ns nil))
|
||||
([ns-sym sci-ns opts]
|
||||
;; this branch is hit by macroexpanding in JVM Clojure, not in the CLJS compiler
|
||||
(let [publics-map (sci/eval-form (store/get-ctx) (list 'ns-publics (list 'quote ns-sym)))
|
||||
publics-map (#'sci/process-publics publics-map opts)
|
||||
mf (#'sci/meta-fn (:copy-meta opts))
|
||||
publics-map (#'sci/exclude-when-meta
|
||||
publics-map
|
||||
meta
|
||||
(fn [k]
|
||||
(list 'quote k))
|
||||
(fn [var m]
|
||||
{:name (list 'quote (:name m))
|
||||
:var var
|
||||
:meta (list 'quote (mf m))})
|
||||
(or (:exclude-when-meta opts)
|
||||
[:no-doc :skip-wiki]))]
|
||||
`(sci.core/-copy-ns ~publics-map ~sci-ns))))
|
||||
|
||||
(def sci-core-namespace
|
||||
(assoc (sci/copy-ns sci.core sns {:exclude [copy-ns]})
|
||||
'copy-ns (sci/copy-var copy-ns sns)
|
||||
'-copy-ns (sci/copy-var sci/-copy-ns sns)))
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
(ns babashka.impl.server
|
||||
(:require [babashka.impl.clojure.core.server :as server]
|
||||
[babashka.impl.common :as common]
|
||||
[babashka.impl.repl :as repl]
|
||||
[babashka.impl.socket-repl :as socket-repl]
|
||||
[sci.core :as sci]))
|
||||
|
||||
|
|
@ -17,9 +18,14 @@
|
|||
(fn [& args]
|
||||
(apply server/start-server (common/ctx) args)))
|
||||
|
||||
(def repl-read
|
||||
(fn [& args]
|
||||
(apply repl/repl-read (common/ctx) @sci/in args)))
|
||||
|
||||
(def clojure-core-server-namespace
|
||||
{'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)
|
||||
'stop-server (sci/copy-var server/stop-server sns)})
|
||||
'stop-server (sci/copy-var server/stop-server sns)
|
||||
'repl-read (sci/copy-var repl-read sns)})
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
[babashka.impl.process :as pp]
|
||||
[babashka.process :as p]
|
||||
[clojure.core.async :refer [<!!]]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[rewrite-clj.node :as node]
|
||||
[rewrite-clj.parser :as parser]
|
||||
|
|
@ -386,7 +385,7 @@
|
|||
loc (zip/down loc)]
|
||||
(into []
|
||||
(comp
|
||||
(take-nth 2 )
|
||||
(take-nth 2)
|
||||
(take-while #(not (zip/end? %)))
|
||||
(filter zip/sexpr-able?)
|
||||
(map zip/sexpr)
|
||||
|
|
@ -426,8 +425,11 @@
|
|||
([task] (run task nil))
|
||||
([task {:keys [:parallel]
|
||||
:or {parallel (:parallel (current-task))}}]
|
||||
(let [[[expr]] (assemble-task task parallel)]
|
||||
(sci/eval-string* (ctx) expr))))
|
||||
(let [[[expr] exit-code] (assemble-task task parallel)]
|
||||
(if (or (nil? exit-code) (zero? exit-code))
|
||||
(sci/eval-string* (ctx) expr)
|
||||
(throw (ex-info nil
|
||||
{:babashka/exit exit-code}))))))
|
||||
|
||||
(defn exec
|
||||
([sym]
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
[babashka.deps :as bdeps]
|
||||
[babashka.fs :as fs]
|
||||
[babashka.impl.bencode :refer [bencode-namespace]]
|
||||
[babashka.impl.cheshire :refer [cheshire-core-namespace]]
|
||||
[babashka.impl.cheshire :refer [cheshire-core-namespace cheshire-factory-namespace]]
|
||||
[babashka.impl.classes :as classes :refer [classes-namespace]]
|
||||
[babashka.impl.classpath :as cp :refer [classpath-namespace]]
|
||||
[babashka.impl.cli :as cli]
|
||||
|
|
@ -16,9 +16,11 @@
|
|||
[babashka.impl.clojure.instant :as instant]
|
||||
[babashka.impl.clojure.java.browse :refer [browse-namespace]]
|
||||
[babashka.impl.clojure.java.io :refer [io-namespace]]
|
||||
[babashka.impl.clojure.java.process :refer [cjp-namespace]]
|
||||
[babashka.impl.clojure.java.shell :refer [shell-namespace]]
|
||||
[babashka.impl.clojure.main :as clojure-main :refer [demunge]]
|
||||
[babashka.impl.clojure.math :refer [math-namespace]]
|
||||
[babashka.impl.clojure.reflect :refer [reflect-namespace]]
|
||||
[babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]]
|
||||
[babashka.impl.clojure.tools.reader :refer [reader-namespace]]
|
||||
[babashka.impl.clojure.tools.reader-types :refer [edn-namespace
|
||||
|
|
@ -34,7 +36,9 @@
|
|||
[babashka.impl.error-handler :refer [error-handler]]
|
||||
[babashka.impl.features :as features]
|
||||
[babashka.impl.fs :refer [fs-namespace]]
|
||||
[babashka.impl.http-client :refer [http-client-namespace]]
|
||||
[babashka.impl.http-client :refer [http-client-namespace
|
||||
http-client-websocket-namespace
|
||||
http-client-interceptors-namespace]]
|
||||
[babashka.impl.nrepl-server :refer [nrepl-server-namespace]]
|
||||
[babashka.impl.pods :as pods]
|
||||
[babashka.impl.pprint :refer [pprint-namespace]]
|
||||
|
|
@ -45,6 +49,7 @@
|
|||
[babashka.impl.reify2 :refer [reify-fn]]
|
||||
[babashka.impl.repl :as repl]
|
||||
[babashka.impl.rewrite-clj :as rewrite]
|
||||
[babashka.impl.sci :refer [sci-core-namespace]]
|
||||
[babashka.impl.server :refer [clojure-core-server-namespace]]
|
||||
[babashka.impl.socket-repl :as socket-repl]
|
||||
[babashka.impl.tasks :as tasks :refer [tasks-namespace]]
|
||||
|
|
@ -105,6 +110,8 @@
|
|||
|
||||
(def version common/version)
|
||||
|
||||
(def build-commit-sha (or (System/getenv "BABASHKA_SHA") ""))
|
||||
|
||||
(defn parse-version [version]
|
||||
(mapv #(Integer/parseInt %)
|
||||
(-> version
|
||||
|
|
@ -137,7 +144,7 @@
|
|||
(binding [*out* *err*]
|
||||
(apply println msgs)))
|
||||
|
||||
(defn print-help [_ctx _command-line-args]
|
||||
(defn print-help []
|
||||
(println (str "Babashka v" version))
|
||||
(println "
|
||||
Usage: bb [svm-opts] [global-opts] [eval opts] [cmdline args]
|
||||
|
|
@ -213,8 +220,7 @@ Tooling:
|
|||
File names take precedence over subcommand names.
|
||||
Remaining arguments are bound to *command-line-args*.
|
||||
Use -- to separate script command line args from bb command line args.
|
||||
When no eval opts or subcommand is provided, the implicit subcommand is repl.")
|
||||
[nil 0])
|
||||
When no eval opts or subcommand is provided, the implicit subcommand is repl."))
|
||||
|
||||
(defn print-doc [ctx command-line-args]
|
||||
(let [arg (first command-line-args)
|
||||
|
|
@ -257,6 +263,7 @@ Use bb run --help to show this help output.
|
|||
(format
|
||||
(str/trim "
|
||||
{:babashka/version \"%s\"
|
||||
:git/sha \"%s\"
|
||||
:feature/csv %s
|
||||
:feature/java-nio %s
|
||||
:feature/java-time %s
|
||||
|
|
@ -277,6 +284,7 @@ Use bb run --help to show this help output.
|
|||
:feature/logging %s
|
||||
:feature/priority-map %s}")
|
||||
version
|
||||
build-commit-sha
|
||||
features/csv?
|
||||
features/java-nio?
|
||||
features/java-time?
|
||||
|
|
@ -354,8 +362,6 @@ Use bb run --help to show this help output.
|
|||
(defn catvec [& xs]
|
||||
(into [] cat xs))
|
||||
|
||||
(def sci-ns (sci/create-ns 'sci.core))
|
||||
|
||||
(def main-var (sci/new-var 'main nil {:ns clojure-main-ns}))
|
||||
|
||||
(def namespaces
|
||||
|
|
@ -373,6 +379,7 @@ Use bb run --help to show this help output.
|
|||
'babashka.signal signal-ns
|
||||
'clojure.java.io io-namespace
|
||||
'cheshire.core cheshire-core-namespace
|
||||
'cheshire.factory cheshire-factory-namespace
|
||||
'clojure.data data/data-namespace
|
||||
'clojure.instant instant/instant-namespace
|
||||
'clojure.stacktrace stacktrace-namespace
|
||||
|
|
@ -386,9 +393,11 @@ Use bb run --help to show this help output.
|
|||
(repl/start-repl! (common/ctx) opts))) {:ns clojure-main-ns})
|
||||
'with-bindings (sci/copy-var clojure-main/with-bindings clojure-main-ns)
|
||||
'repl-caught (sci/copy-var repl/repl-caught clojure-main-ns)
|
||||
'with-read-known (sci/copy-var clojure-main/with-read-known clojure-main-ns)
|
||||
'main main-var}
|
||||
'clojure.test t/clojure-test-namespace
|
||||
'clojure.math math-namespace
|
||||
'clojure.java.process cjp-namespace
|
||||
'babashka.classpath classpath-namespace
|
||||
'babashka.classes classes-namespace
|
||||
'clojure.pprint pprint-namespace
|
||||
|
|
@ -408,6 +417,7 @@ Use bb run --help to show this help output.
|
|||
'clojure.tools.reader reader-namespace
|
||||
'clojure.core.async async-namespace
|
||||
'clojure.core.async.impl.protocols async-protocols-namespace
|
||||
'clojure.reflect reflect-namespace
|
||||
'rewrite-clj.node rewrite/node-namespace
|
||||
'rewrite-clj.paredit rewrite/paredit-namespace
|
||||
'rewrite-clj.parser rewrite/parser-namespace
|
||||
|
|
@ -418,20 +428,17 @@ Use bb run --help to show this help output.
|
|||
{'catvec (sci/copy-var catvec
|
||||
(sci/create-ns 'clojure.core.rrb-vector))})
|
||||
'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)
|
||||
}
|
||||
'sci.core sci-core-namespace
|
||||
'babashka.cli cli/cli-namespace
|
||||
'babashka.http-client http-client-namespace}
|
||||
'babashka.http-client http-client-namespace
|
||||
'babashka.http-client.websocket http-client-websocket-namespace
|
||||
'babashka.http-client.interceptors http-client-interceptors-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))
|
||||
features/yaml? (assoc 'clj-yaml.core @(resolve 'babashka.impl.yaml/yaml-namespace)
|
||||
'flatland.ordered.map @(resolve 'babashka.impl.ordered/ordered-map-ns))
|
||||
'flatland.ordered.map @(resolve 'babashka.impl.ordered/ordered-map-ns)
|
||||
'flatland.ordered.set @(resolve 'babashka.impl.ordered/ordered-set-ns))
|
||||
features/jdbc? (assoc 'next.jdbc @(resolve 'babashka.impl.jdbc/njdbc-namespace)
|
||||
'next.jdbc.sql @(resolve 'babashka.impl.jdbc/next-sql-namespace)
|
||||
'next.jdbc.result-set @(resolve 'babashka.impl.jdbc/result-set-namespace))
|
||||
|
|
@ -479,6 +486,8 @@ Use bb run --help to show this help output.
|
|||
'selmer.validator
|
||||
@(resolve 'babashka.impl.selmer/selmer-validator-namespace))
|
||||
features/logging? (assoc 'taoensso.timbre @(resolve 'babashka.impl.logging/timbre-namespace)
|
||||
'taoensso.timbre.appenders.core @(resolve 'babashka.impl.logging/timbre-appenders-namespace)
|
||||
'taoensso.encore @(resolve 'babashka.impl.logging/encore-namespace)
|
||||
'clojure.tools.logging
|
||||
@(resolve 'babashka.impl.logging/tools-logging-namespace)
|
||||
'clojure.tools.logging.impl
|
||||
|
|
@ -490,7 +499,8 @@ Use bb run --help to show this help output.
|
|||
|
||||
(def edn-readers (cond-> {}
|
||||
features/yaml?
|
||||
(assoc 'ordered/map @(resolve 'flatland.ordered.map/ordered-map))
|
||||
(assoc 'ordered/map @(resolve 'flatland.ordered.map/ordered-map)
|
||||
'ordered/set @(resolve 'flatland.ordered.set/ordered-set))
|
||||
features/xml?
|
||||
(assoc 'xml/ns @(resolve 'clojure.data.xml.name/uri-symbol)
|
||||
'xml/element @(resolve 'clojure.data.xml.node/tagged-element))))
|
||||
|
|
@ -614,7 +624,7 @@ Use bb run --help to show this help output.
|
|||
:uberjar (first options))))
|
||||
("--repl")
|
||||
(let [options (next options)]
|
||||
(recur (next options)
|
||||
(recur options
|
||||
(assoc opts-map
|
||||
:repl true)))
|
||||
("--socket-repl")
|
||||
|
|
@ -723,32 +733,37 @@ Use bb run --help to show this help output.
|
|||
(defn parse-file-opt
|
||||
[options opts-map]
|
||||
(let [opt (first options)]
|
||||
(if (and opt (fs/exists? opt))
|
||||
(let [opts (assoc opts-map
|
||||
(if (and opt (and (fs/exists? opt)
|
||||
(not (fs/directory? opt))))
|
||||
[nil (assoc opts-map
|
||||
(if (str/ends-with? opt ".jar")
|
||||
:jar :file) opt
|
||||
:command-line-args (next options))]
|
||||
opts)
|
||||
(assoc opts-map :command-line-args options))))
|
||||
[options opts-map])))
|
||||
|
||||
(defn parse-opts
|
||||
([options] (parse-opts options nil))
|
||||
([options opts-map]
|
||||
(let [opt (first options)
|
||||
tasks (into #{} (map str) (keys (:tasks @common/bb-edn)))]
|
||||
task-map (:tasks @common/bb-edn)
|
||||
tasks (into #{} (map str) (keys task-map))]
|
||||
(when-let [commands (seq (filter (fn [task]
|
||||
(and (command? task)
|
||||
(not (:override-builtin (get task-map (symbol task))))))
|
||||
tasks))]
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: task(s)" (str/join ", " (map #(format "'%s'" %) commands)) "override built-in command(s). Use :override-builtin true to disable warning.")))
|
||||
(if-not opt opts-map
|
||||
;; FILE > TASK > SUBCOMMAND
|
||||
(cond
|
||||
(.isFile (io/file opt))
|
||||
(if (or (:file opts-map) (:jar opts-map))
|
||||
opts-map ; we've already parsed the file opt
|
||||
(parse-file-opt options opts-map))
|
||||
|
||||
(and (not (or (:file opts-map)
|
||||
(:jar opts-map)))
|
||||
(.isFile (io/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)
|
||||
|
||||
|
|
@ -828,13 +843,12 @@ Use bb run --help to show this help output.
|
|||
sci/print-length @sci/print-length
|
||||
;; when adding vars here, also add them to repl.clj and nrepl_server.clj
|
||||
]
|
||||
(let [{version-opt :version
|
||||
:keys [:shell-in :edn-in :shell-out :edn-out
|
||||
:help :file :command-line-args
|
||||
(let [{:keys [:shell-in :edn-in :shell-out :edn-out
|
||||
:file :command-line-args
|
||||
:expressions :stream? :init
|
||||
:repl :socket-repl :nrepl
|
||||
:debug :classpath :force?
|
||||
:main :uberscript :describe?
|
||||
:main :uberscript
|
||||
:jar :uberjar :clojure
|
||||
:doc :run :list-tasks
|
||||
:print-deps :prepare]
|
||||
|
|
@ -875,7 +889,7 @@ Use bb run --help to show this help output.
|
|||
abs-path))
|
||||
_ (when jar
|
||||
(cp/add-classpath jar))
|
||||
load-fn (fn [{:keys [:namespace :reload]}]
|
||||
load-fn (fn [{:keys [namespace reload ctx]}]
|
||||
(let [loader @cp/the-url-loader]
|
||||
(or
|
||||
(when ;; ignore built-in namespaces when uberscripting, unless with :reload
|
||||
|
|
@ -908,7 +922,7 @@ Use bb run --help to show this help output.
|
|||
res)))
|
||||
(let [rps (cp/resource-paths namespace)
|
||||
rps (mapv #(str "src/babashka/" %) rps)]
|
||||
(when-let [url (some #(io/resource %) rps)]
|
||||
(when-let [url (some io/resource rps)]
|
||||
(let [source (slurp url)]
|
||||
{:file (str url)
|
||||
:source source})))
|
||||
|
|
@ -919,7 +933,9 @@ Use bb run --help to show this help output.
|
|||
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))))
|
||||
(when-not (sci/find-ns ctx namespace)
|
||||
(let [file (str/replace (namespace-munge namespace) "." "/")]
|
||||
(throw (new java.io.FileNotFoundException (format "Could not locate %s.bb, %s.clj or %s.cljc on classpath." file file file)))))))))
|
||||
main (if (and jar (not main))
|
||||
(when-let [res (cp/getResource
|
||||
(cp/new-loader [jar])
|
||||
|
|
@ -1009,13 +1025,9 @@ Use bb run --help to show this help output.
|
|||
exit-code
|
||||
(or exit-code
|
||||
(second
|
||||
(cond version-opt
|
||||
[(print-version) 0]
|
||||
help (print-help sci-ctx command-line-args)
|
||||
doc (print-doc sci-ctx command-line-args)
|
||||
describe?
|
||||
[(print-describe) 0]
|
||||
repl [(repl/start-repl! sci-ctx) 0]
|
||||
(cond doc (print-doc sci-ctx command-line-args)
|
||||
repl (sci/binding [core/command-line-args command-line-args]
|
||||
[(repl/start-repl! sci-ctx) 0])
|
||||
nrepl [(start-nrepl! nrepl) 0]
|
||||
uberjar [nil 0]
|
||||
list-tasks [(tasks/list-tasks sci-ctx) 0]
|
||||
|
|
@ -1063,7 +1075,8 @@ Use bb run --help to show this help output.
|
|||
clojure [nil (if-let [proc (bdeps/clojure command-line-args)]
|
||||
(-> @proc :exit)
|
||||
0)]
|
||||
:else [(repl/start-repl! sci-ctx) 0]))
|
||||
:else (sci/binding [core/command-line-args command-line-args]
|
||||
[(repl/start-repl! sci-ctx) 0])))
|
||||
1)]
|
||||
(flush)
|
||||
(when uberscript
|
||||
|
|
@ -1101,6 +1114,15 @@ Use bb run --help to show this help output.
|
|||
(uberjar/run uber-params))))))
|
||||
exit-code))))
|
||||
|
||||
(defn exec-without-deps [cli-opts]
|
||||
(let [{version-opt :version
|
||||
:keys [help describe?]} cli-opts]
|
||||
(cond
|
||||
version-opt (print-version)
|
||||
help (print-help)
|
||||
describe? (print-describe)))
|
||||
0)
|
||||
|
||||
(defn satisfies-min-version? [min-version]
|
||||
(let [[major-current minor-current patch-current] version-data
|
||||
[major-min minor-min patch-min] (parse-version min-version)]
|
||||
|
|
@ -1111,7 +1133,7 @@ Use bb run --help to show this help output.
|
|||
(>= patch-current patch-min)))))))
|
||||
|
||||
(defn read-bb-edn [string]
|
||||
(try (edn/read-string {:default tagged-literal} string)
|
||||
(try (edn/read-string {:default tagged-literal :eof nil} 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" {}))
|
||||
|
|
@ -1119,20 +1141,60 @@ Use bb run --help to show this help output.
|
|||
(println "Error during loading bb.edn:"))
|
||||
(throw e))))))
|
||||
|
||||
(defn binary-invoked-as-jar []
|
||||
(and (= "executable" (System/getProperty "org.graalvm.nativeimage.kind"))
|
||||
(when-let [bin (-> (java.lang.ProcessHandle/current)
|
||||
.info
|
||||
.command
|
||||
(.orElse nil))]
|
||||
(let [fn (fs/file-name bin)]
|
||||
(if (= "bb" fn)
|
||||
false
|
||||
(if (and (fs/windows?)
|
||||
(= "bb.exe" fn))
|
||||
false
|
||||
(when (try (with-open [_ (java.util.zip.ZipFile. (fs/file bin))])
|
||||
true
|
||||
(catch Exception _ false))
|
||||
bin)))))))
|
||||
|
||||
(defn resolve-symbolic-link [f]
|
||||
(if (and f (fs/exists? f))
|
||||
(try
|
||||
(str (fs/real-path f))
|
||||
(catch Exception _
|
||||
f))
|
||||
f))
|
||||
|
||||
(defn deps-not-needed [opts]
|
||||
(let [fast-path-opts [:version :help :describe?]]
|
||||
(some #(contains? opts %) fast-path-opts)))
|
||||
|
||||
(defn main [& args]
|
||||
(let [[args opts] (parse-global-opts args)
|
||||
{:keys [jar file config merge-deps] :as opts}
|
||||
(let [bin-jar (binary-invoked-as-jar)
|
||||
args (if bin-jar
|
||||
(list* "--jar" bin-jar "--" args)
|
||||
args)
|
||||
[args opts] (parse-global-opts args)
|
||||
[args {:keys [config merge-deps debug] :as opts}]
|
||||
(if-not (or (:file opts)
|
||||
(:jar opts))
|
||||
(parse-file-opt args opts)
|
||||
opts)
|
||||
abs-path #(-> % io/file .getAbsolutePath)
|
||||
[args opts])
|
||||
{:keys [jar file]} opts
|
||||
abs-path resolve-symbolic-link
|
||||
config (cond
|
||||
config (when (fs/exists? config) (abs-path config))
|
||||
jar (some-> [jar] cp/new-loader (cp/resource "META-INF/bb.edn") .toString)
|
||||
config (if (fs/exists? config) (abs-path config)
|
||||
(when debug
|
||||
(binding [*out* *err*]
|
||||
(println "[babashka] WARNING: config file does not exist:" config))
|
||||
nil))
|
||||
jar (let [jar (resolve-symbolic-link jar)]
|
||||
(some->> [jar] cp/new-loader (cp/resource "META-INF/bb.edn") .toString))
|
||||
:else (if (and file (fs/exists? file))
|
||||
;; file relative to bb.edn
|
||||
(let [rel-bb-edn (fs/file (fs/parent file) "bb.edn")]
|
||||
(let [file (abs-path file) ;; follow symlink
|
||||
rel-bb-edn (fs/file (fs/parent file) "bb.edn")]
|
||||
(if (fs/exists? rel-bb-edn)
|
||||
(abs-path rel-bb-edn)
|
||||
;; fall back to local bb.edn
|
||||
|
|
@ -1157,7 +1219,6 @@ Use bb run --help to show this help output.
|
|||
edn)]
|
||||
(vreset! common/bb-edn edn)))
|
||||
opts (parse-opts args opts)
|
||||
;; _ (.println System/err (str bb-edn))
|
||||
min-bb-version (:min-bb-version bb-edn)]
|
||||
(System/setProperty "java.class.path" "")
|
||||
(when min-bb-version
|
||||
|
|
@ -1165,7 +1226,9 @@ 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 opts)))
|
||||
(if (deps-not-needed opts)
|
||||
(exec-without-deps opts)
|
||||
(exec opts))))
|
||||
|
||||
(def musl?
|
||||
"Captured at compile time, to know if we are running inside a
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
(ns my.main-main
|
||||
(:require [my.impl :as impl])
|
||||
(:require [my.impl2 :as impl2]))
|
||||
(:require [my.impl2]))
|
||||
|
||||
(defn -main [& args]
|
||||
(impl/impl-fn args))
|
||||
(prn (impl/impl-fn args)))
|
||||
|
|
|
|||
22
test-resources/bytechannel_and_related_classes.bb
Normal file
22
test-resources/bytechannel_and_related_classes.bb
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
(ns bytechannel-and-related-classes
|
||||
(:require [clojure.java.io :as io])
|
||||
(:import (java.nio.file OpenOption
|
||||
StandardOpenOption)
|
||||
(java.nio.channels ByteChannel
|
||||
FileChannel
|
||||
ReadableByteChannel
|
||||
WritableByteChannel
|
||||
Channels)))
|
||||
|
||||
(when (and (let [ch (-> (.getBytes "Hello")
|
||||
(java.io.ByteArrayInputStream.)
|
||||
(Channels/newChannel))]
|
||||
(instance? ReadableByteChannel ch))
|
||||
(let [ch (-> (java.io.ByteArrayOutputStream.)
|
||||
(Channels/newChannel))]
|
||||
(instance? WritableByteChannel ch))
|
||||
(with-open [ch (FileChannel/open (-> (io/file "README.md")
|
||||
(.toPath))
|
||||
(into-array OpenOption [StandardOpenOption/READ]))]
|
||||
(instance? ByteChannel ch)))
|
||||
(println :success))
|
||||
1
test-resources/extended-attributes.txt
Normal file
1
test-resources/extended-attributes.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
42
|
||||
|
|
@ -93,13 +93,15 @@
|
|||
(test-doric-cyclic-dep-problem))
|
||||
|
||||
;;;; babashka.process
|
||||
(when-not (windows?)
|
||||
;; test built-in babashka.process
|
||||
(test-namespaces 'babashka.process-test)
|
||||
;; test built-in babashka.process
|
||||
(test-namespaces 'babashka.process-test)
|
||||
|
||||
(when (= "native" (System/getenv "BABASHKA_TEST_ENV"))
|
||||
;; test babashka.process from source
|
||||
#_{:clj-kondo/ignore [:duplicate-require]}
|
||||
(require '[babashka.process] :reload)
|
||||
(test-namespaces 'babashka.process-test))
|
||||
(System/setProperty "babashka.process.test.reload" "true")
|
||||
(test-namespaces 'babashka.process-test 'babashka.process-exec-test))
|
||||
|
||||
;;;; final exit code
|
||||
|
||||
|
|
|
|||
|
|
@ -94,7 +94,8 @@
|
|||
progrock/progrock {:git-url "https://github.com/weavejester/progrock", :test-namespaces (progrock.core-test), :git-sha "9c277a3244c52bfde19c21add327d6e20b94fdf5"}
|
||||
;; Don't run portal.jvm-test as it depends on headless chrome
|
||||
djblue/portal {:git-url "https://github.com/djblue/portal", :test-namespaces (portal.test-runner portal.runtime.cson-test portal.runtime.fs-test portal.e2e portal.bench), :git-sha "64e4624bcf3bee2dd47e3d8e47982c709738eb11"}
|
||||
integrant/integrant {:git-url "https://github.com/weavejester/integrant", :test-namespaces (integrant.test.foo integrant.test.quz integrant.test.bar integrant.test.baz integrant.core-test), :git-sha "32a46f5dca8a6b563a6dddf88bec887be3201b08"}
|
||||
integrant/integrant {:git-url "https://github.com/weavejester/integrant", :test-namespaces (integrant.test.foo integrant.test.quz integrant.test.bar integrant.test.baz integrant.core-test), :git-sha "a9fd7c02bd7201f36344b47142badc3c3ef22f88"
|
||||
:test-paths ["test"]}
|
||||
com.wsscode/cljc-misc {:git-url "https://github.com/wilkerlucio/cljc-misc", :test-namespaces (com.wsscode.misc.uuid-test com.wsscode.misc.macros-test com.wsscode.misc.math-test com.wsscode.misc.coll-test com.wsscode.misc.refs-test), :git-sha "dc8e31a200f9cacf86af10b63e40fcb448c259f4"}
|
||||
edn-query-language/eql {:git-url "https://github.com/edn-query-language/eql", :test-namespaces (edn-query-language.core-test), :git-sha "0d4f9745d98c3d20b81bb4bdce3e8e15db7fd094"}
|
||||
meta-merge/meta-merge {:git-url "https://github.com/weavejester/meta-merge", :test-namespaces (meta-merge.core-test), :git-sha "c968c38baccd4219fe0ba592d89af37ea8e426bf"}
|
||||
|
|
@ -186,4 +187,34 @@
|
|||
net.cgrand/xforms {:git-url "https://github.com/cgrand/xforms",
|
||||
:git-sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6",
|
||||
:test-namespaces [net.cgrand.xforms-test],
|
||||
:test-paths ["test"]}}
|
||||
:test-paths ["test"]}
|
||||
prismatic/plumbing {:git-url "https://github.com/plumatic/plumbing",
|
||||
:git-sha "424bc704f2db422de34269c139a5494314b3a43b",
|
||||
:test-namespaces [plumbing.core-test],
|
||||
:test-paths ["test"]}
|
||||
org.clj-commons/hickory {:git-url "https://github.com/clj-commons/hickory"
|
||||
:git-sha "9385b6708ef35f161732d8464b3a3aa57dd79f30"
|
||||
:test-paths ["test/cljc"]
|
||||
:test-namespaces [hickory.test.core
|
||||
hickory.test.convert
|
||||
hickory.test.hiccup-utils
|
||||
hickory.test.render
|
||||
hickory.test.select
|
||||
hickory.test.zip]}
|
||||
cheshire/cheshire {:git-url "https://github.com/dakrone/cheshire", :test-namespaces [cheshire.test.core], :manually-added true}
|
||||
com.potetm/fusebox {:git-url "https://github.com/potetm/fusebox"
|
||||
:git-sha "ac6d6a0a69510b009b3c1bb2247cd110fd9f7246"
|
||||
:test-paths ["test"]
|
||||
:test-namespaces [#_com.potetm.fusebox.bulkhead-test
|
||||
com.potetm.fusebox.bulwark-test
|
||||
com.potetm.fusebox.circuit-breaker-test
|
||||
com.potetm.fusebox.fallback-test
|
||||
com.potetm.fusebox.memoize-test
|
||||
#_com.potetm.fusebox.rate-limit-test
|
||||
com.potetm.fusebox.registry-test
|
||||
com.potetm.fusebox.retry-test
|
||||
#_com.potetm.fusebox.timeout-test]}
|
||||
net.sekao/odoyle-rules {:git-url "https://github.com/oakes/odoyle-rules"
|
||||
:git-sha "0b1d825ec45a998c4d3481dfb292e08ce6a47f0b"
|
||||
:test-paths ["test"]
|
||||
:test-namespaces [odoyle.rules-test]}}
|
||||
|
|
|
|||
793
test-resources/lib_tests/cheshire/test/core.clj
Normal file
793
test-resources/lib_tests/cheshire/test/core.clj
Normal file
|
|
@ -0,0 +1,793 @@
|
|||
(ns cheshire.test.core
|
||||
(:require [clojure.test :refer [deftest testing is are]]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.string :as str]
|
||||
[cheshire.core :as json]
|
||||
;; BB-TEST-PATCH: bb does not include cheshire.exact
|
||||
#_[cheshire.exact :as json-exact]
|
||||
;; BB-TEST-PATCH: bb does not include cheshire.gen
|
||||
#_[cheshire.generate :as gen]
|
||||
[cheshire.factory :as fact]
|
||||
;; BB-TEST-PATCH: bb does not include cheshire.parse
|
||||
#_[cheshire.parse :as parse])
|
||||
(:import ;; BB-TEST-PATCH: tests adjusted to check for general Exception instead of specific jackson exceptions
|
||||
#_(com.fasterxml.jackson.core JsonGenerationException
|
||||
JsonParseException)
|
||||
#_(com.fasterxml.jackson.core.exc StreamConstraintsException)
|
||||
(java.io StringReader StringWriter
|
||||
BufferedReader BufferedWriter
|
||||
IOException)
|
||||
;; BB-TEST-PATCH: bb does not support creating java.sql.Timestamps
|
||||
#_(java.sql Timestamp)
|
||||
(java.util Date UUID)))
|
||||
|
||||
(defn- str-of-len
|
||||
([len]
|
||||
(str-of-len len "x"))
|
||||
([len val]
|
||||
(apply str (repeat len val))))
|
||||
|
||||
(defn- nested-map [depth]
|
||||
(reduce (fn [acc n] {(str n) acc})
|
||||
{"0" "foo"}
|
||||
(range 1 depth)))
|
||||
|
||||
(defn- encode-stream->str [obj opts]
|
||||
(let [sw (StringWriter.)
|
||||
bw (BufferedWriter. sw)]
|
||||
(json/generate-stream obj bw opts)
|
||||
(.toString sw)))
|
||||
|
||||
(def test-obj {"int" 3 "long" (long -2147483647) "boolean" true
|
||||
"LongObj" (Long/parseLong "2147483647") "double" 1.23
|
||||
"nil" nil "string" "string" "vec" [1 2 3] "map" {"a" "b"}
|
||||
"list" (list "a" "b") "short" (short 21) "byte" (byte 3)})
|
||||
|
||||
(deftest t-ratio
|
||||
(let [n 1/2]
|
||||
(is (= (double n) (:num (json/decode (json/encode {:num n}) true))))))
|
||||
|
||||
(deftest t-long-wrap-around
|
||||
(is (= 2147483648 (json/decode (json/encode 2147483648)))))
|
||||
|
||||
(deftest t-bigint
|
||||
(let [n 9223372036854775808]
|
||||
(is (= n (:num (json/decode (json/encode {:num n}) true))))))
|
||||
|
||||
(deftest t-biginteger
|
||||
(let [n (BigInteger. "42")]
|
||||
(is (= n (:num (json/decode (json/encode {:num n}) true))))))
|
||||
|
||||
(deftest t-bigdecimal
|
||||
(let [n (BigDecimal. "42.5")]
|
||||
(is (= (.doubleValue n) (:num (json/decode (json/encode {:num n}) true))))
|
||||
;; BB-TEST-PATCH:
|
||||
#_(binding [parse/*use-bigdecimals?* true]
|
||||
(is (= n (:num (json/decode (json/encode {:num n}) true)))))))
|
||||
|
||||
(deftest test-string-round-trip
|
||||
(is (= test-obj (json/decode (json/encode test-obj)))))
|
||||
|
||||
(deftest test-generate-accepts-float
|
||||
(is (= "3.14" (json/encode 3.14))))
|
||||
|
||||
(deftest test-keyword-encode
|
||||
(is (= {"key" "val"}
|
||||
(json/decode (json/encode {:key "val"})))))
|
||||
|
||||
(deftest test-generate-set
|
||||
(is (= {"set" ["a" "b"]}
|
||||
(json/decode (json/encode {"set" #{"a" "b"}})))))
|
||||
|
||||
(deftest test-generate-empty-set
|
||||
(is (= {"set" []}
|
||||
(json/decode (json/encode {"set" #{}})))))
|
||||
|
||||
(deftest test-generate-empty-array
|
||||
(is (= {"array" []}
|
||||
(json/decode (json/encode {"array" []})))))
|
||||
|
||||
(deftest test-key-coercion
|
||||
(is (= {"foo" "bar" "1" "bat" "2" "bang" "3" "biz"}
|
||||
(json/decode
|
||||
(json/encode
|
||||
{:foo "bar" 1 "bat" (long 2) "bang" (bigint 3) "biz"})))))
|
||||
|
||||
(deftest test-keywords
|
||||
(is (= {:foo "bar" :bat 1}
|
||||
(json/decode (json/encode {:foo "bar" :bat 1}) true))))
|
||||
|
||||
(deftest test-symbols
|
||||
(is (= {"foo" "clojure.core/map"}
|
||||
(json/decode (json/encode {"foo" 'clojure.core/map})))))
|
||||
|
||||
(deftest test-accepts-java-map
|
||||
(is (= {"foo" 1}
|
||||
(json/decode
|
||||
(json/encode (doto (java.util.HashMap.) (.put "foo" 1)))))))
|
||||
|
||||
(deftest test-accepts-java-list
|
||||
(is (= [1 2 3]
|
||||
(json/decode (json/encode (doto (java.util.ArrayList. 3)
|
||||
(.add 1)
|
||||
(.add 2)
|
||||
(.add 3)))))))
|
||||
|
||||
(deftest test-accepts-java-set
|
||||
(is (= {"set" [1 2 3]}
|
||||
(json/decode (json/encode {"set" (doto (java.util.HashSet. 3)
|
||||
(.add 1)
|
||||
(.add 2)
|
||||
(.add 3))})))))
|
||||
|
||||
(deftest test-accepts-empty-java-set
|
||||
(is (= {"set" []}
|
||||
(json/decode (json/encode {"set" (java.util.HashSet. 3)})))))
|
||||
|
||||
(deftest test-nil
|
||||
(is (nil? (json/decode nil true))))
|
||||
|
||||
(deftest test-parsed-seq
|
||||
(let [br (BufferedReader. (StringReader. "1\n2\n3\n"))]
|
||||
(is (= (list 1 2 3) (json/parsed-seq br)))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support smile
|
||||
#_(deftest test-smile-round-trip
|
||||
(is (= test-obj (json/parse-smile (json/generate-smile test-obj)))))
|
||||
|
||||
(def bin-obj {"byte-array" (byte-array (map byte [1 2 3]))})
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support smile/cbor
|
||||
#_(deftest test-round-trip-binary
|
||||
(doseq [[p g] {json/parse-string json/generate-string
|
||||
json/parse-smile json/generate-smile
|
||||
json/parse-cbor json/generate-cbor}]
|
||||
(is (let [roundtripped (p (g bin-obj))]
|
||||
;; test value equality
|
||||
(is (= (->> bin-obj (get "byte-array") seq)
|
||||
(->> roundtripped (get "byte-array") seq)))))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support smile
|
||||
#_(deftest test-smile-factory
|
||||
(binding [fact/*smile-factory* (fact/make-smile-factory {})]
|
||||
(is (= {"a" 1} (-> {:a 1}
|
||||
json/generate-smile
|
||||
json/parse-smile)))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support smile/cbor
|
||||
#_(deftest test-smile-duplicate-detection
|
||||
(let [smile-data (byte-array [0x3a 0x29 0x0a 0x01 ;; smile header
|
||||
0xFa ;; object start
|
||||
0x80 0x61 ;; key a
|
||||
0xC2 ;; value 1
|
||||
0x80 0x61 ;; key a (again)
|
||||
0xC4 ;; value 2
|
||||
0xFB ;; object end
|
||||
])]
|
||||
(binding [fact/*smile-factory* (fact/make-smile-factory {:strict-duplicate-detection false})]
|
||||
(is (= {"a" 2} (json/parse-smile smile-data))))
|
||||
(binding [fact/*smile-factory* (fact/make-smile-factory {:strict-duplicate-detection true})]
|
||||
(is (thrown? JsonParseException (json/parse-smile smile-data))))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support cbor
|
||||
#_(deftest test-cbor-factory
|
||||
(binding [fact/*cbor-factory* (fact/make-cbor-factory {})]
|
||||
(is (= {"a" 1} (-> {:a 1}
|
||||
json/generate-cbor
|
||||
json/parse-cbor)))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support cbor
|
||||
#_(deftest test-cbor-duplicate-detection
|
||||
(let [cbor-data (byte-array [0xbf ;; object begin
|
||||
0x61 0x61 ;; key a
|
||||
0x01 ;; value 1
|
||||
0x61 0x61 ;; key a (again)
|
||||
0x02 ;; value 2
|
||||
0xff ;; object end
|
||||
])]
|
||||
(binding [fact/*cbor-factory* (fact/make-cbor-factory {:strict-duplicate-detection false})]
|
||||
(is (= {"a" 2} (json/parse-cbor cbor-data))))
|
||||
(binding [fact/*cbor-factory* (fact/make-cbor-factory {:strict-duplicate-detection true})]
|
||||
(is (thrown? JsonParseException (json/parse-cbor cbor-data))))))
|
||||
|
||||
(deftest test-aliases
|
||||
(is (= {"foo" "bar" "1" "bat" "2" "bang" "3" "biz"}
|
||||
(json/decode
|
||||
(json/encode
|
||||
{:foo "bar" 1 "bat" (long 2) "bang" (bigint 3) "biz"})))))
|
||||
|
||||
(deftest test-date
|
||||
(is (= {"foo" "1970-01-01T00:00:00Z"}
|
||||
(json/decode (json/encode {:foo (Date. (long 0))}))))
|
||||
(is (= {"foo" "1970-01-01"}
|
||||
(json/decode (json/encode {:foo (Date. (long 0))}
|
||||
{:date-format "yyyy-MM-dd"})))
|
||||
"encode with given date format"))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not support creating java.sql.Timestamps
|
||||
#_(deftest test-sql-timestamp
|
||||
(is (= {"foo" "1970-01-01T00:00:00Z"}
|
||||
(json/decode (json/encode {:foo (Timestamp. (long 0))}))))
|
||||
(is (= {"foo" "1970-01-01"}
|
||||
(json/decode (json/encode {:foo (Timestamp. (long 0))}
|
||||
{:date-format "yyyy-MM-dd"})))
|
||||
"encode with given date format"))
|
||||
|
||||
(deftest test-uuid
|
||||
(let [id (UUID/randomUUID)
|
||||
id-str (str id)]
|
||||
(is (= {"foo" id-str} (json/decode (json/encode {:foo id}))))))
|
||||
|
||||
(deftest test-char-literal
|
||||
(is (= "{\"foo\":\"a\"}" (json/encode {:foo \a}))))
|
||||
|
||||
(deftest test-streams
|
||||
(testing "parse-stream"
|
||||
(are [parsed parse parsee] (= parsed
|
||||
(parse (BufferedReader. (StringReader. parsee))))
|
||||
{"foo" "bar"} json/parse-stream "{\"foo\":\"bar\"}\n"
|
||||
{"foo" "bar"} json/parse-stream-strict "{\"foo\":\"bar\"}\n")
|
||||
|
||||
(are [parsed parse parsee] (= parsed
|
||||
(with-open [rdr (StringReader. parsee)]
|
||||
(parse rdr true)))
|
||||
{(keyword "foo baz") "bar"} json/parse-stream "{\"foo baz\":\"bar\"}\n"
|
||||
{(keyword "foo baz") "bar"} json/parse-stream-strict "{\"foo baz\":\"bar\"}\n"))
|
||||
|
||||
(testing "generate-stream"
|
||||
(let [sw (StringWriter.)
|
||||
bw (BufferedWriter. sw)]
|
||||
(json/generate-stream {"foo" "bar"} bw)
|
||||
(is (= "{\"foo\":\"bar\"}" (.toString sw))))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not include with-writer
|
||||
#_(deftest serial-writing
|
||||
(is (= "[\"foo\",\"bar\"]"
|
||||
(.toString
|
||||
(json/with-writer [(StringWriter.) nil]
|
||||
(json/write [] :start)
|
||||
(json/write "foo")
|
||||
(json/write "bar")
|
||||
(json/write [] :end)))))
|
||||
(is (= "[1,[2,3],4]"
|
||||
(.toString
|
||||
(json/with-writer [(StringWriter.) nil]
|
||||
(json/write [1 [2]] :start-inner)
|
||||
(json/write 3)
|
||||
(json/write [] :end)
|
||||
(json/write 4)
|
||||
(json/write [] :end)))))
|
||||
(is (= "{\"a\":1,\"b\":2,\"c\":3}"
|
||||
(.toString
|
||||
(json/with-writer [(StringWriter.) nil]
|
||||
(json/write {:a 1} :start)
|
||||
(json/write {:b 2} :bare)
|
||||
(json/write {:c 3} :end)))))
|
||||
(is (= (str "[\"start\",\"continue\",[\"implicitly-nested\"],"
|
||||
"[\"explicitly-nested\"],\"flatten\",\"end\"]")
|
||||
(.toString
|
||||
(json/with-writer [(StringWriter.) nil]
|
||||
(json/write ["start"] :start)
|
||||
(json/write "continue")
|
||||
(json/write ["implicitly-nested"])
|
||||
(json/write ["explicitly-nested"] :all)
|
||||
(json/write ["flatten"] :bare)
|
||||
(json/write ["end"] :end)))))
|
||||
(is (= "{\"head\":\"head info\",\"data\":[1,2,3],\"tail\":\"tail info\"}"
|
||||
(.toString
|
||||
(json/with-writer [(StringWriter.) nil]
|
||||
(json/write {:head "head info" :data []} :start-inner)
|
||||
(json/write 1)
|
||||
(json/write 2)
|
||||
(json/write 3)
|
||||
(json/write [] :end)
|
||||
(json/write {:tail "tail info"} :end))))))
|
||||
|
||||
;; BB-TEST-PATCH: modified so that json files could be found
|
||||
(deftest test-multiple-objs-in-file
|
||||
(is (= {"one" 1, "foo" "bar"}
|
||||
(first (json/parsed-seq (io/reader (io/resource "cheshire/test/multi.json"))))))
|
||||
(is (= {"two" 2, "foo" "bar"}
|
||||
(second (json/parsed-seq (io/reader (io/resource "cheshire/test/multi.json"))))))
|
||||
(with-open [r (io/reader (io/resource "cheshire/test/multi.json"))]
|
||||
(is (= [{"one" 1, "foo" "bar"} {"two" 2, "foo" "bar"}]
|
||||
(json/parsed-seq r)))))
|
||||
|
||||
(deftest test-jsondotorg-pass1
|
||||
(let [;; BB-TEST-PATCH: modified so that json files could be found
|
||||
string (slurp (io/resource "cheshire/test/pass1.json"))
|
||||
decoded-json (json/decode string)
|
||||
encoded-json (json/encode decoded-json)
|
||||
re-decoded-json (json/decode encoded-json)]
|
||||
(is (= decoded-json re-decoded-json))))
|
||||
|
||||
(deftest test-namespaced-keywords
|
||||
(is (= "{\"foo\":\"user/bar\"}"
|
||||
(json/encode {:foo :user/bar})))
|
||||
(is (= {:foo/bar "baz/eggplant"}
|
||||
(json/decode (json/encode {:foo/bar :baz/eggplant}) true))))
|
||||
|
||||
(deftest test-array-coerce-fn
|
||||
(is (= {"set" #{"a" "b"} "array" ["a" "b"] "map" {"a" 1}}
|
||||
(json/decode
|
||||
(json/encode {"set" #{"a" "b"} "array" ["a" "b"] "map" {"a" 1}}) false
|
||||
(fn [field-name] (if (= "set" field-name) #{} []))))))
|
||||
|
||||
(deftest t-symbol-encoding-for-non-resolvable-symbols
|
||||
(is (= "{\"bar\":\"clojure.core/pam\",\"foo\":\"clojure.core/map\"}"
|
||||
(json/encode (sorted-map :foo 'clojure.core/map :bar 'clojure.core/pam))))
|
||||
(is (= "{\"bar\":\"clojure.core/pam\",\"foo\":\"foo.bar/baz\"}"
|
||||
(json/encode (sorted-map :foo 'foo.bar/baz :bar 'clojure.core/pam)))))
|
||||
|
||||
(deftest t-bindable-factories-auto-close-source
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:auto-close-source false})]
|
||||
(let [br (BufferedReader. (StringReader. "123"))]
|
||||
(is (= 123 (json/parse-stream br)))
|
||||
(is (= -1 (.read br)))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:auto-close-source true})]
|
||||
(let [br (BufferedReader. (StringReader. "123"))]
|
||||
(is (= 123 (json/parse-stream br)))
|
||||
(is (thrown? IOException (.read br))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-comments
|
||||
(let [s "{\"a\": /* comment */ 1, // comment\n \"b\": 2}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-comments true})]
|
||||
(is (= {"a" 1 "b" 2} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-comments false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-unquoted-field-names
|
||||
(let [s "{a: 1, b: 2}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-unquoted-field-names true})]
|
||||
(is (= {"a" 1 "b" 2} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-unquoted-field-names false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-single-quotes
|
||||
(doseq [s ["{'a': \"one\", 'b': \"two\"}"
|
||||
"{\"a\": 'one', \"b\": 'two'}"
|
||||
"{'a': 'one', 'b': 'two'}"]]
|
||||
(testing s
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-single-quotes true})]
|
||||
(is (= {"a" "one" "b" "two"} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-single-quotes false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s)))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-unquoted-control-chars
|
||||
(let [s "{\"a\": \"one\ntwo\"}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-unquoted-control-chars true})]
|
||||
(is (= {"a" "one\ntwo"} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-unquoted-control-chars false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-backslash-escaping-any-char
|
||||
(let [s "{\"a\": 00000000001}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-numeric-leading-zeros true})]
|
||||
(is (= {"a" 1} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-numeric-leading-zeros false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s))))))
|
||||
|
||||
(deftest t-bindable-factories-allow-numeric-leading-zeros
|
||||
(let [s "{\"a\": \"\\o\\n\\e\"}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-backslash-escaping true})]
|
||||
(is (= {"a" "o\ne"} (json/decode s))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-backslash-escaping false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s))))))
|
||||
|
||||
(deftest t-bindable-factories-non-numeric-numbers
|
||||
(let [s "{\"foo\":NaN}"]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-non-numeric-numbers true})]
|
||||
(is (= (type Double/NaN)
|
||||
(type (:foo (json/decode s true))))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:allow-non-numeric-numbers false})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_JsonParseException Exception (json/decode s true))))))
|
||||
|
||||
(deftest t-bindable-factories-optimization-opts
|
||||
(let [s "{\"a\": \"foo\"}"]
|
||||
(doseq [opts [{:intern-field-names true}
|
||||
{:intern-field-names false}
|
||||
{:canonicalize-field-names true}
|
||||
{:canonicalize-field-names false}]]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory opts)]
|
||||
(is (= {"a" "foo"} (json/decode s)))))))
|
||||
|
||||
(deftest t-bindable-factories-escape-non-ascii
|
||||
;; includes testing legacy fn opt of same name can override factory
|
||||
(let [edn {:foo "It costs £100"}
|
||||
expected-esc "{\"foo\":\"It costs \\u00A3100\"}"
|
||||
expected-no-esc "{\"foo\":\"It costs £100\"}"
|
||||
opt-esc {:escape-non-ascii true}
|
||||
opt-no-esc {:escape-non-ascii false}]
|
||||
(testing "default factory"
|
||||
(doseq [[fn-opts expected]
|
||||
[[{} expected-no-esc]
|
||||
[opt-esc expected-esc]
|
||||
[opt-no-esc expected-no-esc]]]
|
||||
(testing fn-opts
|
||||
(is (= expected (json/encode edn fn-opts) (encode-stream->str edn fn-opts))))))
|
||||
(testing (str "factory: " opt-esc)
|
||||
(binding [fact/*json-factory* (fact/make-json-factory opt-esc)]
|
||||
(doseq [[fn-opts expected]
|
||||
[[{} expected-esc]
|
||||
[opt-esc expected-esc]
|
||||
[opt-no-esc expected-no-esc]]]
|
||||
(testing (str "fn: " fn-opts)
|
||||
(is (= expected (json/encode edn fn-opts) (encode-stream->str edn fn-opts)))))))
|
||||
(testing (str "factory: " opt-no-esc)
|
||||
(binding [fact/*json-factory* (fact/make-json-factory opt-no-esc)]
|
||||
(doseq [[fn-opts expected]
|
||||
[[{} expected-no-esc]
|
||||
[opt-esc expected-esc]
|
||||
[opt-no-esc expected-no-esc]]]
|
||||
(testing (str "fn: " fn-opts)
|
||||
(is (= expected (json/encode edn fn-opts) (encode-stream->str edn fn-opts)))))))))
|
||||
|
||||
(deftest t-bindable-factories-quoteless
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:quote-field-names true})]
|
||||
(is (= "{\"a\":\"foo\"}" (json/encode {:a "foo"}))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:quote-field-names false})]
|
||||
(is (= "{a:\"foo\"}" (json/encode {:a "foo"})))))
|
||||
|
||||
(deftest t-bindable-factories-strict-duplicate-detection
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:strict-duplicate-detection true})]
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
(is (thrown? #_ JsonParseException Exception
|
||||
(json/decode "{\"a\": 1, \"b\": 2, \"a\": 3}"))))
|
||||
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:strict-duplicate-detection false})]
|
||||
(is (= {"a" 3 "b" 2}
|
||||
(json/decode "{\"a\": 1, \"b\": 2, \"a\": 3}")))))
|
||||
|
||||
(deftest t-bindable-factories-max-input-document-length
|
||||
(let [edn {"a" (apply str (repeat 10000 "x"))}
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-document-length (count sample-data)})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
;; as per Jackson docs, limit is inexact, so dividing input length by 2 should do the trick
|
||||
{:max-input-document-length (/ (count sample-data) 2)})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)document length .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-max-input-token-count
|
||||
;; A token is a single unit of input, such as a number, a string, an object start or end, or an array start or end.
|
||||
(let [edn {"1" 2 "3" 4}
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-token-count 6})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-token-count 5})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)token count .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-max-input-name-length
|
||||
(let [k "somekey"
|
||||
edn {k 1}
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-name-length (count k)})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-name-length (dec (count k))})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)name .* exceeds"
|
||||
(json/decode sample-data)))))
|
||||
(let [default-limit (:max-input-name-length fact/default-factory-options)]
|
||||
(let [k (str-of-len default-limit)
|
||||
edn {k 1}
|
||||
sample-data (json/encode edn)]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(let [k (str-of-len (inc default-limit))
|
||||
sample-data (json/encode {k 1})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)name .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-input-nesting-depth
|
||||
(let [edn (nested-map 100)
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-nesting-depth 100})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-nesting-depth 99})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)nesting depth .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-max-input-number-length
|
||||
(let [num 123456789
|
||||
edn {"foo" num}
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-number-length (-> num str count)})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-number-length (-> num str count dec)})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)number value length .* exceeds"
|
||||
(json/decode sample-data)))))
|
||||
(let [default-limit (:max-input-number-length fact/default-factory-options)]
|
||||
(let [num (bigint (str-of-len default-limit 2))
|
||||
edn {"foo" num}
|
||||
sample-data (json/encode edn)]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(let [num (bigint (str-of-len (inc default-limit) 2))
|
||||
sample-data (json/encode {"foo" num})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)number value length .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-max-input-string-length
|
||||
(let [big-string (str-of-len 40000000)
|
||||
edn {"big-string" big-string}
|
||||
sample-data (json/encode edn)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-string-length (count big-string)})]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-input-string-length (dec (count big-string))})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)string value length .* exceeds"
|
||||
(json/decode sample-data)))))
|
||||
(let [default-limit (:max-input-string-length fact/default-factory-options)]
|
||||
(let [big-string (str-of-len default-limit)
|
||||
edn {"big-string" big-string}
|
||||
sample-data (json/encode edn)]
|
||||
(is (= edn (json/decode sample-data))))
|
||||
(let [big-string (str-of-len (inc default-limit))
|
||||
sample-data (json/encode {"big-string" big-string})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)string value length .* exceeds"
|
||||
(json/decode sample-data))))))
|
||||
|
||||
(deftest t-bindable-factories-max-output-nesting-depth
|
||||
(let [edn (nested-map 100)]
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-output-nesting-depth 100})]
|
||||
(is (.contains (json/encode edn) "\"99\"")))
|
||||
(binding [fact/*json-factory* (fact/make-json-factory
|
||||
{:max-output-nesting-depth 99})]
|
||||
(is (thrown-with-msg?
|
||||
;; BB-TEST-PATCH: Generalized exception check
|
||||
#_StreamConstraintsException Exception #"(?i)nesting depth .* exceeds"
|
||||
(json/encode edn))))))
|
||||
|
||||
(deftest t-persistent-queue
|
||||
(let [q (conj clojure.lang.PersistentQueue/EMPTY 1 2 3)]
|
||||
(is (= q (json/decode (json/encode q))))))
|
||||
|
||||
(deftest t-pretty-print
|
||||
(is (= (str/join (System/lineSeparator)
|
||||
["{"
|
||||
" \"bar\" : [ {"
|
||||
" \"baz\" : 2"
|
||||
" }, \"quux\", [ 1, 2, 3 ] ],"
|
||||
" \"foo\" : 1"
|
||||
"}"])
|
||||
(json/encode (sorted-map :foo 1 :bar [{:baz 2} :quux [1 2 3]])
|
||||
{:pretty true}))))
|
||||
|
||||
(deftest t-pretty-print-custom-linebreak
|
||||
(is (= (str/join "foo"
|
||||
["{"
|
||||
" \"bar\" : [ {"
|
||||
" \"baz\" : 2"
|
||||
" }, \"quux\", [ 1, 2, 3 ] ],"
|
||||
" \"foo\" : 1"
|
||||
"}"])
|
||||
(json/encode (sorted-map :foo 1 :bar [{:baz 2} :quux [1 2 3]])
|
||||
{:pretty {:line-break "foo"}}))))
|
||||
|
||||
(deftest t-pretty-print-illegal-argument
|
||||
; just expecting this not to throw
|
||||
(json/encode {:foo "bar"}
|
||||
{:pretty []})
|
||||
(json/encode {:foo "bar"}
|
||||
{:pretty nil}))
|
||||
|
||||
(deftest t-custom-pretty-print-with-defaults
|
||||
(let [test-obj (sorted-map :foo 1 :bar {:baz [{:ulu "mulu"} {:moot "foo"} 3]} :quux :blub)
|
||||
pretty-str-default (json/encode test-obj {:pretty true})
|
||||
pretty-str-custom (json/encode test-obj {:pretty {}})]
|
||||
(is (= pretty-str-default pretty-str-custom))
|
||||
(when-not (= pretty-str-default pretty-str-custom)
|
||||
; print for easy comparison
|
||||
(println "; default pretty print")
|
||||
(println pretty-str-default)
|
||||
(println "; custom pretty print with default options")
|
||||
(println pretty-str-custom))))
|
||||
|
||||
(deftest t-custom-pretty-print-with-non-defaults
|
||||
(let [test-obj (sorted-map :foo 1 :bar {:baz [{:ulu "mulu"} {:moot "foo"} 3]} :quux :blub)
|
||||
test-opts {:pretty {:indentation 4
|
||||
:indent-arrays? false
|
||||
:before-array-values ""
|
||||
:after-array-values ""
|
||||
:object-field-value-separator ": "}}
|
||||
expected (str/join (System/lineSeparator)
|
||||
["{"
|
||||
" \"bar\": {"
|
||||
" \"baz\": [{"
|
||||
" \"ulu\": \"mulu\""
|
||||
" }, {"
|
||||
" \"moot\": \"foo\""
|
||||
" }, 3]"
|
||||
" },"
|
||||
" \"foo\": 1,"
|
||||
" \"quux\": \"blub\""
|
||||
"}"])
|
||||
pretty-str (json/encode test-obj test-opts)]
|
||||
|
||||
; just to be easy on the eyes in case of error
|
||||
(when-not (= expected pretty-str)
|
||||
(println "; pretty print with options - actual")
|
||||
(println pretty-str)
|
||||
(println "; pretty print with options - expected")
|
||||
(println expected))
|
||||
(is (= expected pretty-str))))
|
||||
|
||||
(deftest t-custom-pretty-print-with-noident-objects
|
||||
(let [test-obj [{:foo 1 :bar 2} {:foo 3 :bar 4}]
|
||||
test-opts {:pretty {:indent-objects? false}}
|
||||
expected (str "[ { \"foo\" : 1, \"bar\" : 2 }, "
|
||||
"{ \"foo\" : 3, \"bar\" : 4 } ]")
|
||||
pretty-str (json/encode test-obj test-opts)]
|
||||
; just to be easy on the eyes in case of error
|
||||
(when-not (= expected pretty-str)
|
||||
(println "; pretty print with options - actual")
|
||||
(println pretty-str)
|
||||
(println "; pretty print with options - expected")
|
||||
(println expected))
|
||||
(is (= expected pretty-str))))
|
||||
|
||||
(deftest t-custom-keyword-fn
|
||||
(is (= {:FOO "bar"} (json/decode "{\"foo\": \"bar\"}"
|
||||
(fn [k] (keyword (.toUpperCase k))))))
|
||||
(is (= {"foo" "bar"} (json/decode "{\"foo\": \"bar\"}" nil)))
|
||||
(is (= {"foo" "bar"} (json/decode "{\"foo\": \"bar\"}" false)))
|
||||
(is (= {:foo "bar"} (json/decode "{\"foo\": \"bar\"}" true))))
|
||||
|
||||
(deftest t-custom-encode-key-fn
|
||||
(is (= "{\"FOO\":\"bar\"}"
|
||||
(json/encode {:foo :bar}
|
||||
{:key-fn (fn [k] (.toUpperCase (name k)))}))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does nto include cheshire.generate ns
|
||||
#_(deftest test-add-remove-encoder
|
||||
(gen/remove-encoder java.net.URL)
|
||||
(gen/add-encoder java.net.URL gen/encode-str)
|
||||
(is (= "\"http://foo.com\""
|
||||
(json/encode (java.net.URL. "http://foo.com"))))
|
||||
(gen/remove-encoder java.net.URL)
|
||||
(is (thrown? JsonGenerationException
|
||||
(json/encode (java.net.URL. "http://foo.com")))))
|
||||
|
||||
#_(defprotocol TestP
|
||||
(foo [this] "foo method"))
|
||||
|
||||
#_(defrecord TestR [state])
|
||||
|
||||
#_(extend TestR
|
||||
TestP
|
||||
{:foo (constantly "bar")})
|
||||
|
||||
#_(deftest t-custom-protocol-encoder
|
||||
(let [rec (TestR. :quux)]
|
||||
(is (= {:state "quux"} (json/decode (json/encode rec) true)))
|
||||
(gen/add-encoder cheshire.test.core.TestR
|
||||
(fn [obj jg]
|
||||
(.writeString jg (foo obj))))
|
||||
(is (= "bar" (json/decode (json/encode rec))))
|
||||
(gen/remove-encoder cheshire.test.core.TestR)
|
||||
(is (= {:state "quux"} (json/decode (json/encode rec) true)))))
|
||||
|
||||
#_(defprotocol CTestP
|
||||
(thing [this] "thing method"))
|
||||
#_(defrecord CTestR [state])
|
||||
#_(extend CTestR
|
||||
CTestP
|
||||
{:thing (constantly "thing")})
|
||||
|
||||
#_(deftest t-custom-helpers
|
||||
(let [thing (CTestR. :state)
|
||||
remove #(gen/remove-encoder CTestR)]
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-nil nil jg)))
|
||||
(is (= nil (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-str "foo" jg)))
|
||||
(is (= "foo" (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-number 5 jg)))
|
||||
(is (= 5 (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-long 4 jg)))
|
||||
(is (= 4 (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-int 3 jg)))
|
||||
(is (= 3 (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-ratio 1/2 jg)))
|
||||
(is (= 0.5 (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-seq [:foo :bar] jg)))
|
||||
(is (= ["foo" "bar"] (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-date (Date. (long 0)) jg)))
|
||||
(binding [gen/*date-format* "yyyy-MM-dd'T'HH:mm:ss'Z'"]
|
||||
(is (= "1970-01-01T00:00:00Z" (json/decode (json/encode thing) true))))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-bool true jg)))
|
||||
(is (= true (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-named :foo jg)))
|
||||
(is (= "foo" (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-map {:foo "bar"} jg)))
|
||||
(is (= {:foo "bar"} (json/decode (json/encode thing) true)))
|
||||
(remove)
|
||||
(gen/add-encoder CTestR (fn [_obj jg] (gen/encode-symbol 'foo jg)))
|
||||
(is (= "foo" (json/decode (json/encode thing) true)))
|
||||
(remove)))
|
||||
|
||||
(deftest t-float-encoding
|
||||
(is (= "{\"foo\":0.01}" (json/encode {:foo (float 0.01)}))))
|
||||
|
||||
(deftest t-non-const-bools
|
||||
(is (= {:a 1} (json/decode "{\"a\": 1}" (Boolean. true)))))
|
||||
|
||||
;; BB-TEST-PATCH: bb does not include cheshire.exact ns
|
||||
#_(deftest t-invalid-json
|
||||
(let [invalid-json-message "Invalid JSON, expected exactly one parseable object but multiple objects were found"]
|
||||
(are [x y] (= x (try
|
||||
y
|
||||
(catch Exception e
|
||||
(.getMessage e))))
|
||||
invalid-json-message (json-exact/decode "{\"foo\": 1}asdf")
|
||||
invalid-json-message (json-exact/decode "{\"foo\": 123}null")
|
||||
invalid-json-message (json-exact/decode "\"hello\" : 123}")
|
||||
{"foo" 1} (json/decode "{\"foo\": 1}")
|
||||
invalid-json-message (json-exact/decode-strict "{\"foo\": 1}asdf")
|
||||
invalid-json-message (json-exact/decode-strict "{\"foo\": 123}null")
|
||||
invalid-json-message (json-exact/decode-strict "\"hello\" : 123}")
|
||||
{"foo" 1} (json/decode-strict "{\"foo\": 1}"))))
|
||||
2
test-resources/lib_tests/cheshire/test/multi.json
Normal file
2
test-resources/lib_tests/cheshire/test/multi.json
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
{"one":1,"foo":"bar"}
|
||||
{"two":2,"foo":"bar"}
|
||||
58
test-resources/lib_tests/cheshire/test/pass1.json
Normal file
58
test-resources/lib_tests/cheshire/test/pass1.json
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
[
|
||||
"JSON Test Pattern pass1",
|
||||
{"object with 1 member":["array with 1 element"]},
|
||||
{},
|
||||
[],
|
||||
-42,
|
||||
true,
|
||||
false,
|
||||
null,
|
||||
{
|
||||
"integer": 1234567890,
|
||||
"real": -9876.543210,
|
||||
"e": 0.123456789e-12,
|
||||
"E": 1.234567890E+34,
|
||||
"": 23456789012E66,
|
||||
"zero": 0,
|
||||
"one": 1,
|
||||
"space": " ",
|
||||
"quote": "\"",
|
||||
"backslash": "\\",
|
||||
"controls": "\b\f\n\r\t",
|
||||
"slash": "/ & \/",
|
||||
"alpha": "abcdefghijklmnopqrstuvwyz",
|
||||
"ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
|
||||
"digit": "0123456789",
|
||||
"0123456789": "digit",
|
||||
"special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
|
||||
"hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
|
||||
"true": true,
|
||||
"false": false,
|
||||
"null": null,
|
||||
"array":[ ],
|
||||
"object":{ },
|
||||
"address": "50 St. James Street",
|
||||
"url": "http://www.JSON.org/",
|
||||
"comment": "// /* <!-- --",
|
||||
"# -- --> */": " ",
|
||||
" s p a c e d " :[1,2 , 3
|
||||
|
||||
,
|
||||
|
||||
4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7],
|
||||
"jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
|
||||
"quotes": "" \u0022 %22 0x22 034 "",
|
||||
"\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
|
||||
: "A key can be any string"
|
||||
},
|
||||
0.5 ,98.6
|
||||
,
|
||||
99.44
|
||||
,
|
||||
|
||||
1066,
|
||||
1e1,
|
||||
0.1e1,
|
||||
1e-1,
|
||||
1e00,2e+00,2e-00
|
||||
,"rosebud"]
|
||||
|
|
@ -341,7 +341,7 @@
|
|||
(is (= ::response r))))
|
||||
|
||||
(try (get "https://httpbin.org/gzip" {:timeout 1000})
|
||||
(catch java.net.http.HttpTimeoutException _
|
||||
(catch Exception _
|
||||
(doseq [v (vals (ns-publics *ns*))]
|
||||
(when (:integration (meta v))
|
||||
(println "Removing test from" v "because httpbin is slow.")
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
(ns httpkit.client-test
|
||||
(:require [cheshire.core :as json]
|
||||
[clojure.string :as str]
|
||||
[clojure.test :refer [deftest is testing #_*report-counters*]]
|
||||
[org.httpkit.client :as client]))
|
||||
|
||||
|
|
@ -16,12 +17,14 @@
|
|||
|
||||
(deftest get-test
|
||||
(is (= 200 (:status @(client/get "https://postman-echo.com/get"))))
|
||||
(is (= "https://postman-echo.com/get"
|
||||
(is (str/includes?
|
||||
(-> @(client/get "https://postman-echo.com/get"
|
||||
{:headers {"Accept" "application/json"}})
|
||||
:body
|
||||
(json/parse-string true)
|
||||
:url)))
|
||||
:url)
|
||||
"postman-echo.com/get"))
|
||||
;; BB-TEST-PATCH: postman started responding with http:// instead of https://
|
||||
(testing "query params"
|
||||
(is (= {:foo1 "bar1", :foo2 "bar2"}
|
||||
(-> @(client/get "https://postman-echo.com/get" {:query-params {"foo1" "bar1" "foo2" "bar2"}})
|
||||
|
|
|
|||
|
|
@ -1,549 +0,0 @@
|
|||
(ns integrant.core-test
|
||||
(:require [clojure.spec.alpha :as s]
|
||||
#?(:clj [clojure.test :refer :all]
|
||||
:cljs [cljs.test :refer-macros [are deftest is testing]])
|
||||
[integrant.core :as ig]
|
||||
[weavejester.dependency :as dep]))
|
||||
|
||||
(def log (atom []))
|
||||
|
||||
(defmethod ig/prep-key ::p [_ v]
|
||||
(merge {:a (ig/ref ::a)} v))
|
||||
|
||||
(defmethod ig/init-key :default [k v]
|
||||
(swap! log conj [:init k v])
|
||||
[v])
|
||||
|
||||
(defmethod ig/init-key ::x [k v]
|
||||
(swap! log conj [:init k v])
|
||||
:x)
|
||||
|
||||
(defmethod ig/init-key ::error-init [_ _]
|
||||
(throw (ex-info "Testing" {:reason ::test})))
|
||||
|
||||
(defmethod ig/init-key ::k [_ v] v)
|
||||
|
||||
(defmethod ig/init-key ::n [_ v] (inc v))
|
||||
(defmethod ig/pre-init-spec ::n [_] nat-int?)
|
||||
|
||||
(defmethod ig/init-key ::r [_ v] {:v v})
|
||||
(defmethod ig/resolve-key ::r [_ {:keys [v]}] v)
|
||||
(defmethod ig/resume-key ::r [k v _ _] (ig/init-key k v))
|
||||
|
||||
(defmethod ig/halt-key! :default [k v]
|
||||
(swap! log conj [:halt k v]))
|
||||
|
||||
(defmethod ig/halt-key! ::error-halt [_ _]
|
||||
(throw (ex-info "Testing" {:reason ::test})))
|
||||
|
||||
(defmethod ig/resume-key :default [k cfg cfg' sys]
|
||||
(swap! log conj [:resume k cfg cfg' sys])
|
||||
[cfg])
|
||||
|
||||
(defmethod ig/resume-key ::x [k cfg cfg' sys]
|
||||
(swap! log conj [:resume k cfg cfg' sys])
|
||||
:rx)
|
||||
|
||||
(defmethod ig/suspend-key! :default [k v]
|
||||
(swap! log conj [:suspend k v]))
|
||||
|
||||
(derive ::p ::pp)
|
||||
(derive ::pp ::ppp)
|
||||
|
||||
(derive ::ap ::a)
|
||||
(derive ::ap ::p)
|
||||
|
||||
(deftest ref-test
|
||||
(is (ig/ref? (ig/ref ::foo)))
|
||||
(is (ig/ref? (ig/ref [::foo ::bar])))
|
||||
(is (ig/reflike? (ig/ref ::foo)))
|
||||
(is (ig/reflike? (ig/ref [::foo ::bar]))))
|
||||
|
||||
(deftest refset-test
|
||||
(is (ig/refset? (ig/refset ::foo)))
|
||||
(is (ig/refset? (ig/refset [::foo ::bar])))
|
||||
(is (ig/reflike? (ig/refset ::foo)))
|
||||
(is (ig/reflike? (ig/refset [::foo ::bar]))))
|
||||
|
||||
(deftest composite-keyword-test
|
||||
(let [k (ig/composite-keyword [::a ::b])]
|
||||
(is (isa? k ::a))
|
||||
(is (isa? k ::b))
|
||||
(is (identical? k (ig/composite-keyword [::a ::b])))
|
||||
(is (not= k (ig/composite-keyword [::a ::c])))))
|
||||
|
||||
(deftest valid-config-key-test
|
||||
(is (ig/valid-config-key? ::a))
|
||||
(is (not (ig/valid-config-key? :a))))
|
||||
|
||||
(deftest expand-test
|
||||
(is (= (ig/expand {::a (ig/ref ::b), ::b 1})
|
||||
{::a 1, ::b 1}))
|
||||
(is (= (ig/expand {::a (ig/ref ::b), ::b (ig/ref ::c), ::c 2})
|
||||
{::a 2, ::b 2, ::c 2}))
|
||||
(is (= (ig/expand {::a (ig/ref ::pp), ::p 1})
|
||||
{::a 1, ::p 1}))
|
||||
(is (= (ig/expand {::a (ig/refset ::ppp), ::p 1, ::pp 2})
|
||||
{::a #{1 2}, ::p 1, ::pp 2}))
|
||||
(is (= (ig/expand {::a (ig/refset ::ppp)})
|
||||
{::a #{}})))
|
||||
|
||||
#?(:clj
|
||||
(deftest read-string-test
|
||||
(is (= (ig/read-string "{:foo/a #ig/ref :foo/b, :foo/b 1}")
|
||||
{:foo/a (ig/ref :foo/b), :foo/b 1}))
|
||||
(is (= (ig/read-string "{:foo/a #ig/refset :foo/b, :foo/b 1}")
|
||||
{:foo/a (ig/refset :foo/b), :foo/b 1}))
|
||||
(is (= (ig/read-string {:readers {'test/var find-var}}
|
||||
"{:foo/a #test/var clojure.core/+}")
|
||||
{:foo/a #'+}))))
|
||||
|
||||
;; BB-TEST-PATCH: No *loaded-libs* in bb
|
||||
#?(:bb :TODO :clj
|
||||
(defn- remove-lib [lib]
|
||||
(remove-ns lib)
|
||||
(dosync (alter @#'clojure.core/*loaded-libs* disj lib))))
|
||||
|
||||
(derive :integrant.test-child/foo :integrant.test/foo)
|
||||
|
||||
;; BB-TEST-PATCH: No *loaded-libs* in bb
|
||||
#?(:bb :TODO
|
||||
:clj
|
||||
(deftest load-namespaces-test
|
||||
(testing "all namespaces"
|
||||
(remove-lib 'integrant.test.foo)
|
||||
(remove-lib 'integrant.test.bar)
|
||||
(remove-lib 'integrant.test.baz)
|
||||
(remove-lib 'integrant.test.quz)
|
||||
(is (= (set (ig/load-namespaces {:integrant.test/foo 1
|
||||
:integrant.test.bar/wuz 2
|
||||
[:integrant.test/baz :integrant.test/x] 3
|
||||
[:integrant.test/y :integrant.test/quz] 4}))
|
||||
'#{integrant.test.foo
|
||||
integrant.test.bar
|
||||
integrant.test.baz
|
||||
integrant.test.quz}))
|
||||
(is (some? (find-ns 'integrant.test.foo)))
|
||||
(is (some? (find-ns 'integrant.test.bar)))
|
||||
(is (some? (find-ns 'integrant.test.baz)))
|
||||
(is (some? (find-ns 'integrant.test.quz)))
|
||||
(is (= (some-> 'integrant.test.foo/message find-var var-get) "foo"))
|
||||
(is (= (some-> 'integrant.test.bar/message find-var var-get) "bar"))
|
||||
(is (= (some-> 'integrant.test.baz/message find-var var-get) "baz"))
|
||||
(is (= (some-> 'integrant.test.quz/message find-var var-get) "quz")))
|
||||
|
||||
(testing "some namespaces"
|
||||
(remove-lib 'integrant.test.foo)
|
||||
(remove-lib 'integrant.test.bar)
|
||||
(remove-lib 'integrant.test.baz)
|
||||
(remove-lib 'integrant.test.quz)
|
||||
(is (= (set (ig/load-namespaces
|
||||
{:integrant.test/foo 1
|
||||
:integrant.test/bar (ig/ref :integrant.test/foo)
|
||||
:integrant.test/baz 3}
|
||||
[:integrant.test/bar]))
|
||||
'#{integrant.test.foo
|
||||
integrant.test.bar}))
|
||||
(is (some? (find-ns 'integrant.test.foo)))
|
||||
(is (some? (find-ns 'integrant.test.bar)))
|
||||
(is (nil? (find-ns 'integrant.test.baz))))
|
||||
|
||||
(testing "load namespaces of ancestors"
|
||||
(remove-lib 'integrant.test.foo)
|
||||
(is (= (set (ig/load-namespaces
|
||||
{:integrant.test-child/foo 1}))
|
||||
'#{integrant.test.foo}))
|
||||
(is (some? (find-ns 'integrant.test.foo))))))
|
||||
|
||||
|
||||
(deftest dependency-graph-test
|
||||
(let [m {::a (ig/ref ::p), ::b (ig/refset ::ppp) ::p 1, ::pp 2}]
|
||||
(testing "graph with refsets"
|
||||
(let [g (ig/dependency-graph m)]
|
||||
(is (dep/depends? g ::a ::p))
|
||||
(is (dep/depends? g ::b ::p))
|
||||
(is (dep/depends? g ::b ::pp))))
|
||||
|
||||
(testing "graph without refsets"
|
||||
(let [g (ig/dependency-graph m {:include-refsets? false})]
|
||||
(is (dep/depends? g ::a ::p))
|
||||
(is (not (dep/depends? g ::b ::p)))
|
||||
(is (not (dep/depends? g ::b ::pp)))))))
|
||||
|
||||
(deftest key-comparator-test
|
||||
(let [graph (ig/dependency-graph {::a (ig/ref ::ppp) ::p 1, ::b 2})]
|
||||
(is (= (sort (ig/key-comparator graph) [::b ::a ::p])
|
||||
[::p ::a ::b]))))
|
||||
|
||||
(deftest derived-from?-test
|
||||
(are [a b] (ig/derived-from? a b)
|
||||
::p ::p
|
||||
::p ::pp
|
||||
::p ::ppp
|
||||
::ap [::a ::p]
|
||||
::ap [::a ::pp]
|
||||
[::a ::p] [::a ::pp]
|
||||
[::a ::b ::p] [::a ::ppp]))
|
||||
|
||||
(deftest find-derived-1-test
|
||||
(testing "missing key"
|
||||
(is (nil? (ig/find-derived-1 {} ::p))))
|
||||
|
||||
(testing "derived key"
|
||||
(is (= (ig/find-derived-1 {::a "x" ::p "y"} ::pp)
|
||||
[::p "y"])))
|
||||
|
||||
(testing "ambiguous key"
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
(re-pattern (str "Ambiguous key: " ::pp "\\. "
|
||||
"Found multiple candidates: " ::p ", " ::pp))
|
||||
(ig/find-derived-1 {::a "x" ::p "y", ::pp "z"} ::pp))))
|
||||
|
||||
(testing "composite key"
|
||||
(is (= (ig/find-derived-1 {::a "x" [::b ::x] "y"} ::x)
|
||||
[[::b ::x] "y"]))))
|
||||
|
||||
(deftest find-derived-test
|
||||
(testing "missing key"
|
||||
(is (nil? (ig/find-derived {} ::p))))
|
||||
|
||||
(testing "derived key"
|
||||
(is (= (ig/find-derived {::a "x" ::p "y" ::pp "z"} ::pp)
|
||||
[[::p "y"] [::pp "z"]])))
|
||||
|
||||
(testing "ambiguous key"
|
||||
(is (= (ig/find-derived {::a "x" ::p "y" ::pp "z"} ::ppp)
|
||||
[[::p "y"] [::pp "z"]])))
|
||||
|
||||
(testing "composite key"
|
||||
(is (= (ig/find-derived {::a "x" [::b ::x] "y", [::b ::y] "z"} ::b)
|
||||
[[[::b ::x] "y"] [[::b ::y] "z"]]))))
|
||||
|
||||
(deftest prep-test
|
||||
(testing "default"
|
||||
(is (= (ig/prep {::q {:b 2}, ::a 1})
|
||||
{::q {:b 2}, ::a 1})))
|
||||
|
||||
(testing "custom prep-key"
|
||||
(is (= (ig/prep {::p {:b 2}, ::a 1})
|
||||
{::p {:a (ig/ref ::a), :b 2}, ::a 1})))
|
||||
|
||||
(testing "prep then init"
|
||||
(is (= (ig/init (ig/prep {::p {:b 2}, ::a 1}))
|
||||
{::p [{:a [1], :b 2}], ::a [1]}))))
|
||||
|
||||
(deftest init-test
|
||||
(testing "without keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), ::b 1})]
|
||||
(is (= m {::a [[1]], ::b [1]}))
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a [1]]]))))
|
||||
|
||||
(testing "with keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), ::b 1, ::c 2} [::a])]
|
||||
(is (= m {::a [[1]], ::b [1]}))
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a [1]]]))))
|
||||
|
||||
(testing "with inherited keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::p (ig/ref ::a), ::a 1} [::pp])]
|
||||
(is (= m {::p [[1]], ::a [1]}))
|
||||
(is (= @log [[:init ::a 1]
|
||||
[:init ::p [1]]]))))
|
||||
|
||||
(testing "with composite keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), [::x ::b] 1})]
|
||||
(is (= m {::a [:x], [::x ::b] :x}))
|
||||
(is (= @log [[:init [::x ::b] 1]
|
||||
[:init ::a :x]]))))
|
||||
|
||||
(testing "with composite refs"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref [::b ::c]), [::b ::c ::e] 1, [::b ::d] 2})]
|
||||
(is (= m {::a [[1]], [::b ::c ::e] [1], [::b ::d] [2]}))
|
||||
(is (or (= @log [[:init [::b ::c ::e] 1]
|
||||
[:init ::a [1]]
|
||||
[:init [::b ::d] 2]])
|
||||
(= @log [[:init [::b ::d] 2]
|
||||
[:init [::b ::c ::e] 1]
|
||||
[:init ::a [1]]])))))
|
||||
|
||||
(testing "with failing composite refs"
|
||||
(reset! log [])
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
#"^Invalid composite key: \[:integrant.core-test/a :b\]. Every keyword must be namespaced.$"
|
||||
(ig/init {[::a :b] :anything}))))
|
||||
|
||||
(testing "with custom resolve-key"
|
||||
(let [m (ig/init {::a (ig/ref ::r), ::r 1})]
|
||||
(is (= m {::a [1], ::r {:v 1}}))))
|
||||
|
||||
(testing "with refsets"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/refset ::ppp), ::p 1, ::pp 2})]
|
||||
(is (= m {::a [#{[1] [2]}], ::p [1], ::pp [2]}))
|
||||
(is (= @log [[:init ::p 1]
|
||||
[:init ::pp 2]
|
||||
[:init ::a #{[1] [2]}]]))))
|
||||
|
||||
(testing "with refsets and keys"
|
||||
(reset! log [])
|
||||
(let [m {::a (ig/refset ::ppp), ::p 1, ::pp 2}]
|
||||
(is (= (ig/init m [::a]) {::a [#{}]}))
|
||||
(is (= (ig/init m [::a ::p]) {::a [#{[1]}] ::p [1]}))
|
||||
(is (= (ig/init m [::a ::pp]) {::a [#{[1] [2]}] ::p [1] ::pp [2]}))))
|
||||
|
||||
(testing "large config"
|
||||
(is (= (ig/init {:a/a1 {} :a/a2 {:_ (ig/ref :a/a1)}
|
||||
:a/a3 {} :a/a4 {} :a/a5 {}
|
||||
:a/a6 {} :a/a7 {} :a/a8 {}
|
||||
:a/a9 {} :a/a10 {}})
|
||||
{:a/a1 [{}] :a/a2 [{:_ [{}]}]
|
||||
:a/a3 [{}] :a/a4 [{}] :a/a5 [{}]
|
||||
:a/a6 [{}] :a/a7 [{}] :a/a8 [{}]
|
||||
:a/a9 [{}] :a/a10 [{}]})))
|
||||
|
||||
(testing "with passing specs"
|
||||
(let [m (ig/init {::n (ig/ref ::k), ::k 1})]
|
||||
(is (= m {::n 2, ::k 1}))))
|
||||
|
||||
(testing "with failing specs"
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
(re-pattern (str "Spec failed on key " ::n " when building system"))
|
||||
(ig/init {::n (ig/ref ::k), ::k 1.1}))))
|
||||
|
||||
(testing "with failing composite specs"
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
(re-pattern (str "Spec failed on key \\[" ::n " " ::nnn "\\] when building system"))
|
||||
(ig/init {[::n ::nnn] 1.1})))))
|
||||
|
||||
(deftest halt-test
|
||||
(testing "without keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), ::b 1})]
|
||||
(ig/halt! m)
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a [1]]
|
||||
[:halt ::a [[1]]]
|
||||
[:halt ::b [1]]]))))
|
||||
|
||||
(testing "with keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), ::b (ig/ref ::c), ::c 1})]
|
||||
(ig/halt! m [::a])
|
||||
(is (= @log [[:init ::c 1]
|
||||
[:init ::b [1]]
|
||||
[:init ::a [[1]]]
|
||||
[:halt ::a [[[1]]]]]))
|
||||
(reset! log [])
|
||||
(ig/halt! m [::c])
|
||||
(is (= @log [[:halt ::a [[[1]]]]
|
||||
[:halt ::b [[1]]]
|
||||
[:halt ::c [1]]]))))
|
||||
|
||||
(testing "with partial system"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a 1, ::b (ig/ref ::a)} [::a])]
|
||||
(ig/halt! m)
|
||||
(is (= @log [[:init ::a 1]
|
||||
[:halt ::a [1]]]))))
|
||||
|
||||
(testing "with inherited keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::p), ::p 1} [::a])]
|
||||
(ig/halt! m [::pp])
|
||||
(is (= @log [[:init ::p 1]
|
||||
[:init ::a [1]]
|
||||
[:halt ::a [[1]]]
|
||||
[:halt ::p [1]]]))))
|
||||
|
||||
(testing "with composite keys"
|
||||
(reset! log [])
|
||||
(let [m (ig/init {::a (ig/ref ::b), [::x ::b] 1})]
|
||||
(ig/halt! m)
|
||||
(is (= @log [[:init [::x ::b] 1]
|
||||
[:init ::a :x]
|
||||
[:halt ::a [:x]]
|
||||
[:halt [::x ::b] :x]])))))
|
||||
|
||||
(deftest suspend-resume-test
|
||||
(testing "same configuration"
|
||||
(reset! log [])
|
||||
(let [c {::a (ig/ref ::b), ::b 1}
|
||||
m (ig/init c)
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume c m)]
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a [1]]
|
||||
[:suspend ::a [[1]]]
|
||||
[:suspend ::b [1]]
|
||||
[:resume ::b 1 1 [1]]
|
||||
[:resume ::a [1] [1] [[1]]]]))))
|
||||
|
||||
(testing "missing keys"
|
||||
(reset! log [])
|
||||
(let [c {::a (ig/ref ::b), ::b 1}
|
||||
m (ig/init c)
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume (dissoc c ::a) m)]
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a [1]]
|
||||
[:suspend ::a [[1]]]
|
||||
[:suspend ::b [1]]
|
||||
[:halt ::a [[1]]]
|
||||
[:resume ::b 1 1 [1]]]))))
|
||||
|
||||
(testing "missing refs"
|
||||
(reset! log [])
|
||||
(let [c {::a {:b (ig/ref ::b)}, ::b 1}
|
||||
m (ig/init c)
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume {::a []} m)]
|
||||
(is (= @log [[:init ::b 1]
|
||||
[:init ::a {:b [1]}]
|
||||
[:suspend ::a [{:b [1]}]]
|
||||
[:suspend ::b [1]]
|
||||
[:halt ::b [1]]
|
||||
[:resume ::a [] {:b [1]} [{:b [1]}]]]))))
|
||||
|
||||
(testing "with custom resolve-key"
|
||||
(let [c {::a (ig/ref ::r), ::r 1}
|
||||
m (ig/init c)
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume c m)]
|
||||
(is (= m m'))))
|
||||
|
||||
(testing "composite keys"
|
||||
(reset! log [])
|
||||
(let [c {::a (ig/ref ::x), [::b ::x] 1}
|
||||
m (ig/init c)
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume c m)]
|
||||
(is (= @log [[:init [::b ::x] 1]
|
||||
[:init ::a :x]
|
||||
[:suspend ::a [:x]]
|
||||
[:suspend [::b ::x] :x]
|
||||
[:resume [::b ::x] 1 1 :x]
|
||||
[:resume ::a :rx :x [:x]]]))))
|
||||
|
||||
(testing "resume key with dependencies"
|
||||
(reset! log [])
|
||||
(let [c {::a {:b (ig/ref ::b)}, ::b 1}
|
||||
m (ig/init c [::a])
|
||||
_ (ig/suspend! m)
|
||||
m' (ig/resume c m [::a])]
|
||||
(is (= @log
|
||||
[[:init ::b 1]
|
||||
[:init ::a {:b [1]}]
|
||||
[:suspend ::a [{:b [1]}]]
|
||||
[:suspend ::b [1]]
|
||||
[:resume ::b 1 1 [1]]
|
||||
[:resume ::a {:b [1]} {:b [1]} [{:b [1]}]]])))))
|
||||
|
||||
(deftest invalid-configs-test
|
||||
(testing "ambiguous refs"
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
(re-pattern (str "Ambiguous key: " ::ppp "\\. "
|
||||
"Found multiple candidates: "
|
||||
"(" ::p ", " ::pp "|" ::pp ", " ::p ")"))
|
||||
(ig/init {::a (ig/ref ::ppp), ::p 1, ::pp 2}))))
|
||||
|
||||
(testing "missing refs"
|
||||
(is (thrown-with-msg?
|
||||
#?(:clj clojure.lang.ExceptionInfo :cljs cljs.core.ExceptionInfo)
|
||||
(re-pattern (str "Missing definitions for refs: " ::b))
|
||||
(ig/init {::a (ig/ref ::b)}))))
|
||||
|
||||
(testing "missing refs with explicit keys"
|
||||
(is (= (ig/init {::a (ig/ref ::ppp), ::p 1, ::pp 2} [::p ::pp])
|
||||
{::p [1], ::pp [2]})))
|
||||
|
||||
(testing "missing refs with explicit keys"
|
||||
(is (= (ig/init {::a 1, ::b (ig/ref ::c)} [::a])
|
||||
{::a [1]}))))
|
||||
|
||||
(defn build-log [config]
|
||||
(let [log (atom [])]
|
||||
[(ig/build config (keys config) (fn [k v] (last (swap! log conj [:build k v]))))
|
||||
@log]))
|
||||
|
||||
(deftest build-test
|
||||
(is (= [{::a [:build ::a [:build ::b 1]]
|
||||
::b [:build ::b 1]}
|
||||
[[:build ::b 1]
|
||||
[:build ::a [:build ::b 1]]]]
|
||||
(build-log {::a (ig/ref ::b)
|
||||
::b 1}))))
|
||||
|
||||
(defn test-log [f m]
|
||||
(let [log (atom [])]
|
||||
[(f m (keys m) (fn [k v] (last (swap! log conj [:test k v]))))
|
||||
@log]))
|
||||
|
||||
(deftest run-test* ;; BB-TEST-PATCH: renamed due to conflict with clojure.test
|
||||
(let [config {::a (ig/ref ::b), ::b 1}
|
||||
[system _] (build-log config)]
|
||||
(is (= [nil
|
||||
[[:test ::b [:build ::b 1]]
|
||||
[:test ::a [:build ::a [:build ::b 1]]]]]
|
||||
(test-log ig/run! system)))
|
||||
(is (= [nil
|
||||
[[:test ::a [:build ::a [:build ::b 1]]]
|
||||
[:test ::b [:build ::b 1]]]]
|
||||
(test-log ig/reverse-run! system)))))
|
||||
|
||||
(deftest fold-test
|
||||
(let [config {::a (ig/ref ::ppp), ::b (ig/ref ::pp), ::p 1, ::c 2}
|
||||
system (ig/init config)]
|
||||
(is (= (ig/fold system #(conj %1 [%2 %3]) [])
|
||||
[[::p [1]] [::a [[1]]] [::b [[1]]] [::c [2]]]))))
|
||||
|
||||
(deftest wrapped-exception-test
|
||||
(testing "exception when building"
|
||||
(let [ex (try (ig/init {::a 1, ::error-init (ig/ref ::a)}) nil
|
||||
(catch #?(:clj Throwable :cljs :default) t t))]
|
||||
(is (some? ex))
|
||||
(is (= (#?(:clj .getMessage :cljs ex-message) ex)
|
||||
(str "Error on key " ::error-init " when building system")))
|
||||
(is (= (ex-data ex)
|
||||
{:reason ::ig/build-threw-exception
|
||||
:system {::a [1]}
|
||||
:function ig/init-key
|
||||
:key ::error-init
|
||||
:value [1]}))
|
||||
(let [cause (#?(:clj .getCause :cljs ex-cause) ex)]
|
||||
(is (some? cause))
|
||||
(is (= (#?(:clj .getMessage :cljs ex-message) cause) "Testing"))
|
||||
(is (= (ex-data cause) {:reason ::test})))))
|
||||
|
||||
(testing "exception when running"
|
||||
(let [system (ig/init {::a 1
|
||||
::error-halt (ig/ref ::a)
|
||||
::b (ig/ref ::error-halt)
|
||||
::c (ig/ref ::b)})
|
||||
ex (try (ig/halt! system)
|
||||
(catch #?(:clj Throwable :cljs :default) t t))]
|
||||
(is (some? ex))
|
||||
(is (= (#?(:clj .getMessage :cljs ex-message) ex)
|
||||
(str "Error on key " ::error-halt " when running system")))
|
||||
(is (= (ex-data ex)
|
||||
{:reason ::ig/run-threw-exception
|
||||
:system {::a [1], ::error-halt [[1]], ::b [[[1]]], ::c [[[[1]]]]}
|
||||
:completed-keys '(::c ::b)
|
||||
:remaining-keys '(::a)
|
||||
:function ig/halt-key!
|
||||
:key ::error-halt
|
||||
:value [[1]]}))
|
||||
(let [cause (#?(:clj .getCause :cljs ex-cause) ex)]
|
||||
(is (some? cause))
|
||||
(is (= (#?(:clj .getMessage :cljs ex-message) cause) "Testing"))
|
||||
(is (= (ex-data cause) {:reason ::test}))))))
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
(ns integrant.test.bar)
|
||||
|
||||
(def message "bar")
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
(ns integrant.test.baz)
|
||||
|
||||
(def message "baz")
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
(ns integrant.test.foo)
|
||||
|
||||
(def message "foo")
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
(ns integrant.test.quz)
|
||||
|
||||
(def message "quz")
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
(ns integrant.test-runner
|
||||
(:require [doo.runner :refer-macros [doo-tests]]
|
||||
[integrant.core-test]))
|
||||
|
||||
(doo-tests 'integrant.core-test)
|
||||
|
|
@ -1,67 +1,77 @@
|
|||
(ns rewrite-clj.node.coercer-test
|
||||
(:require [clojure.test :refer [deftest testing is are]]
|
||||
[rewrite-clj.node :as node]
|
||||
[rewrite-clj.node.protocols :as protocols]
|
||||
[rewrite-clj.node.regex :as regex]
|
||||
[rewrite-clj.parser :as p]))
|
||||
|
||||
(deftest t-sexpr->node->sexpr-roundtrip
|
||||
(testing "simple cases roundtrip"
|
||||
(are [?sexpr expected-tag ]
|
||||
(are [?sexpr expected-tag expected-type]
|
||||
(let [n (node/coerce ?sexpr)]
|
||||
(is (node/node? n))
|
||||
(is (= ?sexpr (node/sexpr n)))
|
||||
(is (string? (node/string n)))
|
||||
(is (= expected-tag (node/tag n)) "tag")
|
||||
#_(is (= expected-type (protocols/node-type n)) "node-type")
|
||||
(is (not (meta n)))
|
||||
(is (= (type ?sexpr) (type (node/sexpr n)))))
|
||||
(if (seq? ?sexpr)
|
||||
(is (seq? (node/sexpr n)))
|
||||
(is (= (type (node/sexpr n)) (type ?sexpr) ))))
|
||||
|
||||
;; numbers
|
||||
|
||||
;; note that we do have an integer-node, but rewrite-clj never parses to it
|
||||
;; so we never coerce to it either
|
||||
3 :token ;;:token
|
||||
3N :token ;;:token
|
||||
3.14 :token ;;:token
|
||||
3.14M :token ;;:token
|
||||
3e14 :token ;;:token
|
||||
3 :token :token
|
||||
3N :token :token
|
||||
3.14 :token :token
|
||||
3.14M :token :token
|
||||
3e14 :token :token
|
||||
|
||||
;; ratios are not valid in cljs
|
||||
#?@(:clj [3/4 :token ;;:token
|
||||
]
|
||||
)
|
||||
#?@(:clj [3/4 :token :token])
|
||||
|
||||
;; symbol/keyword/string/...
|
||||
'symbol :token ;;:symbol
|
||||
'namespace/symbol :token ;;:symbol
|
||||
:keyword :token ;;:keyword
|
||||
:1.5.1 :token ;;:keyword
|
||||
::keyword :token ;;:keyword
|
||||
::1.5.1 :token ;;:keyword
|
||||
:namespace/keyword :token ;;:keyword
|
||||
'symbol :token :symbol
|
||||
'namespace/symbol :token :symbol
|
||||
:keyword :token :keyword
|
||||
:1.5.1 :token :keyword
|
||||
::keyword :token :keyword
|
||||
::1.5.1 :token :keyword
|
||||
:namespace/keyword :token :keyword
|
||||
|
||||
"" :token ;;:string
|
||||
"hello, over there!" :token ;;:string
|
||||
"multi\nline" :multi-line ;;:string
|
||||
" " :token ;;:string
|
||||
"\n" :multi-line ;;:string
|
||||
"\n\n" :multi-line ;;:string
|
||||
"," :token ;;:string
|
||||
"" :token :string
|
||||
"hello, over there!" :token :string
|
||||
"multi\nline" :token :string
|
||||
" " :token :string
|
||||
"\n" :token :string
|
||||
"\n\n" :token :string
|
||||
"," :token :string
|
||||
"inner\"quote" :token :string
|
||||
"\\s+" :token :string
|
||||
|
||||
;; seqs
|
||||
[] :vector ;;:seq
|
||||
[1 2 3] :vector ;;:seq
|
||||
() :list ;;:seq
|
||||
'() :list ;;:seq
|
||||
(list 1 2 3) :list ;;:seq
|
||||
#{} :set ;;:seq
|
||||
#{1 2 3} :set ;;:seq
|
||||
[] :vector :seq
|
||||
[1 2 3] :vector :seq
|
||||
() :list :seq
|
||||
'() :list :seq
|
||||
(list 1 2 3) :list :seq
|
||||
#{} :set :seq
|
||||
#{1 2 3} :set :seq
|
||||
(cons 1 [2 3]) :list :seq
|
||||
(lazy-seq [1 2 3]) :list :seq
|
||||
|
||||
;; date
|
||||
#inst "2014-11-26T00:05:23" :token ;; :token
|
||||
))
|
||||
(testing "multi-line string newline variants are normalized"
|
||||
#inst "2014-11-26T00:05:23" :token :token))
|
||||
(testing "multi-line string newline variants are preserved"
|
||||
(let [s "hey\nyou\rover\r\nthere"
|
||||
n (node/coerce s)]
|
||||
(is (= "hey\nyou\nover\nthere" (node/sexpr n))))))
|
||||
(is (= s (node/sexpr n)))))
|
||||
(testing "coerce string roundtrip"
|
||||
(is (= "\"hey \\\" man\"" (-> "hey \" man" node/coerce node/string))))
|
||||
(testing "coerce string equals parsed string"
|
||||
(is (= (p/parse-string "\"hello\"") (node/coerce "hello")))))
|
||||
|
||||
(deftest
|
||||
t-quoted-list-reader-location-metadata-elided
|
||||
|
|
@ -81,7 +91,7 @@
|
|||
(let [n (node/coerce ?sexpr)]
|
||||
(is (node/node? n))
|
||||
(is (= :map (node/tag n)))
|
||||
;; (is (= :seq protocols/node-type n))
|
||||
#_(is (= :seq (protocols/node-type n)))
|
||||
(is (string? (node/string n)))
|
||||
(is (= ?sexpr (node/sexpr n)))
|
||||
;; we do not restore to original map (hash-map or array-map),
|
||||
|
|
@ -94,27 +104,16 @@
|
|||
(array-map)
|
||||
(array-map :d 4 :e 5)))
|
||||
|
||||
(deftest t-namespaced-maps-coerce-to-maps
|
||||
(are [?sexpr]
|
||||
(let [n (node/coerce ?sexpr)]
|
||||
(is (node/node? n))
|
||||
(is (= :map (node/tag n)))
|
||||
;; (is (= :seq (protocols/node-type n)))
|
||||
(is (string? (node/string n)))
|
||||
(is (= ?sexpr (node/sexpr n)))
|
||||
(is (map? (node/sexpr n))))
|
||||
#:prefix {:a 1 :b 2}
|
||||
#::{:c 3 :d 4}
|
||||
#::p{:e 5 :f 6}))
|
||||
|
||||
|
||||
(deftest t-sexpr->node->sexpr-roundtrip-for-regex
|
||||
(are [?in]
|
||||
(let [n (node/coerce ?in)]
|
||||
(is (node/node? n))
|
||||
(is (= :regex (node/tag n)))
|
||||
;; (is (= :regex (protocols/node-type n)))
|
||||
#_(is (= :regex (protocols/node-type n)))
|
||||
(is (string? (node/string n)))
|
||||
#_(is (= (list 're-pattern (regex/pattern-string-for-regex ?in))
|
||||
(is (= (list 're-pattern (regex/pattern-string-for-regex ?in))
|
||||
(node/sexpr n))))
|
||||
#"abc"
|
||||
#"a\nb\nc"
|
||||
|
|
@ -127,7 +126,7 @@
|
|||
(let [n (node/coerce #'identity)]
|
||||
(is (node/node? n))
|
||||
(is (= :var (node/tag n)))
|
||||
#_(is (= :reader (protocols/node-type n)))
|
||||
(is (= :reader (protocols/node-type n)))
|
||||
(is (= '(var #?(:clj clojure.core/identity :cljs cljs.core/identity)) (node/sexpr n)))))
|
||||
|
||||
(deftest t-nil
|
||||
|
|
@ -153,31 +152,30 @@
|
|||
(deftest t-nodes-coerce-to-themselves
|
||||
(testing "parsed nodes"
|
||||
;; lean on the parser to create node structures
|
||||
(are [?s ?tag #_?type]
|
||||
(are [?s ?tag ?type]
|
||||
(let [n (p/parse-string ?s)]
|
||||
(is (= n (node/coerce n)))
|
||||
(is (= ?tag (node/tag n)))
|
||||
#_(is (= ?type (protocols/node-type n))))
|
||||
";; comment" :comment ;;:comment
|
||||
"#! comment" :comment ;;:comment
|
||||
"#(+ 1 %)" :fn ;;:fn
|
||||
":my-kw" :token ;;:keyword
|
||||
"^:m1 [1 2 3]" :meta ;;:meta
|
||||
"#:p1{:a 1 :b 2}" :namespaced-map ;;:namespaced-map
|
||||
"'a" :quote ;;:quote
|
||||
"#'var" :var ;;:reader
|
||||
"#=eval" :eval ;;:reader
|
||||
"@deref" :deref ;;:deref
|
||||
"#mymacro 44" :reader-macro ;;:reader-macro
|
||||
"#\"regex\"" :regex ;;:regex
|
||||
"[1 2 3]" :vector ;;:seq
|
||||
"42" :token ;;:token
|
||||
"sym" :token ;;:symbol
|
||||
"#_ 99" :uneval ;;:uneval
|
||||
" " :whitespace ;;:whitespace
|
||||
"," :comma ;;:comma
|
||||
"\n" :newline ;;:newline
|
||||
))
|
||||
";; comment" :comment :comment
|
||||
"#! comment" :comment :comment
|
||||
"#(+ 1 %)" :fn :fn
|
||||
":my-kw" :token :keyword
|
||||
"^:m1 [1 2 3]" :meta :meta
|
||||
"#:p1{:a 1 :b 2}" :namespaced-map :namespaced-map
|
||||
"'a" :quote :quote
|
||||
"#'var" :var :reader
|
||||
"#=eval" :eval :reader
|
||||
"@deref" :deref :deref
|
||||
"#mymacro 44" :reader-macro :reader-macro
|
||||
"#\"regex\"" :regex :regex
|
||||
"[1 2 3]" :vector :seq
|
||||
"42" :token :token
|
||||
"sym" :token :symbol
|
||||
"#_ 99" :uneval :uneval
|
||||
" " :whitespace :whitespace
|
||||
"," :comma :comma
|
||||
"\n" :newline :newline))
|
||||
(testing "parsed forms nodes"
|
||||
(let [n (p/parse-string-all "(def a 1)")]
|
||||
(is (= n (node/coerce n)))
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -8,7 +8,8 @@
|
|||
[selmer.filters :as f]
|
||||
[selmer.parser :as p :refer [render render-file render-template
|
||||
parse parse-input known-variables
|
||||
<< resolve-var-from-kw env-map]]
|
||||
<< resolve-var-from-kw env-map
|
||||
resolve-arg]]
|
||||
[selmer.tags :as tags]
|
||||
[clojure.set :as set])
|
||||
(:import (java.io StringReader ByteArrayInputStream)
|
||||
|
|
@ -1294,3 +1295,32 @@
|
|||
|
||||
(is (= "false" (let [y false] (<< "{{y}}")))
|
||||
"<< picks up local values even if they are false"))
|
||||
|
||||
(deftest resolve-arg-test
|
||||
(is (= "John"
|
||||
(resolve-arg "{{variable}}" {:variable "John"}))
|
||||
"When arg is a variable, returns it substituted by its value.")
|
||||
(is (= "Hello John!"
|
||||
(resolve-arg "Hello {{variable}}!" {:variable "John"}))
|
||||
"When arg contains a variable, return it with the variable substituted by its value.")
|
||||
(is (= "JOHN"
|
||||
(resolve-arg "{{variable|upper}}" {:variable "John"}))
|
||||
"When arg is a filter, returns it where the filter was applied to its value.")
|
||||
(is (= "Hello JOHN!"
|
||||
(resolve-arg "Hello {{variable|upper}}!" {:variable "John"}))
|
||||
"When arg contains a filter, returns it where the filter was applied to its value.")
|
||||
(is (= "Mr John"
|
||||
(resolve-arg "{% if variable = \"John\" %}Mr {{variable}}{% endif %}" {:variable "John"}))
|
||||
"When arg is a tag, returns it where the tag was rendered to its value.")
|
||||
(is (= "Hello Mr John!"
|
||||
(resolve-arg "Hello {% if variable = \"John\" %}Mr {{variable}}{% endif %}!" {:variable "John"}))
|
||||
"When arg contains a tag, returns it where the tag was rendered to its value.")
|
||||
(is (= "Hello John!"
|
||||
(resolve-arg "\"Hello John!\"" {}))
|
||||
"When arg is a double quoted literal string, returns it without double quoting.")
|
||||
(is (= "Hello John!"
|
||||
(resolve-arg "Hello John!" {}))
|
||||
"When arg is a literal string, returns it as is.")
|
||||
(is (= "29.99"
|
||||
(resolve-arg "29.99" {}))
|
||||
"When arg is a literal number, returns it as is."))
|
||||
|
|
|
|||
1
test-resources/posix-file-attributes.txt
Normal file
1
test-resources/posix-file-attributes.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
42
|
||||
111
test-resources/proxy_inputstream_outputstream.bb
Normal file
111
test-resources/proxy_inputstream_outputstream.bb
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
(ns proxy-inputstream-outputstream
|
||||
(:import (java.io InputStream OutputStream)
|
||||
(java.nio ByteBuffer)))
|
||||
|
||||
|
||||
;;
|
||||
;; Accept a ByteBuffer and return an InputStream that reads data from
|
||||
;; the given buffer.
|
||||
;;
|
||||
|
||||
|
||||
(defn buffer->input-stream ^InputStream [^ByteBuffer buffer]
|
||||
(proxy [InputStream] []
|
||||
(read
|
||||
([]
|
||||
(if (.hasRemaining buffer)
|
||||
(-> (.get buffer)
|
||||
(bit-and 0xff))
|
||||
-1))
|
||||
([b]
|
||||
(.read this b 0 (alength b)))
|
||||
([b off len]
|
||||
(if (.hasRemaining buffer)
|
||||
(let [len (min (alength b)
|
||||
(.remaining buffer))]
|
||||
(.get buffer b off len)
|
||||
len)
|
||||
-1)))))
|
||||
|
||||
|
||||
;;
|
||||
;; Accept a ByteBuffer and return an OutputStream that writes into the
|
||||
;; buffer.
|
||||
;;
|
||||
|
||||
|
||||
(defn buffer->output-stream ^OutputStream [^ByteBuffer buffer]
|
||||
(proxy [OutputStream] []
|
||||
(write
|
||||
([v]
|
||||
(if (bytes? v)
|
||||
(.put buffer ^bytes v)
|
||||
(.put buffer (-> (Integer. v) (.byteValue)))))
|
||||
([v off len]
|
||||
(.put buffer ^bytes v 0 (alength v))))))
|
||||
|
||||
|
||||
;;
|
||||
;; Tests:
|
||||
;;
|
||||
|
||||
|
||||
(defn read-byte-by-byte-test []
|
||||
(let [in (-> (.getBytes "Hello")
|
||||
(ByteBuffer/wrap)
|
||||
(buffer->input-stream))]
|
||||
(and (= (.read in) (int \H))
|
||||
(= (.read in) (int \e))
|
||||
(= (.read in) (int \l))
|
||||
(= (.read in) (int \l))
|
||||
(= (.read in) (int \o))
|
||||
(= (.read in) -1))))
|
||||
|
||||
(defn read-byte-array []
|
||||
(let [in (-> (.getBytes "Hello")
|
||||
(ByteBuffer/wrap)
|
||||
(buffer->input-stream))
|
||||
buffer (byte-array 10)
|
||||
len (.read in buffer)]
|
||||
(and (= len 5)
|
||||
(= (String. buffer 0 len) "Hello"))))
|
||||
|
||||
(defn read-all []
|
||||
(let [in (-> (.getBytes "Hello")
|
||||
(ByteBuffer/wrap)
|
||||
(buffer->input-stream))
|
||||
data (.readAllBytes in)]
|
||||
(= (String. data) "Hello")))
|
||||
|
||||
(defn write-byte-by-byte []
|
||||
(let [buffer (ByteBuffer/allocate 10)
|
||||
out (buffer->output-stream buffer)]
|
||||
(.write out (int \H))
|
||||
(.write out (int \e))
|
||||
(.write out (int \l))
|
||||
(.write out (int \l))
|
||||
(.write out (int \o))
|
||||
(= (String. (.array buffer)
|
||||
0
|
||||
(.position buffer))
|
||||
"Hello")))
|
||||
|
||||
(defn write-byte-array []
|
||||
(let [buffer (ByteBuffer/allocate 10)
|
||||
out (buffer->output-stream buffer)]
|
||||
(.write out (.getBytes "Hello"))
|
||||
(= (String. (.array buffer)
|
||||
0
|
||||
(.position buffer))
|
||||
"Hello")))
|
||||
|
||||
;;
|
||||
;; Run all tests:
|
||||
;;
|
||||
|
||||
(when (and (read-byte-by-byte-test)
|
||||
(read-byte-array)
|
||||
(read-all)
|
||||
(write-byte-by-byte)
|
||||
(write-byte-array))
|
||||
(println ":success"))
|
||||
1
test-resources/script_with_overlapping_opts.clj
Normal file
1
test-resources/script_with_overlapping_opts.clj
Normal file
|
|
@ -0,0 +1 @@
|
|||
(prn *command-line-args*)
|
||||
1
test-resources/symlink-adjacent-bb
Symbolic link
1
test-resources/symlink-adjacent-bb
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
adjacent_bb/medley.bb
|
||||
|
|
@ -42,3 +42,11 @@
|
|||
[(async/go
|
||||
(async/<! (async/timeout 100))
|
||||
10)])))))")))))
|
||||
|
||||
(deftest timeout-test
|
||||
(is (nil? (edn/read-string (test-utils/bb nil "
|
||||
(first (async/<!!
|
||||
(async/go
|
||||
(async/alts!
|
||||
[(async/go
|
||||
(async/<! (async/timeout (int 100))))]))))")))))
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@
|
|||
(testing "call to run in missing dir gives 'cannot run program' message"
|
||||
(test-utils/with-config
|
||||
(pr-str '{:tasks {foo (clojure {:dir "../missingdir"} "-M" "-r")}})
|
||||
; check rough text of error message, specific message about missing directory is OS-dependent
|
||||
;; check rough text of error message, specific message about missing directory is OS-dependent
|
||||
(is (thrown-with-msg? Exception #"Cannot run program .* \(in directory \"\.\.[/\\]missingdir\"\)"
|
||||
(bb "run" "foo"))))))
|
||||
|
||||
|
|
@ -387,7 +387,7 @@ even more stuff here\"
|
|||
(try
|
||||
(spit "uberjar" "#!/usr/bin/env bb\n(+ 1 2 3)")
|
||||
(vreset! common/bb-edn '{:tasks {uberjar (+ 1 2 3)}})
|
||||
(is (= "uberjar" (:file (main/parse-opts ["uberjar"]))))
|
||||
(is (= {:file "uberjar", :command-line-args '("--version")} (second (main/parse-opts ["uberjar" "--version"]))))
|
||||
(finally (fs/delete "uberjar"))))))
|
||||
|
||||
(deftest min-bb-version-test
|
||||
|
|
@ -409,7 +409,7 @@ even more stuff here\"
|
|||
entries (cp/split-classpath out)
|
||||
entry (first entries)]
|
||||
(is (= 1 (count entries)))
|
||||
(is (= (fs/parent config) (fs/parent entry)))
|
||||
(is (= (fs/real-path (fs/parent config)) (fs/real-path (fs/parent entry))))
|
||||
(is (str/ends-with? entry "src"))))))
|
||||
|
||||
(deftest without-deps-test
|
||||
|
|
@ -513,7 +513,7 @@ even more stuff here\"
|
|||
(testing "default deps-root path is same as bb.edn"
|
||||
(let [out (bb "--config" config "cp")
|
||||
entries (cp/split-classpath out)]
|
||||
(is (= (fs/parent f) (fs/parent (first entries))))))
|
||||
(is (= (fs/real-path(fs/parent f)) (fs/real-path (fs/parent (first entries)))))))
|
||||
(spit config
|
||||
'{:paths ["src"]
|
||||
:deps {local/dep {:local/root "local-dep"}}
|
||||
|
|
@ -523,8 +523,27 @@ even more stuff here\"
|
|||
_ (spit (str (fs/file root "deps.edn")) {})
|
||||
out (bb "--config" config "cp")
|
||||
entries (cp/split-classpath out)]
|
||||
(is (= (fs/parent f) (fs/parent (first entries)))))))))
|
||||
(is (= (fs/real-path (fs/parent f)) (fs/real-path (fs/parent (first entries))))))))))
|
||||
|
||||
(deftest adjacent-bb-edn-test
|
||||
(is (= {1 {:id 1}} (bb "test-resources/adjacent_bb/medley.bb")))
|
||||
(is (= {1 {:id 1}} (bb "-f" "test-resources/adjacent_bb/medley.bb"))))
|
||||
(is (= {1 {:id 1}} (bb "-f" "test-resources/adjacent_bb/medley.bb")))
|
||||
(testing "symlink"
|
||||
(is (= {1 {:id 1}} (bb (str (fs/file "test-resources" "symlink-adjacent-bb")))))))
|
||||
|
||||
; symlinks that resolve in the /proc fs cause fs/real-path to throw when figuring out bb.edn path (issue #1700)
|
||||
(deftest redirection-test
|
||||
(testing "main doesn't throw when input file symlink resolves to 'not real' file"
|
||||
(when (and test-utils/native? (not test-utils/windows?))
|
||||
(is (str/starts-with? (test-utils/bb "(println \"hi\")" "/dev/stdin") "hi")))))
|
||||
|
||||
(deftest non-existing-tasks-in-run-gives-exit-code-1
|
||||
(is (thrown? Exception (bb "-Sdeps" "{:tasks {foo {:task (run (quote bar))}}}" "foo"))))
|
||||
|
||||
(deftest empty-bb-edn-test
|
||||
(is (= 6 (bb "-Sdeps" "" "-e" "(+ 1 2 3)"))))
|
||||
|
||||
(deftest warning-on-override-task
|
||||
(when-not test-utils/native?
|
||||
(binding [*out* *err*]
|
||||
(is (str/includes? (with-out-str (bb "-Sdeps" "{:tasks {run {:task 1}}}" "run")) "'run' override")))))
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue