Compare commits
980 commits
frenchy64-
...
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 | ||
|
|
32a18191dc | ||
|
|
dcb0b45405 | ||
|
|
e84eb29fa1 | ||
|
|
1c425796ae | ||
|
|
4e8d907369 | ||
|
|
f4bc802880 | ||
|
|
c13500cddb | ||
|
|
98aa6b996e | ||
|
|
f2e955cc0b | ||
|
|
5c4eedb12b | ||
|
|
c536d524f8 | ||
|
|
ea57060963 | ||
|
|
430a466a25 | ||
|
|
d27efb137d | ||
|
|
0063196074 | ||
|
|
4db3de5987 | ||
|
|
cd70809b1b | ||
|
|
2b24a84c11 | ||
|
|
7d5cdadbcb | ||
|
|
325e043440 | ||
|
|
4dcc159ed7 | ||
|
|
a9be9d02ea | ||
|
|
d2fece3f80 | ||
|
|
39e4ea71e9 | ||
|
|
4cbdb57ad1 | ||
|
|
2e0bbfb260 | ||
|
|
c1726c3b98 | ||
|
|
0951328270 | ||
|
|
1de5c553ea | ||
|
|
cd4987b005 | ||
|
|
340d24fb07 | ||
|
|
abc102f0b8 | ||
|
|
3f99274978 | ||
|
|
26967df643 | ||
|
|
1644c94fda | ||
|
|
63102eca86 | ||
|
|
f7907be86e | ||
|
|
19bfd172fc | ||
|
|
a945ea8146 | ||
|
|
fcb0b4a1a7 | ||
|
|
6eea167cfe | ||
|
|
307ed36f9c | ||
|
|
99655aa224 | ||
|
|
b7ee49ab8d | ||
|
|
37b5d1d6a3 | ||
|
|
1a54f03ce3 | ||
|
|
9365a24eed | ||
|
|
0b5a281d46 | ||
|
|
c89a396bbd | ||
|
|
905f6365d4 | ||
|
|
c1788da654 | ||
|
|
d3f7a52f65 | ||
|
|
c85e86cb7e | ||
|
|
b4365826ba | ||
|
|
e68eb7a998 | ||
|
|
18b2d54d33 | ||
|
|
43e7b4af0b | ||
|
|
57ebb524b0 | ||
|
|
6ccdfae7bb | ||
|
|
fa34ebfdef | ||
|
|
a66a2f74f5 | ||
|
|
6850caed6e | ||
|
|
29150e6bd3 | ||
|
|
4a45624acd | ||
|
|
cce0a3d378 | ||
|
|
26780fffe5 | ||
|
|
1bc4782d42 | ||
|
|
2c6485b876 | ||
|
|
4fc1d9a815 | ||
|
|
e7521110c9 | ||
|
|
e2f2e9ae4e | ||
|
|
0927a48c50 | ||
|
|
69373fb445 | ||
|
|
7aba75564e | ||
|
|
4438f3bbcf | ||
|
|
1bb7ebe3dc | ||
|
|
9545d23cc4 | ||
|
|
e74e7ed2ca | ||
|
|
5ad161a059 | ||
|
|
68878e7f89 | ||
|
|
84bd66f869 | ||
|
|
5516151132 | ||
|
|
4e52f0d34c | ||
|
|
4a38fdbd07 | ||
|
|
a8d3923262 | ||
|
|
8d8d3a1057 | ||
|
|
d4c4e53c86 | ||
|
|
52a7c205a3 | ||
|
|
9e004edefe | ||
|
|
b8a0520b93 | ||
|
|
1022068624 | ||
|
|
8df7f7c3fe | ||
|
|
f5e2fe0f61 | ||
|
|
abdd068149 | ||
|
|
99ec77afeb | ||
|
|
eba9d0d642 | ||
|
|
9520c5b240 | ||
|
|
9b21986f05 | ||
|
|
076a2774be | ||
|
|
3f4ac12cc4 | ||
|
|
b2d422cacb | ||
|
|
5dc7763325 | ||
|
|
3045cd226e | ||
|
|
187ee7da00 | ||
|
|
cd9a87e75c | ||
|
|
3ad043769c | ||
|
|
332c7c6ac8 | ||
|
|
711bb40480 | ||
|
|
be426ee56d | ||
|
|
9118c43da3 | ||
|
|
c5c8086dfe | ||
|
|
734ca577f6 | ||
|
|
bf3623b596 | ||
|
|
b2f534517c | ||
|
|
ead237eee3 | ||
|
|
30a15e16ae | ||
|
|
42fd5d851f | ||
|
|
6d1f295f47 | ||
|
|
a1858774b6 | ||
|
|
ab0c5bb058 | ||
|
|
920babb56b | ||
|
|
cc0338a1e9 | ||
|
|
a4e791e6ad | ||
|
|
02d300ee3d | ||
|
|
a6d8d0179c | ||
|
|
9441dabf81 | ||
|
|
842c7a0589 | ||
|
|
a19d05b8da | ||
|
|
ca1e2d7769 | ||
|
|
72dbf53df7 | ||
|
|
76e779d0d3 | ||
|
|
bbd1940844 | ||
|
|
0dab6f5f3d | ||
|
|
5a1b6a9f79 | ||
|
|
722812bd61 | ||
|
|
2b575b1ea6 | ||
|
|
e9e906e09f | ||
|
|
d8f50879c8 | ||
|
|
28f72ff4a2 | ||
|
|
32864476e5 | ||
|
|
63abc75cf5 | ||
|
|
b2855d1212 | ||
|
|
bd5597a3cb | ||
|
|
a79c33d7bf | ||
|
|
1452f45cfb | ||
|
|
64dcb3335d | ||
|
|
c053765731 | ||
|
|
314906cb0d | ||
|
|
4220902927 | ||
|
|
4931048284 | ||
|
|
2da873a2c1 | ||
|
|
17adc69abc | ||
|
|
a464b59bc2 | ||
|
|
7c2e8a155f | ||
|
|
fa9103807d | ||
|
|
3610f52c47 | ||
|
|
68d041c892 | ||
|
|
02cdb00e8d | ||
|
|
7f44c272b8 | ||
|
|
5140bd4249 | ||
|
|
0be3c71772 | ||
|
|
77878631e9 | ||
|
|
28ec2c690a | ||
|
|
fe6042a06f | ||
|
|
6feb785cb0 | ||
|
|
eca7847ed9 | ||
|
|
430cbedbe4 | ||
|
|
a5318ea289 | ||
|
|
91413c2803 | ||
|
|
7844039861 | ||
|
|
61851a511f | ||
|
|
09debe0f1d | ||
|
|
71d0a14c26 | ||
|
|
5b42de70d8 | ||
|
|
79a9bc531a | ||
|
|
6b6d403d5e | ||
|
|
843ca4c2d3 | ||
|
|
e43edd8627 | ||
|
|
b2b20e15c1 | ||
|
|
004e99eaa3 | ||
|
|
4d1c05b23d | ||
|
|
6f41179849 | ||
|
|
1810b4bd97 | ||
|
|
e3aa11baa8 | ||
|
|
9b5ec623e4 | ||
|
|
0b4bfdc3ab | ||
|
|
96e70ff7e3 | ||
|
|
eb4e583c97 | ||
|
|
47df0c47a1 | ||
|
|
7de2262585 | ||
|
|
27fad0ac36 | ||
|
|
5b7213822c | ||
|
|
8fa49b940d | ||
|
|
6c1f5f7a4d | ||
|
|
2a943086a6 | ||
|
|
9e1ea1071d | ||
|
|
a0a34dc5d8 | ||
|
|
b9308eddcc | ||
|
|
3aca505790 | ||
|
|
5965e32d26 | ||
|
|
e9b87b0185 | ||
|
|
91b3a962b4 | ||
|
|
d9358f0706 | ||
|
|
8e64ef9df8 | ||
|
|
2ac1428341 | ||
|
|
efe4f214cc | ||
|
|
bdbe5a4548 | ||
|
|
34136173d5 | ||
|
|
1e06b07d0f | ||
|
|
188949d7eb | ||
|
|
073e7e3ce0 | ||
|
|
39c1390085 | ||
|
|
dd77a85893 | ||
|
|
4223f1432d | ||
|
|
68a6e24516 | ||
|
|
8b39f67700 | ||
|
|
61950b87e2 | ||
|
|
df24d04f73 | ||
|
|
01eea0babb | ||
|
|
935c8da535 | ||
|
|
62916fa292 | ||
|
|
d9aad85476 | ||
|
|
37e2da9f5b | ||
|
|
2535299be8 | ||
|
|
965c177bca | ||
|
|
dc2502ebae | ||
|
|
df24cf287d | ||
|
|
72377d090f | ||
|
|
5570c416e9 | ||
|
|
e619a896a1 | ||
|
|
38dc526680 | ||
|
|
44dbc57cda | ||
|
|
b9fa877cd7 | ||
|
|
f9131b2979 | ||
|
|
ba328f2387 | ||
|
|
d721b925f4 | ||
|
|
c7ccc6fedb | ||
|
|
58dbd2b6aa | ||
|
|
f7b235635a | ||
|
|
7d5083ac0a | ||
|
|
683752c602 | ||
|
|
5ac048157a | ||
|
|
9dff25d36b | ||
|
|
c931fbe294 | ||
|
|
46b6dfd3c3 | ||
|
|
3bdeee8bee | ||
|
|
531b9383f2 | ||
|
|
facb65734e | ||
|
|
419b71e7c6 | ||
|
|
7cc94ea6a1 | ||
|
|
69db7105e5 | ||
|
|
cd3252796e | ||
|
|
6acd912a34 | ||
|
|
cf01d7f24d | ||
|
|
bd857ae3e1 | ||
|
|
43375d49a2 | ||
|
|
9087cf6311 | ||
|
|
c81babad9a | ||
|
|
952a695234 | ||
|
|
a92ebfe68a | ||
|
|
d681f9bc7f | ||
|
|
9305417edc | ||
|
|
7b6a69f2b3 | ||
|
|
eb740c7c9b | ||
|
|
d53d05c856 | ||
|
|
2a56f2e5ef | ||
|
|
ade5ca1ba7 | ||
|
|
bc0b59500b | ||
|
|
cf0f145d10 | ||
|
|
198722ab7c | ||
|
|
6e00354053 | ||
|
|
cb72f8ba17 | ||
|
|
7d3d38fee1 | ||
|
|
03e50cb17e | ||
|
|
0671678b60 | ||
|
|
434ee39ad9 | ||
|
|
c67441226a | ||
|
|
6f8f205609 | ||
|
|
0df40a1a9a | ||
|
|
4504976191 | ||
|
|
eb6745fa86 | ||
|
|
058d2071b2 | ||
|
|
99f1e948d3 | ||
|
|
40e0087b59 | ||
|
|
b458d79b29 | ||
|
|
495ded8a50 | ||
|
|
326b1def6b | ||
|
|
b7e327c690 | ||
|
|
759d977879 | ||
|
|
b57981bcd5 | ||
|
|
3751749ca3 | ||
|
|
7a22c5fa5a | ||
|
|
e08eab080e | ||
|
|
0ac4eea9ee | ||
|
|
885a82b736 | ||
|
|
d222b32d70 | ||
|
|
8d514cc982 | ||
|
|
65d77d3555 | ||
|
|
66e90be6a7 | ||
|
|
85bb1fec76 | ||
|
|
fc15eab795 | ||
|
|
d8a0018213 | ||
|
|
4c3fa4c406 | ||
|
|
bf55d65f14 | ||
|
|
4c1da7d242 | ||
|
|
a24c8fa197 | ||
|
|
6e2eaa9e87 | ||
|
|
9ed3cb6a31 | ||
|
|
8269a632c0 | ||
|
|
bc901fdcf0 | ||
|
|
a5dec07279 | ||
|
|
ac1b16bfc8 | ||
|
|
bb84bd357e | ||
|
|
e5ee1f4a77 | ||
|
|
5be61476d8 | ||
|
|
ee5f2a7a2e | ||
|
|
36d2ec2d87 | ||
|
|
8d9ac4c4d1 | ||
|
|
3d916df4a0 | ||
|
|
70d9bbd10e | ||
|
|
07030d8f89 | ||
|
|
9083959a5d | ||
|
|
4483ccf20b | ||
|
|
ce064291f3 | ||
|
|
e31cb57a3d | ||
|
|
ccc1512bb6 | ||
|
|
8b146525f2 | ||
|
|
c89300b3b5 | ||
|
|
42d721a92f | ||
|
|
98741c9db7 | ||
|
|
ee85685334 | ||
|
|
a4ba9527b9 | ||
|
|
a035291f41 | ||
|
|
f5a226ab34 | ||
|
|
10ec7dcf1a | ||
|
|
fc5dccc9ef | ||
|
|
9de689c623 | ||
|
|
eaf0a068f3 | ||
|
|
bca3f28e28 | ||
|
|
b452c1d94a | ||
|
|
cf93651e8e | ||
|
|
1cf8321960 | ||
|
|
a141998f55 | ||
|
|
5566a7869f | ||
|
|
17c9003e2a | ||
|
|
16ea1e8f95 | ||
|
|
1ead74a501 | ||
|
|
e3b55b5f47 | ||
|
|
a61c2721d7 | ||
|
|
74c26084e3 | ||
|
|
b409d663ff | ||
|
|
9cd1f71b76 | ||
|
|
81e837006e | ||
|
|
5cdeb09a17 | ||
|
|
0e57b9d461 | ||
|
|
351723fdb6 | ||
|
|
b6f19b03dc | ||
|
|
94aab46855 | ||
|
|
b6dffe3f87 | ||
|
|
bfe59b57d0 | ||
|
|
e283a87b4c | ||
|
|
9ca24ffce4 | ||
|
|
1e9cc9f203 | ||
|
|
7c15b04fa2 | ||
|
|
33bee0480d | ||
|
|
ed22bb573b | ||
|
|
682f8514fb | ||
|
|
c2b3fea9fc | ||
|
|
471ed01cae | ||
|
|
9241c81238 | ||
|
|
863c6051bd | ||
|
|
5bb2d2f8bd | ||
|
|
87e9e0861c | ||
|
|
2dac7847a8 | ||
|
|
851e1f5eb0 | ||
|
|
ec842c942d | ||
|
|
77768cec67 | ||
|
|
9fba927ec8 | ||
|
|
7e77ab5633 | ||
|
|
2b3e7df2e9 | ||
|
|
80a8ee1b7e | ||
|
|
465ea247eb | ||
|
|
c94960eac1 | ||
|
|
c081367304 | ||
|
|
8170fd7675 | ||
|
|
0684119000 | ||
|
|
8352448611 | ||
|
|
8fdefb99b9 | ||
|
|
e6f6b02c06 | ||
|
|
7baa0542ec | ||
|
|
4b1e02c6c7 | ||
|
|
9e8571cd08 | ||
|
|
89e8dfdf32 | ||
|
|
e2a8f03d21 | ||
|
|
020d42a94f | ||
|
|
eed298f4a4 | ||
|
|
0c87ed2312 | ||
|
|
78cbdd1d82 | ||
|
|
42ebb92c5d | ||
|
|
7b563dd802 | ||
|
|
2ff0304821 | ||
|
|
2ffbef09d8 | ||
|
|
525f73f822 | ||
|
|
fd3f4a100a | ||
|
|
a9f0483869 | ||
|
|
3110dde2ab | ||
|
|
848683f82d | ||
|
|
d2c8696039 | ||
|
|
92a8042f97 | ||
|
|
c3f61bdc34 | ||
|
|
3b5dbb7c66 | ||
|
|
aa0da8f503 | ||
|
|
00dee39196 | ||
|
|
06d6e97927 | ||
|
|
3bc5bcab5b | ||
|
|
3b9163cde9 | ||
|
|
621130960b | ||
|
|
739f05cc5e | ||
|
|
b84ecd5da7 | ||
|
|
2f146bd712 | ||
|
|
4926aaf85f | ||
|
|
d0d36a2bc4 | ||
|
|
1a700f6a69 | ||
|
|
1631349fb6 | ||
|
|
9566a7d1f1 | ||
|
|
03b1bfa80f | ||
|
|
e1094e1529 | ||
|
|
267646fbe7 | ||
|
|
ea4f56886d | ||
|
|
c4c76d58ac | ||
|
|
e3e855f7ae | ||
|
|
55ffa95b7d | ||
|
|
a592104bc5 | ||
|
|
ef84df8bc9 | ||
|
|
57a6249dcb | ||
|
|
42f79d0db3 | ||
|
|
8afd672a20 | ||
|
|
c97fb958dc | ||
|
|
dcae949496 | ||
|
|
d91eadbc9c | ||
|
|
086a5eb5a2 | ||
|
|
2400fc7be0 | ||
|
|
1197f4feec | ||
|
|
f116b493be | ||
|
|
ea36bbecb9 | ||
|
|
cd54d2a911 | ||
|
|
3e2738201c | ||
|
|
18e19934d1 | ||
|
|
ef41365656 | ||
|
|
3afd85ccb3 | ||
|
|
cae237e42a | ||
|
|
2ca3b2ecc5 | ||
|
|
bebd20c088 | ||
|
|
d15d38df8a | ||
|
|
fc3f178c7e | ||
|
|
8ef3bb08a8 | ||
|
|
75994d5134 | ||
|
|
38feb35a53 | ||
|
|
1200d5625c | ||
|
|
191c6b75a8 | ||
|
|
e285d970c7 | ||
|
|
52c60e7928 | ||
|
|
ccfa50b2bc | ||
|
|
d5c76f774e | ||
|
|
4a42ba938f | ||
|
|
6cdc002423 | ||
|
|
9b2435557d | ||
|
|
6e92c99f31 | ||
|
|
c77944fad7 | ||
|
|
813c6029c5 | ||
|
|
4dc084502a | ||
|
|
2150cb1e06 | ||
|
|
57b88f2141 | ||
|
|
6035a46b3a | ||
|
|
464a000b1b | ||
|
|
d27fc0d2d6 | ||
|
|
b5a17b3af7 | ||
|
|
1eaa094e9b | ||
|
|
306d97f4ef | ||
|
|
33569df040 | ||
|
|
72864a18d6 | ||
|
|
a7a84e872e | ||
|
|
5823a08d51 | ||
|
|
1b3c90870d | ||
|
|
55ff3bcf98 | ||
|
|
b4b0ee87fe | ||
|
|
42f9440d85 | ||
|
|
a201788087 | ||
|
|
f9327c04ca | ||
|
|
ddee3847bf | ||
|
|
765a9c0846 | ||
|
|
4aa352c94a | ||
|
|
b0de4a79a4 | ||
|
|
de43917140 | ||
|
|
c4f2d45f08 | ||
|
|
2c3b1095c8 | ||
|
|
0cdb897f4f | ||
|
|
c97b08425a | ||
|
|
0608c71687 | ||
|
|
2a01f8720e | ||
|
|
774b2d5d3d | ||
|
|
1bd2c18d5e | ||
|
|
245a5bfaad | ||
|
|
dc30728f68 | ||
|
|
e8ca180529 | ||
|
|
05d105716a | ||
|
|
781cc929dd | ||
|
|
8d24f70d73 | ||
|
|
1b3adaaf64 | ||
|
|
dc5b36bbe6 | ||
|
|
5c03eef36b | ||
|
|
e58fe9db1b | ||
|
|
9e57cb4430 | ||
|
|
5c246ccccb | ||
|
|
cde09afa10 | ||
|
|
9c92500297 | ||
|
|
19f58fca83 | ||
|
|
55ba655fab | ||
|
|
4a76fd050d | ||
|
|
30dcb2ad86 | ||
|
|
8aba3ffc2d | ||
|
|
bf06830353 | ||
|
|
536f39d435 | ||
|
|
ac9b249cc8 | ||
|
|
8f447cf43b | ||
|
|
3cf09e12fa | ||
|
|
dca1d2693c | ||
|
|
0ab0cb2410 | ||
|
|
e1544f3d65 | ||
|
|
4e2ef2f152 | ||
|
|
e20ba643ff | ||
|
|
22763c6485 | ||
|
|
00ea105d4a | ||
|
|
3dfcc74324 | ||
|
|
d18ecbd22f | ||
|
|
38185d5658 | ||
|
|
21fd8e3a3f | ||
|
|
cdbe07ad45 | ||
|
|
32ac3c5398 | ||
|
|
e7c504b331 | ||
|
|
7b10adc69a | ||
|
|
4aa6cfc472 | ||
|
|
90add0e787 | ||
|
|
1a48bdf4bc | ||
|
|
16e427848d | ||
|
|
01e414c4d1 | ||
|
|
f044ba15cd | ||
|
|
f8b0a00a17 | ||
|
|
53aa17dbde | ||
|
|
abc15c4959 | ||
|
|
0751e39eac | ||
|
|
833318edb2 | ||
|
|
9cbdc8f767 | ||
|
|
0c9ddadd90 | ||
|
|
2688156b78 | ||
|
|
3f404746b4 | ||
|
|
f491d02ba0 | ||
|
|
3564cac6b3 | ||
|
|
04f16e220c | ||
|
|
e651de400a | ||
|
|
aec2848e24 | ||
|
|
72e9b6ceee | ||
|
|
6259797f6a | ||
|
|
0b471636e1 | ||
|
|
512dbf9ea5 | ||
|
|
b5dea3563d | ||
|
|
381b9f0a4f | ||
|
|
7769675648 | ||
|
|
573db8ea79 | ||
|
|
9ed705f8db | ||
|
|
0a55554bb8 | ||
|
|
cc2c682e79 | ||
|
|
56d2c2b7d5 |
206 changed files with 10814 additions and 3876 deletions
|
|
@ -2,10 +2,5 @@
|
||||||
:deps {borkdude/gh-release-artifact
|
:deps {borkdude/gh-release-artifact
|
||||||
#_{:local/root "../gh-release-artifact"}
|
#_{:local/root "../gh-release-artifact"}
|
||||||
{:git/url "https://github.com/borkdude/gh-release-artifact"
|
{:git/url "https://github.com/borkdude/gh-release-artifact"
|
||||||
:sha "cf082df46a648178d1904e9cbcb787d8136a35c6"}
|
:git/sha "4a9a74f0e50e897c45df8cc70684360eb30fce80"}}
|
||||||
babashka/.build {:git/url "https://github.com/babashka/.build"
|
:tasks {release-artifact babashka.release-artifact/release}}
|
||||||
:git/sha "1ce87f4960fea14f4d1248052e585e6027555d33"}}
|
|
||||||
:tasks {:requires ([scripts.short-ci :as short])
|
|
||||||
release-artifact babashka.release-artifact/release
|
|
||||||
short-ci {:task (do (alter-var-root (var short/config) assoc :skip-if-only [(re-pattern ".*")])
|
|
||||||
(apply short/main *command-line-args*))}}}
|
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,17 @@
|
||||||
# Check https://circleci.com/docs/2.0/language-clojure/ for more details
|
# Check https://circleci.com/docs/2.0/language-clojure/ for more details
|
||||||
#
|
#
|
||||||
version: 2.1
|
version: 2.1
|
||||||
commands:
|
|
||||||
setup-docker-buildx:
|
|
||||||
steps:
|
|
||||||
- run:
|
|
||||||
name: Create multi-platform capabale buildx builder
|
|
||||||
command: |
|
|
||||||
docker run --privileged --rm tonistiigi/binfmt --install all
|
|
||||||
docker buildx create --name ci-builder --use
|
|
||||||
|
|
||||||
|
# this allows you to use CircleCI's dynamic configuration feature
|
||||||
|
setup: true
|
||||||
|
|
||||||
|
# the continuation orb is required in order to use dynamic configuration
|
||||||
|
orbs:
|
||||||
|
continuation: circleci/continuation@0.1.2
|
||||||
|
|
||||||
|
# our defined job, and its steps
|
||||||
jobs:
|
jobs:
|
||||||
short-if-irrelevant:
|
setup:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/clojure:1.11.1
|
- image: cimg/clojure:1.11.1
|
||||||
steps:
|
steps:
|
||||||
|
|
@ -27,497 +27,14 @@ jobs:
|
||||||
name: Rename bb binary
|
name: Rename bb binary
|
||||||
command: mv /tmp/bb /tmp/bbb
|
command: mv /tmp/bb /tmp/bbb
|
||||||
- run:
|
- run:
|
||||||
name: Short CI if only irrelevant changes
|
name: Generate config
|
||||||
command: |
|
command: |
|
||||||
/tmp/bbb --config .build/bb.edn short-ci "circleci-agent step halt"
|
/tmp/bbb .circleci/script/gen_ci.clj > generated_config.yml
|
||||||
|
- continuation/continue:
|
||||||
jvm:
|
configuration_path: generated_config.yml
|
||||||
docker:
|
|
||||||
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
BABASHKA_PLATFORM: linux # could be used in jar name
|
|
||||||
resource_class: large
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }}
|
|
||||||
# fallback to using the latest cache if no exact match is found
|
|
||||||
- v1-dependencies-
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
sudo script/install-clojure
|
|
||||||
- run:
|
|
||||||
name: Run JVM tests
|
|
||||||
command: |
|
|
||||||
export BABASHKA_FEATURE_JDBC=true
|
|
||||||
export BABASHKA_FEATURE_POSTGRESQL=true
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Run as lein command
|
|
||||||
command: |
|
|
||||||
.circleci/script/lein
|
|
||||||
- run:
|
|
||||||
name: Create uberjar
|
|
||||||
command: |
|
|
||||||
mkdir -p /tmp/release
|
|
||||||
script/uberjar
|
|
||||||
VERSION=$(cat resources/BABASHKA_VERSION)
|
|
||||||
jar=target/babashka-$VERSION-standalone.jar
|
|
||||||
cp $jar /tmp/release
|
|
||||||
java -jar $jar script/reflection.clj
|
|
||||||
reflection="babashka-$VERSION-reflection.json"
|
|
||||||
java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$jar"
|
|
||||||
java -jar "$jar" --config .build/bb.edn --deps-root . release-artifact "$reflection"
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
key: v1-dependencies-{{ checksum "project.clj" }}-{{ checksum "deps.edn" }}
|
|
||||||
linux:
|
|
||||||
docker:
|
|
||||||
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
GRAALVM_VERSION: "22.1.0"
|
|
||||||
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
|
|
||||||
BABASHKA_PLATFORM: linux # used in release script
|
|
||||||
BABASHKA_TEST_ENV: native
|
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
|
||||||
resource_class: large
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
sudo script/install-clojure
|
|
||||||
- run:
|
|
||||||
name: Install native dev tools
|
|
||||||
command: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install build-essential zlib1g-dev
|
|
||||||
- run:
|
|
||||||
name: Download GraalVM
|
|
||||||
command: |
|
|
||||||
script/install-graalvm
|
|
||||||
- run:
|
|
||||||
name: Build binary
|
|
||||||
command: |
|
|
||||||
script/uberjar
|
|
||||||
script/compile
|
|
||||||
no_output_timeout: 30m
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: |
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: |
|
|
||||||
.circleci/script/release
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: /tmp
|
|
||||||
paths:
|
|
||||||
- release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
- ~/graalvm-ce-java11-22.1.0
|
|
||||||
key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- run:
|
|
||||||
name: Publish artifact link to Slack
|
|
||||||
command: |
|
|
||||||
./bb .circleci/script/publish_artifact.clj || true
|
|
||||||
linux-static:
|
|
||||||
docker:
|
|
||||||
- image: circleci/clojure:openjdk-11-lein-2.9.8-bullseye
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
GRAALVM_VERSION: "22.1.0"
|
|
||||||
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
|
|
||||||
BABASHKA_PLATFORM: linux # used in release script
|
|
||||||
BABASHKA_TEST_ENV: native
|
|
||||||
BABASHKA_STATIC: "true"
|
|
||||||
BABASHKA_MUSL: "true"
|
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
|
||||||
resource_class: large
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- attach_workspace:
|
|
||||||
at: /tmp
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
# - run:
|
|
||||||
# name: "Short circuit on SNAPSHOT"
|
|
||||||
# command: |
|
|
||||||
# VERSION=$(cat resources/BABASHKA_VERSION)
|
|
||||||
# if [[ "$VERSION" == *-SNAPSHOT ]]
|
|
||||||
# then
|
|
||||||
# circleci task halt
|
|
||||||
# fi
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
sudo script/install-clojure
|
|
||||||
- run:
|
|
||||||
name: Install native dev tools
|
|
||||||
command: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install build-essential zlib1g-dev
|
|
||||||
sudo -E script/setup-musl
|
|
||||||
- run:
|
|
||||||
name: Download GraalVM
|
|
||||||
command: |
|
|
||||||
script/install-graalvm
|
|
||||||
- run:
|
|
||||||
name: Build binary
|
|
||||||
command: |
|
|
||||||
script/uberjar
|
|
||||||
script/compile
|
|
||||||
no_output_timeout: 30m
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: |
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: |
|
|
||||||
.circleci/script/release
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: /tmp
|
|
||||||
paths:
|
|
||||||
- release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
- ~/graalvm-ce-java11-22.1.0
|
|
||||||
key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- run:
|
|
||||||
name: Publish artifact link to Slack
|
|
||||||
command: |
|
|
||||||
./bb .circleci/script/publish_artifact.clj || true
|
|
||||||
linux-aarch64:
|
|
||||||
machine:
|
|
||||||
image: ubuntu-2004:202111-01
|
|
||||||
resource_class: arm.large
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
GRAALVM_VERSION: "22.1.0"
|
|
||||||
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
|
|
||||||
BABASHKA_PLATFORM: linux # used in release script
|
|
||||||
BABASHKA_ARCH: aarch64
|
|
||||||
BABASHKA_TEST_ENV: native
|
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
sudo script/install-clojure
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- run:
|
|
||||||
name: Install native dev tools
|
|
||||||
command: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install build-essential zlib1g-dev
|
|
||||||
- run:
|
|
||||||
name: Download GraalVM
|
|
||||||
command: |
|
|
||||||
script/install-graalvm
|
|
||||||
- run:
|
|
||||||
name: Build binary
|
|
||||||
command: |
|
|
||||||
script/uberjar
|
|
||||||
script/compile
|
|
||||||
no_output_timeout: 30m
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: |
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: |
|
|
||||||
.circleci/script/release
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: /tmp
|
|
||||||
paths:
|
|
||||||
- release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
- ~/graalvm-ce-java11-22.1.0
|
|
||||||
key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- run:
|
|
||||||
name: Publish artifact link to Slack
|
|
||||||
command: |
|
|
||||||
./bb .circleci/script/publish_artifact.clj || true
|
|
||||||
linux-aarch64-static:
|
|
||||||
machine:
|
|
||||||
image: ubuntu-2004:202111-01
|
|
||||||
resource_class: arm.large
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
GRAALVM_VERSION: "22.1.0"
|
|
||||||
GRAALVM_HOME: /home/circleci/graalvm-ce-java11-22.1.0
|
|
||||||
BABASHKA_PLATFORM: linux # used in release script
|
|
||||||
BABASHKA_ARCH: aarch64
|
|
||||||
BABASHKA_TEST_ENV: native
|
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
|
||||||
BABASHKA_STATIC: "true"
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
# - run:
|
|
||||||
# name: "Short circuit on SNAPSHOT"
|
|
||||||
# command: |
|
|
||||||
# VERSION=$(cat resources/BABASHKA_VERSION)
|
|
||||||
# if [[ "$VERSION" == *-SNAPSHOT ]]
|
|
||||||
# then
|
|
||||||
# circleci task halt
|
|
||||||
# fi
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
sudo script/install-clojure
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- run:
|
|
||||||
name: Install native dev tools
|
|
||||||
command: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install build-essential zlib1g-dev
|
|
||||||
# sudo -E script/setup-musl
|
|
||||||
- run:
|
|
||||||
name: Download GraalVM
|
|
||||||
command: |
|
|
||||||
script/install-graalvm
|
|
||||||
- run:
|
|
||||||
name: Build binary
|
|
||||||
command: |
|
|
||||||
script/uberjar
|
|
||||||
script/compile
|
|
||||||
no_output_timeout: 30m
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: |
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: |
|
|
||||||
.circleci/script/release
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: /tmp
|
|
||||||
paths:
|
|
||||||
- release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
- ~/graalvm-ce-java11-22.1.0
|
|
||||||
key: linux-aarch64-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- run:
|
|
||||||
name: Publish artifact link to Slack
|
|
||||||
command: |
|
|
||||||
./bb .circleci/script/publish_artifact.clj || true
|
|
||||||
mac:
|
|
||||||
macos:
|
|
||||||
xcode: "12.0.0"
|
|
||||||
environment:
|
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.13 # 10.12 is EOL
|
|
||||||
GRAALVM_VERSION: "22.1.0"
|
|
||||||
GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-22.1.0/Contents/Home
|
|
||||||
BABASHKA_PLATFORM: macos # used in release script
|
|
||||||
BABASHKA_TEST_ENV: native
|
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
|
||||||
resource_class: large
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- run:
|
|
||||||
name: Install Clojure
|
|
||||||
command: |
|
|
||||||
script/install-clojure
|
|
||||||
- run:
|
|
||||||
name: Install Leiningen
|
|
||||||
command: |
|
|
||||||
script/install-leiningen
|
|
||||||
- run:
|
|
||||||
name: Download GraalVM
|
|
||||||
command: |
|
|
||||||
script/install-graalvm
|
|
||||||
- run:
|
|
||||||
name: Build binary
|
|
||||||
command: |
|
|
||||||
export PATH=$GRAALVM_HOME/bin:$PATH
|
|
||||||
script/uberjar
|
|
||||||
script/compile
|
|
||||||
no_output_timeout: 30m
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: |
|
|
||||||
export PATH=$GRAALVM_HOME/bin:$PATH
|
|
||||||
script/test
|
|
||||||
script/run_lib_tests
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: |
|
|
||||||
.circleci/script/release
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
- ~/graalvm-ce-java11-22.1.0/Contents/Home
|
|
||||||
key: mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }}
|
|
||||||
- store_artifacts:
|
|
||||||
path: /tmp/release
|
|
||||||
destination: release
|
|
||||||
- run:
|
|
||||||
name: Publish artifact link to Slack
|
|
||||||
command: |
|
|
||||||
./bb .circleci/script/publish_artifact.clj || true
|
|
||||||
deploy:
|
|
||||||
resource_class: large
|
|
||||||
docker:
|
|
||||||
- image: circleci/clojure:lein-2.9.8
|
|
||||||
working_directory: ~/repo
|
|
||||||
environment:
|
|
||||||
LEIN_ROOT: "true"
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- v1-dependencies-{{ checksum "project.clj" }}
|
|
||||||
# fallback to using the latest cache if no exact match is found
|
|
||||||
- v1-dependencies-
|
|
||||||
- run: .circleci/script/deploy
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.m2
|
|
||||||
key: v1-dependencies-{{ checksum "project.clj" }}
|
|
||||||
docker:
|
|
||||||
machine:
|
|
||||||
image: ubuntu-2004:202111-01
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull Submodules"
|
|
||||||
command: |
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
- setup-docker-buildx
|
|
||||||
- attach_workspace:
|
|
||||||
at: /tmp
|
|
||||||
- run:
|
|
||||||
name: Build uberjar
|
|
||||||
command: script/uberjar
|
|
||||||
- run:
|
|
||||||
name: Build Docker image
|
|
||||||
environment:
|
|
||||||
PLATFORMS: linux/amd64,linux/arm64
|
|
||||||
command: java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj
|
|
||||||
|
|
||||||
|
# our single workflow, that triggers the setup job defined above
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
setup:
|
||||||
ci:
|
|
||||||
jobs:
|
jobs:
|
||||||
- short-if-irrelevant
|
- setup
|
||||||
- jvm:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- linux:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- linux-static:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- mac:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- linux-aarch64:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- linux-aarch64-static:
|
|
||||||
requires:
|
|
||||||
- short-if-irrelevant
|
|
||||||
- deploy:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only: master
|
|
||||||
requires:
|
|
||||||
- jvm
|
|
||||||
- linux
|
|
||||||
# - mac # TODO: Enable when not needed from Actions
|
|
||||||
- docker:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only: master
|
|
||||||
requires:
|
|
||||||
- linux
|
|
||||||
- linux-static
|
|
||||||
- linux-aarch64
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
(require '[clojure.string :as str]
|
(require '[babashka.fs :as fs]
|
||||||
'[babashka.process :as proc]
|
'[babashka.process :as proc]
|
||||||
'[babashka.fs :as fs])
|
'[clojure.string :as str])
|
||||||
(import '[java.time Instant])
|
(import '[java.time Instant])
|
||||||
|
|
||||||
(defn read-env
|
(defn read-env
|
||||||
|
|
@ -12,7 +12,9 @@
|
||||||
|
|
||||||
(def image-name "babashka/babashka")
|
(def image-name "babashka/babashka")
|
||||||
|
|
||||||
(def image-tag (slurp "resources/BABASHKA_VERSION"))
|
(def ghcr-image-name "ghcr.io/babashka/babashka")
|
||||||
|
|
||||||
|
(def image-tag (str/trim (slurp "resources/BABASHKA_VERSION")))
|
||||||
|
|
||||||
(def latest-tag "latest")
|
(def latest-tag "latest")
|
||||||
|
|
||||||
|
|
@ -46,6 +48,11 @@
|
||||||
[username password]
|
[username password]
|
||||||
(exec ["docker" "login" "-u" username "-p" password]))
|
(exec ["docker" "login" "-u" username "-p" password]))
|
||||||
|
|
||||||
|
(defn docker-login-ghcr
|
||||||
|
[username password]
|
||||||
|
(exec ["docker" "login" "ghcr.io" "-u" username "-p" password]))
|
||||||
|
|
||||||
|
;; TODO: Remove this when Dockerhub goes off
|
||||||
(defn build-push
|
(defn build-push
|
||||||
[image-tag platform docker-file]
|
[image-tag platform docker-file]
|
||||||
(println (format "Building and pushing %s Docker image(s) %s:%s"
|
(println (format "Building and pushing %s Docker image(s) %s:%s"
|
||||||
|
|
@ -55,6 +62,21 @@
|
||||||
(let [base-cmd ["docker" "buildx" "build"
|
(let [base-cmd ["docker" "buildx" "build"
|
||||||
"-t" (str image-name ":" image-tag)
|
"-t" (str image-name ":" image-tag)
|
||||||
"--platform" platform
|
"--platform" platform
|
||||||
|
"--progress" "plain"
|
||||||
|
"--push"
|
||||||
|
"-f" docker-file]]
|
||||||
|
(exec (concat base-cmd label-args ["."]))))
|
||||||
|
|
||||||
|
(defn build-push-ghcr
|
||||||
|
[image-tag platform docker-file]
|
||||||
|
(println (format "Building and pushing %s Docker image(s) %s:%s to GHCR"
|
||||||
|
platform
|
||||||
|
ghcr-image-name
|
||||||
|
image-tag))
|
||||||
|
(let [base-cmd ["docker" "buildx" "build"
|
||||||
|
"-t" (str ghcr-image-name ":" image-tag)
|
||||||
|
"--platform" platform
|
||||||
|
"--progress" "plain"
|
||||||
"--push"
|
"--push"
|
||||||
"-f" docker-file]]
|
"-f" docker-file]]
|
||||||
(exec (concat base-cmd label-args ["."]))))
|
(exec (concat base-cmd label-args ["."]))))
|
||||||
|
|
@ -64,7 +86,7 @@
|
||||||
(doseq [platform (str/split platforms #",")]
|
(doseq [platform (str/split platforms #",")]
|
||||||
(let [tarball-platform (str/replace platform #"\/" "-")
|
(let [tarball-platform (str/replace platform #"\/" "-")
|
||||||
tarball-platform (if (= "linux-arm64" tarball-platform)
|
tarball-platform (if (= "linux-arm64" tarball-platform)
|
||||||
"linux-aarch64"
|
"linux-aarch64-static"
|
||||||
tarball-platform)
|
tarball-platform)
|
||||||
tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz"
|
tarball-path (format "/tmp/release/babashka-%s-%s.tar.gz"
|
||||||
image-tag
|
image-tag
|
||||||
|
|
@ -74,16 +96,20 @@
|
||||||
; this overwrites, but this is to work around having built the uberjar/metabom multiple times
|
; this overwrites, but this is to work around having built the uberjar/metabom multiple times
|
||||||
(fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true})))
|
(fs/copy (format "/tmp/release/%s-metabom.jar" tarball-platform) "metabom.jar" {:replace-existing true})))
|
||||||
(build-push image-tag platforms "Dockerfile.ci")
|
(build-push image-tag platforms "Dockerfile.ci")
|
||||||
|
(build-push-ghcr image-tag platforms "Dockerfile.ci")
|
||||||
(when-not snapshot?
|
(when-not snapshot?
|
||||||
(build-push latest-tag platforms "Dockerfile.ci")))
|
(build-push latest-tag platforms "Dockerfile.ci")
|
||||||
|
(build-push-ghcr latest-tag platforms "Dockerfile.ci")))
|
||||||
|
|
||||||
(defn build-push-alpine-images
|
(defn build-push-alpine-images
|
||||||
"Build alpine image for linux-amd64 only (no upstream arm64 support yet)"
|
"Build alpine image for linux-amd64 only (no upstream arm64 support yet)"
|
||||||
[]
|
[]
|
||||||
(exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")])
|
(exec ["tar" "zxvf" (str "/tmp/release/babashka-" image-tag "-linux-amd64-static.tar.gz")])
|
||||||
(build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine")
|
(build-push (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine")
|
||||||
|
(build-push-ghcr (str image-tag "-alpine") "linux/amd64" "Dockerfile.alpine")
|
||||||
(when-not snapshot?
|
(when-not snapshot?
|
||||||
(build-push "alpine" "linux/amd64" "Dockerfile.alpine")))
|
(build-push "alpine" "linux/amd64" "Dockerfile.alpine")
|
||||||
|
(build-push-ghcr "alpine" "linux/amd64" "Dockerfile.alpine")))
|
||||||
|
|
||||||
(when (= *file* (System/getProperty "babashka.file"))
|
(when (= *file* (System/getProperty "babashka.file"))
|
||||||
(if (and (nil? (read-env "CIRCLE_PULL_REQUEST"))
|
(if (and (nil? (read-env "CIRCLE_PULL_REQUEST"))
|
||||||
|
|
@ -93,6 +119,7 @@
|
||||||
(println "This is a snapshot version")
|
(println "This is a snapshot version")
|
||||||
(println "This is a non-snapshot version"))
|
(println "This is a non-snapshot version"))
|
||||||
(docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS"))
|
(docker-login (read-env "DOCKERHUB_USER") (read-env "DOCKERHUB_PASS"))
|
||||||
|
(docker-login-ghcr (read-env "CONTAINER_REGISTRY_USER") (read-env "BB_GHCR_TOKEN"))
|
||||||
(build-push-images)
|
(build-push-images)
|
||||||
(build-push-alpine-images))
|
(build-push-alpine-images))
|
||||||
(println "Not publishing docker image(s).")))
|
(println "Not publishing docker image(s).")))
|
||||||
|
|
|
||||||
281
.circleci/script/gen_ci.clj
Normal file
281
.circleci/script/gen_ci.clj
Normal file
|
|
@ -0,0 +1,281 @@
|
||||||
|
(ns gen-ci
|
||||||
|
(:require
|
||||||
|
[babashka.tasks :as tasks]
|
||||||
|
[clj-yaml.core :as yaml]
|
||||||
|
[clojure.string :as str]
|
||||||
|
[flatland.ordered.map :refer [ordered-map]]))
|
||||||
|
|
||||||
|
(def graalvm-version "24")
|
||||||
|
|
||||||
|
(defn run
|
||||||
|
([cmd-name cmd]
|
||||||
|
(run cmd-name cmd nil))
|
||||||
|
([cmd-name cmd no-output-timeout]
|
||||||
|
(let [base {:run {:name cmd-name
|
||||||
|
:command cmd}}]
|
||||||
|
(if no-output-timeout
|
||||||
|
(assoc-in base [:run :no_output_timeout] no-output-timeout)
|
||||||
|
base))))
|
||||||
|
|
||||||
|
(defn gen-steps
|
||||||
|
[shorted? steps]
|
||||||
|
(if shorted?
|
||||||
|
[(run "Shorted" "echo 'Skipping Run'")]
|
||||||
|
steps))
|
||||||
|
|
||||||
|
(defn gen-job
|
||||||
|
[shorted? conf]
|
||||||
|
(if shorted?
|
||||||
|
(-> conf
|
||||||
|
(dissoc :machine :macos)
|
||||||
|
(assoc :resource_class "small" :docker [{:image "ubuntu:latest"}]))
|
||||||
|
conf))
|
||||||
|
|
||||||
|
(defn pull-submodules
|
||||||
|
[]
|
||||||
|
(run "Pull Submodules" "git submodule init\ngit submodule update"))
|
||||||
|
|
||||||
|
(defn deploy
|
||||||
|
[shorted?]
|
||||||
|
(gen-job shorted?
|
||||||
|
(ordered-map
|
||||||
|
:resource_class "large"
|
||||||
|
:docker [{:image "circleci/clojure:lein-2.9.8"}]
|
||||||
|
:working_directory "~/repo"
|
||||||
|
:environment {:LEIN_ROOT "true"}
|
||||||
|
:steps (gen-steps
|
||||||
|
shorted?
|
||||||
|
[:checkout
|
||||||
|
(pull-submodules)
|
||||||
|
{:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}"
|
||||||
|
"v1-dependencies-"]}}
|
||||||
|
{:run ".circleci/script/deploy"}
|
||||||
|
{:save_cache {:paths ["~/.m2"]
|
||||||
|
:key "v1-dependencies-{{ checksum \"project.clj\" }}"}}]))))
|
||||||
|
|
||||||
|
(defn docker
|
||||||
|
[shorted?]
|
||||||
|
(gen-job
|
||||||
|
shorted?
|
||||||
|
(ordered-map
|
||||||
|
:machine {:image "ubuntu-2004:2024.05.1"}
|
||||||
|
:steps
|
||||||
|
(gen-steps
|
||||||
|
shorted?
|
||||||
|
[:checkout
|
||||||
|
(pull-submodules)
|
||||||
|
"setup-docker-buildx"
|
||||||
|
{:attach_workspace {:at "/tmp"}}
|
||||||
|
(run "Build uberjar" "script/uberjar")
|
||||||
|
{:run
|
||||||
|
{:name "Build Docker image"
|
||||||
|
:environment {:PLATFORMS "linux/amd64,linux/arm64"}
|
||||||
|
:command
|
||||||
|
"java -jar ./target/babashka-$(cat resources/BABASHKA_VERSION)-standalone.jar .circleci/script/docker.clj"}}]))))
|
||||||
|
|
||||||
|
(defn jvm
|
||||||
|
[shorted? graalvm-home]
|
||||||
|
(gen-job
|
||||||
|
shorted?
|
||||||
|
(ordered-map
|
||||||
|
:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]
|
||||||
|
:working_directory "~/repo"
|
||||||
|
:environment {:LEIN_ROOT "true"
|
||||||
|
:BABASHKA_PLATFORM "linux"
|
||||||
|
:GRAALVM_VERSION graalvm-version
|
||||||
|
:GRAALVM_HOME graalvm-home
|
||||||
|
:BABASHKA_TEST_ENV "jvm"
|
||||||
|
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
|
||||||
|
:resource_class "large"
|
||||||
|
:steps
|
||||||
|
(gen-steps
|
||||||
|
shorted?
|
||||||
|
[:checkout
|
||||||
|
(pull-submodules)
|
||||||
|
{:restore_cache {:keys ["v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"
|
||||||
|
"v1-dependencies-"]}}
|
||||||
|
(run "Install Clojure" "sudo script/install-clojure")
|
||||||
|
(run "Download GraalVM" "script/install-graalvm")
|
||||||
|
(run
|
||||||
|
"Run JVM tests"
|
||||||
|
"export BABASHKA_FEATURE_JDBC=true
|
||||||
|
export BABASHKA_FEATURE_POSTGRESQL=true
|
||||||
|
script/test\nscript/run_lib_tests")
|
||||||
|
(run
|
||||||
|
"Create uberjar"
|
||||||
|
"mkdir -p /tmp/release
|
||||||
|
script/uberjar
|
||||||
|
VERSION=$(cat resources/BABASHKA_VERSION)
|
||||||
|
jar=target/babashka-$VERSION-standalone.jar
|
||||||
|
cp $jar /tmp/release
|
||||||
|
export PATH=$GRAALVM_HOME/bin:$PATH
|
||||||
|
export JAVA_HOME=$GRAALVM_HOME
|
||||||
|
java -jar $jar script/reflection.clj
|
||||||
|
reflection=\"babashka-$VERSION-reflection.json\"
|
||||||
|
java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$jar\"
|
||||||
|
java -jar \"$jar\" --config .build/bb.edn --deps-root . release-artifact \"$reflection\"")
|
||||||
|
{:store_artifacts {:path "/tmp/release"
|
||||||
|
:destination "release"}}
|
||||||
|
{:save_cache {:paths ["~/.m2"]
|
||||||
|
:key "v1-dependencies-{{ checksum \"project.clj\" }}-{{ checksum \"deps.edn\" }}"}}]))))
|
||||||
|
|
||||||
|
(defn unix
|
||||||
|
[shorted? static? musl? arch executor-conf resource-class graalvm-home platform]
|
||||||
|
(let [env {:LEIN_ROOT "true"
|
||||||
|
:GRAALVM_VERSION graalvm-version
|
||||||
|
:GRAALVM_HOME graalvm-home
|
||||||
|
:BABASHKA_PLATFORM (if (= "mac" platform)
|
||||||
|
"macos"
|
||||||
|
platform)
|
||||||
|
:BABASHKA_TEST_ENV "native"
|
||||||
|
:BABASHKA_XMX "-J-Xmx6500m"
|
||||||
|
:BABASHKA_SHA (System/getenv "CIRCLE_SHA1")}
|
||||||
|
env (if (= "aarch64" arch)
|
||||||
|
(assoc env :BABASHKA_ARCH arch)
|
||||||
|
env)
|
||||||
|
env (if static?
|
||||||
|
(assoc env :BABASHKA_STATIC "true")
|
||||||
|
env)
|
||||||
|
env (if musl?
|
||||||
|
(assoc env :BABASHKA_MUSL "true")
|
||||||
|
env)
|
||||||
|
env (if (= "mac" platform)
|
||||||
|
(assoc env :MACOSX_DEPLOYMENT_TARGET 10.13)
|
||||||
|
env)
|
||||||
|
base-install-cmd "sudo apt-get update\nsudo apt-get -y install build-essential zlib1g-dev"
|
||||||
|
cache-key (format "%s-%s{{ checksum \"project.clj\" }}-{{ checksum \".circleci/config.yml\" }}"
|
||||||
|
platform
|
||||||
|
(if (= "aarch64" arch)
|
||||||
|
"aarch64-"
|
||||||
|
""))]
|
||||||
|
(gen-job shorted?
|
||||||
|
(merge
|
||||||
|
executor-conf
|
||||||
|
(ordered-map
|
||||||
|
:working_directory "~/repo"
|
||||||
|
:environment env
|
||||||
|
:resource_class resource-class
|
||||||
|
:steps (gen-steps shorted?
|
||||||
|
(filter some?
|
||||||
|
[:checkout
|
||||||
|
(when (contains? #{"linux" "linux-aarch64"} platform)
|
||||||
|
(run "Check max glibc version" "script/check_glibc.sh"))
|
||||||
|
{:attach_workspace {:at "/tmp"}}
|
||||||
|
(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"))
|
||||||
|
(when (not= "mac" platform)
|
||||||
|
(run "Install native dev tools"
|
||||||
|
(if (and static? musl? (not= "aarch64" arch))
|
||||||
|
(str base-install-cmd "\nsudo -E script/setup-musl")
|
||||||
|
base-install-cmd)))
|
||||||
|
(run "Download GraalVM" "script/install-graalvm")
|
||||||
|
#_(run "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"]
|
||||||
|
:key cache-key}}
|
||||||
|
{:store_artifacts {:path "/tmp/release"
|
||||||
|
:destination "release"}}
|
||||||
|
(run "Publish artifact link to Slack"
|
||||||
|
"./bb .circleci/script/publish_artifact.clj || true")])))))))
|
||||||
|
|
||||||
|
(defn make-config
|
||||||
|
[shorted?]
|
||||||
|
(let [docker-executor-conf {:docker [{:image "circleci/clojure:openjdk-11-lein-2.9.8-bullseye"}]}
|
||||||
|
machine-executor-conf {:machine {:image "ubuntu-2004: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
|
||||||
|
{:setup-docker-buildx
|
||||||
|
{:steps
|
||||||
|
[{:run
|
||||||
|
{:name "Create multi-platform capabale buildx builder"
|
||||||
|
:command
|
||||||
|
"docker run --privileged --rm tonistiigi/binfmt --install all\ndocker buildx create --name ci-builder --use"}}]}}
|
||||||
|
:jobs (ordered-map
|
||||||
|
:jvm (jvm shorted? linux-graalvm-home)
|
||||||
|
:linux (unix shorted? false false "amd64" docker-executor-conf "large" linux-graalvm-home "linux")
|
||||||
|
:linux-static
|
||||||
|
(unix shorted? true true "amd64" docker-executor-conf "large" linux-graalvm-home "linux")
|
||||||
|
: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 "macos.m1.medium.gen1" mac-graalvm-home "mac")
|
||||||
|
:deploy (deploy shorted?)
|
||||||
|
:docker (docker shorted?))
|
||||||
|
:workflows (ordered-map
|
||||||
|
:version 2
|
||||||
|
:ci {:jobs ["jvm"
|
||||||
|
"linux"
|
||||||
|
"linux-static"
|
||||||
|
"mac"
|
||||||
|
"linux-aarch64-static"
|
||||||
|
{:deploy {:filters {:branches {:only "master"}}
|
||||||
|
:requires ["jvm" "linux"]}}
|
||||||
|
{:docker {:filters {:branches {:only "master"}}
|
||||||
|
:requires ["linux" "linux-static" "linux-aarch64-static"]}}]}))))
|
||||||
|
|
||||||
|
(def skip-config
|
||||||
|
{:skip-if-only [#".*.md$"
|
||||||
|
#"^logo\/.*$"]})
|
||||||
|
|
||||||
|
(defn get-changes
|
||||||
|
[]
|
||||||
|
(-> (tasks/shell {:out :string} "git diff --name-only HEAD~1")
|
||||||
|
(:out)
|
||||||
|
(str/split-lines)))
|
||||||
|
|
||||||
|
(defn irrelevant-change?
|
||||||
|
[change regexes]
|
||||||
|
(some? (some #(re-matches % change) regexes)))
|
||||||
|
|
||||||
|
(defn relevant?
|
||||||
|
[change-set regexes]
|
||||||
|
(some? (some #(not (irrelevant-change? % regexes)) change-set)))
|
||||||
|
|
||||||
|
(defn main
|
||||||
|
[]
|
||||||
|
(let [{:keys [skip-if-only]} skip-config
|
||||||
|
changed-files (get-changes)
|
||||||
|
conf (make-config (not (relevant? changed-files skip-if-only)))]
|
||||||
|
(println (yaml/generate-string conf
|
||||||
|
:dumper-options
|
||||||
|
{:flow-style :block}))))
|
||||||
|
|
||||||
|
(when (= *file* (System/getProperty "babashka.file"))
|
||||||
|
(main))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(main)
|
||||||
|
|
||||||
|
(def regexes
|
||||||
|
[#".*.md$"
|
||||||
|
#".*.clj$" ; ignore clojure files
|
||||||
|
#"^logo\/.*$"])
|
||||||
|
|
||||||
|
(:out (tasks/shell {:out :string} "ls"))
|
||||||
|
|
||||||
|
(irrelevant-change? "src/file.png" regexes)
|
||||||
|
|
||||||
|
(re-matches #".*.clj$" "src/file.clj.dfff")
|
||||||
|
|
||||||
|
(re-matches #"^logo\/.*$" "logo/foo/bar.jpg")
|
||||||
|
|
||||||
|
(relevant? ["src/file.clj"] regexes))
|
||||||
|
|
@ -29,7 +29,9 @@ tar zcvf "$archive" bb # bbk
|
||||||
|
|
||||||
cd -
|
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
|
## cleanup
|
||||||
|
|
||||||
|
|
|
||||||
11
.cirrus.yml
11
.cirrus.yml
|
|
@ -2,10 +2,11 @@ macos_instance:
|
||||||
image: ghcr.io/cirruslabs/macos-monterey-base:latest
|
image: ghcr.io/cirruslabs/macos-monterey-base:latest
|
||||||
|
|
||||||
task:
|
task:
|
||||||
|
skip: "changesIncludeOnly('logo/*', '**.md')"
|
||||||
env:
|
env:
|
||||||
LEIN_ROOT: "true"
|
LEIN_ROOT: "true"
|
||||||
GRAALVM_VERSION: "22.1.0"
|
GRAALVM_VERSION: "24"
|
||||||
GRAALVM_HOME: ${HOME}/graalvm-ce-java11-22.1.0/Contents/Home
|
GRAALVM_HOME: ${HOME}/graalvm-${GRAALVM_VERSION}/Contents/Home
|
||||||
BABASHKA_PLATFORM: macos # used in release script
|
BABASHKA_PLATFORM: macos # used in release script
|
||||||
BABASHKA_ARCH: aarch64
|
BABASHKA_ARCH: aarch64
|
||||||
BABASHKA_TEST_ENV: native
|
BABASHKA_TEST_ENV: native
|
||||||
|
|
@ -19,11 +20,15 @@ task:
|
||||||
sudo script/install-leiningen
|
sudo script/install-leiningen
|
||||||
script/install-graalvm
|
script/install-graalvm
|
||||||
export PATH=$GRAALVM_HOME/bin:$PATH
|
export PATH=$GRAALVM_HOME/bin:$PATH
|
||||||
|
export JAVA_HOME=$GRAALVM_HOME
|
||||||
sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
sudo /usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
||||||
java -version
|
java -version
|
||||||
|
|
||||||
|
export BABASHKA_SHA=$(git rev-parse HEAD)
|
||||||
|
|
||||||
script/uberjar
|
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/test
|
||||||
# script/run_lib_tests
|
# script/run_lib_tests
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,5 @@
|
||||||
babashka.impl.File/gen-wrapper-fn-2 clojure.core/def
|
babashka.impl.File/gen-wrapper-fn-2 clojure.core/def
|
||||||
babashka.impl.Pattern/gen-wrapper-fn-2 clojure.core/def
|
babashka.impl.Pattern/gen-wrapper-fn-2 clojure.core/def
|
||||||
babashka.impl.Pattern/gen-constants clojure.core/declare}
|
babashka.impl.Pattern/gen-constants clojure.core/declare}
|
||||||
:linters {:unsorted-required-namespaces {:level :warning}}}
|
:linters {:unsorted-required-namespaces {:level :warning}}
|
||||||
|
:hooks {:analyze-call {clojure.core/requiring-resolve hooks.mine/req-resolve}}}
|
||||||
|
|
|
||||||
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
|
||||||
61
.github/workflows/build.yml
vendored
61
.github/workflows/build.yml
vendored
|
|
@ -2,9 +2,15 @@ name: build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "logo/**"
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- "**.md"
|
||||||
|
- "logo/**"
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
|
|
@ -18,6 +24,7 @@ jobs:
|
||||||
LEIN_ROOT: "true"
|
LEIN_ROOT: "true"
|
||||||
BABASHKA_PLATFORM: linux # could be used in jar name
|
BABASHKA_PLATFORM: linux # could be used in jar name
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
BABASHKA_SHA: ${{ github.sha }}
|
||||||
steps:
|
steps:
|
||||||
- name: Git checkout
|
- name: Git checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
@ -26,7 +33,7 @@ jobs:
|
||||||
submodules: 'true'
|
submodules: 'true'
|
||||||
|
|
||||||
- name: Cache deps
|
- name: Cache deps
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v4
|
||||||
id: cache-deps
|
id: cache-deps
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: ~/.m2/repository
|
||||||
|
|
@ -37,7 +44,7 @@ jobs:
|
||||||
uses: actions/setup-java@v2
|
uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
distribution: 'adopt-hotspot'
|
distribution: 'adopt-hotspot'
|
||||||
java-version: '11'
|
java-version: '19'
|
||||||
|
|
||||||
- name: Install clojure tools
|
- name: Install clojure tools
|
||||||
uses: DeLaGuardo/setup-clojure@5.0
|
uses: DeLaGuardo/setup-clojure@5.0
|
||||||
|
|
@ -53,9 +60,6 @@ jobs:
|
||||||
script/test
|
script/test
|
||||||
script/run_lib_tests
|
script/run_lib_tests
|
||||||
|
|
||||||
- name: Run as lein command
|
|
||||||
run: echo '{:a 1}' | lein bb '(:a *in*)'
|
|
||||||
|
|
||||||
- name: Build uberjar
|
- name: Build uberjar
|
||||||
run: |
|
run: |
|
||||||
mkdir -p /tmp/release
|
mkdir -p /tmp/release
|
||||||
|
|
@ -74,7 +78,7 @@ jobs:
|
||||||
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
|
BABASHKA_VERSION=$(cat resources/BABASHKA_VERSION)
|
||||||
echo "##[set-output name=version;]${BABASHKA_VERSION}"
|
echo "##[set-output name=version;]${BABASHKA_VERSION}"
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
name: babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
||||||
path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
path: target/babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar
|
||||||
|
|
@ -84,7 +88,7 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: macos-12
|
- os: macos-13
|
||||||
name: macos
|
name: macos
|
||||||
static: false
|
static: false
|
||||||
#- os: ubuntu-latest
|
#- os: ubuntu-latest
|
||||||
|
|
@ -96,11 +100,12 @@ jobs:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
LEIN_ROOT: "true"
|
LEIN_ROOT: "true"
|
||||||
GRAALVM_VERSION: "22.1.0"
|
GRAALVM_VERSION: "24"
|
||||||
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
|
BABASHKA_PLATFORM: ${{ matrix.name }} # used in release script
|
||||||
BABASHKA_TEST_ENV: native
|
BABASHKA_TEST_ENV: native
|
||||||
BABASHKA_XMX: "-J-Xmx6500m"
|
BABASHKA_XMX: "-J-Xmx6500m"
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
BABASHKA_SHA: ${{ github.sha }}
|
||||||
steps:
|
steps:
|
||||||
- name: Git checkout
|
- name: Git checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
@ -109,7 +114,7 @@ jobs:
|
||||||
submodules: 'true'
|
submodules: 'true'
|
||||||
|
|
||||||
- name: Cache deps
|
- name: Cache deps
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v4
|
||||||
id: cache-deps
|
id: cache-deps
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: ~/.m2/repository
|
||||||
|
|
@ -120,8 +125,8 @@ jobs:
|
||||||
if: "matrix.static == false"
|
if: "matrix.static == false"
|
||||||
uses: graalvm/setup-graalvm@v1
|
uses: graalvm/setup-graalvm@v1
|
||||||
with:
|
with:
|
||||||
version: '22.1.0'
|
java-version: '24'
|
||||||
java-version: '11'
|
distribution: 'graalvm'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
|
@ -129,8 +134,8 @@ jobs:
|
||||||
if: "matrix.static == true"
|
if: "matrix.static == true"
|
||||||
uses: graalvm/setup-graalvm@v1
|
uses: graalvm/setup-graalvm@v1
|
||||||
with:
|
with:
|
||||||
version: '22.1.0'
|
version: '24'
|
||||||
java-version: '11'
|
distribution: 'graalvm'
|
||||||
components: 'native-image'
|
components: 'native-image'
|
||||||
native-image-musl: true
|
native-image-musl: true
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
@ -167,6 +172,19 @@ jobs:
|
||||||
BABASHKA_MUSL: "true"
|
BABASHKA_MUSL: "true"
|
||||||
run: script/compile
|
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
|
- name: Test binary and libs
|
||||||
run: |
|
run: |
|
||||||
script/test
|
script/test
|
||||||
|
|
@ -175,19 +193,6 @@ jobs:
|
||||||
- name: Release
|
- name: Release
|
||||||
run: .circleci/script/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:
|
docker:
|
||||||
if: ${{ false }} # Disabled
|
if: ${{ false }} # Disabled
|
||||||
# if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
|
# if: "!contains(github.event.head_commit.message, 'skip ci') && github.event_name == 'push' && github.ref == 'refs/heads/master'"
|
||||||
|
|
@ -211,13 +216,13 @@ jobs:
|
||||||
run: mkdir -p /tmp/release
|
run: mkdir -p /tmp/release
|
||||||
|
|
||||||
- name: Download linux binary
|
- name: Download linux binary
|
||||||
uses: actions/download-artifact@v2
|
uses: actions/download-artifact@v4.1.7
|
||||||
with:
|
with:
|
||||||
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip
|
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-amd64.zip
|
||||||
path: /tmp/release
|
path: /tmp/release
|
||||||
|
|
||||||
- name: Download static linux binary
|
- name: Download static linux binary
|
||||||
uses: actions/download-artifact@v2
|
uses: actions/download-artifact@v4.1.7
|
||||||
with:
|
with:
|
||||||
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
|
name: babashka-${{ steps.babashka-version.outputs.version }}-linux-static-amd64.zip
|
||||||
path: /tmp/release-static
|
path: /tmp/release-static
|
||||||
|
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -36,3 +36,6 @@ bb.build_artifacts.txt
|
||||||
target
|
target
|
||||||
.nrepl-port
|
.nrepl-port
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.portal
|
||||||
|
default.iprof
|
||||||
|
scratch.clj
|
||||||
|
|
|
||||||
576
CHANGELOG.md
576
CHANGELOG.md
|
|
@ -5,6 +5,570 @@ For a list of breaking changes, check [here](#breaking-changes).
|
||||||
A preview of the next release can be installed from
|
A preview of the next release can be installed from
|
||||||
[babashka-dev-builds](https://github.com/babashka/babashka-dev-builds).
|
[babashka-dev-builds](https://github.com/babashka/babashka-dev-builds).
|
||||||
|
|
||||||
|
[Babashka](https://github.com/babashka/babashka): Native, fast starting Clojure interpreter for scripting
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
|
||||||
|
- [#1544](https://github.com/babashka/babashka/issues/1544): `:local/root` in script-adjacent bb.edn should resolve relative to script
|
||||||
|
- [#1545](https://github.com/babashka/babashka/issues/1545): Adjacent `bb.edn` not respected with explicit `-f` option
|
||||||
|
- [#1546](https://github.com/babashka/babashka/issues/1546): add `.contains` for vector and lazy-seq
|
||||||
|
|
||||||
|
## 1.3.178 (2023-04-21)
|
||||||
|
|
||||||
|
- Fix regression with [#1541](https://github.com/babashka/babashka/issues/1541)
|
||||||
|
|
||||||
|
## 1.3.177 (2023-04-21)
|
||||||
|
|
||||||
|
- [#1541](https://github.com/babashka/babashka/issues/1541): respect `bb.edn`
|
||||||
|
adjacent to invoked file. This eases writing system-global scripts from
|
||||||
|
projects without using bbin. See [docs](https://book.babashka.org/#_script_adjacent_bb_edn).
|
||||||
|
- [#1523](https://github.com/babashka/babashka/pull/1523): Reduce the size of the Docker images ([@raszi](https://github.com/raszi))
|
||||||
|
- Upgrade deps.clj to v1.11.1.1273
|
||||||
|
- Upgrade transit-clj to 1.0.333
|
||||||
|
- Add `java.security.cert.CertificateFactory`
|
||||||
|
- Bump clj-yaml to 1.0.26
|
||||||
|
- Bump edamame to 1.3.21
|
||||||
|
- Add `UnsupportedOperationException`
|
||||||
|
- Bump babashka CLI to 0.7.51
|
||||||
|
- Bump babashka http-client to 0.2.9
|
||||||
|
- Add `--install-exit-handlers` to native-image build to support shutdown hook + SIGTERM
|
||||||
|
|
||||||
|
## 1.3.176 (2023-03-18)
|
||||||
|
|
||||||
|
- Upgrade http-client to 0.1.8, fixes binary file uploads (which messed up the previous release)
|
||||||
|
- Downgrade org.flatland/ordered to 1.5.9 due to this [issue](https://github.com/clj-commons/ordered/issues/71)
|
||||||
|
|
||||||
|
## 1.3.175 (2023-03-18)
|
||||||
|
|
||||||
|
- [#1507](https://github.com/babashka/babashka/issues/1507): Expose methods on java.lang.VirtualThread ([@lispyclouds](https://github.com/lispyclouds))
|
||||||
|
- [#1510](https://github.com/babashka/babashka/issues/1510): add virtual thread interop on `Thread`
|
||||||
|
- [#1511](https://github.com/babashka/babashka/issues/1511): support for domain sockets
|
||||||
|
- [#1521](https://github.com/babashka/babashka/issues/1521): push images to GHCR ([@lispyclouds](https://github.com/lispyclouds))
|
||||||
|
- Bump edamame to 1.3.20
|
||||||
|
- Bump deps.clj to 1.11.1.1257
|
||||||
|
- Bump org.flatland/ordered to 1.15.10
|
||||||
|
- Support `clojure.lang.MapEntry/create`
|
||||||
|
- clojure.core.async `go` macro now uses virtual threads
|
||||||
|
- Bump babashka.cli to 0.6.50
|
||||||
|
- Bump http-client to 0.1.7
|
||||||
|
|
||||||
|
## 1.2.174 (2023-03-01)
|
||||||
|
|
||||||
|
- Use GraalVM 22.3.1 on JDK 19.0.2. This adds virtual thread support. See [demo](https://twitter.com/borkdude/status/1572222344684531717).
|
||||||
|
- Expose more `jaxax.crypto` classes
|
||||||
|
- Add more `java.time` and related classes with the goal of supporting [juxt.tick](https://github.com/juxt/tick) ([issue](https://github.com/juxt/tick/issues/86))
|
||||||
|
- Compatibility with [kaocha](https://github.com/lambdaisland/kaocha) test runner
|
||||||
|
- [#1000](https://github.com/babashka/babashka/issues/1000): add lib tests for xforms ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- [#1482](https://github.com/babashka/babashka/issues/1482): make loading of libs thread safe
|
||||||
|
- [#1487](https://github.com/babashka/babashka/issues/1487): `babashka.tasks/clojure` should be supported without arguments to start a REPL
|
||||||
|
- [#1496](https://github.com/babashka/babashka/issues/1496): Add `set-agent-send-executor!` and `set-agent-send-off-executor!`
|
||||||
|
- [#1489](https://github.com/babashka/babashka/issues/1489): Don't overwrite non-empty, non-jar files when writing uberscript/uberjar ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- [#1506](https://github.com/babashka/babashka/issues/1506): `:exec-args` in task should override `:exec-args` on fn metadata
|
||||||
|
- [#1501](https://github.com/babashka/babashka/issues/1501): equals on deftype
|
||||||
|
- Add support for `.getWatches` on atoms
|
||||||
|
- Bump `babashka.fs` to `0.3.17`
|
||||||
|
- Bump `deps.clj` to `1.11.1.1237`
|
||||||
|
- Bump `babashka.http-client` to `0.1.5`
|
||||||
|
- Bump `babashka.cli` to `0.6.46`
|
||||||
|
|
||||||
|
## 1.1.173 (2023-02-04)
|
||||||
|
|
||||||
|
- [#1473](https://github.com/babashka/babashka/issues/1473): support `--config` in other dir + `:local/root` ([@lispyclouds](https://github.com/lispyclouds))
|
||||||
|
- Compatibility with `clojure.tools.namespace.repl/refresh` and `clojure.java.classpath`
|
||||||
|
- `(clojure.lang.RT/baseLoader)` now returns classloader with babashka dependencies on classpath
|
||||||
|
- Support reading tags from `data_readers.clj` and `data_readers.cljc`
|
||||||
|
- Don't exit REPL when `babashka.deps/add-deps` fails
|
||||||
|
- Fix [#1474](https://github.com/babashka/babashka/issues/1474): when `.bb` file is in different artifact, `.clj` file is loaded first if it appears first on classpath
|
||||||
|
- Support for `*loaded-libs*` and `(loaded-libs)`
|
||||||
|
- Bump rewrite-clj to `1.1.46`
|
||||||
|
- Bump http-client to `0.0.3`
|
||||||
|
- Bump fs to `0.2.15`
|
||||||
|
- Bump process to `0.4.16`
|
||||||
|
|
||||||
|
## 1.1.172 (2023-01-23)
|
||||||
|
|
||||||
|
- [#1472](https://github.com/babashka/babashka/issues/1472): fix tokenization of `babashka.tasks/clojure`: command was tokenized twice (regression was introduced in `1.0.168`)
|
||||||
|
- **BREAKING**: Bump `babashka.process`: change default for `:out :append` to `:out :write`. This default is undocumented so the impact should be small.
|
||||||
|
|
||||||
|
## 1.1.171 (2023-01-23)
|
||||||
|
|
||||||
|
- [#1467](https://github.com/babashka/babashka/issues/1467): **BREAKING**: avoid printing results, unless `--prn` is enabled (aside from `-e`, `-o` and `-O`).
|
||||||
|
- Include [http-client](https://github.com/babashka/http-client) as built-in library
|
||||||
|
- SCI: support `add-watch` on vars
|
||||||
|
- Compatibility with [eftest](https://github.com/weavejester/eftest) test runner (see [demo](https://twitter.com/borkdude/status/1616886788898885632))
|
||||||
|
- Add classes:
|
||||||
|
- `java.util.concurrent.Callable`
|
||||||
|
- `java.util.concurrent.ExecutorService`
|
||||||
|
- Expose `clojure.main` `main` and `repl-caught`
|
||||||
|
- Switch `clojure.test/*report-counters*` to ref instead of atom for compatibility with [kaocha](https://github.com/lambdaisland/kaocha)
|
||||||
|
- Allow `java.io.OutputStream` to be proxied, for [kaocha](https://github.com/lambdaisland/kaocha)
|
||||||
|
- Support qualified method names in `proxy` and ignore namespace
|
||||||
|
|
||||||
|
## 1.0.170 (2023-01-19)
|
||||||
|
|
||||||
|
- [#1463](https://github.com/babashka/babashka/issues/1463): Add `java.util.jar.Attributes` class ([@jeroenvandijk](https://github.com/jeroenvandijk))
|
||||||
|
- [#1456](https://github.com/babashka/babashka/issues/1456): allow `*warn-on-reflection*` and `*unchecked-math*` to be set in socket REPL and nREPL ([@axks](https://github.com/axks))
|
||||||
|
- SCI: macroexpansion error location improvement
|
||||||
|
- Add compatibility with [tab](https://github.com/eerohele/tab) and [solenoid](https://github.com/adam-james-v/solenoid)
|
||||||
|
- Bump babashka.cli and babashka.fs
|
||||||
|
- New classes:
|
||||||
|
- `java.util.jar.Attributes`
|
||||||
|
- `java.util.concurrent.ThreadFactory`
|
||||||
|
- `java.lang.Thread$UncaughtExceptionHandler`
|
||||||
|
- `java.lang.Thread$UncaughtExceptionHandler`
|
||||||
|
- `java.util.concurrent.BlockingQueue`
|
||||||
|
- `java.util.concurrent.ArrayBlockingQueue`
|
||||||
|
- `java.util.concurrent.ThreadFactory`
|
||||||
|
- `java.lang.Thread$UncaughtExceptionHandler`
|
||||||
|
- `java.util.concurrent.Semaphore`
|
||||||
|
- Expose more httpkit.server functions: `with-channel`, `on-close`, `close`
|
||||||
|
|
||||||
|
## 1.0.169 (2023-01-03)
|
||||||
|
|
||||||
|
- Implement `ns`, `lazy-seq` as macro
|
||||||
|
- Support `--dev-build` flag in installation script
|
||||||
|
- [#1451](https://github.com/babashka/babashka/issues/1451): Allow passing explicit file and line number to clojure.test ([@matthewdowney](https://github.com/matthewdowney))
|
||||||
|
- [#1280](https://github.com/babashka/babashka/issues/1280): babashka REPL doesn't quit right after Ctrl-d ([@formerly-a-trickster](https://github.com/formerly-a-trickster) and Alice Margatroid)
|
||||||
|
- [#1446](https://github.com/babashka/babashka/issues/1446): add `pprint/code-dispatch`
|
||||||
|
- Update zlib to version `1.2.13` ([@thiagokokada](https://github.com/thiagokokada))
|
||||||
|
- [#1454](https://github.com/babashka/babashka/issues/1454): Add `babashka.process` to `print-deps` output
|
||||||
|
- Update `deps.clj` / clojure tools to `1.11.1.1208`
|
||||||
|
- Add `reader-conditional` function
|
||||||
|
- Fix pretty printing (with `clojure.pprint`) of vars
|
||||||
|
- Upgrade built-in `spec.alpha`
|
||||||
|
- SCI performance improvements: faster JVM interop
|
||||||
|
|
||||||
|
## 1.0.168 (2022-12-07)
|
||||||
|
|
||||||
|
- `loop*`, `fn*` are now special forms and `loop`, `fn`, `defn`, `defmacro`, `and` and `or` are implemented as macros. This restores compatibility with [rcf](https://github.com/borkdude/hyperfiddle-rcf)
|
||||||
|
- fs: don't touch dirs in `split-ext`
|
||||||
|
- Update to babashka process to v0.4.13: support `(process opts? & args)` syntax everywhere
|
||||||
|
- [#1438](https://github.com/babashka/babashka/issues/1438): expose `query-string` and `url-encode` functions from org.httpkit.client ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- Add `java.util.InputMismatchException`
|
||||||
|
|
||||||
|
## 1.0.167 (2022-11-30)
|
||||||
|
|
||||||
|
- [#1433](https://github.com/babashka/babashka/issues/1433): spec source as built-in fallback. When not including the
|
||||||
|
[clojure.spec.alpha](https://github.com/babashka/spec.alpha) fork as a
|
||||||
|
library, babashka loads a bundled version, when `clojure.spec.alpha` is required.
|
||||||
|
- [#1430](https://github.com/babashka/babashka/issues/1430): Fix issue with `bb tasks` throwing on empty display tasks list.
|
||||||
|
- Add note about BSOD when using WSL1, see [README.md/quickstart](https://github.com/LouDnl/babashka#quickstart)
|
||||||
|
- SCI: performance improvements
|
||||||
|
- Better error locations for interop ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- Fix [babashka/babashka.nrepl#59](https://github.com/babashka/babashka.nrepl/issues/59): do not output extra new line with cider pprint
|
||||||
|
- Use `namespace-munge` instead of `munge` for doing ns -> file lookup
|
||||||
|
|
||||||
|
## 1.0.166 (2022-11-24)
|
||||||
|
|
||||||
|
See the [Testing babashka scripts](https://blog.michielborkent.nl/babashka-test-runner.html) blog post for how to run tests with this release.
|
||||||
|
|
||||||
|
- Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace)
|
||||||
|
- Add `run-test` and `run-test-var` to `clojure.test`
|
||||||
|
- Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix
|
||||||
|
- [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map
|
||||||
|
- [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- Update nix app example in docs
|
||||||
|
- Add `java.lang.Error` and `java.net.URLClassLoader` (only for compatibility with the `clojure.java.classpath` lib)
|
||||||
|
- Deps.clj `deps.clj: 1.11.1.1200`
|
||||||
|
- Upgrade timbre to `6.0.1`
|
||||||
|
- Performance improvements in SCI
|
||||||
|
- SCI: preserve stack information on `throw` expressions
|
||||||
|
|
||||||
|
## 1.0.165 (2022-11-01)
|
||||||
|
|
||||||
|
- Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method
|
||||||
|
- Fix [#1405](https://github.com/babashka/babashka/issues/1405): drop name metadata from conditionally defined var
|
||||||
|
- [#602](https://github.com/babashka/babashka/issues/602): add lib tests for clj-commons/fs ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- Add `java.net.URLConnection` class
|
||||||
|
- Add `java.time.zone.ZoneRules` class
|
||||||
|
- Copy more docstrings for core macros and vars
|
||||||
|
- Bump `core.async` to `1.6.673`
|
||||||
|
- Implement `in-ns` as function, rather than special form ([@SignSpice](https://github.com/SignSpice))
|
||||||
|
- Bump `deps.clj` to `1.11.1.1182`
|
||||||
|
- Bump GraalVM to `22.3.0`
|
||||||
|
- SCI: don't rely on metadata for record implementation
|
||||||
|
|
||||||
|
## 1.0.164 (2022-10-17)
|
||||||
|
|
||||||
|
- SCI: optimizations for `let`
|
||||||
|
- Add single argument read method support to PipedInputStream proxy ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- feat: Honor `*print-namespace-maps*` in pprint ([@ghoseb](https://github.com/ghoseb))
|
||||||
|
- [#1369](https://github.com/babashka/babashka/issues/1369): provide `.sha256` files for every released asset
|
||||||
|
- [#1397](https://github.com/babashka/babashka/issues/1397): Add `clojure.lang.Namespace` as alias for `sci.lang.Namespace`, such that `(instance? clojure.lang.Namespace *ns*)` returns `true` in bb
|
||||||
|
- [#1384](https://github.com/babashka/babashka/issues/1384): allow `.indexOf` on `LazySeq`
|
||||||
|
- [#1330](https://github.com/babashka/babashka/issues/1330): allow `(set! *warn-on-reflection*)` in programmatic nREPL
|
||||||
|
- Better error message when failing to load `bb.edn` ([@lispyclouds](https://github.com/lispyclouds))
|
||||||
|
- Pods: print and flush to `*out*` and `*err*` instead of using `println` ([@justone](https://github.com/justone))
|
||||||
|
- deps.clj: support for `CLJ_JVM_OPTS` and `JAVA_OPTS` ([@ikappaki](https://github.com/ikappaki))
|
||||||
|
- Fix `*print-namespace-maps*` when using `clojure.pprint` ([@ghoseb](https://github.com/ghoseb))
|
||||||
|
- Process: only slurp `*err*` when inputstream ([@ikappaki](https://github.com/ikappaki))
|
||||||
|
- Process: add `alive?` API function ([@grzm](https://github.com/grzm))
|
||||||
|
- Bump libraries: tools.cli, babashka.cli
|
||||||
|
- [#1391](https://github.com/babashka/babashka/issues/1391): include raw in `hiccup2.core` ns
|
||||||
|
- [#1391](https://github.com/babashka/babashka/issues/1391): support loading `hiccup.page` when adding hiccup to deps
|
||||||
|
|
||||||
|
## 0.10.163 (2022-09-24)
|
||||||
|
|
||||||
|
- [#808](https://github.com/babashka/babashka/issues/808): support `-Sdeps` option to support passing extra deps map which will be merged last
|
||||||
|
- [#1336](https://github.com/babashka/babashka/issues/1336): tasks subcommand doesn't work with global `-Sforce` option ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- [#1340](https://github.com/babashka/babashka/issues/1340): `defprotocol` methods are missing `:doc` metadata ([@bobisageek](https://github.com/bobisageek))
|
||||||
|
- [#1368](https://github.com/babashka/babashka/issues/1368): `-x`: do not pick up on aliases in `user` ns
|
||||||
|
- [#1367](https://github.com/babashka/babashka/issues/1367): Fix line number in clojure.test output ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- [#1370](https://github.com/babashka/babashka/issues/1370): Add `core.async` `to-chan!`, `to-chan!!`, `onto-chan!` ([@cap10morgan](https://github.com/cap10morgan))
|
||||||
|
- [#1358](https://github.com/babashka/babashka/issues/1358): Expose a subset of `java.lang.ref` to enable hooking into the destruction/GC of objects ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- [#1364](https://github.com/babashka/babashka/issues/1364): Be tolerant of unknown tags in `bb.edn`
|
||||||
|
- Add and expose `babashka.classes/all-classes` to get a list of all available classes (as `java.lang.Class` objects) ([@eerohele](https://github.com/eerohele))
|
||||||
|
- Add more reflection class methods ([@eerohele](https://github.com/eerohele))
|
||||||
|
- Bump `clj-yaml`
|
||||||
|
- Add `-x` help
|
||||||
|
- Set `TCP_NODELAY` in pods for performance
|
||||||
|
- Expose `clojure.main/with-bindings`
|
||||||
|
- Add `ThreadPoolExecutor` rejection policy classes ([@eerohele](https://github.com/eerohele))
|
||||||
|
- Download but don't run pods when `os.name` / `os.arch` don't match ([@cap10morgan](https://github.com/cap10morgan))
|
||||||
|
- Add `clojure.core.server/stop-server` ([@eerohele](https://github.com/eerohele))
|
||||||
|
- Add `ns-unalias`
|
||||||
|
- Add `AtomicInteger` and `AtomicLong` to full interop
|
||||||
|
- Add `PrintWriter-on`
|
||||||
|
- Improve `reify` error messages ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- Expose `core.async` `ManyToManyChannel`
|
||||||
|
- fs: add `write-lines`
|
||||||
|
- fs: add `write-bytes`
|
||||||
|
- [#1350](https://github.com/babashka/babashka/issues/1350): map `clojure.lang.Var` to `sci.lang.Var`
|
||||||
|
- Use temporary fork of `clj-yaml` with new `:load-all`, `:unknown-tag-fn`
|
||||||
|
options and preserves strings with numbers that start with zeros as strings
|
||||||
|
(this solves a problem when YAML 1.1 output is read as YAML 1.2.). Once
|
||||||
|
upstream SnakeYAML 1.33 lands, this will be used again.
|
||||||
|
|
||||||
|
## 0.9.162 (2022-09-04)
|
||||||
|
|
||||||
|
Check out our new project: [bbin](https://github.com/babashka/bbin): install any Babashka script or project with one command. Thanks [@rads](https://github.com/rads)!
|
||||||
|
|
||||||
|
- Throw exception on attempt to reify multiple interfaces ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- Allow java.lang.Object reify with empty methods ([@retrogradeorbit](https://github.com/retrogradeorbit))
|
||||||
|
- [#1343](https://github.com/babashka/babashka/issues/1343): Fix postgres feature
|
||||||
|
- [#1345](https://github.com/babashka/babashka/issues/1345): add `javax.net.ssl.SSLException` and `java.net.SocketTimeoutException` classes ([@lread](https://github.com/lread))
|
||||||
|
- Fix `satisfies?` with marker protocol (no methods)
|
||||||
|
- Update `rewrite-clj`
|
||||||
|
- Update `deps.clj`
|
||||||
|
- Update `babashka.cli`
|
||||||
|
- Update `org.clj-commons/clj-yaml`
|
||||||
|
- `babashka.fs`: fix `expand-home` on Windows
|
||||||
|
- `babashka.fs`: expose `:win-exts`
|
||||||
|
- nREPL: preserve stacktrace on exception
|
||||||
|
- Fix [#1322](https://github.com/babashka/babashka/issues/1322): improve error location
|
||||||
|
- Fix [#1338](https://github.com/babashka/babashka/issues/1338): `add-watch` segfault
|
||||||
|
- Fix [#1339](https://github.com/babashka/babashka/issues/1339): resolve record name ending with dot.
|
||||||
|
|
||||||
|
## 0.9.161 (2022-07-31)
|
||||||
|
|
||||||
|
- Fix `exec`
|
||||||
|
|
||||||
|
## 0.9.160 (2022-07-29)
|
||||||
|
|
||||||
|
- Breaking: change `exec`, introduced in `0.9.159` to a function instead.
|
||||||
|
You now write `(exec 'mynamespace.function)` instead.
|
||||||
|
|
||||||
|
## 0.9.159 (2022-07-29)
|
||||||
|
|
||||||
|
Read the introductory blog post about the new babashka CLI integration [here](https://blog.michielborkent.nl/babashka-tasks-meets-babashka-cli.html).
|
||||||
|
|
||||||
|
- [#1324](https://github.com/babashka/babashka/issues/1324): `-x` to invoke a function with babashka CLI
|
||||||
|
- [#1324](https://github.com/babashka/babashka/issues/1324): `babashka.tasks/exec` to invoke a function with babashka CLI in tasks
|
||||||
|
- SCI: don't eval metatada on defn body
|
||||||
|
- SCI issue 774: make interpreter stacktrace available to user
|
||||||
|
- `babashka.process`: improve `tokenize`
|
||||||
|
- Upgrade to GraalVM 22.2.0 (#1325)
|
||||||
|
|
||||||
|
## 0.8.157 (2022-07-01)
|
||||||
|
|
||||||
|
- Add compatibility with [`metosin/malli`](https://github.com/metosin/malli#babashka) `{:mvn/version "0.8.9"}`.
|
||||||
|
- Expose `babashka.nrepl.server/start-server!`- and `stop-server!`-functions to support programmatically starting
|
||||||
|
an nrepl-server. `start-server!` is redefined to not require a sci-context as its first argument.
|
||||||
|
- Fix misspelling in script/uberjar: `BABASHKA_FEATURE_TRANSIT`
|
||||||
|
|
||||||
## 0.8.156 (2022-06-08)
|
## 0.8.156 (2022-06-08)
|
||||||
|
|
||||||
- macOS aarch64 support. Upgrading via brew or the installer script should
|
- macOS aarch64 support. Upgrading via brew or the installer script should
|
||||||
|
|
@ -465,7 +1029,7 @@ Babashka.pods:
|
||||||
- Add `babashka.task` `System` property [#837](https://github.com/babashka/babashka/issues/837)
|
- 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)
|
- 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:
|
Babashka proper:
|
||||||
|
|
||||||
|
|
@ -475,7 +1039,7 @@ Babashka proper:
|
||||||
[jasentaa](https://github.com/rm-hull/jasentaa) parser combinator library
|
[jasentaa](https://github.com/rm-hull/jasentaa) parser combinator library
|
||||||
- Update Selmer to 1.12.40
|
- Update Selmer to 1.12.40
|
||||||
|
|
||||||
Sci:
|
SCI:
|
||||||
|
|
||||||
- Better error msg for protocol not found or class
|
- Better error msg for protocol not found or class
|
||||||
|
|
||||||
|
|
@ -1045,6 +1609,14 @@ Details about releases prior to v0.1.0 can be found
|
||||||
|
|
||||||
## Breaking changes
|
## Breaking changes
|
||||||
|
|
||||||
|
### v1.1.172
|
||||||
|
|
||||||
|
- Bump `babashka.process`: change default for `:out :append` to `:out :write`. This default is undocumented so the impact should be small.
|
||||||
|
|
||||||
|
### v1.1.171
|
||||||
|
|
||||||
|
- [#1467](https://github.com/babashka/babashka/issues/1467): avoid printing results, unless `--prn` is enabled (aside from `-e`, `-o` and `-O`).
|
||||||
|
|
||||||
### v0.2.4
|
### v0.2.4
|
||||||
|
|
||||||
- Remove cheshire smile functions [#658](https://github.com/babashka/babashka/issues/658)
|
- Remove cheshire smile functions [#658](https://github.com/babashka/babashka/issues/658)
|
||||||
|
|
|
||||||
27
Dockerfile
27
Dockerfile
|
|
@ -5,24 +5,25 @@ RUN apt update
|
||||||
RUN apt install --no-install-recommends -yy build-essential zlib1g-dev
|
RUN apt install --no-install-recommends -yy build-essential zlib1g-dev
|
||||||
WORKDIR "/opt"
|
WORKDIR "/opt"
|
||||||
|
|
||||||
ENV GRAALVM_VERSION="22.1.0"
|
ENV GRAALVM_VERSION="24"
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
ENV BABASHKA_ARCH=${TARGETARCH}
|
# Do not set those directly, use TARGETARCH instead
|
||||||
ENV GRAALVM_ARCH=${TARGETARCH}
|
ENV BABASHKA_ARCH=
|
||||||
|
ENV GRAALVM_ARCH=
|
||||||
RUN if [ "${TARGETARCH}" = "" ] || [ "${TARGETARCH}" = "amd64" ]; then \
|
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 \
|
elif [ "${TARGETARCH}" = "arm64" ]; then \
|
||||||
export GRAALVM_ARCH=aarch64; \
|
export GRAALVM_ARCH=aarch64; \
|
||||||
fi && \
|
fi && \
|
||||||
echo "Installing GraalVM for ${GRAALVM_ARCH}" && \
|
echo "Installing GraalVM for ${GRAALVM_ARCH}" && \
|
||||||
curl -sLO https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${GRAALVM_VERSION}/graalvm-ce-java11-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 && \
|
||||||
tar -xzf graalvm-ce-java11-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz && \
|
mkdir "graalvm-$GRAALVM_VERSION" && \
|
||||||
rm graalvm-ce-java11-linux-${GRAALVM_ARCH}-${GRAALVM_VERSION}.tar.gz
|
tar -xzf graalvm-jdk-${GRAALVM_VERSION}_linux-${GRAALVM_ARCH}_bin.tar.gz -C graalvm-$GRAALVM_VERSION --strip-components 1
|
||||||
|
|
||||||
ARG BABASHKA_XMX="-J-Xmx4500m"
|
ARG BABASHKA_XMX="-J-Xmx4500m"
|
||||||
|
|
||||||
ENV GRAALVM_HOME="/opt/graalvm-ce-java11-${GRAALVM_VERSION}"
|
ENV GRAALVM_HOME="/opt/graalvm-$GRAALVM_VERSION"
|
||||||
ENV JAVA_HOME="/opt/graalvm-ce-java11-${GRAALVM_VERSION}/bin"
|
ENV JAVA_HOME="$GRAALVM_HOME/bin"
|
||||||
ENV PATH="$JAVA_HOME:$PATH"
|
ENV PATH="$JAVA_HOME:$PATH"
|
||||||
ENV BABASHKA_XMX=$BABASHKA_XMX
|
ENV BABASHKA_XMX=$BABASHKA_XMX
|
||||||
|
|
||||||
|
|
@ -34,7 +35,7 @@ ARG BABASHKA_FEATURE_CSV=
|
||||||
ARG BABASHKA_FEATURE_JAVA_NET_HTTP=
|
ARG BABASHKA_FEATURE_JAVA_NET_HTTP=
|
||||||
ARG BABASHKA_FEATURE_JAVA_NIO=
|
ARG BABASHKA_FEATURE_JAVA_NIO=
|
||||||
ARG BABASHKA_FEATURE_JAVA_TIME=
|
ARG BABASHKA_FEATURE_JAVA_TIME=
|
||||||
ARG BABAHSKA_FEATURE_TRANSIT=
|
ARG BABASHKA_FEATURE_TRANSIT=
|
||||||
ARG BABASHKA_FEATURE_XML=
|
ARG BABASHKA_FEATURE_XML=
|
||||||
ARG BABASHKA_FEATURE_YAML=
|
ARG BABASHKA_FEATURE_YAML=
|
||||||
ARG BABASHKA_FEATURE_HTTPKIT_CLIENT=
|
ARG BABASHKA_FEATURE_HTTPKIT_CLIENT=
|
||||||
|
|
@ -51,7 +52,7 @@ ENV BABASHKA_FEATURE_CSV=$BABASHKA_FEATURE_CSV
|
||||||
ENV BABASHKA_FEATURE_JAVA_NET_HTTP=$BABASHKA_FEATURE_JAVA_NET_HTTP
|
ENV BABASHKA_FEATURE_JAVA_NET_HTTP=$BABASHKA_FEATURE_JAVA_NET_HTTP
|
||||||
ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO
|
ENV BABASHKA_FEATURE_JAVA_NIO=$BABASHKA_FEATURE_JAVA_NIO
|
||||||
ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME
|
ENV BABASHKA_FEATURE_JAVA_TIME=$BABASHKA_FEATURE_JAVA_TIME
|
||||||
ENV BABAHSKA_FEATURE_TRANSIT=$BABAHSKA_FEATURE_TRANSIT
|
ENV BABASHKA_FEATURE_TRANSIT=$BABASHKA_FEATURE_TRANSIT
|
||||||
ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML
|
ENV BABASHKA_FEATURE_XML=$BABASHKA_FEATURE_XML
|
||||||
ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML
|
ENV BABASHKA_FEATURE_YAML=$BABASHKA_FEATURE_YAML
|
||||||
ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT
|
ENV BABASHKA_FEATURE_HTTPKIT_CLIENT=$BABASHKA_FEATURE_HTTPKIT_CLIENT
|
||||||
|
|
@ -72,7 +73,9 @@ RUN ./script/compile
|
||||||
|
|
||||||
FROM ubuntu:latest
|
FROM ubuntu:latest
|
||||||
RUN apt-get update && apt-get install -y curl \
|
RUN apt-get update && apt-get install -y curl \
|
||||||
&& mkdir -p /usr/local/bin
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& mkdir -p /usr/local/bin
|
||||||
|
|
||||||
COPY --from=BASE /opt/target/metabom.jar /opt/babashka-metabom.jar
|
COPY --from=BASE /opt/target/metabom.jar /opt/babashka-metabom.jar
|
||||||
COPY --from=BASE /opt/bb /usr/local/bin/bb
|
COPY --from=BASE /opt/bb /usr/local/bin/bb
|
||||||
CMD ["bb"]
|
CMD ["bb"]
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,20 @@ COPY bb /bin/bb
|
||||||
|
|
||||||
RUN chmod +x /bin/bb
|
RUN chmod +x /bin/bb
|
||||||
|
|
||||||
|
# TODO: See https://github.com/sgerrand/alpine-pkg-glibc/issues/185 and remove the `--force-overwrite`s when resolved.
|
||||||
|
|
||||||
RUN apk --no-cache add curl ca-certificates tar && \
|
RUN apk --no-cache add curl ca-certificates tar && \
|
||||||
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
|
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
|
||||||
apk add --allow-untrusted /tmp/glibc-2.28-r0.apk
|
apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk
|
||||||
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
|
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
|
||||||
|
|
||||||
# TODO: Run actual native tests when they are ported
|
# TODO: Run actual native tests when they are ported
|
||||||
|
|
||||||
RUN bb -e "(curl/get \"https://httpstat.us/200\")" # cURL http test
|
RUN curl --version
|
||||||
RUN bb -e "(require '[org.httpkit.client :as http]) (when-let [error (:error @(http/get \"https://httpstat.us/200\"))] (throw error))" # JVM http test
|
# 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 "(.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
|
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
|
||||||
|
|
||||||
|
|
@ -21,7 +26,7 @@ FROM alpine:3
|
||||||
|
|
||||||
RUN apk --no-cache add curl ca-certificates tar && \
|
RUN apk --no-cache add curl ca-certificates tar && \
|
||||||
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
|
curl -Ls https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk > /tmp/glibc-2.28-r0.apk && \
|
||||||
apk add --allow-untrusted /tmp/glibc-2.28-r0.apk
|
apk add --allow-untrusted --force-overwrite /tmp/glibc-2.28-r0.apk && rm /tmp/glibc-2.28-r0.apk
|
||||||
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
|
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
|
||||||
|
|
||||||
COPY metabom.jar /opt/babashka-metabom.jar
|
COPY metabom.jar /opt/babashka-metabom.jar
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ FROM ubuntu:latest
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y curl \
|
&& apt-get install -y curl \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
&& mkdir -p /usr/local/bin
|
&& mkdir -p /usr/local/bin
|
||||||
|
|
||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
|
|
|
||||||
218
README.md
218
README.md
|
|
@ -1,10 +1,10 @@
|
||||||
<img src="logo/babashka.svg" width="425px">
|
[<img src="logo/babashka.svg" alt="Babashka" width="425px">](https://babashka.org)
|
||||||
|
|
||||||
[](https://circleci.com/gh/babashka/babashka/tree/master)
|
[](https://circleci.com/gh/babashka/babashka/tree/master)
|
||||||
[](https://app.slack.com/client/T03RZGPFR/CLX41ASCS)
|
[](https://app.slack.com/client/T03RZGPFR/CLX41ASCS)
|
||||||
[](https://opencollective.com/babashka) [](https://clojars.org/babashka/babashka)
|
[](https://opencollective.com/babashka) [](https://clojars.org/babashka/babashka)
|
||||||
[](https://twitter.com/search?q=%23babashka&src=typed_query&f=live)
|
[](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">
|
<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>
|
<p lang="en" dir="ltr">Life's too short to remember how to write Bash code. I feel liberated.</p>
|
||||||
|
|
@ -12,12 +12,6 @@
|
||||||
<a href="https://github.com/laheadle">@laheadle</a> on Clojurians Slack
|
<a href="https://github.com/laheadle">@laheadle</a> on Clojurians Slack
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
Please leave some feedback about babashka in the [Q1 Survey](https://forms.gle/ko3NjDg2SwXeEoNQ9)!
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
Babashka is a native Clojure interpreter for scripting with fast startup. Its
|
Babashka is a native Clojure interpreter for scripting with fast startup. Its
|
||||||
|
|
@ -46,10 +40,10 @@ As one user described it:
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
For installation options check [Installation](https://github.com/babashka/babashka#installation).
|
For installation options check [Installation](https://github.com/babashka/babashka#installation).
|
||||||
For quick installation use:
|
For quick installation using `bash`, use:
|
||||||
|
|
||||||
``` shell
|
``` 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
|
or grab a binary from [Github
|
||||||
|
|
@ -59,11 +53,36 @@ anywhere on the path.
|
||||||
Then you're ready to go:
|
Then you're ready to go:
|
||||||
|
|
||||||
``` shellsession
|
``` shellsession
|
||||||
$ ls | bb -i '(filter #(-> % io/file .isDirectory) *input*)'
|
time bb -e '(->> (fs/list-dir ".") (filter fs/directory?) (map fs/normalize) (map str) (take 3))'
|
||||||
("doc" "resources" "sci" "script" "src" "target" "test")
|
|
||||||
bb took 4ms.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
``` clojure
|
||||||
|
(".build" "feature-lanterna" ".repl")
|
||||||
|
bb -e 0,01s user 0,01s system 70% cpu 0,017 total
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support :heart:
|
||||||
|
|
||||||
|
You can support this project via [Github
|
||||||
|
Sponsors](https://github.com/sponsors/borkdude),
|
||||||
|
[OpenCollective](https://opencollective.com/babashka),
|
||||||
|
[Ko-fi](https://ko-fi.com/borkdude) or indirectly via [Clojurists
|
||||||
|
Together](https://www.clojuriststogether.org/).
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Top sponsors</summary>
|
||||||
|
|
||||||
|
- [Clojurists Together](https://clojuriststogether.org/)
|
||||||
|
- [Roam Research](https://roamresearch.com/)
|
||||||
|
- [Nextjournal](https://nextjournal.com/)
|
||||||
|
- [Toyokumo](https://toyokumo.co.jp/)
|
||||||
|
- [Cognitect](https://www.cognitect.com/)
|
||||||
|
- [Kepler16](https://kepler16.com/)
|
||||||
|
- [Adgoji](https://www.adgoji.com/)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## Babashka users
|
## Babashka users
|
||||||
|
|
||||||
See [companies](doc/companies.md) for a list of companies using babashka.
|
See [companies](doc/companies.md) for a list of companies using babashka.
|
||||||
|
|
@ -88,7 +107,7 @@ and is unlikely to change. Changes may happen in other parts of babashka,
|
||||||
although we will try our best to prevent them. Always check the release notes or
|
although we will try our best to prevent them. Always check the release notes or
|
||||||
[CHANGELOG.md](CHANGELOG.md) before upgrading.
|
[CHANGELOG.md](CHANGELOG.md) before upgrading.
|
||||||
|
|
||||||
### Talk
|
## Talk
|
||||||
|
|
||||||
To get an overview of babashka, you can watch this talk ([slides](https://speakerdeck.com/borkdude/babashka-and-the-small-clojure-interpreter-at-clojured-2020)):
|
To get an overview of babashka, you can watch this talk ([slides](https://speakerdeck.com/borkdude/babashka-and-the-small-clojure-interpreter-at-clojured-2020)):
|
||||||
|
|
||||||
|
|
@ -99,44 +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
|
The [babashka book](https://book.babashka.org) contains detailed information
|
||||||
about how to get the most out of babashka scripting.
|
about how to get the most out of babashka scripting.
|
||||||
|
|
||||||
## Examples
|
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
|
||||||
Read the output from a shell command as a lazy seq of strings:
|
[Clojure for the Brave and
|
||||||
|
True](https://www.braveclojure.com/clojure-for-the-brave-and-true/).
|
||||||
``` 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 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).
|
|
||||||
|
|
||||||
## Try online
|
## Try online
|
||||||
|
|
||||||
|
|
@ -153,11 +138,6 @@ Install:
|
||||||
|
|
||||||
brew install borkdude/brew/babashka
|
brew install borkdude/brew/babashka
|
||||||
|
|
||||||
<!-- On macOS with an M1 processor: -->
|
|
||||||
|
|
||||||
<!-- softwareupdate --install-rosetta -->
|
|
||||||
<!-- arch -x86_64 brew install borkdude/brew/babashka -->
|
|
||||||
|
|
||||||
Upgrade:
|
Upgrade:
|
||||||
|
|
||||||
brew upgrade babashka
|
brew upgrade babashka
|
||||||
|
|
@ -180,6 +160,12 @@ Upgrade:
|
||||||
|
|
||||||
You can find more documentation on how to use babashka with nix [here](./doc/nix.md).
|
You can find more documentation on how to use babashka with nix [here](./doc/nix.md).
|
||||||
|
|
||||||
|
### Alpine
|
||||||
|
|
||||||
|
On Alpine it's recommended to download the binary manually from [Github
|
||||||
|
Releases](https://github.com/babashka/babashka/releases) and use the static
|
||||||
|
linux binary.
|
||||||
|
|
||||||
### Arch (Linux)
|
### Arch (Linux)
|
||||||
|
|
||||||
`babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as
|
`babashka` is [available](https://aur.archlinux.org/packages/babashka-bin/) in the [Arch User Repository](https://aur.archlinux.org). It can be installed using your favorite [AUR](https://aur.archlinux.org) helper such as
|
||||||
|
|
@ -189,13 +175,25 @@ You can find more documentation on how to use babashka with nix [here](./doc/nix
|
||||||
|
|
||||||
### asdf
|
### 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:
|
Babashka can be installed using a plugin as follows:
|
||||||
|
|
||||||
asdf plugin add babashka
|
asdf plugin add babashka https://github.com/pitch-io/asdf-babashka
|
||||||
asdf install babashka latest
|
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
|
### Windows
|
||||||
|
|
||||||
#### Scoop
|
#### Scoop
|
||||||
|
|
@ -220,12 +218,22 @@ If scoop does not work for you, then you can also just download the `bb.exe`
|
||||||
binary from [Github releases](https://github.com/babashka/babashka/releases) and
|
binary from [Github releases](https://github.com/babashka/babashka/releases) and
|
||||||
place it on your path manually.
|
place it on your path manually.
|
||||||
|
|
||||||
|
#### WSL1
|
||||||
|
> Note: WSL1 users might experience a BSOD, please use the --static install option when installing
|
||||||
|
``` shell
|
||||||
|
$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
|
||||||
|
$ chmod +x install
|
||||||
|
$ ./install --static
|
||||||
|
```
|
||||||
|
|
||||||
### Installer script
|
### Installer script
|
||||||
|
|
||||||
Install via the installer script:
|
Install via the installer script for linux and macOS:
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
$ curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
|
$ 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
|
$ chmod +x install
|
||||||
$ ./install
|
$ ./install
|
||||||
```
|
```
|
||||||
|
|
@ -274,6 +282,12 @@ You may also download a binary from
|
||||||
[Github](https://github.com/babashka/babashka/releases). For linux there is a
|
[Github](https://github.com/babashka/babashka/releases). For linux there is a
|
||||||
static binary available which can be used on Alpine.
|
static binary available which can be used on Alpine.
|
||||||
|
|
||||||
|
### CI
|
||||||
|
|
||||||
|
- On Github Actions it's recommended to use [setup-clojure](https://github.com/DeLaGuardo/setup-clojure) with `bb: latest`.
|
||||||
|
- You can use the [installer script](https://github.com/babashka/babashka#installer-script) on any non-Windows CI system. CircleCI requires `sudo`.
|
||||||
|
- On Appveyor + Windows you can use a bit of [Powershell](https://github.com/clj-kondo/clj-kondo/blob/39b5cb2b0d3d004c005e8975b6fafe0e314eec68/appveyor.yml#L60-L64).
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
Check out the image on [Docker hub](https://hub.docker.com/r/babashka/babashka/).
|
Check out the image on [Docker hub](https://hub.docker.com/r/babashka/babashka/).
|
||||||
|
|
@ -286,13 +300,25 @@ Check out the [news](doc/news.md) page to keep track of babashka-related news it
|
||||||
|
|
||||||
Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list of built-in namespaces.
|
Go [here](https://book.babashka.org/#built-in-namespaces) to see the full list of built-in namespaces.
|
||||||
|
|
||||||
## [Projects](doc/projects.md)
|
## [Compatible Projects](doc/projects.md)
|
||||||
|
|
||||||
A list of projects (scripts, libraries, pods and tools) known to work with babashka.
|
A list of projects (scripts, libraries, pods and tools) known to work with babashka.
|
||||||
|
|
||||||
Have a library that is already compatible or has recently been made compatible? Add the official badge to add some flair to your repo!
|
## Badges
|
||||||
|
|
||||||
[](https://babashka.org)
|
[](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.
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
See [the babashka book for details](https://book.babashka.org#badges).
|
||||||
|
|
||||||
|
## Swag
|
||||||
|
|
||||||
|
- [t-shirt](https://www.etsy.com/listing/1241766068/babashka-clj-kondo-nbb-shirt)
|
||||||
|
|
||||||
## [Pods](https://github.com/babashka/babashka.pods)
|
## [Pods](https://github.com/babashka/babashka.pods)
|
||||||
|
|
||||||
|
|
@ -300,7 +326,7 @@ Pods are programs that can be used as a Clojure library by
|
||||||
babashka. Documentation is available in the [pod library
|
babashka. Documentation is available in the [pod library
|
||||||
repo](https://github.com/babashka/pods).
|
repo](https://github.com/babashka/pods).
|
||||||
|
|
||||||
A list of available pods can be found [here](doc/projects.md#pods).
|
A list of available pods can be found in the [pod registry](https://github.com/babashka/pod-registry).
|
||||||
|
|
||||||
## Differences with Clojure
|
## Differences with Clojure
|
||||||
|
|
||||||
|
|
@ -342,8 +368,33 @@ handling of SIGINT and SIGPIPE. This can be done by setting
|
||||||
|
|
||||||
## Articles, podcasts and videos
|
## Articles, podcasts and videos
|
||||||
|
|
||||||
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé
|
- [Blambda analyses sites](https://jmglov.net/blog/2023-01-04-blambda-analyses-sites.html) by Josh Glover
|
||||||
|
- [The wizard of HOP - How we built the web based HOP CLI Settings Editor using Babashka and Scittle](https://www.gethop.dev/post/the-wizard-of-hop-how-we-built-the-web-based-hop-cli-settings-editor-using-babashka-and-scittle) by Bingen Galartza
|
||||||
|
- [Simple TUIs with Babashka and Gum](https://rattlin.blog/bbgum.html) by Rattlin.blog
|
||||||
|
- [Babashka And Dialog Part Ii: Announcing The Bb-Dialog Library](https://www.pixelated-noise.com/blog/2023/01/20/bb-dialog-announcement/index.html) by A.C. Danvers
|
||||||
|
- [Babashka Babooka](https://www.braveclojure.com/quests/babooka/): Write Command-Line Clojure by Daniel Higginbotham
|
||||||
|
- [Re-Writing a GlobalProtect OpenConnect VPN Connect script in Babashka](https://tech.toryanderson.com/2023/01/14/re-writing-a-globalprotect-openconnect-vpn-connect-script-in-babashka/) by Tory Anderson
|
||||||
|
- [Babashka: How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746) by Michiel Borkent (Japanese version [here]((https://logico-jp.io/2023/01/07/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure/)))
|
||||||
|
- [Adding Prompts To Your Babashka Scripts With Dialog](https://www.pixelated-noise.com/blog/2022/12/09/dialog-and-babashka/index.html) by A.C. Danvers
|
||||||
|
- [Scraping an HTML dictionary with Babashka and Bootleg](https://blog.exupero.org/scraping-an-html-dictionary-with-babashka-and-bootleg/) by exupero
|
||||||
|
- [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices.html) by Kari Marttila
|
||||||
|
- [How to Do Things With Babashka](https://presumably.de/how-to-do-things-with-babashka.html) by Paulus Esterhazy (2022-12)
|
||||||
|
- [Using nREPL as a system interface](https://yogthos.net/posts/2022-11-26-nREPL-system-interaction.html) by Dmitri Sotnikov
|
||||||
|
- [Manage git hooks with babashka tasks](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy
|
||||||
|
- [Messing around with babashka](https://ian-muge.medium.com/messing-around-with-babashka-f181a9003faa) by Ian Muge
|
||||||
|
- Introducing [bbin](https://radsmith.com/bbin) by Radford Smith (2022-09)
|
||||||
|
- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller
|
||||||
|
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund
|
||||||
|
- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover
|
||||||
|
- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs!
|
||||||
|
- [Breakneck Babashka on K8s](https://www.linkedin.com/pulse/breakneck-babashka-k8s-heow-goodman/) by Heow Goodman
|
||||||
|
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/)
|
||||||
|
- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg
|
||||||
|
- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou
|
||||||
|
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group
|
||||||
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
|
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
|
||||||
|
- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks) by Cyprien Pannier
|
||||||
|
- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent
|
||||||
- [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea
|
- [Moldable Emacs: a Clojure Playground with Babashka](https://ag91.github.io/blog/2021/11/05/moldable-emacs-a-clojure-playground-with-babashka/) by Andrea
|
||||||
- [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller
|
- [Finding my inner Wes Anderson with #Babashka](https://javahippie.net/clojure/2021/10/18/finding-my-inner-wes-anderson.html) by Tim Zöller
|
||||||
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý
|
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holý
|
||||||
|
|
@ -418,47 +469,10 @@ commit](https://github.com/babashka/babashka/commit/02c7c51ad4b2b1ab9aa95c26a744
|
||||||
|
|
||||||
Thanks to all the people that contributed to babashka:
|
Thanks to all the people that contributed to babashka:
|
||||||
|
|
||||||
- [Adgoji](https://www.adgoji.com/) for financial support
|
|
||||||
- [CircleCI](https://circleci.com/) for CI and additional support
|
- [CircleCI](https://circleci.com/) for CI and additional support
|
||||||
- [Nikita Prokopov](https://github.com/tonsky) for the logo
|
- [Nikita Prokopov](https://github.com/tonsky) for the logo
|
||||||
- [Contributors](https://github.com/babashka/babashka/graphs/contributors) and
|
- [Contributors](https://github.com/babashka/babashka/graphs/contributors) and
|
||||||
other users posting issues with bug reports and ideas
|
other users posting issues with bug reports and ideas
|
||||||
- [Github sponsors](https://github.com/sponsors/borkdude)
|
|
||||||
- [OpenCollective sponsors](https://opencollective.com/babashka)
|
|
||||||
- [Clojurists Together](https://www.clojuriststogether.org/)
|
|
||||||
|
|
||||||
### Code Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](doc/dev.md)].
|
|
||||||
<a href="https://github.com/babashka/babashka/graphs/contributors"><img src="https://opencollective.com/babashka/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
### Financial Contributors
|
|
||||||
|
|
||||||
#### Github Sponsors
|
|
||||||
|
|
||||||
- [Dig Gashinsky](https://github.com/digash)
|
|
||||||
|
|
||||||
#### OpenCollective
|
|
||||||
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/babashka/contribute)]
|
|
||||||
|
|
||||||
##### Individuals
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/babashka"><img src="https://opencollective.com/babashka/individuals.svg?width=890"></a>
|
|
||||||
|
|
||||||
##### Organizations
|
|
||||||
|
|
||||||
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/babashka/contribute)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/babashka/organization/0/website"><img src="https://opencollective.com/babashka/organization/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/1/website"><img src="https://opencollective.com/babashka/organization/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/2/website"><img src="https://opencollective.com/babashka/organization/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/3/website"><img src="https://opencollective.com/babashka/organization/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/4/website"><img src="https://opencollective.com/babashka/organization/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/5/website"><img src="https://opencollective.com/babashka/organization/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/6/website"><img src="https://opencollective.com/babashka/organization/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/7/website"><img src="https://opencollective.com/babashka/organization/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/8/website"><img src="https://opencollective.com/babashka/organization/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/babashka/organization/9/website"><img src="https://opencollective.com/babashka/organization/9/avatar.svg"></a>
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
|
||||||
27
appveyor.yml
27
appveyor.yml
|
|
@ -2,15 +2,20 @@
|
||||||
|
|
||||||
version: "v-{build}"
|
version: "v-{build}"
|
||||||
|
|
||||||
image: Visual Studio 2017
|
image: Visual Studio 2022
|
||||||
|
|
||||||
clone_folder: C:\projects\babashka
|
clone_folder: C:\projects\babashka
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0
|
GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
|
||||||
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-22.1.0
|
JAVA_HOME: C:\projects\babashka\graalvm\graalvm-jdk-24+36.1
|
||||||
BABASHKA_XMX: "-J-Xmx5g"
|
BABASHKA_XMX: "-J-Xmx5g"
|
||||||
|
|
||||||
|
skip_commits:
|
||||||
|
files:
|
||||||
|
- "logo/*"
|
||||||
|
- "**/*.md"
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
- C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml
|
- C:\ProgramData\chocolatey\lib -> project.clj, appveyor.yml
|
||||||
- '%USERPROFILE%\.m2 -> project.clj'
|
- '%USERPROFILE%\.m2 -> project.clj'
|
||||||
|
|
@ -18,6 +23,9 @@ cache:
|
||||||
|
|
||||||
clone_script:
|
clone_script:
|
||||||
- cmd: git config --global core.autocrlf true
|
- cmd: git config --global core.autocrlf true
|
||||||
|
|
||||||
|
- cmd: git config --global core.symlinks true
|
||||||
|
|
||||||
- ps: >-
|
- ps: >-
|
||||||
if(-not $env:APPVEYOR_PULL_REQUEST_NUMBER) {
|
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
|
git clone -q --branch=$env:APPVEYOR_REPO_BRANCH https://github.com/$env:APPVEYOR_REPO_NAME.git $env:APPVEYOR_BUILD_FOLDER
|
||||||
|
|
@ -31,9 +39,12 @@ clone_script:
|
||||||
}
|
}
|
||||||
- cmd: git submodule update --init --recursive
|
- cmd: git submodule update --init --recursive
|
||||||
|
|
||||||
|
- cmd: git reset --hard
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
|
# TODO: Extract the zip by removing the top level folder to remove the hardcoded path for GRAALVM_HOME
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-windows-amd64-22.1.0.zip', 'graalvm.zip') }"
|
powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://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 }"
|
powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }"
|
||||||
|
|
||||||
|
|
@ -50,7 +61,7 @@ build_script:
|
||||||
# see https://github.com/quarkusio/quarkus/pull/7663
|
# see https://github.com/quarkusio/quarkus/pull/7663
|
||||||
|
|
||||||
- cmd: >-
|
- cmd: >-
|
||||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
|
set BABASHKA_SHA=%APPVEYOR_REPO_COMMIT%
|
||||||
|
|
||||||
call script/uberjar.bat
|
call script/uberjar.bat
|
||||||
|
|
||||||
|
|
@ -64,11 +75,15 @@ build_script:
|
||||||
|
|
||||||
bb --config .build/bb.edn --deps-root . release-artifact %zip%
|
bb --config .build/bb.edn --deps-root . release-artifact %zip%
|
||||||
|
|
||||||
|
before_test:
|
||||||
|
- cmd: >-
|
||||||
set BABASHKA_CLASSPATH=
|
set BABASHKA_CLASSPATH=
|
||||||
|
|
||||||
set BABASHKA_TEST_ENV=native
|
set BABASHKA_TEST_ENV=native
|
||||||
|
|
||||||
call script/test.bat
|
test_script:
|
||||||
|
- cmd: >-
|
||||||
|
call script/test.bat :windows
|
||||||
|
|
||||||
call script/run_lib_tests.bat
|
call script/run_lib_tests.bat
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 8a27e6060a739c7580cc89ba2bfddf48881e7178
|
Subproject commit e936acd40544eb637b6041c7e89454b21eb7ee34
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0fba78aaa783d0f103533f035c8c5717ce4ac314
|
Subproject commit edd3d613bfb9bf3adabfd0bda5c3f5c6ee85ec20
|
||||||
2
deps.clj
2
deps.clj
|
|
@ -1 +1 @@
|
||||||
Subproject commit bac835661adbcd06b07ce2c408bb3e4911a48c28
|
Subproject commit 976cf7b0e54901ada3f7e83f12a4c0aed039adc9
|
||||||
89
deps.edn
89
deps.edn
|
|
@ -16,39 +16,43 @@
|
||||||
"babashka.nrepl/src"
|
"babashka.nrepl/src"
|
||||||
"depstar/src" "process/src"
|
"depstar/src" "process/src"
|
||||||
"deps.clj/src" "deps.clj/resources"
|
"deps.clj/src" "deps.clj/resources"
|
||||||
"resources" "sci/resources"],
|
"resources" "sci/resources"
|
||||||
:deps {org.clojure/clojure {:mvn/version "1.11.1"},
|
"impl-java/src"],
|
||||||
|
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
|
||||||
org.babashka/sci {:local/root "sci"}
|
org.babashka/sci {:local/root "sci"}
|
||||||
org.babashka/babashka.impl.reify {:mvn/version "0.1.1"}
|
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
|
||||||
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
||||||
babashka/babashka.curl {:local/root "babashka.curl"}
|
babashka/babashka.curl {:local/root "babashka.curl"}
|
||||||
babashka/fs {:local/root "fs"}
|
babashka/fs {:local/root "fs"}
|
||||||
babashka/babashka.core {:local/root "babashka.core"}
|
babashka/babashka.core {:local/root "babashka.core"}
|
||||||
borkdude/graal.locking {:mvn/version "0.0.2"},
|
org.clojure/core.async {:mvn/version "1.8.741"},
|
||||||
org.clojure/core.async {:mvn/version "1.5.648"},
|
org.clojure/tools.cli {:mvn/version "1.0.214"},
|
||||||
org.clojure/tools.cli {:mvn/version "1.0.206"},
|
|
||||||
org.clojure/data.csv {:mvn/version "1.0.0"},
|
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-alpha6"}
|
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
|
||||||
clj-commons/clj-yaml {:mvn/version "0.7.108"}
|
clj-commons/clj-yaml {:mvn/version "1.0.29"}
|
||||||
com.cognitect/transit-clj {:mvn/version "1.0.329"}
|
com.cognitect/transit-clj {:mvn/version "1.0.333"}
|
||||||
org.clojure/test.check {:mvn/version "1.1.1"}
|
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"}
|
seancorfield/next.jdbc {:mvn/version "1.1.610"}
|
||||||
org.postgresql/postgresql {:mvn/version "42.2.18"}
|
org.postgresql/postgresql {:mvn/version "42.2.18"}
|
||||||
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
|
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
|
||||||
datascript/datascript {:mvn/version "1.0.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"}
|
babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"}
|
||||||
org.clojure/core.match {:mvn/version "1.0.0"}
|
org.clojure/core.match {:mvn/version "1.0.0"}
|
||||||
hiccup/hiccup {:mvn/version "2.0.0-alpha2"}
|
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
|
||||||
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"}
|
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
|
||||||
selmer/selmer {:mvn/version "1.12.50"}
|
selmer/selmer {:mvn/version "1.12.59"}
|
||||||
com.taoensso/timbre {:mvn/version "5.2.1"}
|
com.taoensso/timbre {:mvn/version "6.6.0"}
|
||||||
org.clojure/tools.logging {:mvn/version "1.1.0"}
|
org.clojure/tools.logging {:mvn/version "1.1.0"}
|
||||||
org.clojure/data.priority-map {:mvn/version "1.1.0"}
|
org.clojure/data.priority-map {:mvn/version "1.1.0"}
|
||||||
insn/insn {:mvn/version "0.5.2"}
|
insn/insn {:mvn/version "0.5.2"}
|
||||||
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}}
|
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}
|
||||||
|
org.babashka/cli {:mvn/version "0.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
|
:aliases {:babashka/dev
|
||||||
{:main-opts ["-m" "babashka.main"]}
|
{:main-opts ["-m" "babashka.main"]}
|
||||||
:profile
|
:profile
|
||||||
|
|
@ -61,8 +65,8 @@
|
||||||
:lib-tests
|
:lib-tests
|
||||||
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
|
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
|
||||||
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
|
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
|
||||||
org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
|
#_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
|
||||||
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
|
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
|
||||||
lambdaisland/regal {:mvn/version "0.0.143"}
|
lambdaisland/regal {:mvn/version "0.0.143"}
|
||||||
cprop/cprop {:mvn/version "0.1.16"}
|
cprop/cprop {:mvn/version "0.1.16"}
|
||||||
comb/comb {:mvn/version "0.1.1"}
|
comb/comb {:mvn/version "0.1.1"}
|
||||||
|
|
@ -104,20 +108,22 @@
|
||||||
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
||||||
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
||||||
expound/expound {:mvn/version "0.8.10"}
|
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"}
|
com.stuartsierra/dependency {:mvn/version "1.0.0"}
|
||||||
listora/again {:mvn/version "1.0.0"}
|
listora/again {:mvn/version "1.0.0"}
|
||||||
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
||||||
environ/environ {:mvn/version "1.2.0"}
|
environ/environ {:mvn/version "1.2.0"}
|
||||||
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
|
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
|
||||||
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
|
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
|
||||||
org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
|
org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32",
|
||||||
|
:git/url "https://github.com/clojure/tools.namespace"}
|
||||||
medley/medley {:mvn/version "1.3.0"}
|
medley/medley {:mvn/version "1.3.0"}
|
||||||
io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"}
|
io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner",
|
||||||
|
:git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"}
|
||||||
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
||||||
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
|
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
|
||||||
testdoc/testdoc {:mvn/version "1.4.1"}
|
testdoc/testdoc {:mvn/version "1.4.1"}
|
||||||
org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"}
|
org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}
|
||||||
borkdude/rewrite-edn {:mvn/version "0.1.0"}
|
borkdude/rewrite-edn {:mvn/version "0.1.0"}
|
||||||
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
|
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
|
||||||
io.aviso/pretty {:mvn/version "1.1.1"}
|
io.aviso/pretty {:mvn/version "1.1.1"}
|
||||||
|
|
@ -141,7 +147,38 @@
|
||||||
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}
|
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}
|
||||||
prismatic/schema {:git/url "https://github.com/plumatic/schema"
|
prismatic/schema {:git/url "https://github.com/plumatic/schema"
|
||||||
:git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
|
:git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
|
||||||
:git/tag "schema-1.3.0"}}
|
:git/tag "schema-1.3.0"}
|
||||||
|
metosin/malli {:git/url "https://github.com/metosin/malli"
|
||||||
|
:git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99"
|
||||||
|
:git/tag "0.8.9"}
|
||||||
|
meander/epsilon {:git/url "https://github.com/noprompt/meander"
|
||||||
|
:git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"}
|
||||||
|
cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex"
|
||||||
|
:git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor"
|
||||||
|
:git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri"
|
||||||
|
:git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
clj-commons/fs {:mvn/version "1.6.310"}
|
||||||
|
postmortem/postmortem {:git/url "https://github.com/athos/Postmortem"
|
||||||
|
:git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}
|
||||||
|
com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj"
|
||||||
|
:git/sha "4a92e772b4e07bf127423448d4140748b5782198"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
|
||||||
|
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
|
||||||
|
: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
|
:classpath-overrides {org.clojure/clojure nil
|
||||||
org.clojure/spec.alpha nil}}
|
org.clojure/spec.alpha nil}}
|
||||||
:clj-nvd
|
:clj-nvd
|
||||||
|
|
@ -151,9 +188,11 @@
|
||||||
:test
|
:test
|
||||||
{:extra-paths ["test"]
|
{:extra-paths ["test"]
|
||||||
:extra-deps {io.github.cognitect-labs/test-runner
|
:extra-deps {io.github.cognitect-labs/test-runner
|
||||||
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
|
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}
|
||||||
|
nubank/matcher-combinators {:mvn/version "3.6.0"}}
|
||||||
:main-opts ["-m" "cognitect.test-runner"]
|
:main-opts ["-m" "cognitect.test-runner"]
|
||||||
:exec-fn cognitect.test-runner.api/test}
|
:exec-fn cognitect.test-runner.api/test}
|
||||||
:test-pod
|
:test-pod
|
||||||
{:extra-paths ["test-resources"]
|
{:extra-paths ["test-resources"]
|
||||||
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
|
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
|
||||||
|
;; release
|
||||||
|
|
|
||||||
2
depstar
2
depstar
|
|
@ -1 +1 @@
|
||||||
Subproject commit c419b8c82041855d55593c5b561fc7cea8234712
|
Subproject commit 2bf9d3c9f15298d7dd9de033674a42f830e23d6f
|
||||||
14
doc/build.md
14
doc/build.md
|
|
@ -3,24 +3,24 @@
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Install [lein](https://leiningen.org/) for producing uberjars
|
- Install [lein](https://leiningen.org/) for producing uberjars
|
||||||
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-22.1.0*.
|
- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *Oracle GraalVM 24*.
|
||||||
- For Windows, installing Visual Studio 2019 with the "Desktop development
|
- For Windows, installing Visual Studio 2019 with the "Desktop development
|
||||||
with C++" workload is recommended.
|
with C++" workload is recommended.
|
||||||
- Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like:
|
- Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like:
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0/Contents/Home
|
export GRAALVM_HOME=~/Downloads/graalvm-jdk-21.0.0.1/Contents/Home
|
||||||
```
|
```
|
||||||
|
|
||||||
On linux:
|
On linux:
|
||||||
|
|
||||||
``` shell
|
``` shell
|
||||||
export GRAALVM_HOME=~/Downloads/graalvm-ce-java11-22.1.0
|
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):
|
On Windows, from the [Visual Studio 2019 x64 Native Tools Command Prompt](https://github.com/oracle/graal/issues/2116#issuecomment-590470806) or `cmd.exe` (not Powershell):
|
||||||
```
|
```
|
||||||
set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-java11-22.1.0
|
set GRAALVM_HOME=%USERPROFILE%\Downloads\graalvm-ce-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:
|
If you are not running from the x64 Native Tools Command Prompt, you will need to set additional environment variables using:
|
||||||
```
|
```
|
||||||
|
|
@ -62,7 +62,7 @@ take long to complete.
|
||||||
|
|
||||||
### Alternative: Build inside Docker
|
### Alternative: Build inside Docker
|
||||||
|
|
||||||
To build a Linux version of babashka, you can use `docker build`, enabling the
|
To build a Linux version of babashka, you can use `docker build`, enabling the
|
||||||
desired features via `--build-arg` like this:
|
desired features via `--build-arg` like this:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
@ -113,8 +113,8 @@ Babashka supports the following feature flags:
|
||||||
| `BABASHKA_FEATURE_ORACLEDB` | Includes the [Oracle](https://www.oracle.com/database/technologies/appdev/jdbc.html) JDBC driver | `false` |
|
| `BABASHKA_FEATURE_ORACLEDB` | Includes the [Oracle](https://www.oracle.com/database/technologies/appdev/jdbc.html) JDBC driver | `false` |
|
||||||
| `BABASHKA_FEATURE_DATASCRIPT` | Includes [datascript](https://github.com/tonsky/datascript) | `false` |
|
| `BABASHKA_FEATURE_DATASCRIPT` | Includes [datascript](https://github.com/tonsky/datascript) | `false` |
|
||||||
| `BABASHKA_FEATURE_LANTERNA` | Includes [clojure-lanterna](https://github.com/babashka/clojure-lanterna) | `false` |
|
| `BABASHKA_FEATURE_LANTERNA` | Includes [clojure-lanterna](https://github.com/babashka/clojure-lanterna) | `false` |
|
||||||
| `BABASHKA_FEATURE_LOGGING` | Includes [clojure.tools.logging](https://github.com/clojure/tools.logging) with [taoensso.timbre](https://github.com/ptaoussanis/timbre) as the default implementation| `true` |
|
| `BABASHKA_FEATURE_LOGGING` | Includes [clojure.tools.logging](https://github.com/clojure/tools.logging) with [taoensso.timbre](https://github.com/ptaoussanis/timbre) as the default implementation| `true` |
|
||||||
| `BABASHKA_FEATURE_PRIORITY_MAP` | Includes [clojure.data.priority-map](https://github.com/clojure/data.priority-map) | `true` |
|
| `BABASHKA_FEATURE_PRIORITY_MAP` | Includes [clojure.data.priority-map](https://github.com/clojure/data.priority-map) | `true` |
|
||||||
|
|
||||||
Note that httpkit server is currently experimental, the feature flag could be toggled to `false` in a future release.
|
Note that httpkit server is currently experimental, the feature flag could be toggled to `false` in a future release.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ Sponsoring via [Cognitect](https://www.cognitect.com/).
|
||||||
- [Fluree](https://flur.ee/)
|
- [Fluree](https://flur.ee/)
|
||||||
- [Hi](https://www.hi.group/)
|
- [Hi](https://www.hi.group/)
|
||||||
- [Juxt](https://www.juxt.pro/)
|
- [Juxt](https://www.juxt.pro/)
|
||||||
|
- [Kleene](https://www.kleene.ai/)
|
||||||
- [Latacora](https://www.latacora.com/)
|
- [Latacora](https://www.latacora.com/)
|
||||||
- [Metosin](https://www.metosin.fi/en/)
|
- [Metosin](https://www.metosin.fi/en/)
|
||||||
- [Nextdoc](https://www.nextdoc.io/)
|
- [Nextdoc](https://www.nextdoc.io/)
|
||||||
|
|
|
||||||
56
doc/dev.md
56
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
|
Each bug fix, change or new feature should be tested well to prevent future
|
||||||
regressions.
|
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
|
### Force-push
|
||||||
|
|
||||||
Please do not use `git push --force` on your PR branch for the following
|
Please do not use `git push --force` on your PR branch for the following
|
||||||
|
|
@ -37,7 +40,7 @@ reasons:
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-22.1.0.
|
You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use Oracle GraalVM 24.
|
||||||
|
|
||||||
## Clone repository
|
## Clone repository
|
||||||
|
|
||||||
|
|
@ -81,8 +84,14 @@ Test the native version:
|
||||||
## Tests for Libraries
|
## Tests for Libraries
|
||||||
|
|
||||||
Babashka runs tests of libraries that are compatible with it through
|
Babashka runs tests of libraries that are compatible with it through
|
||||||
`script/run_lib_tests`. The script `add-libtest.clj` makes adding new libraries
|
`script/run_lib_tests`.
|
||||||
fairly easy. Some examples:
|
|
||||||
|
You can check out [this
|
||||||
|
commit](https://github.com/babashka/babashka/commit/8d9ac4c4d18a5588a4a258a61a9db3835b4f4e5c)
|
||||||
|
for how to add tests for a library that needs no changes to its tests.
|
||||||
|
The library is cloned as a git dependency, which also includes the tests, that are then added to the test's classpath and ran.
|
||||||
|
|
||||||
|
If a library's tests needs changes, we copy the tests using the `add-libtest.clj` script. Examples:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# To add tests for a new library on clojars
|
# To add tests for a new library on clojars
|
||||||
|
|
@ -105,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
|
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.
|
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
|
## Build
|
||||||
|
|
||||||
See [build.md](build.md).
|
See [build.md](build.md).
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,12 @@ borkdude/deps,https://github.com/borkdude/deps.clj
|
||||||
borkdude/missing.test.assertions,https://github.com/borkdude/missing.test.assertions
|
borkdude/missing.test.assertions,https://github.com/borkdude/missing.test.assertions
|
||||||
borkdude/rewrite-edn,https://github.com/borkdude/rewrite-edn
|
borkdude/rewrite-edn,https://github.com/borkdude/rewrite-edn
|
||||||
camel-snake-kebab/camel-snake-kebab,https://github.com/clj-commons/camel-snake-kebab
|
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
|
circleci/bond,https://github.com/circleci/bond
|
||||||
cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git
|
cli-matic/cli-matic,https://github.com/l3nz/cli-matic.git
|
||||||
clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml
|
clj-commons/clj-yaml,https://github.com/clj-commons/clj-yaml
|
||||||
|
clj-commons/fs,https://github.com/clj-commons/fs
|
||||||
clj-commons/multigrep,https://github.com/clj-commons/multigrep
|
clj-commons/multigrep,https://github.com/clj-commons/multigrep
|
||||||
clj-stacktrace/clj-stacktrace,https://github.com/mmcgrana/clj-stacktrace
|
clj-stacktrace/clj-stacktrace,https://github.com/mmcgrana/clj-stacktrace
|
||||||
clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv
|
clojure-csv/clojure-csv,https://github.com/davidsantiago/clojure-csv
|
||||||
|
|
@ -18,6 +21,7 @@ clojure-msgpack/clojure-msgpack,https://github.com/edma2/clojure-msgpack
|
||||||
clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors
|
clojure-term-colors/clojure-term-colors,https://github.com/trhura/clojure-term-colors
|
||||||
com.exoscale/lingo,https://github.com/exoscale/lingo
|
com.exoscale/lingo,https://github.com/exoscale/lingo
|
||||||
com.github.askonomm/clarktown,https://github.com/askonomm/clarktown
|
com.github.askonomm/clarktown,https://github.com/askonomm/clarktown
|
||||||
|
com.github.rawleyfowler/sluj,https://github.com/rawleyfowler/sluj
|
||||||
com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test
|
com.github.seancorfield/expectations,https://github.com/clojure-expectations/clojure-test
|
||||||
com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql
|
com.github.seancorfield/honeysql,https://github.com/seancorfield/honeysql
|
||||||
com.grammarly/omniconf,https://github.com/grammarly/omniconf
|
com.grammarly/omniconf,https://github.com/grammarly/omniconf
|
||||||
|
|
@ -36,6 +40,7 @@ douglass/clj-psql,https://github.com/DarinDouglass/clj-psql
|
||||||
edn-query-language/eql,https://github.com/edn-query-language/eql
|
edn-query-language/eql,https://github.com/edn-query-language/eql
|
||||||
environ/environ,https://github.com/weavejester/environ
|
environ/environ,https://github.com/weavejester/environ
|
||||||
exoscale/coax,https://github.com/exoscale/coax
|
exoscale/coax,https://github.com/exoscale/coax
|
||||||
|
exoscale/interceptor,https://github.com/exoscale/interceptor
|
||||||
expound/expound,https://github.com/bhb/expound
|
expound/expound,https://github.com/bhb/expound
|
||||||
failjure/failjure,https://github.com/adambard/failjure
|
failjure/failjure,https://github.com/adambard/failjure
|
||||||
ffclj/ffclj,https://github.com/luissantos/ffclj
|
ffclj/ffclj,https://github.com/luissantos/ffclj
|
||||||
|
|
@ -57,10 +62,13 @@ java-http-clj/java-http-clj,http://www.github.com/schmee/java-http-clj
|
||||||
lambdaisland/regal,https://github.com/lambdaisland/regal
|
lambdaisland/regal,https://github.com/lambdaisland/regal
|
||||||
listora/again,https://github.com/liwp/again
|
listora/again,https://github.com/liwp/again
|
||||||
markdown-clj/markdown-clj,https://github.com/yogthos/markdown-clj
|
markdown-clj/markdown-clj,https://github.com/yogthos/markdown-clj
|
||||||
|
meander/epsilon,https://github.com/noprompt/meander
|
||||||
medley/medley,https://github.com/weavejester/medley
|
medley/medley,https://github.com/weavejester/medley
|
||||||
meta-merge/meta-merge,https://github.com/weavejester/meta-merge
|
meta-merge/meta-merge,https://github.com/weavejester/meta-merge
|
||||||
|
metosin/malli,https://github.com/metosin/malli
|
||||||
minimallist/minimallist,https://github.com/green-coder/minimallist
|
minimallist/minimallist,https://github.com/green-coder/minimallist
|
||||||
mvxcvi/arrangement,https://github.com/greglook/clj-arrangement
|
mvxcvi/arrangement,https://github.com/greglook/clj-arrangement
|
||||||
|
net.cgrand/xforms,https://github.com/cgrand/xforms
|
||||||
orchestra/orchestra,https://github.com/jeaye/orchestra
|
orchestra/orchestra,https://github.com/jeaye/orchestra
|
||||||
org.babashka/spec.alpha,https://github.com/babashka/spec.alpha
|
org.babashka/spec.alpha,https://github.com/babashka/spec.alpha
|
||||||
org.clj-commons/clj-http-lite,https://github.com/clj-commons/clj-http-lite
|
org.clj-commons/clj-http-lite,https://github.com/clj-commons/clj-http-lite
|
||||||
|
|
@ -77,7 +85,9 @@ org.clojure/math.combinatorics,https://github.com/clojure/math.combinatorics
|
||||||
org.clojure/math.numeric-tower,https://github.com/clojure/math.numeric-tower
|
org.clojure/math.numeric-tower,https://github.com/clojure/math.numeric-tower
|
||||||
org.clojure/test.check,https://github.com/clojure/test.check
|
org.clojure/test.check,https://github.com/clojure/test.check
|
||||||
org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs
|
org.clojure/tools.gitlibs,https://github.com/clojure/tools.gitlibs
|
||||||
org.clojure/tools.namespace,https://github.com/babashka/tools.namespace
|
org.clojure/tools.namespace,https://github.com/clojure/tools.namespace
|
||||||
|
postmortem/postmortem,https://github.com/athos/Postmortem
|
||||||
|
prismatic/schema,https://github.com/plumatic/schema
|
||||||
progrock/progrock,https://github.com/weavejester/progrock
|
progrock/progrock,https://github.com/weavejester/progrock
|
||||||
reifyhealth/specmonstah,https://github.com/reifyhealth/specmonstah
|
reifyhealth/specmonstah,https://github.com/reifyhealth/specmonstah
|
||||||
rewrite-clj/rewrite-clj,https://github.com/clj-commons/rewrite-clj
|
rewrite-clj/rewrite-clj,https://github.com/clj-commons/rewrite-clj
|
||||||
|
|
|
||||||
|
309
doc/news.md
309
doc/news.md
|
|
@ -5,13 +5,314 @@ you have anything to add. Also see
|
||||||
[#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on
|
[#babashka](https://twitter.com/hashtag/babashka?src=hashtag_click&f=live) on
|
||||||
Twitter.
|
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))
|
||||||
|
|
||||||
## 2022-03
|
### 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
|
||||||
|
Berlin. Save the date and/or submit your babashka/clojure-related talk or workshop
|
||||||
|
in the CfP!
|
||||||
|
|
||||||
|
### Releases
|
||||||
|
|
||||||
|
1.3.177
|
||||||
|
|
||||||
|
Biggest highlight: `bb.edn` is now respected relative of a script, no matter the directory you invoke it from! See [docs](https://book.babashka.org/#_script_adjacent_bb_edn).
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
- [babashka-dl](https://github.com/mjhika/babashka-dl): simple install script for babashka on windows
|
||||||
|
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Use instaparse from babashka, a new release
|
||||||
|
|
||||||
|
### Videos
|
||||||
|
|
||||||
|
- [Learning clojure w/ @lispyclouds](https://youtu.be/uBTRLBU-83A): a stream with teej_dv, a neovim core dev
|
||||||
|
|
||||||
|
## 2023-03 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-03-01%20until%3A2023-04-01&src=typed_query&f=top), [Mastodon](https://mastodon.social/tags/babashka))
|
||||||
|
|
||||||
|
### Releases
|
||||||
|
|
||||||
|
1.3.176, 1.3.175, 1.2.174:
|
||||||
|
|
||||||
|
Biggest highlight: Switch to GraalVM 19 and enable virtual threads!
|
||||||
|
|
||||||
|
### Videos
|
||||||
|
|
||||||
|
- [Blambda! The sound of babashka and AWS colliding](https://pitch.com/public/03fa9c7e-2b0e-45fb-8a22-d4a4d4d79d24), by Josh Glover from Pitch!
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
- [babashka.json](https://github.com/babashka/json): JSON abstraction library
|
||||||
|
- [martian](https://github.com/oliyh/martian) is now babashka compatible!
|
||||||
|
- [panas.reload](https://github.com/keychera/panas.reload): a hot reload for babashka serving html+css (or htmx)
|
||||||
|
- [cljs-exif-reader](https://git.sr.ht/~rwv/cljs-exif-reader): Extract information from TIFF and JPEG images (works in babashka, despite the name)
|
||||||
|
|
||||||
|
### Jobs
|
||||||
|
|
||||||
|
- Write babashka at [Cognician](https://twitter.com/RobStuttaford/status/1641694501793038336)!
|
||||||
|
|
||||||
|
## 2023-02 ([Twitter](https://twitter.com/search?q=(%23babashka%20OR%20babashka)%20since%3A2023-02-01%20until%3A2023-03-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
|
||||||
|
|
||||||
|
## Releases
|
||||||
|
|
||||||
|
1.1.173: mostly bugfixes
|
||||||
|
|
||||||
|
### Articles
|
||||||
|
|
||||||
|
- [A technique for live coding simple web pages](https://github.com/whacked/cow/blob/main/a%20technique%20for%20live%20coding%20simple%20web%20pages.md) with babashka
|
||||||
|
|
||||||
|
### Videos
|
||||||
|
|
||||||
|
- [Stockholm Clojure Meetup Feb 23: Blambda! The sound of Babashka and Lambda colliding](https://www.youtube.com/watch?v=NfgYon96dsE)
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
- [debux](https://github.com/philoskim/debux) is now babaskha-compatible
|
||||||
|
- [lines-of-code-bb](https://github.com/matthewdowney/linesofcode-bb): Babashka script to count lines of Clojure code, docs, comments, and more
|
||||||
|
- [deps-try](https://github.com/eval/deps-try): a babashka-script to try out Clojure libraries in rebel-readline
|
||||||
|
- [bb-dialog](https://github.com/pixelated-noise/bb-dialog) adds support for `--treeview`
|
||||||
|
- [A duckduck go CLI with babashka and (bbl)gum](https://mastodon.me.uk/@choffee/109845697304457129)
|
||||||
|
- [babashka http-client](https://github.com/babashka/http-client) now supports multipart uploads
|
||||||
|
- [sublime-pretty-edn](https://github.com/oakmac/sublime-pretty-edn): Format, Validate, Minify EDN files in Sublime Text
|
||||||
|
- [Play console tetris in babashka!](https://twitter.com/borkdude/status/1628473136969576449)
|
||||||
|
- [kaocha test runner](https://github.com/lambdaisland/kaocha) became babashka compatible!
|
||||||
|
|
||||||
|
## 2023-01 ([Twitter](https://twitter.com/search?q=%28%23babashka%20OR%20babashka%29%20until%3A2023-02-01%20since%3A2023-01-01&src=typed_query&f=live), [Mastodon](https://mastodon.social/tags/babashka))
|
||||||
|
|
||||||
|
### Releases
|
||||||
|
|
||||||
|
New releases in the past month: 1.0.170 - 1.1.173
|
||||||
|
Release highlights:
|
||||||
|
|
||||||
|
- Support for `data_readers.clj(c)`
|
||||||
|
- Include [http-client](https://github.com/babashka/http-client) as built-in library
|
||||||
|
- Compatibility with [clojure.tools.namespace.repl/refresh](https://github.com/clojure/tools.namespace)
|
||||||
|
- Compatibility with [clojure.java.classpath](https://github.com/clojure/java.classpath) (and other libraries which rely on `java.class.path` and `RT/baseLoader`)
|
||||||
|
- Compatibility with [eftest](https://github.com/weavejester/eftest) test runner (see demo)
|
||||||
|
- Compatibility with [cljfmt](https://github.com/weavejester/cljfmt)
|
||||||
|
- Support for `*loaded-libs*` and `(loaded-libs)`
|
||||||
|
- Support `add-watch` on vars (which adds compatibility with `potemkin.namespaces`)
|
||||||
|
- BREAKING: make printing of script results explicit with `--prn`
|
||||||
|
|
||||||
|
### Events
|
||||||
|
|
||||||
|
- [Babashka Workshop](https://clojure.stream/workshops/babashka) at ClojureStream with Rahul De
|
||||||
|
- [Blambda! The sound of Babashka and Lambda colliding](https://www.meetup.com/sthlm-clj/events/291204199/?utm_medium=referral&utm_campaign=share-btn_savedevents_share_modal&utm_source=twitter): sthlm.clj (Stockholm, Sweden)
|
||||||
|
|
||||||
|
### Articles
|
||||||
|
|
||||||
|
- [Babooka: write command line Clojure](https://www.braveclojure.com/quests/babooka/) by Daniel Higginbotham
|
||||||
|
- [Blambda analyses sites](https://jmglov.net/blog/2023-01-04-blambda-analyses-sites.html) by Josh Glover
|
||||||
|
- [Babashka: How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://logico-jp.io/2023/01/07/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure/) in Japanese
|
||||||
|
- [The wizard of HOP - How we built the web based HOP CLI Settings Editor using Babashka and Scittle](https://www.gethop.dev/post/the-wizard-of-hop-how-we-built-the-web-based-hop-cli-settings-editor-using-babashka-and-scittle) by Bingen Galartza
|
||||||
|
- [Simple TUIs with Babashka and Gum](https://rattlin.blog/bbgum.html) by Rattlin.blog
|
||||||
|
- [Babashka And Dialog Part Ii: Announcing The Bb-Dialog Library](https://www.pixelated-noise.com/blog/2023/01/20/bb-dialog-announcement/index.html) by A.C. Danvers
|
||||||
|
- [Re-Writing a GlobalProtect OpenConnect VPN Connect script in Babashka](https://tech.toryanderson.com/2023/01/14/re-writing-a-globalprotect-openconnect-vpn-connect-script-in-babashka/) by Tory Anderson
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
Projects that were new, had updates or were made compatible with babashka:
|
||||||
|
|
||||||
|
- [asdf-babashka](https://github.com/pitch-io/asdf-babashka): babashka plugin for the asdf version manager
|
||||||
|
- [babashka-htmx-todoapp](https://github.com/prestancedesign/babashka-htmx-todoapp): Quick example of a todo list SPA using Babashka and HTMX
|
||||||
|
- [bblgum](https://github.com/lispyclouds/bblgum): An extremely tiny and simple wrapper around charmbracelet/gum
|
||||||
|
- [bb-dialog](https://github.com/pixelated-noise/bb-dialog): A simple wrapper library for working with dialog from Babashka
|
||||||
|
- [carve](https://github.com/borkdude/carve): Remove unused Clojure vars
|
||||||
|
- [chr](https://github.com/ThaddeusJiang/chr): native commands history report for the default terminal users
|
||||||
|
- [clj-kondo-bb](https://github.com/clj-kondo/clj-kondo-bb): Invoke clj-kondo from babashka scripts!
|
||||||
|
- [cljfmt](https://github.com/weavejester/cljfmt): A tool for formatting Clojure code
|
||||||
|
- [drepl](https://github.com/claytn/drepl): Node JS dependency-repl. The node repl you already know with easy library installations
|
||||||
|
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Wrapper library aroud pod-babashka-instaparse
|
||||||
|
- [lein2deps](https://github.com/borkdude/lein2deps): Lein project.clj to deps.edn converter
|
||||||
|
- [neil](https://github.com/babashka/neil): A CLI to add common aliases and features to deps.edn-based projects
|
||||||
|
- [obsidian-babashka](https://github.com/filipesilva/obsidian-babashka): Run Obsidian Clojure(Script) codeblocks in Babashka
|
||||||
|
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure)
|
||||||
|
- [quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka
|
||||||
|
- [solenoid](https://github.com/adam-james-v/solenoid): A small clojure tool for making little control UIs while using the REPL!
|
||||||
|
- [tools.bbuild](https://github.com/babashka/tools.bbuild): babashka version of tools.build
|
||||||
|
- [weather](https://gist.github.com/yogthos/f86e63b856e1413180b2262024ece977): command line util for grabbing current weather for a city using OpenWeather API
|
||||||
|
|
||||||
|
## [2022-12](https://twitter.com/search?q=%28%23babashka%20OR%20babashka%29%20until%3A2023-01-01%20since%3A2022-12-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [1.0.168](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [How GraalVM Helped Create a Fast-Starting Scripting Environment for Clojure](https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746)
|
||||||
|
- [http-client](https://github.com/babashka/http-client): a new HTTP client library for babashka
|
||||||
|
- [How to Do Things With Babashka](https://presumably.de/how-to-do-things-with-babashka.html) by Paulus Esterhazy (2022-12)
|
||||||
|
- [Using Babashka to Get Electricity Prices](https://www.karimarttila.fi/clojure/2022/12/04/using-babashka-to-get-electricity-prices) by Kari Marttila
|
||||||
|
- [Adding prompts to your babashka scripts with dialog](https://www.pixelated-noise.com/blog/2022/12/09/dialog-and-babashka/index.html) by A.C. Danvers
|
||||||
|
- [Scraping an HTML dictionary with Babashka and Bootleg](https://blog.exupero.org/scraping-an-html-dictionary-with-babashka-and-bootleg/) by exupero
|
||||||
|
- [quickblog](https://github.com/borkdude/quickblog) v0.1.0: Light-weight static blog engine for Clojure and babashka
|
||||||
|
- [bb-excel](https://github.com/kbosompem/bb-excel): Read Excel Files in babashka scripts
|
||||||
|
- [Get paginated list of issues from gitlab with clojure/babashka](https://gist.github.com/MrGung/29d0547fe45316c3438032fd164d42c6) by Steffen Glückselig
|
||||||
|
- Install development builds: `bash <(curl https://raw.githubusercontent.com/babashka/babashka/master/install) --dev-build --dir /tmp`
|
||||||
|
- [JVM interop improvements in bb](https://twitter.com/borkdude/status/1606280110692352001)
|
||||||
|
- [A little trick to have conditional code for babashka in a .clj file without resorting to .cljc reader conditionals](https://twitter.com/borkdude/status/1599067149187764224)
|
||||||
|
- [Get Advent of Code input in babashka](https://gist.github.com/jeeger/6e39fea94ce49e33d1fa43f40cc36630) by Jan Seeger
|
||||||
|
- [Grabbing current weather for a city using OpenWeather API](https://gist.github.com/yogthos/f86e63b856e1413180b2262024ece977) by Dmitri Sotnikov
|
||||||
|
|
||||||
|
## [2022-11](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-12-01%20since%3A2022-11-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [1.0.165 - 1.0.167](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- Registration for a [Babashka workshop](https://clojure.stream/workshops/babashka) with Rahul De at ClojureStream is now open!
|
||||||
|
- [Tutkain, a Sublime plugin for clojure based on socket REPL now with support for babashka](https://github.com/eerohele/Tutkain)
|
||||||
|
- [Manage git hooks in babashka](https://blaster.ai/blog/posts/manage-git-hooks-w-babashka.html) by Mykhaylo Bilyanskyy
|
||||||
|
- [Messing around with babashka](Messing around with Babashka) by Ian Muge
|
||||||
|
- [A babashka one liner to inspect data in portal](https://twitter.com/borkdude/status/1597505695800516609)
|
||||||
|
- [Using nREPL as a system interface](https://yogthos.net/posts/2022-11-26-nREPL-system-interaction.html) by Dmitri Sotnikov
|
||||||
|
- [deep-diff2](https://github.com/lambdaisland/deep-diff2) is now babashka-compatible!
|
||||||
|
- [A script to normalize auto-resolved keywords](https://github.com/babashka/babashka/blob/master/examples/normalize-keywords.clj)
|
||||||
|
- [Sum up page counts of books from Calibre library with babashka](https://gist.github.com/jeeger/d13159fefaee33c771be979639900ebc) by Jan Seeger
|
||||||
|
- [Tiny babashka script that returns a random clojure doc](https://gist.github.com/CarnunMP/c592cd3b6e711d56ddd4ca7832b9b251) by Carnun Marcus-Page
|
||||||
|
|
||||||
|
|
||||||
|
## [2022-10](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-11-01%20since%3A2022-10-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [1.0.164](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [bb-pod-racer](https://github.com/justone/bb-pod-racer): Speed up development of Babashka pods by Nate Jones
|
||||||
|
- [Babashka tasks VSCode plugin](https://marketplace.visualstudio.com/items?itemName=fbeyer.babashka-tasks) by Ferdinand Beyer
|
||||||
|
- A [PR](https://github.com/nextjournal/clerk/pull/232) to get Clerk working in babashka
|
||||||
|
- [lein2deps](https://github.com/borkdude/lein2deps): lein to deps.edn converter
|
||||||
|
- [awyeah-api](https://github.com/grzm/awyeah-api) by Michael Glaesemann v0.8.41 is now available! aws-api for Babashka. Aw yeah!
|
||||||
|
- [bbssh](https://github.com/epiccastle/bbssh/releases/tag/v0.2.0) by Crispin Wellington, v0.2.0 released
|
||||||
|
- [safely use rsync --archive --delete to backup a directory](https://gist.github.com/stelcodes/ddc8ff53de2192dca7d3fee1081ddb77) by Stel Abrego
|
||||||
|
|
||||||
|
## [2022-09](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-10-01%20since%3A2022-09-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.9.162 - 0.10.163](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- Introducing [bbin](https://radsmith.com/bbin): a tool to install babashka scripts on your system by Radford Smith
|
||||||
|
- [bbssh](https://github.com/epiccastle/bbssh): Babashka pod for SSH support by [Epic Castle](https://github.com/epiccastle)
|
||||||
|
- [Loom virtual threads are coming to babashka](https://twitter.com/borkdude/status/1572222344684531717)
|
||||||
|
- [Tiny script to cycle through pulseaudio outputs (aka sinks)](https://gist.github.com/stelcodes/7d9136a5839b645b6cd5bc829a9fe541) by Stel Abrego
|
||||||
|
- [Tetris in the console via pod-babashka-lantera](https://twitter.com/borkdude/status/1569351199404576770)
|
||||||
|
- [org-mode gets support for babashka](https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=764642f55b7a9821acbabcfa1e2d354afab99be7)
|
||||||
|
- [docs for combining babashka process with promesa](https://github.com/babashka/process#promesa)
|
||||||
|
[exoscale/interceptor](https://github.com/exoscale/interceptor) became babashka-compatible!
|
||||||
|
- [Tutkain, socket REPL Sublime plugin, gets better support for babashka](https://twitter.com/borkdude/status/1568315151404924933)
|
||||||
|
- [babashka tweepy](https://github.com/davclark/babashka-tweepy): kicking the tires on using the tweepy library from a babashka task by Dav Clark
|
||||||
|
- [aoc helper](https://github.com/jjcomer/aoc-helper) by Josh Comer
|
||||||
|
- [Dogfooding blambda part 5](https://jmglov.net/blog/2022-09-02-dogfooding-blambda-logs.html) by Josh Glover
|
||||||
|
|
||||||
|
## [2022-08](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-09-01%20since%3A2022-08-01&src=typed_query&f=live)
|
||||||
|
- It's babashka's third birthday on August 9th 2022!
|
||||||
|
- [etaoin](https://github.com/clj-commons/etaoin), Pure Clojure Webdriver protocol implementation, is now babashka-compatible!
|
||||||
|
- [xforms](https://github.com/cgrand/xforms) is now babashka-compatible!
|
||||||
|
- [squint](https://github.com/squint-cljs/squint) and [cherry](https://github.com/squint-cljs/cherry) are CLJS-compilers that work with babashka!
|
||||||
|
|
||||||
|
## [2022-07](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-08-01%20since%3A2022-07-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.8.157 - 0.9.161](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [Recursive document transformations with Pandoc and Clojure](https://play.teod.eu/document-transform-pandoc-clojure/) by Teodor Heggelund
|
||||||
|
- [Babashka toolbox](https://babashka.org/toolbox/): A categorised directory of libraries and tools for Babashka
|
||||||
|
- [Quickblog](https://github.com/borkdude/quickblog): Light-weight static blog engine for Clojure and babashka
|
||||||
|
- Win a babashka t-shirt by participating in [this](https://twitter.com/borkdude/status/1547847843381030912) contest!
|
||||||
|
- [AWS Lambda, now with first class parentheses](https://www.juxt.pro/blog/nbb-lambda) by Ray McDermott (about nbb)
|
||||||
|
- [bb-github-app](https://github.com/brandonstubbs/bb-github-app): An example Babashka Script authenticating as a Github App and interacting with the Checks API
|
||||||
|
- [Ruuter](https://github.com/askonomm/ruuter#setting-up-with-babashka) is a routing library which works very well with bb
|
||||||
|
- [Blambda!](https://jmglov.net/blog/2022-07-03-blambda.html) by Josh Glover
|
||||||
|
- Files with the `.bb` extension are now correctly highlighted as Clojure code on Github! See [this](https://twitter.com/borkdude/status/1543937735429431298) tweet.
|
||||||
|
- Encode and decode files as kroki url diagrams, a [gist](https://gist.github.com/henryw374/070845dbd8cfb4672a3c0d06cf8b00e4) by Henry Widd
|
||||||
|
- Customized bb builds with clj-nix: [tweet](https://twitter.com/jlesquembre/status/1543686641461694470)
|
||||||
|
- Expose Clojure functions in the CLI with babashka and nix: [tweet](https://twitter.com/jlesquembre/status/1546777332471455745)
|
||||||
|
- [Meander](https://github.com/noprompt/meander) is now compatible with bb: [tweet](https://twitter.com/borkdude/status/1542881167338250242)
|
||||||
|
- [Deleting AWS Glacier vaults with babashka](https://javahippie.net/clojure/2022/07/23/deleting-aws-glacier-vaults-with-babashka.html) by Tim Zöller
|
||||||
|
|
||||||
|
|
||||||
|
## [2022-06](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-07-01%20since%3A2022-06-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.8.156](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [AWS wiki page](https://github.com/babashka/babashka/wiki/AWS)
|
||||||
|
- [blambda](https://github.com/jmglov/blambda): Blambda! is a custom runtime for AWS Lambda that lets you write functions using Babashka
|
||||||
|
- [Babashka CLI](https://blog.michielborkent.nl/babashka-cli.html): turn Clojure functions into CLIs!
|
||||||
|
- [Http-server](https://github.com/babashka/http-server#babashka): Serve static assets
|
||||||
|
- [Deps-bundler](https://github.com/MrGung/deps-bundler): Bundle dependencies on
|
||||||
|
a computer that has access to maven and clojars (PC-A) and bring these over to
|
||||||
|
a computer with limited access (PC-L).
|
||||||
|
- [Prismatic/schema](https://github.com/plumatic/schema/blob/master/CHANGELOG.md#130-2022-06-10) and babashka are now compatible
|
||||||
|
- [Logseq bb tasks](https://github.com/logseq/bb-tasks): Reusable babashka tasks used by logseq team
|
||||||
|
- [Breakneck Babashka on K8s](Breakneck Babashka on K8s) by Heow Goodman
|
||||||
|
|
||||||
|
## [2022-05](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-06-01%20since%3A2022-05-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.8.2](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [Etaoin](https://github.com/clj-commons/etaoin) moved to clj-commons and now works with babashka as well.
|
||||||
|
- [Nix docs for babashka](https://github.com/babashka/babashka/blob/master/doc/nix.md)
|
||||||
|
- [Fly.io docs for babashka](https://github.com/babashka/babashka/tree/master/doc/fly_io)
|
||||||
|
- [Babashka survey results](https://blog.michielborkent.nl/babashka-survey-q1-2022.html)
|
||||||
|
- [Quickdoc](https://github.com/borkdude/quickdoc): (Quick and minimal API doc generation for Clojure
|
||||||
|
- [Awyeah-api](https://github.com/grzm/awyeah-api) - Cognitect's aws-api for babashka
|
||||||
|
|
||||||
|
## [2022-04](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-05-01%20since%3A2022-04-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.8.0 - 0.8.1](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [Babashka and Clojure](https://youtu.be/ZvOs5Ele6VE) by Rahul Dé at North Virginia Linux Users Group
|
||||||
|
- [Setup-Clojure](https://github.com/DeLaGuardo/setup-clojure/releases/tag/5.0) Github action is now able to install babashka!
|
||||||
|
- Control Chrome via devtools using [clj-chrome-devtools](https://github.com/tatut/clj-chrome-devtools/blob/master/bb.clj) which runs with bb!
|
||||||
|
- Use pods directly in `bb.edn`: [tweet](https://twitter.com/borkdude/status/1510995356229767172)
|
||||||
|
|
||||||
|
## [2022-03](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-04-01%20since%3A2022-03-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.7.7 - 0.7.8](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
|
- [Create a password manager with Clojure using Babashka, sqlite, honeysql and stash](https://youtu.be/jm0RXmyjRJ8) by Daniel Amber
|
||||||
|
- [Detecting inconsistent aliases in a clojure codebase](https://www.youtube.com/watch?v=bf8KLKkCH2g) by Oxalorg
|
||||||
|
- [Clj-konmari](https://github.com/oxalorg/clj-konmari/) by Oxalorg
|
||||||
|
- [Logseq-query](https://github.com/cldwalker/logseq-query) by Gabriel Horner [(announcement tweet with video)](https://twitter.com/cldwalker/status/1506991213030871041)
|
||||||
|
- The [loom](https://github.com/aysylu/loom) library is now compatible [(tweet)](https://twitter.com/borkdude/status/1502237220811550723)
|
||||||
|
- The [at-at](https://github.com/overtone/at-at) library is now compatible
|
||||||
|
|
||||||
-->
|
## [2022-02](https://twitter.com/search?q=%28%23babashka%29%20until%3A2022-03-01%20since%3A2022-02-01&src=typed_query&f=live)
|
||||||
|
|
||||||
|
- Releases: [0.7.5 - 0.7.6](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [Spire is available as a babashka pod](https://twitter.com/epic_castle/status/1496784352256008194)
|
||||||
|
- Babashka Clojure template on [Repl.it](https://replit.com/@eccentric-j/Babashka-Clojure-Template?v=1#replit.nix) by Eccentric J
|
||||||
|
- Create a self-contained executable with [caxa](https://github.com/babashka/babashka/wiki/Self-contained-executable)
|
||||||
|
- Cli-matic is now compatible due to this [PR](https://github.com/l3nz/cli-matic/pull/145)
|
||||||
|
- [I, too, Wrote Myself a Static Site Generator](https://dawranliou.com/blog/i-too-wrote-myself-a-static-site-generator/) by Daw-Ran Liou
|
||||||
|
- [Staplegun](https://github.com/escherize/staplegun): Single file clipboard-manager
|
||||||
|
- [Bbb](https://github.com/nikvdp/bbb): make executable CLI tools from bb scripts
|
||||||
|
- [Apptemplate](https://github.com/redstarssystems/apptemplate): Application project template for Clojure featuring bb tasks
|
||||||
|
|
||||||
|
|
||||||
|
## [2022-01](https://twitter.com/search?f=live&q=%28%23babashka%29%20until%3A2022-02-01%20since%3A2022-01-01&src=typed_query)
|
||||||
|
|
||||||
|
- Releases: [0.7.4](https://github.com/babashka/babashka/blob/master/CHANGELOG.md).
|
||||||
|
- [Babashka dev builds](https://github.com/babashka/babashka-dev-builds)
|
||||||
|
- [Writing Clojure-living-cookbooks](https://www.loop-code-recur.io/live-clojure-cookbooks/) by Cyprien Pannier
|
||||||
|
- [HTMX Todo App](https://github.com/prestancedesign/babashka-htmx-todoapp)
|
||||||
|
- [Better linting for `bb.edn`](https://twitter.com/borkdude/status/1484100071134220291)
|
||||||
|
- [Unwordle](https://github.com/mknoszlig/unwordle): solver for wordle puzzles
|
||||||
|
- [Using babashka with PHP](https://blog.michielborkent.nl/using-babashka-with-php.html) by Michiel Borkent
|
||||||
|
|
||||||
## 2021-12
|
## 2021-12
|
||||||
|
|
||||||
|
|
@ -74,7 +375,7 @@ Twitter.
|
||||||
- [Cursive](https://twitter.com/CursiveIDE/status/1439022267187433472) adds support for babashka in 1.11.0
|
- [Cursive](https://twitter.com/CursiveIDE/status/1439022267187433472) adds support for babashka in 1.11.0
|
||||||
- How to filter tail output with babashka on [StackOverflow](https://stackoverflow.com/questions/69241046/how-to-filter-output-of-tail-with-babashka/69241911?stw=2#69241911)
|
- How to filter tail output with babashka on [StackOverflow](https://stackoverflow.com/questions/69241046/how-to-filter-output-of-tail-with-babashka/69241911?stw=2#69241911)
|
||||||
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holy
|
- [Awesome Babashka: Parse & produce HTML and SQLite](https://blog.jakubholy.net/2021/awesome-babashka-dash/) by Jakub Holy
|
||||||
- [neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects.
|
- [Neil](https://github.com/babashka/neil): an installable babashka script to add common aliases and features to deps.edn-based projects.
|
||||||
|
|
||||||
## 2021-08
|
## 2021-08
|
||||||
|
|
||||||
|
|
|
||||||
36
doc/nix.md
36
doc/nix.md
|
|
@ -81,39 +81,7 @@ After running `direnv allow`, babashka should be available on the `$PATH`, when
|
||||||
|
|
||||||
You can write babashka scripts with native dependencies using [WriteBabashkaApplication](https://github.com/sohalt/write-babashka-application).
|
You can write babashka scripts with native dependencies using [WriteBabashkaApplication](https://github.com/sohalt/write-babashka-application).
|
||||||
|
|
||||||
Here is an example `flake.nix` using `cowsay` as an external dependency:
|
The WriteBabashkaApplication repository has an [example](https://github.com/Sohalt/write-babashka-application/tree/main/example) `flake.nix` using `cowsay` as an external dependency.
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
inputs.wbba.url = "github:sohalt/write-babashka-application";
|
|
||||||
inputs.flake-utils.url = "github:numtide/flake-utils";
|
|
||||||
outputs = { nixpkgs, flake-utils, wbba, ... }:
|
|
||||||
flake-utils.lib.eachDefaultSystem (system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs {
|
|
||||||
inherit system;
|
|
||||||
overlays = [ wbba.overlay ];
|
|
||||||
};
|
|
||||||
hello-babashka = pkgs.writeBabashkaApplication {
|
|
||||||
name = "hello";
|
|
||||||
runtimeInputs = with pkgs;[
|
|
||||||
cowsay # add your dependencies here
|
|
||||||
];
|
|
||||||
text = ''
|
|
||||||
(ns hello
|
|
||||||
(:require [babashka.process :refer [sh]]))
|
|
||||||
|
|
||||||
(-> (sh ["cowsay" "hello from babashka"])
|
You can download that example, and then build the application using `nix build` or run it using `nix run`.
|
||||||
:out
|
|
||||||
print)
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
defaultApp = hello-babashka;
|
|
||||||
defaultPackage = hello-babashka;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
You can then build the application using `nix build` or run it using `nix run`.
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ The following libraries and projects are known to work with babashka.
|
||||||
- [tools.namespace](#toolsnamespace)
|
- [tools.namespace](#toolsnamespace)
|
||||||
- [test-runner](#test-runner)
|
- [test-runner](#test-runner)
|
||||||
- [spec.alpha](#specalpha)
|
- [spec.alpha](#specalpha)
|
||||||
- [tools.bbuild](#toolsbbuild)
|
|
||||||
- [clj-http-lite](#clj-http-lite)
|
- [clj-http-lite](#clj-http-lite)
|
||||||
- [spartan.spec](#spartanspec)
|
- [spartan.spec](#spartanspec)
|
||||||
- [missing.test.assertions](#missingtestassertions)
|
- [missing.test.assertions](#missingtestassertions)
|
||||||
|
|
@ -62,6 +61,12 @@ The following libraries and projects are known to work with babashka.
|
||||||
- [datalog-parser](#datalog-parser)
|
- [datalog-parser](#datalog-parser)
|
||||||
- [at-at](#at-at)
|
- [at-at](#at-at)
|
||||||
- [aysylu/loom](#aysyluloom)
|
- [aysylu/loom](#aysyluloom)
|
||||||
|
- [Clarktown](#clarktown)
|
||||||
|
- [Malli](#malli)
|
||||||
|
- [Meander](#meander)
|
||||||
|
- [Schema](#schema)
|
||||||
|
- [Sluj](#sluj)
|
||||||
|
- [malli-cli](#malli-cli)
|
||||||
- [Pods](#pods)
|
- [Pods](#pods)
|
||||||
- [Projects](#projects-1)
|
- [Projects](#projects-1)
|
||||||
- [babashka-test-action](#babashka-test-action)
|
- [babashka-test-action](#babashka-test-action)
|
||||||
|
|
@ -88,6 +93,7 @@ The following libraries and projects are known to work with babashka.
|
||||||
- [Babashka + scittle guestbook](#babashka--scittle-guestbook)
|
- [Babashka + scittle guestbook](#babashka--scittle-guestbook)
|
||||||
- [bb htmx todo app](#bb-htmx-todo-app)
|
- [bb htmx todo app](#bb-htmx-todo-app)
|
||||||
- [bb aws lambda runtime](#bb-aws-lambda-runtime)
|
- [bb aws lambda runtime](#bb-aws-lambda-runtime)
|
||||||
|
- [bb-github-app](#bb-github-app)
|
||||||
|
|
||||||
Also keep an eye on the [news](news.md) page for new projects, gists and other
|
Also keep an eye on the [news](news.md) page for new projects, gists and other
|
||||||
developments around babashka.
|
developments around babashka.
|
||||||
|
|
@ -114,9 +120,9 @@ A fork of `clojure.spec.alpha` that includes support for generation and
|
||||||
instrumentation! Its readme also contains instructions on how to use
|
instrumentation! Its readme also contains instructions on how to use
|
||||||
`clojure.core.specs.alpha`.
|
`clojure.core.specs.alpha`.
|
||||||
|
|
||||||
### [tools.bbuild](https://github.com/babashka/tools.bbuild)
|
<!-- ### [tools.bbuild](https://github.com/babashka/tools.bbuild) -->
|
||||||
|
|
||||||
A fork of `tools.build`.
|
<!-- A fork of `tools.build`. -->
|
||||||
|
|
||||||
### [clj-http-lite](https://github.com/clj-commons/clj-http-lite)
|
### [clj-http-lite](https://github.com/clj-commons/clj-http-lite)
|
||||||
|
|
||||||
|
|
@ -763,7 +769,7 @@ Example:
|
||||||
|
|
||||||
(require '[babashka.deps :as deps])
|
(require '[babashka.deps :as deps])
|
||||||
|
|
||||||
(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.2"}}})
|
(deps/add-deps '{:deps {org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}}})
|
||||||
|
|
||||||
(require '[contajners.core :as c])
|
(require '[contajners.core :as c])
|
||||||
|
|
||||||
|
|
@ -812,6 +818,26 @@ Graph library for Clojure. Compatible with babashka 0.7.8+.
|
||||||
|
|
||||||
An extensible and modular zero-dependency, pure-Clojure Markdown parser.
|
An extensible and modular zero-dependency, pure-Clojure Markdown parser.
|
||||||
|
|
||||||
|
### [Malli](https://github.com/metosin/malli#babashka)
|
||||||
|
|
||||||
|
Data-Driven Schemas for Clojure/Script
|
||||||
|
|
||||||
|
### [Meander](https://github.com/noprompt/meander)
|
||||||
|
|
||||||
|
Tools for transparent data transformation
|
||||||
|
|
||||||
|
### [Schema](https://github.com/plumatic/schema)
|
||||||
|
|
||||||
|
Clojure(Script) library for declarative data description and validation
|
||||||
|
|
||||||
|
### [Sluj](https://github.com/rawleyfowler/sluj)
|
||||||
|
|
||||||
|
Sluj is a very small library for converting strings of UTF-16 text to slugs. A slug is a piece of text that is URL safe.
|
||||||
|
|
||||||
|
### [malli-cli](https://github.com/piotr-yuxuan/malli-cli)
|
||||||
|
|
||||||
|
Configuration and CLI powertool with `metosin/malli`.
|
||||||
|
|
||||||
## Pods
|
## Pods
|
||||||
|
|
||||||
[Babashka pods](https://github.com/babashka/babashka.pods) are programs that can
|
[Babashka pods](https://github.com/babashka/babashka.pods) are programs that can
|
||||||
|
|
@ -939,3 +965,8 @@ Quick example of a todo list SPA using Babashka and htmx.
|
||||||
### [bb aws lambda runtime](https://github.com/tatut/bb-lambda)
|
### [bb aws lambda runtime](https://github.com/tatut/bb-lambda)
|
||||||
|
|
||||||
AWS Lambda custom runtime for Babashka scripts.
|
AWS Lambda custom runtime for Babashka scripts.
|
||||||
|
|
||||||
|
### [bb-github-app](https://github.com/brandonstubbs/bb-github-app)
|
||||||
|
|
||||||
|
An example Babashka script that can authenticate as a Github Application,
|
||||||
|
this example focuses on the checks api.
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@
|
||||||
- [Simple logger](#simple-logger)
|
- [Simple logger](#simple-logger)
|
||||||
- [Using GZip streams (memo utility)](#using-gzip-streams-to-make-a-note-utility)
|
- [Using GZip streams (memo utility)](#using-gzip-streams-to-make-a-note-utility)
|
||||||
- [Pretty-printing mySQL results](#pretty-printing-mysql-results)
|
- [Pretty-printing mySQL results](#pretty-printing-mysql-results)
|
||||||
|
- [Single page application with Babashka + htmx](#single-page-application-with-babashka--htmx)
|
||||||
|
- [Wikipedia translation](#wikipedia-translation)
|
||||||
|
|
||||||
|
|
||||||
Here's a gallery of useful examples. Do you have a useful example? PR welcome!
|
Here's a gallery of useful examples. Do you have a useful example? PR welcome!
|
||||||
|
|
@ -390,7 +392,7 @@ Example usage:
|
||||||
$ examples/http-server.clj
|
$ examples/http-server.clj
|
||||||
```
|
```
|
||||||
|
|
||||||
See [file-server.clj](file-server.clj).
|
See [http-server.clj](http-server.clj).
|
||||||
|
|
||||||
## Torrent viewer
|
## Torrent viewer
|
||||||
|
|
||||||
|
|
@ -555,3 +557,14 @@ Example of a todo list SPA using Babashka and htmx
|
||||||
See [htmx_todoapp.clj](htmx_todoapp.clj)
|
See [htmx_todoapp.clj](htmx_todoapp.clj)
|
||||||
|
|
||||||
Contributed by [@prestancedesign](https://github.com/prestancedesign).
|
Contributed by [@prestancedesign](https://github.com/prestancedesign).
|
||||||
|
|
||||||
|
## Wikipedia translation
|
||||||
|
|
||||||
|
[wiki-translate.clj](wiki-translate.clj) uses Wikipedia to translate words from English to Dutch (other languages are available).
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
$ bb wiki-translate.clj window
|
||||||
|
"Venster (muur) – Dutch"
|
||||||
|
```
|
||||||
|
|
||||||
|
Shared by Janne Himanka on Clojurians Slack
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
(ns normalize-keywords
|
(ns normalize-keywords
|
||||||
(:require [babashka.pods :as pods]
|
(:require [babashka.pods :as pods]
|
||||||
|
[clojure.java.io :as io]
|
||||||
[rewrite-clj.node :as node]
|
[rewrite-clj.node :as node]
|
||||||
[rewrite-clj.zip :as z]))
|
[rewrite-clj.zip :as z]))
|
||||||
|
|
||||||
(pods/load-pod 'borkdude/clj-kondo "2021.06.18")
|
(pods/load-pod 'clj-kondo/clj-kondo "2022.11.02")
|
||||||
|
|
||||||
(require '[pod.borkdude.clj-kondo :as clj-kondo])
|
(require '[pod.borkdude.clj-kondo :as clj-kondo])
|
||||||
|
|
||||||
(def code (first *command-line-args*))
|
(def code (first *command-line-args*))
|
||||||
|
|
||||||
(def findings
|
(defn findings [file-path]
|
||||||
(->> (with-in-str code
|
(->> (clj-kondo/run! {:lint [file-path]
|
||||||
(clj-kondo/run! {:lint [code]
|
:config {:output {:analysis {:keywords true}}}})
|
||||||
:config {:output {:analysis {:keywords true}}}}))
|
|
||||||
:analysis
|
:analysis
|
||||||
:keywords
|
:keywords
|
||||||
(filter (some-fn :alias :auto-resolved))))
|
(filter (some-fn :alias :auto-resolved))))
|
||||||
|
|
@ -33,6 +33,11 @@
|
||||||
zloc (z/replace zloc (node/coerce k))]
|
zloc (z/replace zloc (node/coerce k))]
|
||||||
(recur zloc (next findings)))
|
(recur zloc (next findings)))
|
||||||
(recur (z/next zloc) findings)))
|
(recur (z/next zloc) findings)))
|
||||||
(println (str (z/root zloc))))))
|
(str (z/root zloc)))))
|
||||||
|
|
||||||
(remove-locs (z/of-file code) findings)
|
(doseq [f (file-seq (io/file code))
|
||||||
|
:when (re-find #"\.clj[cdsx]?$" (str f))
|
||||||
|
:let [file-path (str f)]]
|
||||||
|
(when-let [findings' (findings file-path)]
|
||||||
|
(prn (format "Rewriting %s" file-path))
|
||||||
|
(spit f (remove-locs (z/of-file file-path) findings'))))
|
||||||
|
|
|
||||||
11
examples/wiki-translate.clj
Normal file
11
examples/wiki-translate.clj
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
;; by Janne Himanka shared on Clojurians Slack
|
||||||
|
(require '[babashka.curl :as curl])
|
||||||
|
|
||||||
|
(let [url (str "https://en.wikipedia.org/wiki/" (first *command-line-args*))
|
||||||
|
page (:body (curl/get url))]
|
||||||
|
(cond
|
||||||
|
(re-find #"Disambiguation" page)
|
||||||
|
(doseq [item (map last (re-seq #"<li><a href...wiki/([^\"]+)" page))]
|
||||||
|
(println item))
|
||||||
|
:else (last (re-find #"nl.wikipedia.org/.+?title..([^\"]+)" page))))
|
||||||
|
|
@ -55,7 +55,8 @@
|
||||||
{'html (copy-var html-1 hns {:name 'html})})
|
{'html (copy-var html-1 hns {:name 'html})})
|
||||||
|
|
||||||
(def hiccup2-namespace
|
(def hiccup2-namespace
|
||||||
{'html (copy-var html-2 hns2 {:name 'html})})
|
{'html (copy-var html-2 hns2 {:name 'html})
|
||||||
|
'raw (copy-var util/raw-string hns2 {:name 'raw})})
|
||||||
|
|
||||||
(def html-mode (copy-var util/*html-mode* uns))
|
(def html-mode (copy-var util/*html-mode* uns))
|
||||||
(def escape-strings? (copy-var util/*escape-strings?* uns))
|
(def escape-strings? (copy-var util/*escape-strings?* uns))
|
||||||
|
|
@ -63,7 +64,8 @@
|
||||||
(def hiccup-util-namespace
|
(def hiccup-util-namespace
|
||||||
{'*html-mode* html-mode
|
{'*html-mode* html-mode
|
||||||
'*escape-strings?* escape-strings?
|
'*escape-strings?* escape-strings?
|
||||||
'raw-string (copy-var util/raw-string uns)})
|
'raw-string (copy-var util/raw-string uns)
|
||||||
|
'to-uri (copy-var util/to-uri uns)})
|
||||||
|
|
||||||
(defn render-html [& contents]
|
(defn render-html [& contents]
|
||||||
(binding [util/*html-mode* @html-mode
|
(binding [util/*html-mode* @html-mode
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,9 @@
|
||||||
'acl (copy-var acl cns)
|
'acl (copy-var acl cns)
|
||||||
'unlock (copy-var unlock cns)
|
'unlock (copy-var unlock cns)
|
||||||
'default-client (copy-var client/default-client cns)
|
'default-client (copy-var client/default-client cns)
|
||||||
'*default-client* default-client})
|
'*default-client* default-client
|
||||||
|
'query-string (copy-var client/query-string cns)
|
||||||
|
'url-encode (copy-var client/url-encode cns)})
|
||||||
|
|
||||||
(def sni-client-namespace
|
(def sni-client-namespace
|
||||||
{'ssl-configurer (copy-var sni-client/ssl-configurer sns)
|
{'ssl-configurer (copy-var sni-client/ssl-configurer sns)
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,8 @@
|
||||||
'send-checked-websocket-handshake! (copy-var server/send-checked-websocket-handshake! sns)
|
'send-checked-websocket-handshake! (copy-var server/send-checked-websocket-handshake! sns)
|
||||||
'send-websocket-handshake! (copy-var server/send-websocket-handshake! sns)
|
'send-websocket-handshake! (copy-var server/send-websocket-handshake! sns)
|
||||||
'as-channel (copy-var server/as-channel sns)
|
'as-channel (copy-var server/as-channel sns)
|
||||||
'send! (copy-var server/send! sns)})
|
'send! (copy-var server/send! sns)
|
||||||
|
'with-channel (copy-var server/with-channel sns)
|
||||||
|
'on-close (copy-var server/on-close sns)
|
||||||
|
'close (copy-var server/close sns)}
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@
|
||||||
[next.jdbc :as njdbc]
|
[next.jdbc :as njdbc]
|
||||||
[next.jdbc.result-set :as rs]
|
[next.jdbc.result-set :as rs]
|
||||||
[next.jdbc.sql :as sql]
|
[next.jdbc.sql :as sql]
|
||||||
[sci.core :as sci]
|
[sci.core :as sci]))
|
||||||
[sci.impl.namespaces :refer [copy-var macrofy]]))
|
|
||||||
|
|
||||||
(def next-ns (sci/create-ns 'next.jdbc nil))
|
(def next-ns (sci/create-ns 'next.jdbc nil))
|
||||||
|
|
||||||
|
|
@ -20,30 +19,30 @@
|
||||||
* `:rollback-only` -- `true` / `false`."
|
* `:rollback-only` -- `true` / `false`."
|
||||||
[_ _ [sym transactable opts] & body]
|
[_ _ [sym transactable opts] & body]
|
||||||
(let [con (vary-meta sym assoc :tag 'java.sql.Connection)]
|
(let [con (vary-meta sym assoc :tag 'java.sql.Connection)]
|
||||||
`(next.jdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {}))))
|
`(njdbc/transact ~transactable (^{:once true} fn* [~con] ~@body) ~(or opts {}))))
|
||||||
|
|
||||||
(def njdbc-namespace
|
(def njdbc-namespace
|
||||||
{'get-datasource (copy-var njdbc/get-datasource next-ns)
|
{'get-datasource (sci/copy-var njdbc/get-datasource next-ns)
|
||||||
'execute! (copy-var njdbc/execute! next-ns)
|
'execute! (sci/copy-var njdbc/execute! next-ns)
|
||||||
'execute-one! (copy-var njdbc/execute-one! next-ns)
|
'execute-one! (sci/copy-var njdbc/execute-one! next-ns)
|
||||||
'get-connection (copy-var njdbc/get-connection next-ns)
|
'get-connection (sci/copy-var njdbc/get-connection next-ns)
|
||||||
'plan (copy-var njdbc/plan next-ns)
|
'plan (sci/copy-var njdbc/plan next-ns)
|
||||||
'prepare (copy-var njdbc/prepare next-ns)
|
'prepare (sci/copy-var njdbc/prepare next-ns)
|
||||||
'transact (copy-var njdbc/transact next-ns)
|
'transact (sci/copy-var njdbc/transact next-ns)
|
||||||
'with-transaction (macrofy 'with-transaction with-transaction next-ns)})
|
'with-transaction (sci/copy-var with-transaction next-ns)})
|
||||||
|
|
||||||
(def sns (sci/create-ns 'next.jdbc.sql nil))
|
(def sns (sci/create-ns 'next.jdbc.sql nil))
|
||||||
|
|
||||||
(def next-sql-namespace
|
(def next-sql-namespace
|
||||||
{'insert-multi! (copy-var sql/insert-multi! sns)})
|
{'insert-multi! (sci/copy-var sql/insert-multi! sns)})
|
||||||
|
|
||||||
(def rsns (sci/create-ns 'next.jdbc.result-set nil))
|
(def rsns (sci/create-ns 'next.jdbc.result-set nil))
|
||||||
|
|
||||||
(def result-set-namespace
|
(def result-set-namespace
|
||||||
{'as-maps (copy-var rs/as-maps rsns)
|
{'as-maps (sci/copy-var rs/as-maps rsns)
|
||||||
'as-unqualified-maps (copy-var rs/as-unqualified-maps rsns)
|
'as-unqualified-maps (sci/copy-var rs/as-unqualified-maps rsns)
|
||||||
'as-modified-maps (copy-var rs/as-modified-maps rsns)
|
'as-modified-maps (sci/copy-var rs/as-modified-maps rsns)
|
||||||
'as-unqualified-modified-maps (copy-var rs/as-unqualified-modified-maps rsns)
|
'as-unqualified-modified-maps (sci/copy-var rs/as-unqualified-modified-maps rsns)
|
||||||
'as-lower-maps (copy-var rs/as-lower-maps rsns)
|
'as-lower-maps (sci/copy-var rs/as-lower-maps rsns)
|
||||||
'as-unqualified-lower-maps (copy-var rs/as-unqualified-lower-maps rsns)
|
'as-unqualified-lower-maps (sci/copy-var rs/as-unqualified-lower-maps rsns)
|
||||||
'as-maps-adapter (copy-var rs/as-maps-adapter rsns)})
|
'as-maps-adapter (sci/copy-var rs/as-maps-adapter rsns)})
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,8 @@
|
||||||
[clojure.tools.logging.impl :as impl]
|
[clojure.tools.logging.impl :as impl]
|
||||||
[clojure.tools.logging.readable]
|
[clojure.tools.logging.readable]
|
||||||
[sci.core :as sci]
|
[sci.core :as sci]
|
||||||
[taoensso.encore :as enc :refer [have]]
|
[taoensso.encore :as encore :refer [have]]
|
||||||
[taoensso.timbre :as timbre]
|
[taoensso.timbre :as timbre]))
|
||||||
[taoensso.timbre.appenders.core :as appenders]))
|
|
||||||
|
|
||||||
;;;; timbre
|
;;;; timbre
|
||||||
|
|
||||||
|
|
@ -13,56 +12,80 @@
|
||||||
|
|
||||||
(defn- fline [and-form] (:line (meta and-form)))
|
(defn- fline [and-form] (:line (meta and-form)))
|
||||||
|
|
||||||
|
(defonce callsite-counter
|
||||||
|
(encore/counter))
|
||||||
|
|
||||||
(defmacro log! ; Public wrapper around `-log!`
|
(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?}
|
|
||||||
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
|
|
||||||
|
|
||||||
?file (when (not= ?file "NO_SOURCE_PATH") ?file)
|
* `level` - must eval to a valid logging level
|
||||||
|
* `msg-type` - must eval to e/o #{:p :f nil}
|
||||||
|
* `args` - arguments seq (ideally vec) for logging call
|
||||||
|
* `opts` - ks e/o #{:config ?err ?base-data spying?
|
||||||
|
:?ns-str :?file :?line :?column}
|
||||||
|
|
||||||
;; Identifies this particular macro expansion; note that this'll
|
Supports compile-time elision when compile-time const vals
|
||||||
;; be fixed for any fns wrapping `log!` (notably `tools.logging`,
|
provided for `level` and/or `?ns-str`.
|
||||||
;; `slf4j-timbre`, etc.):
|
|
||||||
callsite-id
|
|
||||||
(hash [level msg-type args ; Unevaluated args (arg forms)
|
|
||||||
?ns-str ?file ?line (rand)])]
|
|
||||||
|
|
||||||
`(taoensso.timbre/-log! ~config ~level ~?ns-str ~?file ~?line ~msg-type ~?err
|
Logging wrapper examples:
|
||||||
(delay [~@args]) ~?base-data ~callsite-id ~spying?)))))
|
|
||||||
|
(defn log-wrapper-fn [& args] (timbre/log! :info :p args))
|
||||||
|
(defmacro log-wrapper-macro [& args] (timbre/keep-callsite `(timbre/log! :info :p ~args)))"
|
||||||
|
|
||||||
|
([{: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]
|
(defn make-ns [ns sci-ns ks]
|
||||||
(reduce (fn [ns-map [var-name var]]
|
(reduce (fn [ns-map [var-name var]]
|
||||||
(let [m (meta var)
|
(let [m (meta var)
|
||||||
no-doc (:no-doc m)
|
|
||||||
doc (:doc m)
|
doc (:doc m)
|
||||||
arglists (:arglists m)]
|
arglists (:arglists m)]
|
||||||
(if no-doc ns-map
|
(assoc ns-map var-name
|
||||||
(assoc ns-map var-name
|
(sci/new-var (symbol var-name) @var
|
||||||
(sci/new-var (symbol var-name) @var
|
(cond-> {:ns sci-ns
|
||||||
(cond-> {:ns sci-ns
|
:name (:name m)}
|
||||||
:name (:name m)}
|
(:macro m) (assoc :macro true)
|
||||||
(:macro m) (assoc :macro true)
|
doc (assoc :doc doc)
|
||||||
doc (assoc :doc doc)
|
arglists (assoc :arglists arglists))))))
|
||||||
arglists (assoc :arglists arglists)))))))
|
|
||||||
{}
|
{}
|
||||||
(select-keys (ns-publics ns) ks)))
|
(select-keys (ns-publics ns) ks)))
|
||||||
|
|
||||||
(def atomic-println @#'appenders/atomic-println)
|
|
||||||
|
|
||||||
(defn println-appender
|
(defn println-appender
|
||||||
"Returns a simple `println` appender for Clojure/Script.
|
"Returns a simple `println` appender for Clojure/Script.
|
||||||
Use with ClojureScript requires that `cljs.core/*print-fn*` be set.
|
Use with ClojureScript requires that `cljs.core/*print-fn*` be set.
|
||||||
|
|
@ -92,7 +115,7 @@
|
||||||
:*err* @sci/err
|
:*err* @sci/err
|
||||||
stream)]
|
stream)]
|
||||||
(binding [*out* stream]
|
(binding [*out* stream]
|
||||||
(atomic-println (force output_)))))}))
|
(encore/println-atomic (force output_)))))}))
|
||||||
|
|
||||||
(def default-config (assoc-in timbre/*config* [:appenders :println]
|
(def default-config (assoc-in timbre/*config* [:appenders :println]
|
||||||
(println-appender {:stream :auto})))
|
(println-appender {:stream :auto})))
|
||||||
|
|
@ -105,7 +128,7 @@
|
||||||
|
|
||||||
(defn set-level! [level] (swap-config! (fn [m] (assoc m :min-level level))))
|
(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]
|
(defmacro -log-and-rethrow-errors [?line & body]
|
||||||
`(try (do ~@body)
|
`(try (do ~@body)
|
||||||
|
|
@ -120,14 +143,27 @@
|
||||||
'info 'infof 'warn 'warnf
|
'info 'infof 'warn 'warnf
|
||||||
'error 'errorf
|
'error 'errorf
|
||||||
'-log! 'with-level
|
'-log! 'with-level
|
||||||
'spit-appender '-spy 'spy])
|
'spit-appender '-spy 'spy
|
||||||
|
'color-str])
|
||||||
'log! (sci/copy-var log! tns)
|
'log! (sci/copy-var log! tns)
|
||||||
'*config* config
|
'*config* config
|
||||||
'swap-config! (sci/copy-var swap-config! tns)
|
'swap-config! (sci/copy-var swap-config! tns)
|
||||||
'merge-config! (sci/copy-var merge-config! tns)
|
'merge-config! (sci/copy-var merge-config! tns)
|
||||||
'set-level! (sci/copy-var set-level! tns)
|
'set-level! (sci/copy-var set-level! tns)
|
||||||
'println-appender (sci/copy-var println-appender 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
|
;;;; clojure.tools.logging
|
||||||
|
|
||||||
|
|
@ -160,7 +196,7 @@
|
||||||
#'clojure.tools.logging/*logger-factory*
|
#'clojure.tools.logging/*logger-factory*
|
||||||
(fn [_]
|
(fn [_]
|
||||||
(LoggerFactory.
|
(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))
|
(def lns (sci/create-ns 'clojure.tools.logging nil))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
[babashka.impl.common :refer [ctx]]
|
[babashka.impl.common :refer [ctx]]
|
||||||
[sci.core :as sci]
|
[sci.core :as sci]
|
||||||
[selmer.filters :as filters]
|
[selmer.filters :as filters]
|
||||||
|
[selmer.filter-parser :as fp]
|
||||||
[selmer.parser]
|
[selmer.parser]
|
||||||
[selmer.tags :as tags]
|
[selmer.tags :as tags]
|
||||||
[selmer.util :as util]
|
[selmer.util :as util]
|
||||||
|
|
@ -60,7 +61,7 @@
|
||||||
(selmer.parser/render-template template context-map)))
|
(selmer.parser/render-template template context-map)))
|
||||||
|
|
||||||
(defn sci-ns-resolve [ns fqs]
|
(defn sci-ns-resolve [ns fqs]
|
||||||
(sci/eval-form @ctx (list 'clojure.core/ns-resolve ns (list 'quote fqs))))
|
(sci/eval-form (ctx) (list 'clojure.core/ns-resolve ns (list 'quote fqs))))
|
||||||
|
|
||||||
(defn force! [x]
|
(defn force! [x]
|
||||||
(if (instance? clojure.lang.IDeref x) @x x))
|
(if (instance? clojure.lang.IDeref x) @x x))
|
||||||
|
|
@ -83,12 +84,31 @@
|
||||||
(apply merge)
|
(apply merge)
|
||||||
(selmer.parser/render ~s)))
|
(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
|
(def selmer-parser-namespace
|
||||||
(-> selmer-parser-ns
|
(-> selmer-parser-ns
|
||||||
(assoc 'render-file (sci/copy-var render-file spns)
|
(assoc 'render-file (sci/copy-var render-file spns)
|
||||||
'render (sci/copy-var render spns)
|
'render (sci/copy-var render spns)
|
||||||
'render-template (sci/copy-var render-template spns)
|
'render-template (sci/copy-var render-template spns)
|
||||||
'resolve-var-from-kw (sci/copy-var resolve-var-from-kw 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))))
|
'<< (sci/copy-var << spns))))
|
||||||
|
|
||||||
(def stns (sci/create-ns 'selmer.tags nil))
|
(def stns (sci/create-ns 'selmer.tags nil))
|
||||||
|
|
@ -105,7 +125,9 @@
|
||||||
|
|
||||||
(def selmer-filters-namespace
|
(def selmer-filters-namespace
|
||||||
{'add-filter! (sci/copy-var filters/add-filter! sfns)
|
{'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! []
|
(defn turn-off-escaping! []
|
||||||
(sci/alter-var-root escape-variables (constantly false)))
|
(sci/alter-var-root escape-variables (constantly false)))
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,8 @@
|
||||||
#_(assert (<= (count ans)) (pr-str ans))
|
#_(assert (<= (count ans)) (pr-str ans))
|
||||||
(let [xn (xml/uri-symbol n)
|
(let [xn (xml/uri-symbol n)
|
||||||
al (symbol (clj-ns-name a))]
|
al (symbol (clj-ns-name a))]
|
||||||
(sci/eval-form @ctx `(create-ns (quote ~xn)))
|
(sci/eval-form (ctx) `(create-ns (quote ~xn)))
|
||||||
(sci/eval-form @ctx `(alias (quote ~al) (quote ~xn)))
|
(sci/eval-form (ctx) `(alias (quote ~al) (quote ~xn)))
|
||||||
(recur rst)))))
|
(recur rst)))))
|
||||||
|
|
||||||
(def xml-namespace
|
(def xml-namespace
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
(ns babashka.impl.ordered
|
(ns babashka.impl.ordered
|
||||||
{:no-doc true}
|
{:no-doc true}
|
||||||
(:require [flatland.ordered.map :as omap]
|
(:require [flatland.ordered.map :as omap]
|
||||||
|
[flatland.ordered.set :as oset]
|
||||||
[sci.core :as sci]))
|
[sci.core :as sci]))
|
||||||
|
|
||||||
(def omap-ns (sci/create-ns 'flatland.ordered.map nil))
|
(def omap-ns (sci/create-ns 'flatland.ordered.map nil))
|
||||||
|
(def oset-ns (sci/create-ns 'flatland.ordered.set nil))
|
||||||
|
|
||||||
(def ordered-map-ns
|
(def ordered-map-ns
|
||||||
{'ordered-map (sci/copy-var omap/ordered-map omap-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 6c5e180d52136e68671e15b639e55fbc14e85969
|
Subproject commit fdd5780bc4df4931332b56082c6c3a5c3c85066d
|
||||||
2
impl-java/bb.edn
Normal file
2
impl-java/bb.edn
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
{:tasks {install (clojure "-T:build install")
|
||||||
|
deploy (clojure "-T:build deploy")}}
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
(:require [build.reify2 :as reify2]
|
(:require [build.reify2 :as reify2]
|
||||||
[clojure.tools.build.api :as b]))
|
[clojure.tools.build.api :as b]))
|
||||||
|
|
||||||
(def lib 'org.babashka/babashka.impl.reify)
|
(def lib 'org.babashka/babashka.impl.java)
|
||||||
(def version "0.1.1")
|
(def version "0.1.10")
|
||||||
(def class-dir "target/classes")
|
(def class-dir "target/classes")
|
||||||
(def basis (b/create-basis {:project "deps.edn"}))
|
(def basis (b/create-basis {:project "deps.edn"}))
|
||||||
(def jar-file (format "target/%s-%s.jar" (name lib) version))
|
(def jar-file (format "target/%s-%s.jar" (name lib) version))
|
||||||
|
|
@ -14,13 +14,25 @@
|
||||||
(defn gen-classes [_]
|
(defn gen-classes [_]
|
||||||
(reify2/gen-classes nil))
|
(reify2/gen-classes nil))
|
||||||
|
|
||||||
|
(defn compile-java [_]
|
||||||
|
(b/javac {:src-dirs ["src-java"]
|
||||||
|
:class-dir class-dir
|
||||||
|
:basis basis
|
||||||
|
:javac-opts ["--release" "8"]}))
|
||||||
|
|
||||||
(defn jar [_]
|
(defn jar [_]
|
||||||
|
(compile-java nil)
|
||||||
(gen-classes nil)
|
(gen-classes nil)
|
||||||
(b/write-pom {:class-dir class-dir
|
(b/write-pom {:class-dir class-dir
|
||||||
:lib lib
|
:lib lib
|
||||||
:version version
|
:version version
|
||||||
:basis basis
|
: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"]
|
(b/copy-dir {:src-dirs ["src"]
|
||||||
:target-dir class-dir})
|
:target-dir class-dir})
|
||||||
(b/jar {:class-dir class-dir
|
(b/jar {:class-dir class-dir
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
:aliases
|
:aliases
|
||||||
{:build ;; added by neil
|
{:build ;; added by neil
|
||||||
{:paths ["." "build" "src"]
|
{: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"}
|
slipset/deps-deploy {:mvn/version "0.2.0"}
|
||||||
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
||||||
;; insn/insn {:mvn/version "0.5.3"}
|
;; insn/insn {:mvn/version "0.5.3"}
|
||||||
94
impl-java/src-java/babashka/impl/URLClassLoader.java
Normal file
94
impl-java/src-java/babashka/impl/URLClassLoader.java
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
// This file is mostly a workaround for https://github.com/oracle/graal/issues/1956
|
||||||
|
|
||||||
|
package babashka.impl;
|
||||||
|
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.jar.*;
|
||||||
|
|
||||||
|
public class URLClassLoader extends java.net.URLClassLoader implements Closeable {
|
||||||
|
|
||||||
|
private WeakHashMap<Closeable,Void>
|
||||||
|
closeables = new WeakHashMap<>();
|
||||||
|
|
||||||
|
public URLClassLoader(java.net.URL[] urls) {
|
||||||
|
super(urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public URLClassLoader(java.net.URL[] urls, java.net.URLClassLoader parent) {
|
||||||
|
super(urls, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void _addURL(java.net.URL url) {
|
||||||
|
super.addURL(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
// calling super.getResource() returned nil in native-image
|
||||||
|
public java.net.URL getResource(String name) {
|
||||||
|
return findResource(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// calling super.getResourceAsStream() returned nil in native-image
|
||||||
|
public InputStream getResourceAsStream(String name) {
|
||||||
|
Objects.requireNonNull(name);
|
||||||
|
URL url = getResource(name);
|
||||||
|
try {
|
||||||
|
if (url == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
URLConnection urlc = url.openConnection();
|
||||||
|
InputStream is = urlc.getInputStream();
|
||||||
|
if (urlc instanceof JarURLConnection) {
|
||||||
|
JarFile jar = ((JarURLConnection)urlc).getJarFile();
|
||||||
|
synchronized (closeables) {
|
||||||
|
if (!closeables.containsKey(jar)) {
|
||||||
|
closeables.put(jar, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
synchronized (closeables) {
|
||||||
|
closeables.put(is, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return is;
|
||||||
|
} catch (IOException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public java.util.Enumeration<java.net.URL> getResources(String name) throws java.io.IOException {
|
||||||
|
return findResources(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() throws IOException {
|
||||||
|
super.close();
|
||||||
|
|
||||||
|
java.util.List<IOException> errors = new java.util.ArrayList<IOException>();
|
||||||
|
|
||||||
|
synchronized (closeables) {
|
||||||
|
java.util.Set<Closeable> keys = closeables.keySet();
|
||||||
|
for (Closeable c : keys) {
|
||||||
|
try {
|
||||||
|
c.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
errors.add(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closeables.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errors.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IOException firstEx = errors.remove(0);
|
||||||
|
|
||||||
|
for (IOException error: errors) {
|
||||||
|
firstEx.addSuppressed(error);
|
||||||
|
}
|
||||||
|
throw firstEx;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -45,8 +45,26 @@
|
||||||
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20))
|
(invoke [this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20] (invoke-fn this a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20))
|
||||||
(applyTo [this arglist] (apply-fn this arglist)))))
|
(applyTo [this arglist] (apply-fn this arglist)))))
|
||||||
|
|
||||||
|
(defn reify-object [m]
|
||||||
|
(let [methods (:methods m)
|
||||||
|
toString-fn (or (get methods 'toString)
|
||||||
|
(fn [this]
|
||||||
|
(str
|
||||||
|
(.getName (.getClass this))
|
||||||
|
"@"
|
||||||
|
(Integer/toHexString (.hashCode this)))))]
|
||||||
|
(reify
|
||||||
|
sci.impl.types.IReified
|
||||||
|
(getMethods [_] (:methods m))
|
||||||
|
(getInterfaces [_] (:interfaces m))
|
||||||
|
(getProtocols [_] (:protocols m))
|
||||||
|
java.lang.Object
|
||||||
|
(toString [this] (toString-fn this)))))
|
||||||
|
|
||||||
(defmacro gen-reify-fn []
|
(defmacro gen-reify-fn []
|
||||||
`(fn [~'m]
|
`(fn [~'m]
|
||||||
|
(when (> (count (:interfaces ~'m)) 1)
|
||||||
|
(throw (UnsupportedOperationException. "babashka reify only supports implementing a single interface")))
|
||||||
(if (empty? (:interfaces ~'m))
|
(if (empty? (:interfaces ~'m))
|
||||||
(reify
|
(reify
|
||||||
sci.impl.types.IReified
|
sci.impl.types.IReified
|
||||||
|
|
@ -55,19 +73,12 @@
|
||||||
(getProtocols [_] (:protocols ~'m)))
|
(getProtocols [_] (:protocols ~'m)))
|
||||||
(case (.getName ~(with-meta `(first (:interfaces ~'m))
|
(case (.getName ~(with-meta `(first (:interfaces ~'m))
|
||||||
{:tag 'Class}))
|
{:tag 'Class}))
|
||||||
"java.lang.Object"
|
|
||||||
(reify
|
|
||||||
java.lang.Object
|
|
||||||
(toString [~'this]
|
|
||||||
((method-or-bust (:methods ~'m) (quote ~'toString)) ~'this))
|
|
||||||
sci.impl.types.IReified
|
|
||||||
(getMethods [_] (:methods ~'m))
|
|
||||||
(getInterfaces [_] (:interfaces ~'m))
|
|
||||||
(getProtocols [_] (:protocols ~'m)))
|
|
||||||
~@(mapcat identity
|
~@(mapcat identity
|
||||||
(cons
|
(cons
|
||||||
["clojure.lang.IFn"
|
["clojure.lang.IFn"
|
||||||
`(reify-ifn ~'m)]
|
`(reify-ifn ~'m)
|
||||||
|
"java.lang.Object"
|
||||||
|
`(reify-object ~'m)]
|
||||||
(for [i interfaces]
|
(for [i interfaces]
|
||||||
(let [in (.getName ^Class i)]
|
(let [in (.getName ^Class i)]
|
||||||
[in
|
[in
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(ns babashka.impl.reify2.interfaces)
|
(ns babashka.impl.reify2.interfaces)
|
||||||
|
|
||||||
(def interfaces [java.nio.file.FileVisitor
|
(def interfaces [java.nio.file.FileVisitor
|
||||||
|
java.nio.file.DirectoryStream$Filter
|
||||||
java.io.FileFilter
|
java.io.FileFilter
|
||||||
java.io.FilenameFilter
|
java.io.FilenameFilter
|
||||||
clojure.lang.Associative
|
clojure.lang.Associative
|
||||||
|
|
@ -19,13 +20,19 @@
|
||||||
clojure.lang.Reversible
|
clojure.lang.Reversible
|
||||||
clojure.lang.Seqable
|
clojure.lang.Seqable
|
||||||
java.lang.Iterable
|
java.lang.Iterable
|
||||||
|
java.lang.Runnable
|
||||||
java.net.http.WebSocket$Listener
|
java.net.http.WebSocket$Listener
|
||||||
java.util.Iterator
|
java.util.Iterator
|
||||||
java.util.function.Consumer
|
java.util.function.Consumer
|
||||||
|
java.util.function.BiConsumer
|
||||||
java.util.function.Function
|
java.util.function.Function
|
||||||
|
java.util.function.BiFunction
|
||||||
java.util.function.Predicate
|
java.util.function.Predicate
|
||||||
java.util.function.Supplier
|
java.util.function.Supplier
|
||||||
java.lang.Comparable
|
java.lang.Comparable
|
||||||
javax.net.ssl.X509TrustManager
|
javax.net.ssl.X509TrustManager
|
||||||
clojure.lang.LispReader$Resolver
|
clojure.lang.LispReader$Resolver
|
||||||
sun.misc.SignalHandler])
|
sun.misc.SignalHandler
|
||||||
|
java.util.concurrent.ThreadFactory
|
||||||
|
java.lang.Thread$UncaughtExceptionHandler
|
||||||
|
java.util.concurrent.Callable])
|
||||||
58
install
58
install
|
|
@ -8,6 +8,7 @@ static_binary="false"
|
||||||
default_install_dir="/usr/local/bin"
|
default_install_dir="/usr/local/bin"
|
||||||
install_dir="$default_install_dir"
|
install_dir="$default_install_dir"
|
||||||
download_dir=""
|
download_dir=""
|
||||||
|
dev_build=""
|
||||||
|
|
||||||
print_help() {
|
print_help() {
|
||||||
echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin."
|
echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin."
|
||||||
|
|
@ -28,6 +29,32 @@ print_help() {
|
||||||
exit 1
|
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 ]]
|
while [[ $# -gt 0 ]]
|
||||||
do
|
do
|
||||||
key="$1"
|
key="$1"
|
||||||
|
|
@ -56,6 +83,10 @@ do
|
||||||
static_binary="true"
|
static_binary="true"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
--dev-build)
|
||||||
|
dev_build="true"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
*) # unknown option
|
*) # unknown option
|
||||||
print_help
|
print_help
|
||||||
shift
|
shift
|
||||||
|
|
@ -74,7 +105,11 @@ if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$version" == "" ]]; then
|
if [[ "$version" == "" ]]; then
|
||||||
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
|
if [[ "$dev_build" == "true" ]]; then
|
||||||
|
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
|
||||||
|
else
|
||||||
|
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$(uname -s)" in
|
case "$(uname -s)" in
|
||||||
|
|
@ -87,14 +122,23 @@ IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
|
||||||
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
|
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
|
||||||
|
|
||||||
case "$(uname -m)" in
|
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
|
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
|
||||||
arch="amd64"
|
arch="amd64"
|
||||||
else
|
else
|
||||||
arch="aarch64"
|
arch="aarch64"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*) arch=amd64;;
|
*) arch=amd64
|
||||||
|
# always use static image on linux
|
||||||
|
if [[ "$platform" == "linux" ]]; then
|
||||||
|
static_binary="true"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ 10#$vernum -le 10#000002013 ]]; then
|
if [[ 10#$vernum -le 10#000002013 ]]; then
|
||||||
|
|
@ -125,10 +169,10 @@ fi
|
||||||
download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename"
|
download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename"
|
||||||
|
|
||||||
# macOS only have shasum available by default
|
# macOS only have shasum available by default
|
||||||
# Some Linux distros (RHEL-like) only have sha256sum avaiable by default (others have both)
|
# Some Linux distros (RHEL-like) only have sha256sum available by default (others have both)
|
||||||
if command -v sha256sum >/dev/null; then
|
if has sha256sum; then
|
||||||
sha256sum_cmd="sha256sum"
|
sha256sum_cmd="sha256sum"
|
||||||
elif command -v shasum >/dev/null; then
|
elif has shasum; then
|
||||||
sha256sum_cmd="shasum -a 256"
|
sha256sum_cmd="shasum -a 256"
|
||||||
else
|
else
|
||||||
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
|
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
|
||||||
|
|
@ -141,7 +185,7 @@ mkdir -p "$download_dir" && (
|
||||||
cd "$download_dir"
|
cd "$download_dir"
|
||||||
echo -e "Downloading $download_url to $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 [[ -n "$checksum" ]]; then
|
||||||
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
|
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
|
||||||
>&2 echo "Failed checksum on $filename"
|
>&2 echo "Failed checksum on $filename"
|
||||||
|
|
|
||||||
BIN
logo/babashka-blue-yellow.png
Normal file
BIN
logo/babashka-blue-yellow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 124 KiB |
25
logo/babashka-blue-yellow.svg
Normal file
25
logo/babashka-blue-yellow.svg
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg width="882" height="648" viewBox="0 0 2944 2162" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1742.91 1219.89C1857.93 1138.38 1933 1004.21 1933 852.5C1933 603.972 1761 280.5 1483 139C1207.5 288 1033 603.972 1033 852.5C1033 1004.21 1108.07 1138.38 1223.09 1219.89C1218.98 1220.44 1214.95 1221.14 1211 1222C1123.61 1241.07 1017 1385.05 1017 1385.05H1281C1327.97 1385.05 1372.63 1367.41 1407.96 1347.62C1425.12 1370.32 1452.34 1385 1483 1385C1513.66 1385 1540.89 1370.32 1558.04 1347.62C1593.37 1367.41 1638.03 1385.05 1685 1385.05H1949C1949 1385.05 1842.39 1241.07 1755 1222C1751.05 1221.14 1747.02 1220.44 1742.91 1219.89Z" style="fill-rule: evenodd; fill: rgb(0, 91, 187);"/>
|
||||||
|
<circle cx="1482.5" cy="878.5" r="311.5" style="fill: rgb(255, 213, 0);"/>
|
||||||
|
<path d="M1212 745.5C1396.5 758.5 1505.5 713.5 1581 602C1581 602 1435.5 553 1347 602C1258.8 650.834 1212 745.5 1212 745.5Z" fill="#B4B4B4"/>
|
||||||
|
<path d="M1728 718C1654 710 1588 686 1556.5 595.5C1556.5 595.5 1621.93 610.435 1688 670.614C1756.62 733.114 1728 718 1728 718Z" fill="#B4B4B4"/>
|
||||||
|
<circle cx="1482.5" cy="878.5" r="311.5" stroke="#0A0000" stroke-width="40"/>
|
||||||
|
<path d="M1544 745H1421L1451 775V865C1455.5 835.5 1511.5 834.5 1514.5 865L1522 775L1544 745Z" fill="black"/>
|
||||||
|
<path d="M1098.12 785C1098.12 762.909 1116.03 745 1138.12 745H1423.02C1447.2 745 1465.85 766.292 1462.67 790.264L1437.91 976.764C1435.27 996.646 1418.31 1011.5 1398.26 1011.5H1138.12C1116.03 1011.5 1098.12 993.591 1098.12 971.5V785Z" fill="black"/>
|
||||||
|
<path d="M1216.1 967.55V951.05H1210.55C1206.95 951.05 1204.55 948.5 1203.35 944.75L1180.55 876.05C1179.05 871.7 1177.25 868.55 1174.85 866.15C1170.35 861.5 1164.5 860 1157.9 860H1150.7V877.25H1155.5C1159.55 877.25 1162.7 878.75 1164.05 883.55L1167.2 894.65L1139 967.55H1159.55L1176.5 919.55L1185.5 948.5C1188.95 959.75 1194.8 967.55 1208 967.55H1216.1Z" fill="white"/>
|
||||||
|
<path d="M1248.8 951.05V967.55H1304.8V951.05H1248.8Z" fill="white"/>
|
||||||
|
<path d="M1503.01 790.267C1499.83 766.294 1518.48 745 1542.66 745H1827C1849.09 745 1867 762.909 1867 785V971.096C1867 993.187 1849.09 1011.1 1827 1011.1H1567.38C1547.33 1011.1 1530.37 996.244 1527.73 976.362L1503.01 790.267Z" fill="black"/>
|
||||||
|
<path d="M1649.3 968V951.5H1643.75C1640.15 951.5 1637.75 948.95 1636.55 945.2L1613.75 876.5C1612.25 872.15 1610.45 869 1608.05 866.6C1603.55 861.95 1597.7 860.45 1591.1 860.45H1583.9V877.7H1588.7C1592.75 877.7 1595.9 879.2 1597.25 884L1600.4 895.1L1572.2 968H1592.75L1609.7 920L1618.7 948.95C1622.15 960.2 1628 968 1641.2 968H1649.3Z" fill="white"/>
|
||||||
|
<path d="M1682 951.5V968H1738V951.5H1682Z" fill="white"/>
|
||||||
|
<path d="M 245.923 1712.64 C 254.47 1701.19 264.812 1692.21 276.949 1685.72 C 289.085 1679.05 301.991 1675.72 315.667 1675.72 C 349.684 1675.72 374.897 1688.37 391.308 1713.67 C 407.889 1738.79 416.18 1774.26 416.18 1820.08 C 416.18 1848.45 411.906 1873.67 403.359 1895.72 C 394.983 1917.6 382.59 1934.78 366.18 1947.26 C 349.94 1959.56 330.282 1965.72 307.205 1965.72 C 293.53 1965.72 280.795 1962.81 269 1957 C 257.376 1951.36 247.633 1943.15 239.769 1932.38 L 236.692 1957 L 164.897 1957 L 164.897 1576.49 L 245.923 1568.03 L 245.923 1712.64 Z M 285.923 1906.74 C 317.034 1906.74 332.59 1878.2 332.59 1821.1 C 332.59 1799.22 330.88 1782.04 327.462 1769.56 C 324.043 1756.91 319.171 1748.11 312.846 1743.15 C 306.692 1738.03 299.085 1735.46 290.026 1735.46 C 273.274 1735.46 258.573 1745.97 245.923 1767 L 245.923 1881.87 C 251.222 1890.25 257.034 1896.49 263.359 1900.59 C 269.855 1904.69 277.376 1906.74 285.923 1906.74 Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M 701.745 1878.54 C 701.745 1888.62 703.113 1896.06 705.848 1900.85 C 708.583 1905.46 713.198 1908.97 719.694 1911.36 L 703.027 1964.69 C 686.446 1963.15 672.686 1959.56 661.745 1953.92 C 650.976 1948.11 642.515 1939.74 636.361 1928.79 C 626.275 1940.93 613.198 1950.16 597.13 1956.49 C 581.233 1962.64 564.395 1965.72 546.617 1965.72 C 528.156 1965.72 511.916 1962.13 497.899 1954.95 C 484.053 1947.6 473.369 1937.51 465.848 1924.69 C 458.327 1911.7 454.566 1896.83 454.566 1880.08 C 454.566 1860.59 459.78 1843.92 470.207 1830.08 C 480.634 1816.23 495.763 1805.72 515.592 1798.54 C 535.421 1791.19 559.267 1787.51 587.13 1787.51 L 623.797 1787.51 L 623.797 1777.26 C 623.797 1749.39 605.848 1735.46 569.951 1735.46 C 560.891 1735.46 549.438 1736.74 535.592 1739.31 C 521.916 1741.87 508.498 1745.38 495.335 1749.82 L 476.617 1695.97 C 493.711 1689.48 511.745 1684.52 530.72 1681.1 C 549.694 1677.51 567.045 1675.72 582.771 1675.72 C 622.771 1675.72 652.6 1683.84 672.258 1700.08 C 691.916 1716.32 701.745 1740.25 701.745 1771.87 L 701.745 1878.54 Z M 574.566 1907.77 C 583.797 1907.77 593.113 1905.12 602.515 1899.82 C 611.916 1894.35 619.01 1887 623.797 1877.77 L 623.797 1833.67 L 603.797 1833.67 C 581.574 1833.67 565.079 1837.09 554.31 1843.92 C 543.54 1850.76 538.156 1860.93 538.156 1874.44 C 538.156 1885.03 541.318 1893.24 547.643 1899.05 C 554.139 1904.86 563.113 1907.77 574.566 1907.77 Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M984.204 1711.64C992.751 1700.19 1003.09 1691.21 1015.23 1684.72C1027.37 1678.05 1040.27 1674.72 1053.95 1674.72C1087.97 1674.72 1113.18 1687.37 1129.59 1712.67C1146.17 1737.79 1154.46 1773.26 1154.46 1819.08C1154.46 1847.45 1150.19 1872.67 1141.64 1894.72C1133.26 1916.6 1120.87 1933.78 1104.46 1946.26C1088.22 1958.56 1068.56 1964.72 1045.49 1964.72C1031.81 1964.72 1019.08 1961.81 1007.28 1956C995.657 1950.36 985.914 1942.15 978.05 1931.38L974.974 1956H903.179V1575.49L984.204 1567.03V1711.64ZM1024.2 1905.74C1055.32 1905.74 1070.87 1877.2 1070.87 1820.1C1070.87 1798.22 1069.16 1781.04 1065.74 1768.56C1062.32 1755.91 1057.45 1747.11 1051.13 1742.15C1044.97 1737.03 1037.37 1734.46 1028.31 1734.46C1011.55 1734.46 996.854 1744.97 984.204 1766V1880.87C989.503 1889.25 995.315 1895.49 1001.64 1899.59C1008.14 1903.69 1015.66 1905.74 1024.2 1905.74Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M1440.03 1877.54C1440.03 1887.62 1441.39 1895.06 1444.13 1899.85C1446.86 1904.46 1451.48 1907.97 1457.98 1910.36L1441.31 1963.69C1424.73 1962.15 1410.97 1958.56 1400.03 1952.92C1389.26 1947.11 1380.8 1938.74 1374.64 1927.79C1364.56 1939.93 1351.48 1949.16 1335.41 1955.49C1319.51 1961.64 1302.68 1964.72 1284.9 1964.72C1266.44 1964.72 1250.2 1961.13 1236.18 1953.95C1222.33 1946.6 1211.65 1936.51 1204.13 1923.69C1196.61 1910.7 1192.85 1895.83 1192.85 1879.08C1192.85 1859.59 1198.06 1842.92 1208.49 1829.08C1218.92 1815.23 1234.04 1804.72 1253.87 1797.54C1273.7 1790.19 1297.55 1786.51 1325.41 1786.51H1362.08V1776.26C1362.08 1748.39 1344.13 1734.46 1308.23 1734.46C1299.17 1734.46 1287.72 1735.74 1273.87 1738.31C1260.2 1740.87 1246.78 1744.38 1233.62 1748.82L1214.9 1694.97C1231.99 1688.48 1250.03 1683.52 1269 1680.1C1287.98 1676.51 1305.33 1674.72 1321.05 1674.72C1361.05 1674.72 1390.88 1682.84 1410.54 1699.08C1430.2 1715.32 1440.03 1739.25 1440.03 1770.87V1877.54ZM1312.85 1906.77C1322.08 1906.77 1331.39 1904.12 1340.8 1898.82C1350.2 1893.35 1357.29 1886 1362.08 1876.77V1832.67H1342.08C1319.86 1832.67 1303.36 1836.09 1292.59 1842.92C1281.82 1849.76 1276.44 1859.93 1276.44 1873.44C1276.44 1884.03 1279.6 1892.24 1285.92 1898.05C1292.42 1903.86 1301.39 1906.77 1312.85 1906.77Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M1627.64 1906.77C1641.49 1906.77 1652.43 1904.63 1660.46 1900.36C1668.67 1895.91 1672.77 1889.5 1672.77 1881.13C1672.77 1875.15 1671.15 1870.27 1667.9 1866.51C1664.65 1862.58 1658.58 1858.91 1649.7 1855.49C1640.81 1851.9 1626.96 1847.54 1608.16 1842.41C1580.81 1835.06 1559.87 1824.97 1545.34 1812.15C1530.98 1799.33 1523.8 1781.56 1523.8 1758.82C1523.8 1742.41 1528.33 1727.88 1537.39 1715.23C1546.62 1702.58 1560.12 1692.67 1577.9 1685.49C1595.68 1678.31 1617.05 1674.72 1642 1674.72C1685.25 1674.72 1722 1685.74 1752.26 1707.79L1719.95 1755.49C1708.16 1748.31 1695.76 1742.67 1682.77 1738.56C1669.95 1734.46 1657.13 1732.41 1644.31 1732.41C1631.15 1732.41 1621.32 1734.21 1614.82 1737.79C1608.5 1741.21 1605.34 1746.43 1605.34 1753.44C1605.34 1758.22 1606.96 1762.24 1610.21 1765.49C1613.63 1768.74 1619.7 1772.07 1628.41 1775.49C1637.3 1778.91 1651.06 1783.26 1669.7 1788.56C1689.35 1794.03 1705.34 1800.1 1717.64 1806.77C1729.95 1813.26 1739.52 1821.98 1746.36 1832.92C1753.37 1843.69 1756.87 1857.62 1756.87 1874.72C1756.87 1893.86 1751.06 1910.27 1739.44 1923.95C1727.99 1937.45 1712.52 1947.62 1693.03 1954.46C1673.54 1961.3 1651.92 1964.72 1628.16 1964.72C1602.69 1964.72 1579.78 1961.13 1559.44 1953.95C1539.1 1946.6 1521.58 1936.51 1506.87 1923.69L1547.64 1878.05C1558.93 1886.94 1571.32 1893.95 1584.82 1899.08C1598.33 1904.21 1612.6 1906.77 1627.64 1906.77Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M1907.06 1710.62C1929.79 1686.68 1956.46 1674.72 1987.06 1674.72C2011.16 1674.72 2029.62 1681.81 2042.44 1696C2055.43 1710.02 2061.93 1730.02 2061.93 1756V1956H1980.9V1778.56C1980.9 1767.45 1980.05 1758.74 1978.34 1752.41C1976.8 1746.09 1974.15 1741.56 1970.39 1738.82C1966.63 1735.91 1961.41 1734.46 1954.75 1734.46C1946.54 1734.46 1938.59 1737.28 1930.9 1742.92C1923.21 1748.56 1915.26 1756.77 1907.06 1767.54V1956H1826.03V1575.49L1907.06 1567.54V1710.62Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M2337.72 1956H2256.69V1575.49L2337.72 1567.03V1956ZM2425.67 1804.21L2522.59 1956H2430.28L2340.8 1806.77L2430.28 1683.69H2515.16L2425.67 1804.21Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M2793.54 1877.54C2793.54 1887.62 2794.91 1895.06 2797.64 1899.85C2800.38 1904.46 2805 1907.97 2811.49 1910.36L2794.82 1963.69C2778.24 1962.15 2764.48 1958.56 2753.54 1952.92C2742.77 1947.11 2734.31 1938.74 2728.16 1927.79C2718.07 1939.93 2705 1949.16 2688.93 1955.49C2673.03 1961.64 2656.19 1964.72 2638.41 1964.72C2619.95 1964.72 2603.71 1961.13 2589.7 1953.95C2575.85 1946.6 2565.17 1936.51 2557.64 1923.69C2550.12 1910.7 2546.36 1895.83 2546.36 1879.08C2546.36 1859.59 2551.58 1842.92 2562 1829.08C2572.43 1815.23 2587.56 1804.72 2607.39 1797.54C2627.22 1790.19 2651.06 1786.51 2678.93 1786.51H2715.59V1776.26C2715.59 1748.39 2697.64 1734.46 2661.75 1734.46C2652.69 1734.46 2641.23 1735.74 2627.39 1738.31C2613.71 1740.87 2600.29 1744.38 2587.13 1748.82L2568.41 1694.97C2585.51 1688.48 2603.54 1683.52 2622.52 1680.1C2641.49 1676.51 2658.84 1674.72 2674.57 1674.72C2714.57 1674.72 2744.4 1682.84 2764.06 1699.08C2783.71 1715.32 2793.54 1739.25 2793.54 1770.87V1877.54ZM2666.36 1906.77C2675.59 1906.77 2684.91 1904.12 2694.31 1898.82C2703.71 1893.35 2710.81 1886 2715.59 1876.77V1832.67H2695.59C2673.37 1832.67 2656.88 1836.09 2646.11 1842.92C2635.34 1849.76 2629.95 1859.93 2629.95 1873.44C2629.95 1884.03 2633.11 1892.24 2639.44 1898.05C2645.94 1903.86 2654.91 1906.77 2666.36 1906.77Z" style="fill: rgb(0, 91, 187);"/>
|
||||||
|
<path d="M862 1819C862 1848.27 838.271 1872 809 1872C779.729 1872 756 1848.27 756 1819C756 1789.73 779.729 1766 809 1766C838.271 1766 862 1789.73 862 1819Z" style="fill: rgb(255, 213, 0);"/>
|
||||||
|
<path d="M2215.5 1819C2215.5 1848.27 2191.77 1872 2162.5 1872C2133.23 1872 2109.5 1848.27 2109.5 1819C2109.5 1789.73 2133.23 1766 2162.5 1766C2191.77 1766 2215.5 1789.73 2215.5 1819Z" style="fill: rgb(255, 213, 0);"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
BIN
logo/babashka_red.png
Normal file
BIN
logo/babashka_red.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 141 KiB |
31
logo/babashka_red.svg
Normal file
31
logo/babashka_red.svg
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg width="882" height="648" viewBox="0 0 2944 2162" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1742.91 1219.89C1857.93 1138.38 1933 1004.21 1933 852.5C1933 603.972 1761 280.5 1483 139C1207.5 288 1033 603.972 1033 852.5C1033 1004.21 1108.07 1138.38 1223.09 1219.89C1218.98 1220.44 1214.95 1221.14 1211 1222C1123.61 1241.07 1017 1385.05 1017 1385.05H1281C1327.97 1385.05 1372.63 1367.41 1407.96 1347.62C1425.12 1370.32 1452.34 1385 1483 1385C1513.66 1385 1540.89 1370.32 1558.04 1347.62C1593.37 1367.41 1638.03 1385.05 1685 1385.05H1949C1949 1385.05 1842.39 1241.07 1755 1222C1751.05 1221.14 1747.02 1220.44 1742.91 1219.89Z" fill="url(#paint0_linear)"/>
|
||||||
|
<circle cx="1482.5" cy="878.5" r="311.5" fill="white"/>
|
||||||
|
<path d="M1212 745.5C1396.5 758.5 1505.5 713.5 1581 602C1581 602 1435.5 553 1347 602C1258.8 650.834 1212 745.5 1212 745.5Z" fill="#B4B4B4"/>
|
||||||
|
<path d="M1728 718C1654 710 1588 686 1556.5 595.5C1556.5 595.5 1621.93 610.435 1688 670.614C1756.62 733.114 1728 718 1728 718Z" fill="#B4B4B4"/>
|
||||||
|
<circle cx="1482.5" cy="878.5" r="311.5" stroke="#0A0000" stroke-width="40"/>
|
||||||
|
<path d="M1544 745H1421L1451 775V865C1455.5 835.5 1511.5 834.5 1514.5 865L1522 775L1544 745Z" fill="black"/>
|
||||||
|
<path d="M1098.12 785C1098.12 762.909 1116.03 745 1138.12 745H1423.02C1447.2 745 1465.85 766.292 1462.67 790.264L1437.91 976.764C1435.27 996.646 1418.31 1011.5 1398.26 1011.5H1138.12C1116.03 1011.5 1098.12 993.591 1098.12 971.5V785Z" fill="black"/>
|
||||||
|
<path d="M1216.1 967.55V951.05H1210.55C1206.95 951.05 1204.55 948.5 1203.35 944.75L1180.55 876.05C1179.05 871.7 1177.25 868.55 1174.85 866.15C1170.35 861.5 1164.5 860 1157.9 860H1150.7V877.25H1155.5C1159.55 877.25 1162.7 878.75 1164.05 883.55L1167.2 894.65L1139 967.55H1159.55L1176.5 919.55L1185.5 948.5C1188.95 959.75 1194.8 967.55 1208 967.55H1216.1Z" fill="white"/>
|
||||||
|
<path d="M1248.8 951.05V967.55H1304.8V951.05H1248.8Z" fill="white"/>
|
||||||
|
<path d="M1503.01 790.267C1499.83 766.294 1518.48 745 1542.66 745H1827C1849.09 745 1867 762.909 1867 785V971.096C1867 993.187 1849.09 1011.1 1827 1011.1H1567.38C1547.33 1011.1 1530.37 996.244 1527.73 976.362L1503.01 790.267Z" fill="black"/>
|
||||||
|
<path d="M1649.3 968V951.5H1643.75C1640.15 951.5 1637.75 948.95 1636.55 945.2L1613.75 876.5C1612.25 872.15 1610.45 869 1608.05 866.6C1603.55 861.95 1597.7 860.45 1591.1 860.45H1583.9V877.7H1588.7C1592.75 877.7 1595.9 879.2 1597.25 884L1600.4 895.1L1572.2 968H1592.75L1609.7 920L1618.7 948.95C1622.15 960.2 1628 968 1641.2 968H1649.3Z" fill="white"/>
|
||||||
|
<path d="M1682 951.5V968H1738V951.5H1682Z" fill="white"/>
|
||||||
|
<path d="M245.923 1711.64C254.47 1700.19 264.812 1691.21 276.949 1684.72C289.085 1678.05 301.991 1674.72 315.667 1674.72C349.684 1674.72 374.897 1687.37 391.308 1712.67C407.889 1737.79 416.18 1773.26 416.18 1819.08C416.18 1847.45 411.906 1872.67 403.359 1894.72C394.983 1916.6 382.59 1933.78 366.18 1946.26C349.94 1958.56 330.282 1964.72 307.205 1964.72C293.53 1964.72 280.795 1961.81 269 1956C257.376 1950.36 247.633 1942.15 239.769 1931.38L236.692 1956H164.897V1575.49L245.923 1567.03V1711.64ZM285.923 1905.74C317.034 1905.74 332.59 1877.2 332.59 1820.1C332.59 1798.22 330.88 1781.04 327.462 1768.56C324.043 1755.91 319.171 1747.11 312.846 1742.15C306.692 1737.03 299.085 1734.46 290.026 1734.46C273.274 1734.46 258.573 1744.97 245.923 1766V1880.87C251.222 1889.25 257.034 1895.49 263.359 1899.59C269.855 1903.69 277.376 1905.74 285.923 1905.74Z" style="fill: rgb(220, 27, 32);"/>
|
||||||
|
<path d="M701.745 1877.54C701.745 1887.62 703.113 1895.06 705.848 1899.85C708.583 1904.46 713.198 1907.97 719.694 1910.36L703.027 1963.69C686.446 1962.15 672.686 1958.56 661.745 1952.92C650.976 1947.11 642.515 1938.74 636.361 1927.79C626.275 1939.93 613.198 1949.16 597.13 1955.49C581.233 1961.64 564.395 1964.72 546.617 1964.72C528.156 1964.72 511.916 1961.13 497.899 1953.95C484.053 1946.6 473.369 1936.51 465.848 1923.69C458.327 1910.7 454.566 1895.83 454.566 1879.08C454.566 1859.59 459.78 1842.92 470.207 1829.08C480.634 1815.23 495.763 1804.72 515.592 1797.54C535.421 1790.19 559.267 1786.51 587.13 1786.51H623.797V1776.26C623.797 1748.39 605.848 1734.46 569.951 1734.46C560.891 1734.46 549.438 1735.74 535.592 1738.31C521.916 1740.87 508.498 1744.38 495.335 1748.82L476.617 1694.97C493.711 1688.48 511.745 1683.52 530.72 1680.1C549.694 1676.51 567.045 1674.72 582.771 1674.72C622.771 1674.72 652.6 1682.84 672.258 1699.08C691.916 1715.32 701.745 1739.25 701.745 1770.87V1877.54ZM574.566 1906.77C583.797 1906.77 593.113 1904.12 602.515 1898.82C611.916 1893.35 619.01 1886 623.797 1876.77V1832.67H603.797C581.574 1832.67 565.079 1836.09 554.31 1842.92C543.54 1849.76 538.156 1859.93 538.156 1873.44C538.156 1884.03 541.318 1892.24 547.643 1898.05C554.139 1903.86 563.113 1906.77 574.566 1906.77Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M984.204 1711.64C992.751 1700.19 1003.09 1691.21 1015.23 1684.72C1027.37 1678.05 1040.27 1674.72 1053.95 1674.72C1087.97 1674.72 1113.18 1687.37 1129.59 1712.67C1146.17 1737.79 1154.46 1773.26 1154.46 1819.08C1154.46 1847.45 1150.19 1872.67 1141.64 1894.72C1133.26 1916.6 1120.87 1933.78 1104.46 1946.26C1088.22 1958.56 1068.56 1964.72 1045.49 1964.72C1031.81 1964.72 1019.08 1961.81 1007.28 1956C995.657 1950.36 985.914 1942.15 978.05 1931.38L974.974 1956H903.179V1575.49L984.204 1567.03V1711.64ZM1024.2 1905.74C1055.32 1905.74 1070.87 1877.2 1070.87 1820.1C1070.87 1798.22 1069.16 1781.04 1065.74 1768.56C1062.32 1755.91 1057.45 1747.11 1051.13 1742.15C1044.97 1737.03 1037.37 1734.46 1028.31 1734.46C1011.55 1734.46 996.854 1744.97 984.204 1766V1880.87C989.503 1889.25 995.315 1895.49 1001.64 1899.59C1008.14 1903.69 1015.66 1905.74 1024.2 1905.74Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M1440.03 1877.54C1440.03 1887.62 1441.39 1895.06 1444.13 1899.85C1446.86 1904.46 1451.48 1907.97 1457.98 1910.36L1441.31 1963.69C1424.73 1962.15 1410.97 1958.56 1400.03 1952.92C1389.26 1947.11 1380.8 1938.74 1374.64 1927.79C1364.56 1939.93 1351.48 1949.16 1335.41 1955.49C1319.51 1961.64 1302.68 1964.72 1284.9 1964.72C1266.44 1964.72 1250.2 1961.13 1236.18 1953.95C1222.33 1946.6 1211.65 1936.51 1204.13 1923.69C1196.61 1910.7 1192.85 1895.83 1192.85 1879.08C1192.85 1859.59 1198.06 1842.92 1208.49 1829.08C1218.92 1815.23 1234.04 1804.72 1253.87 1797.54C1273.7 1790.19 1297.55 1786.51 1325.41 1786.51H1362.08V1776.26C1362.08 1748.39 1344.13 1734.46 1308.23 1734.46C1299.17 1734.46 1287.72 1735.74 1273.87 1738.31C1260.2 1740.87 1246.78 1744.38 1233.62 1748.82L1214.9 1694.97C1231.99 1688.48 1250.03 1683.52 1269 1680.1C1287.98 1676.51 1305.33 1674.72 1321.05 1674.72C1361.05 1674.72 1390.88 1682.84 1410.54 1699.08C1430.2 1715.32 1440.03 1739.25 1440.03 1770.87V1877.54ZM1312.85 1906.77C1322.08 1906.77 1331.39 1904.12 1340.8 1898.82C1350.2 1893.35 1357.29 1886 1362.08 1876.77V1832.67H1342.08C1319.86 1832.67 1303.36 1836.09 1292.59 1842.92C1281.82 1849.76 1276.44 1859.93 1276.44 1873.44C1276.44 1884.03 1279.6 1892.24 1285.92 1898.05C1292.42 1903.86 1301.39 1906.77 1312.85 1906.77Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M1627.64 1906.77C1641.49 1906.77 1652.43 1904.63 1660.46 1900.36C1668.67 1895.91 1672.77 1889.5 1672.77 1881.13C1672.77 1875.15 1671.15 1870.27 1667.9 1866.51C1664.65 1862.58 1658.58 1858.91 1649.7 1855.49C1640.81 1851.9 1626.96 1847.54 1608.16 1842.41C1580.81 1835.06 1559.87 1824.97 1545.34 1812.15C1530.98 1799.33 1523.8 1781.56 1523.8 1758.82C1523.8 1742.41 1528.33 1727.88 1537.39 1715.23C1546.62 1702.58 1560.12 1692.67 1577.9 1685.49C1595.68 1678.31 1617.05 1674.72 1642 1674.72C1685.25 1674.72 1722 1685.74 1752.26 1707.79L1719.95 1755.49C1708.16 1748.31 1695.76 1742.67 1682.77 1738.56C1669.95 1734.46 1657.13 1732.41 1644.31 1732.41C1631.15 1732.41 1621.32 1734.21 1614.82 1737.79C1608.5 1741.21 1605.34 1746.43 1605.34 1753.44C1605.34 1758.22 1606.96 1762.24 1610.21 1765.49C1613.63 1768.74 1619.7 1772.07 1628.41 1775.49C1637.3 1778.91 1651.06 1783.26 1669.7 1788.56C1689.35 1794.03 1705.34 1800.1 1717.64 1806.77C1729.95 1813.26 1739.52 1821.98 1746.36 1832.92C1753.37 1843.69 1756.87 1857.62 1756.87 1874.72C1756.87 1893.86 1751.06 1910.27 1739.44 1923.95C1727.99 1937.45 1712.52 1947.62 1693.03 1954.46C1673.54 1961.3 1651.92 1964.72 1628.16 1964.72C1602.69 1964.72 1579.78 1961.13 1559.44 1953.95C1539.1 1946.6 1521.58 1936.51 1506.87 1923.69L1547.64 1878.05C1558.93 1886.94 1571.32 1893.95 1584.82 1899.08C1598.33 1904.21 1612.6 1906.77 1627.64 1906.77Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M1907.06 1710.62C1929.79 1686.68 1956.46 1674.72 1987.06 1674.72C2011.16 1674.72 2029.62 1681.81 2042.44 1696C2055.43 1710.02 2061.93 1730.02 2061.93 1756V1956H1980.9V1778.56C1980.9 1767.45 1980.05 1758.74 1978.34 1752.41C1976.8 1746.09 1974.15 1741.56 1970.39 1738.82C1966.63 1735.91 1961.41 1734.46 1954.75 1734.46C1946.54 1734.46 1938.59 1737.28 1930.9 1742.92C1923.21 1748.56 1915.26 1756.77 1907.06 1767.54V1956H1826.03V1575.49L1907.06 1567.54V1710.62Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M2337.72 1956H2256.69V1575.49L2337.72 1567.03V1956ZM2425.67 1804.21L2522.59 1956H2430.28L2340.8 1806.77L2430.28 1683.69H2515.16L2425.67 1804.21Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M2793.54 1877.54C2793.54 1887.62 2794.91 1895.06 2797.64 1899.85C2800.38 1904.46 2805 1907.97 2811.49 1910.36L2794.82 1963.69C2778.24 1962.15 2764.48 1958.56 2753.54 1952.92C2742.77 1947.11 2734.31 1938.74 2728.16 1927.79C2718.07 1939.93 2705 1949.16 2688.93 1955.49C2673.03 1961.64 2656.19 1964.72 2638.41 1964.72C2619.95 1964.72 2603.71 1961.13 2589.7 1953.95C2575.85 1946.6 2565.17 1936.51 2557.64 1923.69C2550.12 1910.7 2546.36 1895.83 2546.36 1879.08C2546.36 1859.59 2551.58 1842.92 2562 1829.08C2572.43 1815.23 2587.56 1804.72 2607.39 1797.54C2627.22 1790.19 2651.06 1786.51 2678.93 1786.51H2715.59V1776.26C2715.59 1748.39 2697.64 1734.46 2661.75 1734.46C2652.69 1734.46 2641.23 1735.74 2627.39 1738.31C2613.71 1740.87 2600.29 1744.38 2587.13 1748.82L2568.41 1694.97C2585.51 1688.48 2603.54 1683.52 2622.52 1680.1C2641.49 1676.51 2658.84 1674.72 2674.57 1674.72C2714.57 1674.72 2744.4 1682.84 2764.06 1699.08C2783.71 1715.32 2793.54 1739.25 2793.54 1770.87V1877.54ZM2666.36 1906.77C2675.59 1906.77 2684.91 1904.12 2694.31 1898.82C2703.71 1893.35 2710.81 1886 2715.59 1876.77V1832.67H2695.59C2673.37 1832.67 2656.88 1836.09 2646.11 1842.92C2635.34 1849.76 2629.95 1859.93 2629.95 1873.44C2629.95 1884.03 2633.11 1892.24 2639.44 1898.05C2645.94 1903.86 2654.91 1906.77 2666.36 1906.77Z" style="fill: rgb(220, 27, 32);"/>
|
||||||
|
<path d="M862 1819C862 1848.27 838.271 1872 809 1872C779.729 1872 756 1848.27 756 1819C756 1789.73 779.729 1766 809 1766C838.271 1766 862 1789.73 862 1819Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<path d="M2215.5 1819C2215.5 1848.27 2191.77 1872 2162.5 1872C2133.23 1872 2109.5 1848.27 2109.5 1819C2109.5 1789.73 2133.23 1766 2162.5 1766C2191.77 1766 2215.5 1789.73 2215.5 1819Z" style="fill: rgb(219, 25, 31);"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear" x1="1499" y1="139" x2="1499" y2="1385.52" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#E41F26"/>
|
||||||
|
<stop offset="1" stop-color="#B70000"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
1
logo/built-in-badge.svg
Normal file
1
logo/built-in-badge.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="129" height="20" role="img" aria-label="babashka: built-in"><title>babashka: built-in</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="129" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="80" height="20" fill="#555"/><rect x="80" width="49" height="20" fill="#97ca00"/><rect width="129" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><image x="5" y="3" width="14" height="14" xlink:href="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDE0NzIgMTQ3MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05OTUuOTExIDExOTMuODlDMTExMC45MyAxMTEyLjM4IDExODYgOTc4LjIwNiAxMTg2IDgyNi41QzExODYgNTc3Ljk3MiAxMDE0IDI1NC41IDczNiAxMTNDNDYwLjUgMjYyIDI4NiA1NzcuOTcyIDI4NiA4MjYuNUMyODYgOTc4LjIwNiAzNjEuMDcgMTExMi4zOCA0NzYuMDg5IDExOTMuODlDNDcxLjk4MyAxMTk0LjQ0IDQ2Ny45NDkgMTE5NS4xNCA0NjQgMTE5NkMzNzYuNjExIDEyMTUuMDcgMjcwIDEzNTkuMDUgMjcwIDEzNTkuMDVINTM0QzU4MC45NzIgMTM1OS4wNSA2MjUuNjMxIDEzNDEuNDEgNjYwLjk1NiAxMzIxLjYyQzY3OC4xMTUgMTM0NC4zMiA3MDUuMzQ0IDEzNTkgNzM2IDEzNTlDNzY2LjY1NiAxMzU5IDc5My44ODUgMTM0NC4zMiA4MTEuMDQ0IDEzMjEuNjJDODQ2LjM2OSAxMzQxLjQxIDg5MS4wMjggMTM1OS4wNSA5MzggMTM1OS4wNUgxMjAyQzEyMDIgMTM1OS4wNSAxMDk1LjM5IDEyMTUuMDcgMTAwOCAxMTk2QzEwMDQuMDUgMTE5NS4xNCAxMDAwLjAyIDExOTQuNDQgOTk1LjkxMSAxMTkzLjg5WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyKSIvPgo8Y2lyY2xlIGN4PSI3MzUuNSIgY3k9Ijg1Mi41IiByPSIzMTEuNSIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTQ0MyA3NTAuNDE3QzY2MiA3NjUuODY2IDc5MS4zODIgNzEyLjM4OCA4ODEgNTc5Ljg4MUM4ODEgNTc5Ljg4MSA3MDguMjkzIDUyMS42NDkgNjAzLjI0NCA1NzkuODgxQzQ5OC41NSA2MzcuOTE2IDQ0MyA3NTAuNDE3IDQ0MyA3NTAuNDE3WiIgZmlsbD0iI0I0QjRCNCIvPgo8cGF0aCBkPSJNMTAzOS45OSA3NDguMjgyQzkxNC44NjIgNzM0Ljc0NSA4MDMuMjY0IDY5NC4xMzUgNzUwIDU0MUM3NTAgNTQxIDg2MC42MzMgNTY2LjI3MiA5NzIuMzU1IDY2OC4xMDFDMTA4OC4zOSA3NzMuODU3IDEwMzkuOTkgNzQ4LjI4MiAxMDM5Ljk5IDc0OC4yODJaIiBmaWxsPSIjQjRCNEI0Ii8+CjxjaXJjbGUgY3g9IjczNS41IiBjeT0iODUyLjUiIHI9IjMxMS41IiBzdHJva2U9IiMwQTAwMDAiIHN0cm9rZS13aWR0aD0iNDAiLz4KPHBhdGggZD0iTTc5NyA3MTlINjc0TDcwNCA3NDlWODM5QzcwOC41IDgwOS41IDc2NC41IDgwOC41IDc2Ny41IDgzOUw3NzUgNzQ5TDc5NyA3MTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMzUxLjExNyA3NTlDMzUxLjExNyA3MzYuOTA5IDM2OS4wMjYgNzE5IDM5MS4xMTcgNzE5SDY3Ni4wMThDNzAwLjIgNzE5IDcxOC44NTIgNzQwLjI5MiA3MTUuNjcgNzY0LjI2NEw2OTAuOTEgOTUwLjc2NEM2ODguMjcgOTcwLjY0NiA2NzEuMzE0IDk4NS41IDY1MS4yNTggOTg1LjVIMzkxLjExN0MzNjkuMDI2IDk4NS41IDM1MS4xMTcgOTY3LjU5MSAzNTEuMTE3IDk0NS41Vjc1OVoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik03NTYuMDEyIDc2NC4yNjdDNzUyLjgyOCA3NDAuMjk0IDc3MS40ODEgNzE5IDc5NS42NjQgNzE5SDEwODBDMTEwMi4wOSA3MTkgMTEyMCA3MzYuOTA5IDExMjAgNzU5Vjk0NS4wOTZDMTEyMCA5NjcuMTg3IDExMDIuMDkgOTg1LjA5NiAxMDgwIDk4NS4wOTZIODIwLjM4MUM4MDAuMzI1IDk4NS4wOTYgNzgzLjM3IDk3MC4yNDQgNzgwLjcyOSA5NTAuMzYyTDc1Ni4wMTIgNzY0LjI2N1oiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0xMDI0IDk1MlY5MjEuNDdIMTAxMy43MUMxMDA3LjAzIDkyMS40NyAxMDAyLjU4IDkxNi43NTIgMTAwMC4zNSA5MDkuODEzTDk1OC4wNjQgNzgyLjY5N0M5NTUuMjgyIDc3NC42NDkgOTUxLjk0NCA3NjguODIgOTQ3LjQ5MiA3NjQuMzc5QzkzOS4xNDYgNzU1Ljc3NSA5MjguMjk2IDc1MyA5MTYuMDU0IDc1M0g5MDIuN1Y3ODQuOTE4SDkxMS42MDNDOTE5LjExNSA3ODQuOTE4IDkyNC45NTcgNzg3LjY5MyA5MjcuNDYxIDc5Ni41NzVMOTMzLjMwMyA4MTcuMTEzTDg4MSA5NTJIOTE5LjExNUw5NTAuNTUzIDg2My4xODVMOTY3LjI0NSA5MTYuNzUyQzk3My42NDQgOTM3LjU2OCA5ODQuNDk0IDk1MiAxMDA4Ljk4IDk1MkgxMDI0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU5MCA5NTJWOTIxLjQ3SDU3OS43MDZDNTczLjAyOSA5MjEuNDcgNTY4LjU3OCA5MTYuNzUyIDU2Ni4zNTIgOTA5LjgxM0w1MjQuMDY0IDc4Mi42OTdDNTIxLjI4MiA3NzQuNjQ5IDUxNy45NDQgNzY4LjgyIDUxMy40OTIgNzY0LjM3OUM1MDUuMTQ2IDc1NS43NzUgNDk0LjI5NiA3NTMgNDgyLjA1NCA3NTNINDY4LjdWNzg0LjkxOEg0NzcuNjAzQzQ4NS4xMTUgNzg0LjkxOCA0OTAuOTU3IDc4Ny42OTMgNDkzLjQ2MSA3OTYuNTc1TDQ5OS4zMDMgODE3LjExM0w0NDcgOTUySDQ4NS4xMTVMNTE2LjU1MyA4NjMuMTg1TDUzMy4yNDUgOTE2Ljc1MkM1MzkuNjQ0IDkzNy41NjggNTUwLjQ5NCA5NTIgNTc0Ljk3NyA5NTJINTkwWiIgZmlsbD0id2hpdGUiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9Ijc1MiIgeTE9IjExMyIgeDI9Ijc1MiIgeTI9IjEzNTkuNTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0U0MUYyNiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNCNzAwMDAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K"/><text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">babashka</text><text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="530">babashka</text><text aria-hidden="true" x="1035" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="390">built-in</text><text x="1035" y="140" transform="scale(.1)" fill="#fff" textLength="390">built-in</text></g></svg>
|
||||||
|
After Width: | Height: | Size: 4.8 KiB |
2
pods
2
pods
|
|
@ -1 +1 @@
|
||||||
Subproject commit 66867eee7f050af0126c83c876f8031e0eae709a
|
Subproject commit 717cef7af5cb1c1b091bd10e012b2e71b7b8b9bc
|
||||||
2
process
2
process
|
|
@ -1 +1 @@
|
||||||
Subproject commit d7331aa5522c44bcd5be74abacf11dbf3903d764
|
Subproject commit 2058c79fb63f80ca71917432eddea73e0c58717c
|
||||||
58
project.clj
58
project.clj
|
|
@ -11,33 +11,41 @@
|
||||||
"babashka.core/src"
|
"babashka.core/src"
|
||||||
"babashka.nrepl/src" "depstar/src" "process/src"
|
"babashka.nrepl/src" "depstar/src" "process/src"
|
||||||
"deps.clj/src" "deps.clj/resources"
|
"deps.clj/src" "deps.clj/resources"
|
||||||
"reify/src"]
|
"impl-java/src"]
|
||||||
;; for debugging Reflector.java code:
|
;; for debugging Reflector.java code:
|
||||||
;; :java-source-paths ["sci/reflector/src-java"]
|
;; :java-source-paths ["sci/reflector/src-java"]
|
||||||
:java-source-paths ["src-java"]
|
:java-source-paths ["src-java"]
|
||||||
:resource-paths ["resources" "sci/resources"]
|
:resource-paths ["resources" "sci/resources"]
|
||||||
:test-selectors {:default (complement :windows-only)
|
:test-selectors {:default (complement (some-fn :windows-only :flaky))
|
||||||
:windows (complement :skip-windows)}
|
:windows (complement (some-fn :skip-windows :flaky))
|
||||||
:dependencies [[org.clojure/clojure "1.11.1"]
|
:non-flaky (complement :flaky)
|
||||||
[borkdude/edamame "1.0.0"]
|
:flaky :flaky}
|
||||||
[borkdude/graal.locking "0.0.2"]
|
:jvm-opts ["--enable-preview"]
|
||||||
[org.clojure/tools.cli "1.0.206"]
|
:dependencies [[org.clojure/clojure "1.12.0"]
|
||||||
[cheshire "5.11.0"]
|
[borkdude/edamame "1.4.30"]
|
||||||
[nrepl/bencode "1.1.0"]
|
[org.clojure/tools.cli "1.0.214"]
|
||||||
[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/sci.impl.types "0.0.2"]
|
||||||
[org.babashka/babashka.impl.reify "0.1.1"]
|
[org.babashka/babashka.impl.java "0.1.10"]
|
||||||
[org.clojure/core.async "1.5.648"]
|
[org.clojure/core.async "1.8.741"]
|
||||||
[org.clojure/test.check "1.1.1"]
|
[org.clojure/test.check "1.1.1"]
|
||||||
[com.github.clj-easy/graal-build-time "0.1.0"]
|
[com.github.clj-easy/graal-build-time "0.1.0"]
|
||||||
[rewrite-clj/rewrite-clj "1.0.699-alpha"]
|
[rewrite-clj/rewrite-clj "1.1.49"]
|
||||||
[insn/insn "0.5.2"]]
|
[insn/insn "0.5.2"]
|
||||||
|
[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"]]
|
:plugins [[org.kipz/lein-meta-bom "0.1.1"]]
|
||||||
:metabom {:jar-name "metabom.jar"}
|
:metabom {:jar-name "metabom.jar"}
|
||||||
:profiles {:feature/xml {:source-paths ["feature-xml"]
|
:profiles {:feature/xml {:source-paths ["feature-xml"]
|
||||||
:dependencies [[org.clojure/data.xml "0.2.0-alpha6"]]}
|
:dependencies [[org.clojure/data.xml "0.2.0-alpha8"]]}
|
||||||
:feature/yaml {:source-paths ["feature-yaml"]
|
:feature/yaml {:source-paths ["feature-yaml"]
|
||||||
:dependencies [[clj-commons/clj-yaml "0.7.108"]]}
|
:dependencies [[clj-commons/clj-yaml "1.0.29"
|
||||||
|
:exclusions [org.flatland/ordered]#_#_clj-commons/clj-yaml "0.7.110"]
|
||||||
|
[org.flatland/ordered "1.15.12"]]}
|
||||||
:feature/jdbc {:source-paths ["feature-jdbc"]
|
:feature/jdbc {:source-paths ["feature-jdbc"]
|
||||||
:dependencies [[seancorfield/next.jdbc "1.1.610"]]}
|
:dependencies [[seancorfield/next.jdbc "1.1.610"]]}
|
||||||
:feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}]
|
:feature/sqlite [:feature/jdbc {:dependencies [[org.xerial/sqlite-jdbc "3.36.0.3"]]}]
|
||||||
|
|
@ -48,25 +56,25 @@
|
||||||
:feature/csv {:source-paths ["feature-csv"]
|
:feature/csv {:source-paths ["feature-csv"]
|
||||||
:dependencies [[org.clojure/data.csv "1.0.0"]]}
|
:dependencies [[org.clojure/data.csv "1.0.0"]]}
|
||||||
:feature/transit {:source-paths ["feature-transit"]
|
:feature/transit {:source-paths ["feature-transit"]
|
||||||
:dependencies [[com.cognitect/transit-clj "1.0.329"]]}
|
:dependencies [[com.cognitect/transit-clj "1.0.333"]]}
|
||||||
:feature/datascript {:source-paths ["feature-datascript"]
|
:feature/datascript {:source-paths ["feature-datascript"]
|
||||||
:dependencies [[datascript "1.3.10"]]}
|
:dependencies [[datascript "1.3.10"]]}
|
||||||
:feature/httpkit-client {:source-paths ["feature-httpkit-client"]
|
: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"]
|
: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"]
|
:feature/lanterna {:source-paths ["feature-lanterna"]
|
||||||
:dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]}
|
:dependencies [[babashka/clojure-lanterna "0.9.8-SNAPSHOT"]]}
|
||||||
:feature/core-match {:source-paths ["feature-core-match"]
|
:feature/core-match {:source-paths ["feature-core-match"]
|
||||||
:dependencies [[org.clojure/core.match "1.0.0"]]}
|
:dependencies [[org.clojure/core.match "1.0.0"]]}
|
||||||
:feature/hiccup {:source-paths ["feature-hiccup"]
|
: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/test-check {:source-paths ["feature-test-check"]}
|
||||||
:feature/spec-alpha {:source-paths ["feature-spec-alpha"]}
|
:feature/spec-alpha {:source-paths ["feature-spec-alpha"]}
|
||||||
:feature/selmer {:source-paths ["feature-selmer"]
|
:feature/selmer {:source-paths ["feature-selmer"]
|
||||||
:dependencies [[selmer/selmer "1.12.50"]]}
|
:dependencies [[selmer/selmer "1.12.59"]]}
|
||||||
:feature/logging {:source-paths ["feature-logging"]
|
:feature/logging {:source-paths ["feature-logging"]
|
||||||
:dependencies [[com.taoensso/timbre "5.2.1"]
|
:dependencies [[com.taoensso/timbre "6.6.0"]
|
||||||
[org.clojure/tools.logging "1.1.0"]]}
|
[org.clojure/tools.logging "1.1.0"]]}
|
||||||
:feature/priority-map {:source-paths ["feature-priority-map"]
|
:feature/priority-map {:source-paths ["feature-priority-map"]
|
||||||
:dependencies [[org.clojure/data.priority-map "1.1.0"]]}
|
:dependencies [[org.clojure/data.priority-map "1.1.0"]]}
|
||||||
|
|
@ -90,8 +98,10 @@
|
||||||
:feature/logging
|
:feature/logging
|
||||||
:feature/priority-map
|
:feature/priority-map
|
||||||
:feature/rrb-vector
|
:feature/rrb-vector
|
||||||
{:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.0"]
|
{:dependencies [[borkdude/rewrite-edn "0.4.6"]
|
||||||
[com.opentable.components/otj-pg-embedded "0.13.3"]]}]
|
[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}
|
:uberjar {:global-vars {*assert* false}
|
||||||
:jvm-opts ["-Dclojure.compiler.direct-linking=true"
|
:jvm-opts ["-Dclojure.compiler.direct-linking=true"
|
||||||
"-Dclojure.spec.skip-macros=true"
|
"-Dclojure.spec.skip-macros=true"
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
0.8.156
|
1.12.200
|
||||||
|
|
@ -1 +1 @@
|
||||||
0.8.157-SNAPSHOT
|
1.12.201-SNAPSHOT
|
||||||
|
|
@ -16,39 +16,43 @@
|
||||||
"babashka.nrepl/src"
|
"babashka.nrepl/src"
|
||||||
"depstar/src" "process/src"
|
"depstar/src" "process/src"
|
||||||
"deps.clj/src" "deps.clj/resources"
|
"deps.clj/src" "deps.clj/resources"
|
||||||
"resources" "sci/resources"],
|
"resources" "sci/resources"
|
||||||
:deps {org.clojure/clojure {:mvn/version "1.11.1"},
|
"impl-java/src"],
|
||||||
|
:deps {org.clojure/clojure {:mvn/version "1.12.0"},
|
||||||
org.babashka/sci {:local/root "sci"}
|
org.babashka/sci {:local/root "sci"}
|
||||||
org.babashka/babashka.impl.reify {:mvn/version "0.1.1"}
|
org.babashka/babashka.impl.java {:mvn/version "0.1.10"}
|
||||||
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
org.babashka/sci.impl.types {:mvn/version "0.0.2"}
|
||||||
babashka/babashka.curl {:local/root "babashka.curl"}
|
babashka/babashka.curl {:local/root "babashka.curl"}
|
||||||
babashka/fs {:local/root "fs"}
|
babashka/fs {:local/root "fs"}
|
||||||
babashka/babashka.core {:local/root "babashka.core"}
|
babashka/babashka.core {:local/root "babashka.core"}
|
||||||
borkdude/graal.locking {:mvn/version "0.0.2"},
|
org.clojure/core.async {:mvn/version "1.8.741"},
|
||||||
org.clojure/core.async {:mvn/version "1.5.648"},
|
org.clojure/tools.cli {:mvn/version "1.0.214"},
|
||||||
org.clojure/tools.cli {:mvn/version "1.0.206"},
|
|
||||||
org.clojure/data.csv {:mvn/version "1.0.0"},
|
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-alpha6"}
|
org.clojure/data.xml {:mvn/version "0.2.0-alpha8"}
|
||||||
clj-commons/clj-yaml {:mvn/version "0.7.108"}
|
clj-commons/clj-yaml {:mvn/version "1.0.29"}
|
||||||
com.cognitect/transit-clj {:mvn/version "1.0.329"}
|
com.cognitect/transit-clj {:mvn/version "1.0.333"}
|
||||||
org.clojure/test.check {:mvn/version "1.1.1"}
|
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"}
|
seancorfield/next.jdbc {:mvn/version "1.1.610"}
|
||||||
org.postgresql/postgresql {:mvn/version "42.2.18"}
|
org.postgresql/postgresql {:mvn/version "42.2.18"}
|
||||||
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
|
org.hsqldb/hsqldb {:mvn/version "2.5.1"}
|
||||||
datascript/datascript {:mvn/version "1.0.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"}
|
babashka/clojure-lanterna {:mvn/version "0.9.8-SNAPSHOT"}
|
||||||
org.clojure/core.match {:mvn/version "1.0.0"}
|
org.clojure/core.match {:mvn/version "1.0.0"}
|
||||||
hiccup/hiccup {:mvn/version "2.0.0-alpha2"}
|
hiccup/hiccup {:mvn/version "2.0.0-RC1"}
|
||||||
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"}
|
rewrite-clj/rewrite-clj {:mvn/version "1.1.49"}
|
||||||
selmer/selmer {:mvn/version "1.12.50"}
|
selmer/selmer {:mvn/version "1.12.59"}
|
||||||
com.taoensso/timbre {:mvn/version "5.2.1"}
|
com.taoensso/timbre {:mvn/version "6.6.0"}
|
||||||
org.clojure/tools.logging {:mvn/version "1.1.0"}
|
org.clojure/tools.logging {:mvn/version "1.1.0"}
|
||||||
org.clojure/data.priority-map {:mvn/version "1.1.0"}
|
org.clojure/data.priority-map {:mvn/version "1.1.0"}
|
||||||
insn/insn {:mvn/version "0.5.2"}
|
insn/insn {:mvn/version "0.5.2"}
|
||||||
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}}
|
org.clojure/core.rrb-vector {:mvn/version "0.1.2"}
|
||||||
|
org.babashka/cli {:mvn/version "0.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
|
:aliases {:babashka/dev
|
||||||
{:main-opts ["-m" "babashka.main"]}
|
{:main-opts ["-m" "babashka.main"]}
|
||||||
:profile
|
:profile
|
||||||
|
|
@ -61,8 +65,8 @@
|
||||||
:lib-tests
|
:lib-tests
|
||||||
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
|
{:extra-paths ["process/src" "process/test" "test-resources/lib_tests"]
|
||||||
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
|
:extra-deps {org.clj-commons/clj-http-lite {:mvn/version "0.4.392"}
|
||||||
org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
|
#_#_org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha"
|
||||||
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
|
:sha "0dec1f88cbde74a0470b454396f09a03adb4ae39"}
|
||||||
lambdaisland/regal {:mvn/version "0.0.143"}
|
lambdaisland/regal {:mvn/version "0.0.143"}
|
||||||
cprop/cprop {:mvn/version "0.1.16"}
|
cprop/cprop {:mvn/version "0.1.16"}
|
||||||
comb/comb {:mvn/version "0.1.1"}
|
comb/comb {:mvn/version "0.1.1"}
|
||||||
|
|
@ -104,20 +108,22 @@
|
||||||
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
exoscale/coax {:mvn/version "1.0.0-alpha14"}
|
||||||
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
orchestra/orchestra {:mvn/version "2021.01.01-1"}
|
||||||
expound/expound {:mvn/version "0.8.10"}
|
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"}
|
com.stuartsierra/dependency {:mvn/version "1.0.0"}
|
||||||
listora/again {:mvn/version "1.0.0"}
|
listora/again {:mvn/version "1.0.0"}
|
||||||
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
org.clojure/tools.gitlibs {:mvn/version "2.4.172"}
|
||||||
environ/environ {:mvn/version "1.2.0"}
|
environ/environ {:mvn/version "1.2.0"}
|
||||||
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
|
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
|
||||||
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
|
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
|
||||||
org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
|
org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32",
|
||||||
|
:git/url "https://github.com/clojure/tools.namespace"}
|
||||||
medley/medley {:mvn/version "1.3.0"}
|
medley/medley {:mvn/version "1.3.0"}
|
||||||
io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"}
|
io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner",
|
||||||
|
:git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"}
|
||||||
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
||||||
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
|
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
|
||||||
testdoc/testdoc {:mvn/version "1.4.1"}
|
testdoc/testdoc {:mvn/version "1.4.1"}
|
||||||
org.clojars.lispyclouds/contajners {:mvn/version "0.0.4"}
|
org.clojars.lispyclouds/contajners {:mvn/version "0.0.6"}
|
||||||
borkdude/rewrite-edn {:mvn/version "0.1.0"}
|
borkdude/rewrite-edn {:mvn/version "0.1.0"}
|
||||||
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
|
clojure-term-colors/clojure-term-colors {:mvn/version "0.1.0"}
|
||||||
io.aviso/pretty {:mvn/version "1.1.1"}
|
io.aviso/pretty {:mvn/version "1.1.1"}
|
||||||
|
|
@ -138,7 +144,41 @@
|
||||||
com.github.seancorfield/expectations {:mvn/version "2.0.157"}
|
com.github.seancorfield/expectations {:mvn/version "2.0.157"}
|
||||||
com.rpl/specter {:mvn/version "1.1.4"}
|
com.rpl/specter {:mvn/version "1.1.4"}
|
||||||
com.github.askonomm/clarktown {:mvn/version "1.1.2"}
|
com.github.askonomm/clarktown {:mvn/version "1.1.2"}
|
||||||
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}}
|
org.clojure/math.numeric-tower {:git/tag "math.numeric-tower-0.0.5", :git/sha "12eb9c5", :git/url "https://github.com/clojure/math.numeric-tower"}
|
||||||
|
prismatic/schema {:git/url "https://github.com/plumatic/schema"
|
||||||
|
:git/sha "6846dc7c3a9df5bfd718f68f183c683ce0f621ff"
|
||||||
|
:git/tag "schema-1.3.0"}
|
||||||
|
metosin/malli {:git/url "https://github.com/metosin/malli"
|
||||||
|
:git/sha "588147ef49b2e41c7d12a8aa994b39c1c6fedd99"
|
||||||
|
:git/tag "0.8.9"}
|
||||||
|
meander/epsilon {:git/url "https://github.com/noprompt/meander"
|
||||||
|
:git/sha "55f5ce70e6ef717e95c58260f6bc725d70c0cb6d"}
|
||||||
|
cc.qbits/auspex {:git/url "https://github.com/mpenet/auspex"
|
||||||
|
:git/sha "1a9d7427e60e1a434a764aa820d1c53f7e22504a"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
exoscale/interceptor {:git/url "https://github.com/exoscale/interceptor"
|
||||||
|
:git/sha "ca115fe00a0abf3a2f78452ab309c3aa4c00fc4e"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
lambdaisland/uri {:git/url "https://github.com/lambdaisland/uri"
|
||||||
|
:git/sha "ac4f1f9c8e4f45a088db1c6383ce2191c973987c"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
clj-commons/fs {:mvn/version "1.6.310"}
|
||||||
|
postmortem/postmortem {:git/url "https://github.com/athos/Postmortem"
|
||||||
|
:git/sha "1a29775a3d286f9f6fe3f979c78b6e2bf298d5ba"}
|
||||||
|
com.github.rawleyfowler/sluj {:git/url "https://github.com/rawleyfowler/sluj"
|
||||||
|
:git/sha "4a92e772b4e07bf127423448d4140748b5782198"
|
||||||
|
:deps/manifest :deps}
|
||||||
|
net.cgrand/xforms {:git/url "https://github.com/cgrand/xforms"
|
||||||
|
:git/sha "550dbc150a79c6ecc148d8a7e260e10bc36321c6"
|
||||||
|
: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
|
:classpath-overrides {org.clojure/clojure nil
|
||||||
org.clojure/spec.alpha nil}}
|
org.clojure/spec.alpha nil}}
|
||||||
:clj-nvd
|
:clj-nvd
|
||||||
|
|
@ -148,9 +188,11 @@
|
||||||
:test
|
:test
|
||||||
{:extra-paths ["test"]
|
{:extra-paths ["test"]
|
||||||
:extra-deps {io.github.cognitect-labs/test-runner
|
:extra-deps {io.github.cognitect-labs/test-runner
|
||||||
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
|
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}
|
||||||
|
nubank/matcher-combinators {:mvn/version "3.6.0"}}
|
||||||
:main-opts ["-m" "cognitect.test-runner"]
|
:main-opts ["-m" "cognitect.test-runner"]
|
||||||
:exec-fn cognitect.test-runner.api/test}
|
:exec-fn cognitect.test-runner.api/test}
|
||||||
:test-pod
|
:test-pod
|
||||||
{:extra-paths ["test-resources"]
|
{:extra-paths ["test-resources"]
|
||||||
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
|
:main-opts ["-m" "babashka.main" "test-resources/pod.clj"]}}}
|
||||||
|
;; release
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,17 @@ Args=-H:+ReportExceptionStackTraces \
|
||||||
-J-Dborkdude.dynaload.aot=true \
|
-J-Dborkdude.dynaload.aot=true \
|
||||||
-H:IncludeResources=BABASHKA_VERSION \
|
-H:IncludeResources=BABASHKA_VERSION \
|
||||||
-H:IncludeResources=META-INF/babashka/.* \
|
-H:IncludeResources=META-INF/babashka/.* \
|
||||||
|
-H:IncludeResources=src/babashka/.* \
|
||||||
-H:IncludeResources=SCI_VERSION \
|
-H:IncludeResources=SCI_VERSION \
|
||||||
-H:Log=registerResource: \
|
-H:Log=registerResource:3 \
|
||||||
-H:EnableURLProtocols=http,https,jar \
|
--enable-url-protocols=http,https,jar,unix \
|
||||||
--enable-all-security-services \
|
--enable-all-security-services \
|
||||||
-H:+JNI \
|
-H:+JNI \
|
||||||
--no-server \
|
--no-server \
|
||||||
--report-unsupported-elements-at-runtime \
|
--report-unsupported-elements-at-runtime \
|
||||||
--initialize-at-build-time=com.fasterxml.jackson \
|
--initialize-at-build-time=com.fasterxml.jackson \
|
||||||
--initialize-at-build-time=java.sql.SQLException \
|
--initialize-at-build-time=java.sql.SQLException \
|
||||||
|
--initialize-at-build-time=org.yaml.snakeyaml \
|
||||||
--initialize-at-run-time=org.postgresql.sspi.SSPIClient \
|
--initialize-at-run-time=org.postgresql.sspi.SSPIClient \
|
||||||
--initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \
|
--initialize-at-run-time=org.httpkit.client.ClientSslEngineFactory$SSLHolder \
|
||||||
-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \
|
-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader \
|
||||||
|
|
@ -24,4 +26,32 @@ Args=-H:+ReportExceptionStackTraces \
|
||||||
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader \
|
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader \
|
||||||
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter \
|
-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter \
|
||||||
-H:ServiceLoaderFeatureExcludeServices=java.net.ContentHandlerFactory \
|
-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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
55
resources/UrlClassLoaderSubstitutions.java
Normal file
55
resources/UrlClassLoaderSubstitutions.java
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.security.AccessControlContext;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
|
import com.oracle.svm.core.annotate.Alias;
|
||||||
|
import com.oracle.svm.core.annotate.RecomputeFieldValue;
|
||||||
|
import com.oracle.svm.core.annotate.Substitute;
|
||||||
|
import com.oracle.svm.core.annotate.TargetClass;
|
||||||
|
|
||||||
|
@TargetClass(URLClassLoader.class)
|
||||||
|
@SuppressWarnings({"unused", "static-method"})
|
||||||
|
final class Target_java_net_URLClassLoader {
|
||||||
|
@Alias//
|
||||||
|
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.NewInstance, declClass = WeakHashMap.class)//
|
||||||
|
private WeakHashMap<Closeable, Void> closeables;
|
||||||
|
|
||||||
|
@Substitute
|
||||||
|
public InputStream getResourceAsStream(String name) throws IOException {
|
||||||
|
System.out.println("getResource");
|
||||||
|
return null;
|
||||||
|
// return Resources.createInputStream(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
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}))))
|
||||||
|
|
||||||
2014
resources/src/babashka/clojure/spec/alpha.clj
Normal file
2014
resources/src/babashka/clojure/spec/alpha.clj
Normal file
File diff suppressed because it is too large
Load diff
227
resources/src/babashka/clojure/spec/gen/alpha.clj
Normal file
227
resources/src/babashka/clojure/spec/gen/alpha.clj
Normal file
|
|
@ -0,0 +1,227 @@
|
||||||
|
; Copyright (c) Rich Hickey. All rights reserved.
|
||||||
|
; The use and distribution terms for this software are covered by the
|
||||||
|
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
||||||
|
; which can be found in the file epl-v10.html at the root of this distribution.
|
||||||
|
; By using this software in any fashion, you are agreeing to be bound by
|
||||||
|
; the terms of this license.
|
||||||
|
; You must not remove this notice, or any other, from this software.
|
||||||
|
|
||||||
|
(ns clojure.spec.gen.alpha
|
||||||
|
(:refer-clojure :exclude [boolean bytes cat hash-map list map not-empty set vector
|
||||||
|
char double int keyword symbol string uuid delay shuffle]))
|
||||||
|
|
||||||
|
(alias 'c 'clojure.core)
|
||||||
|
|
||||||
|
(defonce ^:private dynalock (Object.))
|
||||||
|
|
||||||
|
(defn- dynaload
|
||||||
|
[s]
|
||||||
|
(let [ns (namespace s)]
|
||||||
|
(assert ns)
|
||||||
|
(locking dynalock
|
||||||
|
(require (c/symbol ns)))
|
||||||
|
(let [v (resolve s)]
|
||||||
|
(if v
|
||||||
|
@v
|
||||||
|
(throw (RuntimeException. (str "Var " s " is not on the classpath")))))))
|
||||||
|
|
||||||
|
(def ^:private quick-check-ref
|
||||||
|
(c/delay (dynaload 'clojure.test.check/quick-check)))
|
||||||
|
(defn quick-check
|
||||||
|
[& args]
|
||||||
|
(apply @quick-check-ref args))
|
||||||
|
|
||||||
|
(def ^:private for-all*-ref
|
||||||
|
(c/delay (dynaload 'clojure.test.check.properties/for-all*)))
|
||||||
|
(defn for-all*
|
||||||
|
"Dynamically loaded clojure.test.check.properties/for-all*."
|
||||||
|
[& args]
|
||||||
|
(apply @for-all*-ref args))
|
||||||
|
|
||||||
|
(let [g? (c/delay (dynaload 'clojure.test.check.generators/generator?))
|
||||||
|
g (c/delay (dynaload 'clojure.test.check.generators/generate))
|
||||||
|
mkg (c/delay (dynaload 'clojure.test.check.generators/->Generator))]
|
||||||
|
(defn- generator?
|
||||||
|
[x]
|
||||||
|
(@g? x))
|
||||||
|
(defn- generator
|
||||||
|
[gfn]
|
||||||
|
(@mkg gfn))
|
||||||
|
(defn generate
|
||||||
|
"Generate a single value using generator."
|
||||||
|
[generator]
|
||||||
|
(@g generator)))
|
||||||
|
|
||||||
|
(defn ^:skip-wiki delay-impl
|
||||||
|
[gfnd]
|
||||||
|
;;N.B. depends on test.check impl details
|
||||||
|
(generator (fn [rnd size]
|
||||||
|
((:gen @gfnd) rnd size))))
|
||||||
|
|
||||||
|
(defmacro delay
|
||||||
|
"given body that returns a generator, returns a
|
||||||
|
generator that delegates to that, but delays
|
||||||
|
creation until used."
|
||||||
|
[& body]
|
||||||
|
`(delay-impl (c/delay ~@body)))
|
||||||
|
|
||||||
|
(defn gen-for-name
|
||||||
|
"Dynamically loads test.check generator named s."
|
||||||
|
[s]
|
||||||
|
(let [g (dynaload s)]
|
||||||
|
(if (generator? g)
|
||||||
|
g
|
||||||
|
(throw (RuntimeException. (str "Var " s " is not a generator"))))))
|
||||||
|
|
||||||
|
(defmacro ^:skip-wiki lazy-combinator
|
||||||
|
"Implementation macro, do not call directly."
|
||||||
|
[s]
|
||||||
|
(let [fqn (c/symbol "clojure.test.check.generators" (name s))
|
||||||
|
doc (str "Lazy loaded version of " fqn)]
|
||||||
|
`(let [g# (c/delay (dynaload '~fqn))]
|
||||||
|
(defn ~s
|
||||||
|
~doc
|
||||||
|
[& ~'args]
|
||||||
|
(apply @g# ~'args)))))
|
||||||
|
|
||||||
|
(defmacro ^:skip-wiki lazy-combinators
|
||||||
|
"Implementation macro, do not call directly."
|
||||||
|
[& syms]
|
||||||
|
`(do
|
||||||
|
~@(c/map
|
||||||
|
(fn [s] (c/list 'lazy-combinator s))
|
||||||
|
syms)))
|
||||||
|
|
||||||
|
(lazy-combinators hash-map list map not-empty set vector vector-distinct fmap elements
|
||||||
|
bind choose fmap one-of such-that tuple sample return
|
||||||
|
large-integer* double* frequency shuffle)
|
||||||
|
|
||||||
|
(defmacro ^:skip-wiki lazy-prim
|
||||||
|
"Implementation macro, do not call directly."
|
||||||
|
[s]
|
||||||
|
(let [fqn (c/symbol "clojure.test.check.generators" (name s))
|
||||||
|
doc (str "Fn returning " fqn)]
|
||||||
|
`(let [g# (c/delay (dynaload '~fqn))]
|
||||||
|
(defn ~s
|
||||||
|
~doc
|
||||||
|
[& ~'args]
|
||||||
|
@g#))))
|
||||||
|
|
||||||
|
(defmacro ^:skip-wiki lazy-prims
|
||||||
|
"Implementation macro, do not call directly."
|
||||||
|
[& syms]
|
||||||
|
`(do
|
||||||
|
~@(c/map
|
||||||
|
(fn [s] (c/list 'lazy-prim s))
|
||||||
|
syms)))
|
||||||
|
|
||||||
|
(lazy-prims any any-printable boolean bytes char char-alpha char-alphanumeric char-ascii double
|
||||||
|
int keyword keyword-ns large-integer ratio simple-type simple-type-printable
|
||||||
|
string string-ascii string-alphanumeric symbol symbol-ns uuid)
|
||||||
|
|
||||||
|
(defn cat
|
||||||
|
"Returns a generator of a sequence catenated from results of
|
||||||
|
gens, each of which should generate something sequential."
|
||||||
|
[& gens]
|
||||||
|
(fmap #(apply concat %)
|
||||||
|
(apply tuple gens)))
|
||||||
|
|
||||||
|
(defn- qualified? [ident] (not (nil? (namespace ident))))
|
||||||
|
|
||||||
|
(def ^:private
|
||||||
|
gen-builtins
|
||||||
|
(c/delay
|
||||||
|
(let [simple (simple-type-printable)]
|
||||||
|
{any? (one-of [(return nil) (any-printable)])
|
||||||
|
some? (such-that some? (any-printable))
|
||||||
|
number? (one-of [(large-integer) (double)])
|
||||||
|
integer? (large-integer)
|
||||||
|
int? (large-integer)
|
||||||
|
pos-int? (large-integer* {:min 1})
|
||||||
|
neg-int? (large-integer* {:max -1})
|
||||||
|
nat-int? (large-integer* {:min 0})
|
||||||
|
float? (double)
|
||||||
|
double? (double)
|
||||||
|
boolean? (boolean)
|
||||||
|
string? (string-alphanumeric)
|
||||||
|
ident? (one-of [(keyword-ns) (symbol-ns)])
|
||||||
|
simple-ident? (one-of [(keyword) (symbol)])
|
||||||
|
qualified-ident? (such-that qualified? (one-of [(keyword-ns) (symbol-ns)]))
|
||||||
|
keyword? (keyword-ns)
|
||||||
|
simple-keyword? (keyword)
|
||||||
|
qualified-keyword? (such-that qualified? (keyword-ns))
|
||||||
|
symbol? (symbol-ns)
|
||||||
|
simple-symbol? (symbol)
|
||||||
|
qualified-symbol? (such-that qualified? (symbol-ns))
|
||||||
|
uuid? (uuid)
|
||||||
|
uri? (fmap #(java.net.URI/create (str "http://" % ".com")) (uuid))
|
||||||
|
decimal? (fmap #(BigDecimal/valueOf %)
|
||||||
|
(double* {:infinite? false :NaN? false}))
|
||||||
|
inst? (fmap #(java.util.Date. %)
|
||||||
|
(large-integer))
|
||||||
|
seqable? (one-of [(return nil)
|
||||||
|
(list simple)
|
||||||
|
(vector simple)
|
||||||
|
(map simple simple)
|
||||||
|
(set simple)
|
||||||
|
(string-alphanumeric)])
|
||||||
|
indexed? (vector simple)
|
||||||
|
map? (map simple simple)
|
||||||
|
vector? (vector simple)
|
||||||
|
list? (list simple)
|
||||||
|
seq? (list simple)
|
||||||
|
char? (char)
|
||||||
|
set? (set simple)
|
||||||
|
nil? (return nil)
|
||||||
|
false? (return false)
|
||||||
|
true? (return true)
|
||||||
|
zero? (return 0)
|
||||||
|
rational? (one-of [(large-integer) (ratio)])
|
||||||
|
coll? (one-of [(map simple simple)
|
||||||
|
(list simple)
|
||||||
|
(vector simple)
|
||||||
|
(set simple)])
|
||||||
|
empty? (elements [nil '() [] {} #{}])
|
||||||
|
associative? (one-of [(map simple simple) (vector simple)])
|
||||||
|
sequential? (one-of [(list simple) (vector simple)])
|
||||||
|
ratio? (such-that ratio? (ratio))
|
||||||
|
bytes? (bytes)})))
|
||||||
|
|
||||||
|
(defn gen-for-pred
|
||||||
|
"Given a predicate, returns a built-in generator if one exists."
|
||||||
|
[pred]
|
||||||
|
(if (set? pred)
|
||||||
|
(elements pred)
|
||||||
|
(get @gen-builtins pred)))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(require :reload 'clojure.spec.gen.alpha)
|
||||||
|
(in-ns 'clojure.spec.gen.alpha)
|
||||||
|
|
||||||
|
;; combinators, see call to lazy-combinators above for complete list
|
||||||
|
(generate (one-of [(gen-for-pred integer?) (gen-for-pred string?)]))
|
||||||
|
(generate (such-that #(< 10000 %) (gen-for-pred integer?)))
|
||||||
|
(let [reqs {:a (gen-for-pred number?)
|
||||||
|
:b (gen-for-pred ratio?)}
|
||||||
|
opts {:c (gen-for-pred string?)}]
|
||||||
|
(generate (bind (choose 0 (count opts))
|
||||||
|
#(let [args (concat (seq reqs) (c/shuffle (seq opts)))]
|
||||||
|
(->> args
|
||||||
|
(take (+ % (count reqs)))
|
||||||
|
(mapcat identity)
|
||||||
|
(apply hash-map))))))
|
||||||
|
(generate (cat (list (gen-for-pred string?))
|
||||||
|
(list (gen-for-pred ratio?))))
|
||||||
|
|
||||||
|
;; load your own generator
|
||||||
|
(gen-for-name 'clojure.test.check.generators/int)
|
||||||
|
|
||||||
|
;; failure modes
|
||||||
|
(gen-for-name 'unqualified)
|
||||||
|
(gen-for-name 'clojure.core/+)
|
||||||
|
(gen-for-name 'clojure.core/name-does-not-exist)
|
||||||
|
(gen-for-name 'ns.does.not.exist/f)
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
579
resources/src/babashka/clojure/spec/test/alpha.clj
Normal file
579
resources/src/babashka/clojure/spec/test/alpha.clj
Normal file
|
|
@ -0,0 +1,579 @@
|
||||||
|
; Copyright (c) Rich Hickey. All rights reserved.
|
||||||
|
; The use and distribution terms for this software are covered by the
|
||||||
|
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
||||||
|
; which can be found in the file epl-v10.html at the root of this distribution.
|
||||||
|
; By using this software in any fashion, you are agreeing to be bound by
|
||||||
|
; the terms of this license.
|
||||||
|
; You must not remove this notice, or any other, from this software.
|
||||||
|
|
||||||
|
(ns clojure.spec.test.alpha
|
||||||
|
(:refer-clojure :exclude [test])
|
||||||
|
(:require
|
||||||
|
[clojure.pprint :as pp]
|
||||||
|
[clojure.spec.alpha :as s]
|
||||||
|
[clojure.spec.gen.alpha :as gen]
|
||||||
|
[clojure.string :as str]))
|
||||||
|
|
||||||
|
(in-ns 'clojure.spec.test.check)
|
||||||
|
(in-ns 'clojure.spec.test.alpha)
|
||||||
|
(alias 'stc 'clojure.spec.test.check)
|
||||||
|
|
||||||
|
(defn- throwable?
|
||||||
|
[x]
|
||||||
|
(instance? Throwable x))
|
||||||
|
|
||||||
|
(defn ->sym
|
||||||
|
[x]
|
||||||
|
(@#'s/->sym x))
|
||||||
|
|
||||||
|
(defn- ->var
|
||||||
|
[s-or-v]
|
||||||
|
(if (var? s-or-v)
|
||||||
|
s-or-v
|
||||||
|
(let [v (and (symbol? s-or-v) (resolve s-or-v))]
|
||||||
|
(if (var? v)
|
||||||
|
v
|
||||||
|
(throw (IllegalArgumentException. (str (pr-str s-or-v) " does not name a var")))))))
|
||||||
|
|
||||||
|
(defn- collectionize
|
||||||
|
[x]
|
||||||
|
(if (symbol? x)
|
||||||
|
(list x)
|
||||||
|
x))
|
||||||
|
|
||||||
|
(defn enumerate-namespace
|
||||||
|
"Given a symbol naming an ns, or a collection of such symbols,
|
||||||
|
returns the set of all symbols naming vars in those nses."
|
||||||
|
[ns-sym-or-syms]
|
||||||
|
(into
|
||||||
|
#{}
|
||||||
|
(mapcat (fn [ns-sym]
|
||||||
|
(map
|
||||||
|
(fn [name-sym]
|
||||||
|
(symbol (name ns-sym) (name name-sym)))
|
||||||
|
(keys (ns-interns ns-sym)))))
|
||||||
|
(collectionize ns-sym-or-syms)))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instrument ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(def ^:private ^:dynamic *instrument-enabled*
|
||||||
|
"if false, instrumented fns call straight through"
|
||||||
|
true)
|
||||||
|
|
||||||
|
(defn- fn-spec?
|
||||||
|
"Fn-spec must include at least :args or :ret specs."
|
||||||
|
[m]
|
||||||
|
(or (:args m) (:ret m)))
|
||||||
|
|
||||||
|
(defmacro with-instrument-disabled
|
||||||
|
"Disables instrument's checking of calls, within a scope."
|
||||||
|
[& body]
|
||||||
|
`(binding [*instrument-enabled* nil]
|
||||||
|
~@body))
|
||||||
|
|
||||||
|
(defn- thunk-frame? [s]
|
||||||
|
(str/includes? s "--KVS--EMULATION--THUNK--"))
|
||||||
|
|
||||||
|
(defn- interpret-stack-trace-element
|
||||||
|
"Given the vector-of-syms form of a stacktrace element produced
|
||||||
|
by e.g. Throwable->map, returns a map form that adds some keys
|
||||||
|
guessing the original Clojure names. Returns a map with
|
||||||
|
|
||||||
|
:class class name symbol from stack trace
|
||||||
|
:method method symbol from stack trace
|
||||||
|
:file filename from stack trace
|
||||||
|
:line line number from stack trace
|
||||||
|
:var-scope optional Clojure var symbol scoping fn def
|
||||||
|
:local-fn optional local Clojure symbol scoping fn def
|
||||||
|
|
||||||
|
For non-Clojure fns, :scope and :local-fn will be absent."
|
||||||
|
[[cls method file line]]
|
||||||
|
(let [clojure? (contains? '#{invoke invokeStatic} method)
|
||||||
|
demunge #(s/demunge %)
|
||||||
|
degensym #(str/replace % #"--.*" "")
|
||||||
|
[ns-sym name-sym local] (when clojure?
|
||||||
|
(->> (str/split (str cls) #"\$" 3)
|
||||||
|
(map demunge)))]
|
||||||
|
(merge {:file file
|
||||||
|
:line line
|
||||||
|
:method method
|
||||||
|
:class cls}
|
||||||
|
(when (and ns-sym name-sym)
|
||||||
|
{:var-scope (symbol ns-sym name-sym)})
|
||||||
|
(when local
|
||||||
|
{:local-fn (symbol (degensym local))
|
||||||
|
:thunk? (thunk-frame? local)}))))
|
||||||
|
|
||||||
|
(defn- stacktrace-relevant-to-instrument
|
||||||
|
"Takes a coll of stack trace elements (as returned by
|
||||||
|
StackTraceElement->vec) and returns a coll of maps as per
|
||||||
|
interpret-stack-trace-element that are relevant to a
|
||||||
|
failure in instrument."
|
||||||
|
[elems]
|
||||||
|
(let [plumbing? (fn [{:keys [var-scope thunk?]}]
|
||||||
|
(or thunk?
|
||||||
|
(contains? '#{clojure.spec.test.alpha/spec-checking-fn
|
||||||
|
clojure.core/apply}
|
||||||
|
var-scope)))]
|
||||||
|
(sequence (comp (map StackTraceElement->vec)
|
||||||
|
(map interpret-stack-trace-element)
|
||||||
|
(filter :var-scope)
|
||||||
|
(drop-while plumbing?))
|
||||||
|
elems)))
|
||||||
|
|
||||||
|
(defn- spec-checking-fn
|
||||||
|
"Takes a function name, a function f, and an fspec and returns a thunk that
|
||||||
|
first conforms the arguments given then calls f with those arguments if
|
||||||
|
the conform succeeds. Otherwise, an exception is thrown containing information
|
||||||
|
about the conform failure."
|
||||||
|
[fn-name f fn-spec]
|
||||||
|
(let [fn-spec (@#'s/maybe-spec fn-spec)
|
||||||
|
conform! (fn [fn-name role spec data args]
|
||||||
|
(let [conformed (s/conform spec data)]
|
||||||
|
(if (= ::s/invalid conformed)
|
||||||
|
(let [caller (->> (.getStackTrace (Thread/currentThread))
|
||||||
|
stacktrace-relevant-to-instrument
|
||||||
|
first)
|
||||||
|
ed (merge (assoc (s/explain-data* spec [] [] [] data)
|
||||||
|
::s/fn fn-name
|
||||||
|
::s/args args
|
||||||
|
::s/failure :instrument)
|
||||||
|
(when caller
|
||||||
|
{::caller (dissoc caller :class :method)}))]
|
||||||
|
(throw (ex-info
|
||||||
|
(str "Call to " fn-name " did not conform to spec.")
|
||||||
|
ed)))
|
||||||
|
conformed)))]
|
||||||
|
(fn
|
||||||
|
[& args]
|
||||||
|
(if *instrument-enabled*
|
||||||
|
(with-instrument-disabled
|
||||||
|
(when (:args fn-spec) (conform! fn-name :args (:args fn-spec) args args))
|
||||||
|
(binding [*instrument-enabled* true]
|
||||||
|
(.applyTo ^clojure.lang.IFn f args)))
|
||||||
|
(.applyTo ^clojure.lang.IFn f args)))))
|
||||||
|
|
||||||
|
(defn- no-fspec
|
||||||
|
[v spec]
|
||||||
|
(ex-info (str "Fn at " v " is not spec'ed.")
|
||||||
|
{:var v :spec spec ::s/failure :no-fspec}))
|
||||||
|
|
||||||
|
(defonce ^:private instrumented-vars (atom {}))
|
||||||
|
|
||||||
|
(defn- find-varargs-decl
|
||||||
|
"Takes an arglist and returns the restargs binding form if found, else nil."
|
||||||
|
[arglist]
|
||||||
|
(let [[_ decl :as restargs] (->> arglist
|
||||||
|
(split-with (complement #{'&}))
|
||||||
|
second)]
|
||||||
|
(and (= 2 (count restargs))
|
||||||
|
decl)))
|
||||||
|
|
||||||
|
(defn- has-kwargs? [arglists]
|
||||||
|
(->> arglists (some find-varargs-decl) map?))
|
||||||
|
|
||||||
|
(defn- kwargs->kvs
|
||||||
|
"Takes the restargs of a kwargs function call and checks for a trailing element.
|
||||||
|
If found, that element is flattened into a sequence of key->value pairs and
|
||||||
|
concatenated onto the preceding arguments."
|
||||||
|
[args]
|
||||||
|
(if (even? (count args))
|
||||||
|
args
|
||||||
|
(concat (butlast args)
|
||||||
|
(reduce-kv (fn [acc k v] (->> acc (cons v) (cons k)))
|
||||||
|
()
|
||||||
|
(last args)))))
|
||||||
|
|
||||||
|
(defn- gen-fixed-args-syms
|
||||||
|
"Takes an arglist and generates a vector of names corresponding to the fixed
|
||||||
|
args found."
|
||||||
|
[arglist]
|
||||||
|
(->> arglist (take-while (complement #{'&})) (map (fn [_] (gensym))) vec))
|
||||||
|
|
||||||
|
(defn- build-kwargs-body
|
||||||
|
"Takes a function name fn-name and arglist and returns code for a function body that
|
||||||
|
handles kwargs by calling fn-name with any fixed followed by its restargs transformed
|
||||||
|
from kwargs to kvs."
|
||||||
|
[fn-name arglist]
|
||||||
|
(let [alias (gensym "kwargs")
|
||||||
|
head-args (gen-fixed-args-syms arglist)]
|
||||||
|
(list (conj head-args '& alias)
|
||||||
|
`(apply ~fn-name ~@head-args (@#'kwargs->kvs ~alias)))))
|
||||||
|
|
||||||
|
(defn- build-varargs-body
|
||||||
|
"Takes a function name fn-name and arglist and returns code for a function body that
|
||||||
|
handles varargs by calling fn-name with any fixed args followed by its rest args."
|
||||||
|
[fn-name arglist]
|
||||||
|
(let [head-args (gen-fixed-args-syms arglist)
|
||||||
|
alias (gensym "restargs")]
|
||||||
|
(list (conj head-args '& alias)
|
||||||
|
`(apply ~fn-name ~@head-args ~alias))))
|
||||||
|
|
||||||
|
(defn- build-fixed-args-body
|
||||||
|
"Takes a function name fn-name and arglist and returns code for a function body that
|
||||||
|
handles fixed args by calling fn-name with its fixed args."
|
||||||
|
[fn-name arglist]
|
||||||
|
(let [arglist (gen-fixed-args-syms arglist)]
|
||||||
|
(list arglist
|
||||||
|
`(~fn-name ~@arglist))))
|
||||||
|
|
||||||
|
(defn- build-flattener-code
|
||||||
|
"Takes argslists and generates code for a HOF that given a function, returns a forwarding thunk
|
||||||
|
of analogous arglists that ensures that kwargs are passed as kvs to the original function."
|
||||||
|
[arglists]
|
||||||
|
(let [closed-over-name (gensym "inner")]
|
||||||
|
`(fn [~closed-over-name]
|
||||||
|
(fn ~'--KVS--EMULATION--THUNK--
|
||||||
|
~@(map (fn [arglist]
|
||||||
|
(let [varargs-decl (find-varargs-decl arglist)]
|
||||||
|
(cond (map? varargs-decl) (build-kwargs-body closed-over-name arglist)
|
||||||
|
varargs-decl (build-varargs-body closed-over-name arglist)
|
||||||
|
:default (build-fixed-args-body closed-over-name arglist))))
|
||||||
|
(or arglists
|
||||||
|
'([& args])))))))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
;; Given a function with the arglists (([a]) ([a b]) ([a b & kvs]))
|
||||||
|
;; the flattener generated is below (with some gensym name cleanup for readability)
|
||||||
|
(fn [inner]
|
||||||
|
(fn
|
||||||
|
([G__a] (inner G__a))
|
||||||
|
([G__a G__b] (inner G__a G__b))
|
||||||
|
([G__a G__b & G__kvs]
|
||||||
|
(apply inner G__a G__b (if (even? (count G__kvs))
|
||||||
|
G__kvs
|
||||||
|
(reduce-kv (fn [acc k v]
|
||||||
|
(->> acc (cons v) (cons k)))
|
||||||
|
(butlast G__kvs)
|
||||||
|
(last G__kvs)))))))
|
||||||
|
)
|
||||||
|
|
||||||
|
(defn- maybe-wrap-kvs-emulation
|
||||||
|
"Takes an argslist and function f and returns f except when arglists
|
||||||
|
contains a kwargs binding, else wraps f with a forwarding thunk that
|
||||||
|
flattens a trailing map into kvs if present in the kwargs call."
|
||||||
|
[f arglists]
|
||||||
|
(if (has-kwargs? arglists)
|
||||||
|
(let [flattener-code (build-flattener-code arglists)
|
||||||
|
kvs-emu (eval flattener-code)]
|
||||||
|
(kvs-emu f))
|
||||||
|
f))
|
||||||
|
|
||||||
|
(defn- instrument-choose-fn
|
||||||
|
"Helper for instrument."
|
||||||
|
[f spec sym {over :gen :keys [stub replace]}]
|
||||||
|
(if (some #{sym} stub)
|
||||||
|
(-> spec (s/gen over) gen/generate)
|
||||||
|
(get replace sym f)))
|
||||||
|
|
||||||
|
(defn- instrument-choose-spec
|
||||||
|
"Helper for instrument"
|
||||||
|
[spec sym {overrides :spec}]
|
||||||
|
(get overrides sym spec))
|
||||||
|
|
||||||
|
(defn- instrument-1
|
||||||
|
[s opts]
|
||||||
|
(when-let [v (resolve s)]
|
||||||
|
(when-not (-> v meta :macro)
|
||||||
|
(let [spec (s/get-spec v)
|
||||||
|
{:keys [raw wrapped]} (get @instrumented-vars v)
|
||||||
|
current @v
|
||||||
|
to-wrap (if (= wrapped current) raw current)
|
||||||
|
ospec (or (instrument-choose-spec spec s opts)
|
||||||
|
(throw (no-fspec v spec)))
|
||||||
|
ofn (instrument-choose-fn to-wrap ospec s opts)
|
||||||
|
checked (spec-checking-fn (->sym v) ofn ospec)
|
||||||
|
arglists (->> v meta :arglists (sort-by count) seq)
|
||||||
|
wrapped (maybe-wrap-kvs-emulation checked arglists)]
|
||||||
|
(alter-var-root v (constantly wrapped))
|
||||||
|
(swap! instrumented-vars assoc v {:raw to-wrap :wrapped wrapped})
|
||||||
|
(->sym v)))))
|
||||||
|
|
||||||
|
(defn- unstrument-1
|
||||||
|
[s]
|
||||||
|
(when-let [v (resolve s)]
|
||||||
|
(when-let [{:keys [raw wrapped]} (get @instrumented-vars v)]
|
||||||
|
(swap! instrumented-vars dissoc v)
|
||||||
|
(let [current @v]
|
||||||
|
(when (= wrapped current)
|
||||||
|
(alter-var-root v (constantly raw))
|
||||||
|
(->sym v))))))
|
||||||
|
|
||||||
|
(defn- opt-syms
|
||||||
|
"Returns set of symbols referenced by 'instrument' opts map"
|
||||||
|
[opts]
|
||||||
|
(reduce into #{} [(:stub opts) (keys (:replace opts)) (keys (:spec opts))]))
|
||||||
|
|
||||||
|
(defn- fn-spec-name?
|
||||||
|
[s]
|
||||||
|
(and (symbol? s)
|
||||||
|
(not (some-> (resolve s) meta :macro))))
|
||||||
|
|
||||||
|
(defn instrumentable-syms
|
||||||
|
"Given an opts map as per instrument, returns the set of syms
|
||||||
|
that can be instrumented."
|
||||||
|
([] (instrumentable-syms nil))
|
||||||
|
([opts]
|
||||||
|
(assert (every? ident? (keys (:gen opts))) "instrument :gen expects ident keys")
|
||||||
|
(reduce into #{} [(filter fn-spec-name? (keys (s/registry)))
|
||||||
|
(keys (:spec opts))
|
||||||
|
(:stub opts)
|
||||||
|
(keys (:replace opts))])))
|
||||||
|
|
||||||
|
(defn instrument
|
||||||
|
"Instruments the vars named by sym-or-syms, a symbol or collection
|
||||||
|
of symbols, or all instrumentable vars if sym-or-syms is not
|
||||||
|
specified.
|
||||||
|
|
||||||
|
If a var has an :args fn-spec, sets the var's root binding to a
|
||||||
|
fn that checks arg conformance (throwing an exception on failure)
|
||||||
|
before delegating to the original fn.
|
||||||
|
|
||||||
|
The opts map can be used to override registered specs, and/or to
|
||||||
|
replace fn implementations entirely. Opts for symbols not included
|
||||||
|
in sym-or-syms are ignored. This facilitates sharing a common
|
||||||
|
options map across many different calls to instrument.
|
||||||
|
|
||||||
|
The opts map may have the following keys:
|
||||||
|
|
||||||
|
:spec a map from var-name symbols to override specs
|
||||||
|
:stub a set of var-name symbols to be replaced by stubs
|
||||||
|
:gen a map from spec names to generator overrides
|
||||||
|
:replace a map from var-name symbols to replacement fns
|
||||||
|
|
||||||
|
:spec overrides registered fn-specs with specs your provide. Use
|
||||||
|
:spec overrides to provide specs for libraries that do not have
|
||||||
|
them, or to constrain your own use of a fn to a subset of its
|
||||||
|
spec'ed contract.
|
||||||
|
|
||||||
|
:stub replaces a fn with a stub that checks :args, then uses the
|
||||||
|
:ret spec to generate a return value.
|
||||||
|
|
||||||
|
:gen overrides are used only for :stub generation.
|
||||||
|
|
||||||
|
:replace replaces a fn with a fn that checks args conformance, then
|
||||||
|
invokes the fn you provide, enabling arbitrary stubbing and mocking.
|
||||||
|
|
||||||
|
:spec can be used in combination with :stub or :replace.
|
||||||
|
|
||||||
|
Returns a collection of syms naming the vars instrumented."
|
||||||
|
([] (instrument (instrumentable-syms)))
|
||||||
|
([sym-or-syms] (instrument sym-or-syms nil))
|
||||||
|
([sym-or-syms opts]
|
||||||
|
(locking instrumented-vars
|
||||||
|
(into
|
||||||
|
[]
|
||||||
|
(comp (filter (instrumentable-syms opts))
|
||||||
|
(distinct)
|
||||||
|
(map #(instrument-1 % opts))
|
||||||
|
(remove nil?))
|
||||||
|
(collectionize sym-or-syms)))))
|
||||||
|
|
||||||
|
(defn unstrument
|
||||||
|
"Undoes instrument on the vars named by sym-or-syms, specified
|
||||||
|
as in instrument. With no args, unstruments all instrumented vars.
|
||||||
|
Returns a collection of syms naming the vars unstrumented."
|
||||||
|
([] (unstrument (map ->sym (keys @instrumented-vars))))
|
||||||
|
([sym-or-syms]
|
||||||
|
(locking instrumented-vars
|
||||||
|
(into
|
||||||
|
[]
|
||||||
|
(comp (filter symbol?)
|
||||||
|
(map unstrument-1)
|
||||||
|
(remove nil?))
|
||||||
|
(collectionize sym-or-syms)))))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; testing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn- explain-check
|
||||||
|
[args spec v role]
|
||||||
|
(ex-info
|
||||||
|
"Specification-based check failed"
|
||||||
|
(when-not (s/valid? spec v nil)
|
||||||
|
(assoc (s/explain-data* spec [role] [] [] v)
|
||||||
|
::args args
|
||||||
|
::val v
|
||||||
|
::s/failure :check-failed))))
|
||||||
|
|
||||||
|
(defn- check-call
|
||||||
|
"Returns true if call passes specs, otherwise *returns* an exception
|
||||||
|
with explain-data + ::s/failure."
|
||||||
|
[f specs args]
|
||||||
|
(let [cargs (when (:args specs) (s/conform (:args specs) args))]
|
||||||
|
(if (= cargs ::s/invalid)
|
||||||
|
(explain-check args (:args specs) args :args)
|
||||||
|
(let [ret (apply f args)
|
||||||
|
cret (when (:ret specs) (s/conform (:ret specs) ret))]
|
||||||
|
(if (= cret ::s/invalid)
|
||||||
|
(explain-check args (:ret specs) ret :ret)
|
||||||
|
(if (and (:args specs) (:ret specs) (:fn specs))
|
||||||
|
(if (s/valid? (:fn specs) {:args cargs :ret cret})
|
||||||
|
true
|
||||||
|
(explain-check args (:fn specs) {:args cargs :ret cret} :fn))
|
||||||
|
true))))))
|
||||||
|
|
||||||
|
(defn- quick-check
|
||||||
|
[f specs {gen :gen opts ::stc/opts}]
|
||||||
|
(let [{:keys [num-tests] :or {num-tests 1000}} opts
|
||||||
|
g (try (s/gen (:args specs) gen) (catch Throwable t t))]
|
||||||
|
(if (throwable? g)
|
||||||
|
{:result g}
|
||||||
|
(let [prop (gen/for-all* [g] #(check-call f specs %))]
|
||||||
|
(apply gen/quick-check num-tests prop (mapcat identity opts))))))
|
||||||
|
|
||||||
|
(defn- make-check-result
|
||||||
|
"Builds spec result map."
|
||||||
|
[check-sym spec test-check-ret]
|
||||||
|
(merge {:spec spec
|
||||||
|
::stc/ret test-check-ret}
|
||||||
|
(when check-sym
|
||||||
|
{:sym check-sym})
|
||||||
|
(when-let [result (-> test-check-ret :result)]
|
||||||
|
(when-not (true? result) {:failure result}))
|
||||||
|
(when-let [shrunk (-> test-check-ret :shrunk)]
|
||||||
|
{:failure (:result shrunk)})))
|
||||||
|
|
||||||
|
(defn- check-1
|
||||||
|
[{:keys [s f v spec]} opts]
|
||||||
|
(let [re-inst? (and v (seq (unstrument s)) true)
|
||||||
|
f (or f (when v @v))
|
||||||
|
specd (s/spec spec)]
|
||||||
|
(try
|
||||||
|
(cond
|
||||||
|
(or (nil? f) (some-> v meta :macro))
|
||||||
|
{:failure (ex-info "No fn to spec" {::s/failure :no-fn})
|
||||||
|
:sym s :spec spec}
|
||||||
|
|
||||||
|
(:args specd)
|
||||||
|
(let [tcret (quick-check f specd opts)]
|
||||||
|
(make-check-result s spec tcret))
|
||||||
|
|
||||||
|
:default
|
||||||
|
{:failure (ex-info "No :args spec" {::s/failure :no-args-spec})
|
||||||
|
:sym s :spec spec})
|
||||||
|
(finally
|
||||||
|
(when re-inst? (instrument s))))))
|
||||||
|
|
||||||
|
(defn- sym->check-map
|
||||||
|
[s]
|
||||||
|
(let [v (resolve s)]
|
||||||
|
{:s s
|
||||||
|
:v v
|
||||||
|
:spec (when v (s/get-spec v))}))
|
||||||
|
|
||||||
|
(defn- validate-check-opts
|
||||||
|
[opts]
|
||||||
|
(assert (every? ident? (keys (:gen opts))) "check :gen expects ident keys"))
|
||||||
|
|
||||||
|
(defn check-fn
|
||||||
|
"Runs generative tests for fn f using spec and opts. See
|
||||||
|
'check' for options and return."
|
||||||
|
([f spec] (check-fn f spec nil))
|
||||||
|
([f spec opts]
|
||||||
|
(validate-check-opts opts)
|
||||||
|
(check-1 {:f f :spec spec} opts)))
|
||||||
|
|
||||||
|
(defn checkable-syms
|
||||||
|
"Given an opts map as per check, returns the set of syms that
|
||||||
|
can be checked."
|
||||||
|
([] (checkable-syms nil))
|
||||||
|
([opts]
|
||||||
|
(validate-check-opts opts)
|
||||||
|
(reduce into #{} [(filter fn-spec-name? (keys (s/registry)))
|
||||||
|
(keys (:spec opts))])))
|
||||||
|
|
||||||
|
(defn check
|
||||||
|
"Run generative tests for spec conformance on vars named by
|
||||||
|
sym-or-syms, a symbol or collection of symbols. If sym-or-syms
|
||||||
|
is not specified, check all checkable vars.
|
||||||
|
|
||||||
|
The opts map includes the following optional keys, where stc
|
||||||
|
aliases clojure.spec.test.check:
|
||||||
|
|
||||||
|
::stc/opts opts to flow through test.check/quick-check
|
||||||
|
:gen map from spec names to generator overrides
|
||||||
|
|
||||||
|
The ::stc/opts include :num-tests in addition to the keys
|
||||||
|
documented by test.check. Generator overrides are passed to
|
||||||
|
spec/gen when generating function args.
|
||||||
|
|
||||||
|
Returns a lazy sequence of check result maps with the following
|
||||||
|
keys
|
||||||
|
|
||||||
|
:spec the spec tested
|
||||||
|
:sym optional symbol naming the var tested
|
||||||
|
:failure optional test failure
|
||||||
|
::stc/ret optional value returned by test.check/quick-check
|
||||||
|
|
||||||
|
The value for :failure can be any exception. Exceptions thrown by
|
||||||
|
spec itself will have an ::s/failure value in ex-data:
|
||||||
|
|
||||||
|
:check-failed at least one checked return did not conform
|
||||||
|
:no-args-spec no :args spec provided
|
||||||
|
:no-fn no fn provided
|
||||||
|
:no-fspec no fspec provided
|
||||||
|
:no-gen unable to generate :args
|
||||||
|
:instrument invalid args detected by instrument
|
||||||
|
"
|
||||||
|
([] (check (checkable-syms)))
|
||||||
|
([sym-or-syms] (check sym-or-syms nil))
|
||||||
|
([sym-or-syms opts]
|
||||||
|
(->> (collectionize sym-or-syms)
|
||||||
|
(filter (checkable-syms opts))
|
||||||
|
(pmap
|
||||||
|
#(check-1 (sym->check-map %) opts)))))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check reporting ;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn- failure-type
|
||||||
|
[x]
|
||||||
|
(::s/failure (ex-data x)))
|
||||||
|
|
||||||
|
(defn- unwrap-failure
|
||||||
|
[x]
|
||||||
|
(if (failure-type x)
|
||||||
|
(ex-data x)
|
||||||
|
x))
|
||||||
|
|
||||||
|
(defn- result-type
|
||||||
|
"Returns the type of the check result. This can be any of the
|
||||||
|
::s/failure keywords documented in 'check', or:
|
||||||
|
|
||||||
|
:check-passed all checked fn returns conformed
|
||||||
|
:check-threw checked fn threw an exception"
|
||||||
|
[ret]
|
||||||
|
(let [failure (:failure ret)]
|
||||||
|
(cond
|
||||||
|
(nil? failure) :check-passed
|
||||||
|
(failure-type failure) (failure-type failure)
|
||||||
|
:default :check-threw)))
|
||||||
|
|
||||||
|
(defn abbrev-result
|
||||||
|
"Given a check result, returns an abbreviated version
|
||||||
|
suitable for summary use."
|
||||||
|
[x]
|
||||||
|
(if (:failure x)
|
||||||
|
(-> (dissoc x ::stc/ret)
|
||||||
|
(update :spec s/describe)
|
||||||
|
(update :failure unwrap-failure))
|
||||||
|
(dissoc x :spec ::stc/ret)))
|
||||||
|
|
||||||
|
(defn summarize-results
|
||||||
|
"Given a collection of check-results, e.g. from 'check', pretty
|
||||||
|
prints the summary-result (default abbrev-result) of each.
|
||||||
|
|
||||||
|
Returns a map with :total, the total number of results, plus a
|
||||||
|
key with a count for each different :type of result."
|
||||||
|
([check-results] (summarize-results check-results abbrev-result))
|
||||||
|
([check-results summary-result]
|
||||||
|
(reduce
|
||||||
|
(fn [summary result]
|
||||||
|
(pp/pprint (summary-result result))
|
||||||
|
(-> summary
|
||||||
|
(update :total inc)
|
||||||
|
(update (result-type result) (fnil inc 0))))
|
||||||
|
{:total 0}
|
||||||
|
check-results)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2
sci
2
sci
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6c859336a92d91418611a70152a5590889d88814
|
Subproject commit e85433a0214114fdceb4ca896e1b9c27b1bdf713
|
||||||
|
|
@ -30,7 +30,9 @@
|
||||||
:repo "babashka"
|
:repo "babashka"
|
||||||
:file file
|
:file file
|
||||||
:tag (str "v" current-version)
|
:tag (str "v" current-version)
|
||||||
:draft true})
|
:draft true
|
||||||
|
:overwrite (str/ends-with? current-version "SNAPSHOT")
|
||||||
|
:sha256 true})
|
||||||
(ghr/overwrite-asset {:org "babashka"
|
(ghr/overwrite-asset {:org "babashka"
|
||||||
:repo "babashka-dev-builds"
|
:repo "babashka-dev-builds"
|
||||||
:file file
|
:file file
|
||||||
|
|
@ -38,6 +40,8 @@
|
||||||
;; do not set, because we are posting to another repo
|
;; do not set, because we are posting to another repo
|
||||||
:target-commitish false
|
:target-commitish false
|
||||||
:draft false
|
:draft false
|
||||||
:prerelease true}))
|
:prerelease true
|
||||||
|
:overwrite (str/ends-with? current-version "SNAPSHOT")
|
||||||
|
:sha256 true}))
|
||||||
(println "Skipping release artifact (no GITHUB_TOKEN or not on main branch)"))
|
(println "Skipping release artifact (no GITHUB_TOKEN or not on main branch)"))
|
||||||
nil))
|
nil))
|
||||||
|
|
|
||||||
16
script/built_in.clj
Executable file
16
script/built_in.clj
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(ns built-in
|
||||||
|
(:require [babashka.fs :as fs]
|
||||||
|
[babashka.process :refer [shell]]))
|
||||||
|
|
||||||
|
;; copy clojure spec as built-in
|
||||||
|
(fs/with-temp-dir [tmp-dir {}]
|
||||||
|
(let [tmp-dir (fs/file tmp-dir)]
|
||||||
|
(shell {:dir tmp-dir} "git clone https://github.com/babashka/spec.alpha")
|
||||||
|
(let [spec-dir (fs/file tmp-dir "spec.alpha")]
|
||||||
|
(shell {:dir spec-dir} "git reset 951b49b8c173244e66443b8188e3ff928a0a71e7 --hard")
|
||||||
|
(fs/copy-tree (fs/file spec-dir "src" "main" "clojure") (fs/file "resources" "src" "babashka")
|
||||||
|
{:replace-existing true}))))
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
;; GraalVM Community Edition 19.3.2 based on OpenJDK 8u252
|
;; GraalVM Community Edition 19.3.2 based on OpenJDK 8u252
|
||||||
;; GraalVM Community Edition 19.3.2 based on OpenJDK 11.0.7
|
;; GraalVM Community Edition 19.3.2 based on OpenJDK 11.0.7
|
||||||
;;
|
;;
|
||||||
;; Currently we use GraalVM java11-20.1.0
|
;; Currently we use GraalVM java19-20.1.0
|
||||||
|
|
||||||
(ns bump-graal-version
|
(ns bump-graal-version
|
||||||
(:require [clojure.string :as str]
|
(:require [clojure.string :as str]
|
||||||
|
|
@ -31,8 +31,8 @@
|
||||||
""
|
""
|
||||||
"./bump_graal_version.clj -g 19.3.2 (the new version)"
|
"./bump_graal_version.clj -g 19.3.2 (the new version)"
|
||||||
"or"
|
"or"
|
||||||
"./bump_graal_version.clj -g 19.3.2 --java java11"
|
"./bump_graal_version.clj -g 19.3.2 --java java19"
|
||||||
"(for GraalVM java11-19.3.2)"
|
"(for GraalVM java19-19.3.2)"
|
||||||
""]
|
""]
|
||||||
(str/join \newline))))
|
(str/join \newline))))
|
||||||
|
|
||||||
|
|
@ -43,7 +43,10 @@
|
||||||
".github/workflows/build.yml"
|
".github/workflows/build.yml"
|
||||||
".circleci/config.yml"
|
".circleci/config.yml"
|
||||||
"appveyor.yml"
|
"appveyor.yml"
|
||||||
"project.clj"])
|
"project.clj"
|
||||||
|
"script/bump_graal_version.clj"
|
||||||
|
".cirrus.yml"
|
||||||
|
"script/install-graalvm"])
|
||||||
|
|
||||||
;; We might have to keep changing these from
|
;; We might have to keep changing these from
|
||||||
;; time to time whenever the version is bumped
|
;; time to time whenever the version is bumped
|
||||||
|
|
@ -51,10 +54,7 @@
|
||||||
;; OR
|
;; OR
|
||||||
;;
|
;;
|
||||||
;; We could have them as environment variables
|
;; We could have them as environment variables
|
||||||
(def current-graal-version "22.0.0.2")
|
(def current-graal-version "24")
|
||||||
(def current-java-version "java11")
|
|
||||||
(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0" "21.0.0" "21.1.0" "21.2.0" "21.3.0" "22.0.0.2" "22.1.0"])
|
|
||||||
(def valid-java-bumps ["java8" "java11"])
|
|
||||||
|
|
||||||
(def cl-options
|
(def cl-options
|
||||||
[["-g" "--graal VERSION" "graal version"]
|
[["-g" "--graal VERSION" "graal version"]
|
||||||
|
|
@ -65,8 +65,8 @@
|
||||||
(:options (cli/parse-opts *command-line-args* cl-options)))
|
(:options (cli/parse-opts *command-line-args* cl-options)))
|
||||||
|
|
||||||
(defn is-valid-bump?
|
(defn is-valid-bump?
|
||||||
[version valid-bumps]
|
[_version _valid-bumps]
|
||||||
(some #(= % version) valid-bumps))
|
true)
|
||||||
|
|
||||||
(defn replace-current
|
(defn replace-current
|
||||||
[file current new]
|
[file current new]
|
||||||
|
|
@ -90,19 +90,12 @@
|
||||||
[args]
|
[args]
|
||||||
(when (empty? args)
|
(when (empty? args)
|
||||||
(display-help))
|
(display-help))
|
||||||
(let [new-graal-version (:graal args)
|
(let [new-graal-version (:graal args)]
|
||||||
new-java-version (:java args)]
|
|
||||||
(when (not (nil? new-graal-version))
|
(when (not (nil? new-graal-version))
|
||||||
(if (is-valid-bump? new-graal-version valid-graal-bumps)
|
(if (is-valid-bump? new-graal-version nil)
|
||||||
(do
|
(do
|
||||||
(println "Performing Graal bump...")
|
(println "Performing Graal bump...")
|
||||||
(bump-current current-graal-version new-graal-version))
|
(bump-current current-graal-version new-graal-version))
|
||||||
(show-error new-graal-version)))
|
(show-error new-graal-version)))))
|
||||||
(when (not (nil? new-java-version))
|
|
||||||
(if (is-valid-bump? new-java-version valid-java-bumps)
|
|
||||||
(do
|
|
||||||
(println "Performing Java bump...")
|
|
||||||
(bump-current current-java-version new-java-version))
|
|
||||||
(show-error new-java-version)))))
|
|
||||||
|
|
||||||
(exec-script cl-args)
|
(exec-script cl-args)
|
||||||
|
|
|
||||||
15
script/check_glibc.sh
Executable file
15
script/check_glibc.sh
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
function ver_lte() {
|
||||||
|
printf '%s\n%s' "$1" "$2" | sort -C -V
|
||||||
|
}
|
||||||
|
|
||||||
|
max_glibc_version="2.31"
|
||||||
|
current_glibc_version=$(ldd --version | head -1 | awk '{print $4}' | cut -d "-" -f 1)
|
||||||
|
|
||||||
|
function bail() {
|
||||||
|
echo "glibc greater than max version ${max_glibc_version}: ${current_glibc_version}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ver_lte "${current_glibc_version}" "${max_glibc_version}" || bail
|
||||||
|
|
@ -26,17 +26,6 @@ fi
|
||||||
export JAVA_HOME=$GRAALVM_HOME
|
export JAVA_HOME=$GRAALVM_HOME
|
||||||
export PATH=$GRAALVM_HOME/bin:$PATH
|
export PATH=$GRAALVM_HOME/bin:$PATH
|
||||||
|
|
||||||
rm -rf resources/*.class
|
|
||||||
# SVM_JAR=$(find -L "$GRAALVM_HOME" | grep svm.jar)
|
|
||||||
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffCoreServicesDependencies.java
|
|
||||||
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffSunAwtWwwContentAudioAiff.java
|
|
||||||
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffMisc.java
|
|
||||||
if [ -z "$BABASHKA_JAR" ]; then
|
|
||||||
lein with-profiles +reflection,+native-image "do" run
|
|
||||||
lein "do" clean, uberjar, metabom
|
|
||||||
BABASHKA_JAR=${BABASHKA_JAR:-"target/babashka-$BABASHKA_VERSION-standalone.jar"}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# because script/test cleans target during ci before the jar can we saved
|
# because script/test cleans target during ci before the jar can we saved
|
||||||
cp target/metabom.jar .
|
cp target/metabom.jar .
|
||||||
|
|
||||||
|
|
@ -50,24 +39,29 @@ args=("-jar" "$BABASHKA_JAR"
|
||||||
# "-H:DashboardDump=reports/dump"
|
# "-H:DashboardDump=reports/dump"
|
||||||
# "-H:+DashboardPretty"
|
# "-H:+DashboardPretty"
|
||||||
# "-H:+DashboardJson"
|
# "-H:+DashboardJson"
|
||||||
"-H:ReportAnalysisForbiddenType=java.awt.Toolkit:InHeap,Allocated"
|
# "-H:ReportAnalysisForbiddenType=java.awt.Toolkit:Instantiated"
|
||||||
"--verbose"
|
"--verbose"
|
||||||
"--no-fallback"
|
"--no-fallback"
|
||||||
"--native-image-info"
|
"--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
|
# --trace-class-initialization=jdk.internal.net.http.common.DebugLogger,jdk.internal.net.http.websocket.WebSocketImpl,jdk.internal.net.http.common.Utils
|
||||||
"$BABASHKA_XMX")
|
"$BABASHKA_XMX"
|
||||||
|
"--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_STATIC=${BABASHKA_STATIC:-}
|
||||||
BABASHKA_MUSL=${BABASHKA_MUSL:-}
|
BABASHKA_MUSL=${BABASHKA_MUSL:-}
|
||||||
|
|
||||||
if [ "$BABASHKA_STATIC" = "true" ]; then
|
if [ "$BABASHKA_STATIC" = "true" ]; then
|
||||||
args+=("--static")
|
|
||||||
if [ "$BABASHKA_MUSL" = "true" ]; then
|
if [ "$BABASHKA_MUSL" = "true" ]; then
|
||||||
|
args+=("--static")
|
||||||
args+=("--libc=musl"
|
args+=("--libc=musl"
|
||||||
# see https://github.com/oracle/graal/issues/3398
|
# see https://github.com/oracle/graal/issues/3398
|
||||||
"-H:CCompilerOption=-Wl,-z,stack-size=2097152")
|
"-H:CCompilerOption=-Wl,-z,stack-size=2097152")
|
||||||
else
|
else
|
||||||
# see https://github.com/oracle/graal/issues/3737
|
# see https://github.com/oracle/graal/issues/3737
|
||||||
|
args+=("-H:+UnlockExperimentalVMOptions")
|
||||||
args+=("-H:+StaticExecutableWithDynamicLibC")
|
args+=("-H:+StaticExecutableWithDynamicLibC")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
@ -78,6 +72,12 @@ if [ "$BABASHKA_FEATURE_HSQLDB" = "true" ]; then
|
||||||
args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql")
|
args+=("-H:IncludeResources=org/hsqldb/.*\.properties" "-H:IncludeResources=org/hsqldb/.*\.sql")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
BABASHKA_FEATURE_POSTGRESQL=${BABASHKA_FEATURE_POSTGRESQL:-}
|
||||||
|
|
||||||
|
if [ "$BABASHKA_FEATURE_POSTGRESQL" = "true" ]; then
|
||||||
|
args+=("--initialize-at-build-time=org.postgresql.PGProperty")
|
||||||
|
fi
|
||||||
|
|
||||||
BABASHKA_FEATURE_SELMER=${BABASHKA_FEATURE_SELMER:-}
|
BABASHKA_FEATURE_SELMER=${BABASHKA_FEATURE_SELMER:-}
|
||||||
|
|
||||||
if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then
|
if [ "$BABASHKA_FEATURE_SELMER" = "true" ]; then
|
||||||
|
|
@ -92,7 +92,7 @@ then
|
||||||
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
|
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
|
||||||
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
|
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
|
||||||
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
|
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
|
||||||
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}"
|
export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
|
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
|
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
|
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
|
||||||
|
|
@ -107,4 +107,14 @@ then
|
||||||
export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}"
|
export BABASHKA_FEATURE_PRIORITY_MAP="${BABASHKA_FEATURE_PRIORITY_MAP:-false}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
"$GRAALVM_HOME/bin/native-image" "${args[@]}"
|
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,14 +23,27 @@ Rem -H:EnableURLProtocols=jar,http,https is also not supported.
|
||||||
|
|
||||||
call %GRAALVM_HOME%\bin\gu.cmd install native-image
|
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 ^
|
call %GRAALVM_HOME%\bin\native-image.cmd ^
|
||||||
"-jar" "target/babashka-%BABASHKA_VERSION%-standalone.jar" ^
|
"-jar" "target/babashka-%BABASHKA_VERSION%-standalone.jar" ^
|
||||||
"-H:Name=bb" ^
|
"-H:Name=bb" ^
|
||||||
"-H:+ReportExceptionStackTraces" ^
|
"-H:+ReportExceptionStackTraces" ^
|
||||||
"--verbose" ^
|
"--verbose" ^
|
||||||
"--no-fallback" ^
|
"--no-fallback" ^
|
||||||
"%BABASHKA_XMX%"
|
"--enable-preview" ^
|
||||||
|
"--install-exit-handlers" ^
|
||||||
|
"-march=compatibility" ^
|
||||||
|
"-O1" ^
|
||||||
|
"%BABASHKA_XMX%" ^
|
||||||
|
%*
|
||||||
|
|
||||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
|
|
||||||
call bb "(+ 1 2 3)"
|
call bb "(+ 1 2 3)"
|
||||||
|
call bb describe
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
CLOJURE_TOOLS_VERSION="1.10.3.1040"
|
CLOJURE_TOOLS_VERSION="1.11.1.1200"
|
||||||
|
|
||||||
install_dir="${1:-/usr/local}"
|
install_dir="${1:-/usr/local}"
|
||||||
mkdir -p "$install_dir"
|
mkdir -p "$install_dir"
|
||||||
|
|
|
||||||
|
|
@ -4,34 +4,33 @@ set -euo pipefail
|
||||||
|
|
||||||
INSTALL_DIR="${1:-$HOME}"
|
INSTALL_DIR="${1:-$HOME}"
|
||||||
|
|
||||||
GRAALVM_VERSION="${GRAALVM_VERSION:-21.2.0}"
|
GRAALVM_VERSION="${GRAALVM_VERSION:-24}"
|
||||||
|
|
||||||
case "$BABASHKA_PLATFORM" in
|
GRAALVM_PLATFORM=$BABASHKA_PLATFORM
|
||||||
macos)
|
|
||||||
GRAALVM_PLATFORM="darwin"
|
|
||||||
;;
|
|
||||||
linux)
|
|
||||||
GRAALVM_PLATFORM="linux"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "${BABASHKA_ARCH:-}" in
|
case "${BABASHKA_ARCH:-}" in
|
||||||
aarch64)
|
aarch64)
|
||||||
GRAALVM_ARCH="aarch64"
|
GRAALVM_ARCH="aarch64"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
GRAALVM_ARCH="amd64"
|
GRAALVM_ARCH="x64"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
GRAALVM_FILENAME="graalvm-ce-java11-$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
|
pushd "$INSTALL_DIR" >/dev/null
|
||||||
|
|
||||||
if ! [ -d "graalvm-ce-java11-$GRAALVM_VERSION" ]; then
|
if ! [ -d "$GRAALVM_DIR_NAME" ]; then
|
||||||
echo "Downloading GraalVM $GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION on '$PWD'..."
|
echo "Downloading GraalVM $GRAALVM_PLATFORM-$GRAALVM_ARCH-$GRAALVM_VERSION on '$PWD'..."
|
||||||
curl -O -sL "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-$GRAALVM_VERSION/$GRAALVM_FILENAME"
|
echo "$DOWNLOAD_URL"
|
||||||
tar xzf "$GRAALVM_FILENAME"
|
curl --fail -LO "$DOWNLOAD_URL"
|
||||||
|
ls -la
|
||||||
|
mkdir "$GRAALVM_DIR_NAME"
|
||||||
|
tar xzvf "$GRAALVM_FILENAME" -C "$GRAALVM_DIR_NAME" --strip-components 1
|
||||||
|
ls -la "$GRAALVM_DIR_NAME"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,20 @@
|
||||||
|
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
|
: "${BABASHKA_TEST_ENV:=jvm}"
|
||||||
|
export BABASHKA_TEST_ENV
|
||||||
|
|
||||||
if [ "$BABASHKA_TEST_ENV" = "native" ]; then
|
if [ "$BABASHKA_TEST_ENV" = "native" ]; then
|
||||||
BB_CMD="./bb"
|
BB_CMD="./bb"
|
||||||
else
|
else
|
||||||
BB_CMD="lein bb"
|
BB_CMD="lein bb"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export PATH
|
||||||
|
PATH=$(pwd)/process/target/test/on-path:$PATH
|
||||||
|
|
||||||
export BABASHKA_CLASSPATH
|
export BABASHKA_CLASSPATH
|
||||||
BABASHKA_CLASSPATH=$(clojure -A:lib-tests -Spath)
|
BABASHKA_CLASSPATH=$(clojure -Spath -A:lib-tests)
|
||||||
|
|
||||||
$BB_CMD -cp "$BABASHKA_CLASSPATH" \
|
$BB_CMD -cp "$BABASHKA_CLASSPATH" \
|
||||||
-f "test-resources/lib_tests/babashka/run_all_libtests.clj" "$@"
|
-f "test-resources/lib_tests/babashka/run_all_libtests.clj" "$@"
|
||||||
|
|
|
||||||
|
|
@ -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)
|
if "%BABASHKA_TEST_ENV%" EQU "native" (set BB_CMD=.\bb) else (set BB_CMD=lein bb)
|
||||||
|
|
||||||
set EDN=lib_tests.edn
|
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 -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 %*
|
%BB_CMD% --config %EDN% --deps-root . -f test-resources/lib_tests/babashka/run_all_libtests.clj %*
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ fi
|
||||||
|
|
||||||
apt-get update -y && apt-get install musl-tools -y
|
apt-get update -y && apt-get install musl-tools -y
|
||||||
|
|
||||||
ZLIB_VERSION="1.2.11"
|
ZLIB_VERSION="1.2.13"
|
||||||
ZLIB_SHA256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1"
|
ZLIB_SHA256="b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30"
|
||||||
|
|
||||||
# stable archive path
|
# stable archive path
|
||||||
curl -O -sL --fail --show-error "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz"
|
curl -O -sL --fail --show-error "https://zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz"
|
||||||
|
|
|
||||||
16
script/test
16
script/test
|
|
@ -1,5 +1,7 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
if [ "$GRAALVM_HOME" != "" ]
|
if [ "$GRAALVM_HOME" != "" ]
|
||||||
then
|
then
|
||||||
export JAVA_HOME=$GRAALVM_HOME
|
export JAVA_HOME=$GRAALVM_HOME
|
||||||
|
|
@ -8,7 +10,6 @@ fi
|
||||||
|
|
||||||
java -version
|
java -version
|
||||||
|
|
||||||
set -eo pipefail
|
|
||||||
unset BABASHKA_PRELOADS
|
unset BABASHKA_PRELOADS
|
||||||
unset BABASHKA_CLASSPATH
|
unset BABASHKA_CLASSPATH
|
||||||
unset BABASHKA_PRELOADS_TEST
|
unset BABASHKA_PRELOADS_TEST
|
||||||
|
|
@ -16,6 +17,9 @@ unset BABASHKA_PRELOADS_TEST
|
||||||
echo "running tests part 1"
|
echo "running tests part 1"
|
||||||
lein "do" clean, test "$@"
|
lein "do" clean, test "$@"
|
||||||
|
|
||||||
|
echo "running flaky tests"
|
||||||
|
lein "do" clean, test :flaky || true
|
||||||
|
|
||||||
export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'
|
export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'
|
||||||
export BABASHKA_PRELOADS_TEST=true
|
export BABASHKA_PRELOADS_TEST=true
|
||||||
echo "running tests part 2"
|
echo "running tests part 2"
|
||||||
|
|
@ -37,3 +41,13 @@ lein test :only babashka.pod-test
|
||||||
|
|
||||||
export BABASHKA_SOCKET_REPL_TEST=true
|
export BABASHKA_SOCKET_REPL_TEST=true
|
||||||
lein test :only babashka.impl.socket-repl-test
|
lein test :only babashka.impl.socket-repl-test
|
||||||
|
|
||||||
|
# test invoking script in subdir with bb.edn in parent dir
|
||||||
|
unset BABASHKA_PRELOADS
|
||||||
|
unset BABASHKA_CLASSPATH
|
||||||
|
pushd test-resources/bb_in_root_script_in_other_dir
|
||||||
|
if [[ $BABASHKA_TEST_ENV = "native" ]]
|
||||||
|
then
|
||||||
|
../../bb dir/script.clj
|
||||||
|
fi
|
||||||
|
popd
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ set BABASHKA_POD_TEST=
|
||||||
set BABASHKA_SOCKET_REPL_TEST=
|
set BABASHKA_SOCKET_REPL_TEST=
|
||||||
|
|
||||||
echo "running tests part 1"
|
echo "running tests part 1"
|
||||||
call lein do clean, test :windows || exit /B 1
|
call lein do clean, test %* || exit /B 1
|
||||||
|
|
||||||
|
echo "running flaky tests"
|
||||||
|
REM there's no "or exit" here because we don't want flaky tests to fail the script
|
||||||
|
call lein do clean, test :flaky
|
||||||
|
|
||||||
set BABASHKA_PRELOADS=(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")
|
set BABASHKA_PRELOADS=(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")
|
||||||
set BABASHKA_PRELOADS_TEST=true
|
set BABASHKA_PRELOADS_TEST=true
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ then
|
||||||
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
|
export BABASHKA_FEATURE_XML="${BABASHKA_FEATURE_XML:-false}"
|
||||||
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
|
export BABASHKA_FEATURE_YAML="${BABASHKA_FEATURE_YAML:-false}"
|
||||||
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
|
export BABASHKA_FEATURE_CSV="${BABASHKA_FEATURE_CSV:-false}"
|
||||||
export BABAHSKA_FEATURE_TRANSIT="${BABAHSKA_FEATURE_TRANSIT:-false}"
|
export BABASHKA_FEATURE_TRANSIT="${BABASHKA_FEATURE_TRANSIT:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
|
export BABASHKA_FEATURE_JAVA_TIME="${BABASHKA_FEATURE_JAVA_TIME:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
|
export BABASHKA_FEATURE_JAVA_NET_HTTP="${BABASHKA_FEATURE_JAVA_NET_HTTP:-false}"
|
||||||
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
|
export BABASHKA_FEATURE_JAVA_NIO="${BABASHKA_FEATURE_JAVA_NIO:-false}"
|
||||||
|
|
@ -175,8 +175,18 @@ else
|
||||||
BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector"
|
BABASHKA_LEIN_PROFILES+=",-feature/rrb-vector"
|
||||||
fi
|
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
|
cp deps.edn resources/META-INF/babashka/deps.edn
|
||||||
|
|
||||||
|
rm -rf resources/*.class
|
||||||
|
# SVM_JAR=$(find -L "$GRAALVM_HOME" | grep svm.jar)
|
||||||
|
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/UrlClassLoaderSubstitutions.java
|
||||||
|
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffSunAwtWwwContentAudioAiff.java
|
||||||
|
# "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffMisc.java
|
||||||
|
|
||||||
if [ -z "$BABASHKA_JAR" ]; then
|
if [ -z "$BABASHKA_JAR" ]; then
|
||||||
lein with-profiles "$BABASHKA_LEIN_PROFILES,+reflection,-uberjar" do run
|
lein with-profiles "$BABASHKA_LEIN_PROFILES,+reflection,-uberjar" do run
|
||||||
lein with-profiles "$BABASHKA_LEIN_PROFILES" do clean, uberjar, metabom
|
lein with-profiles "$BABASHKA_LEIN_PROFILES" do clean, uberjar, metabom
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,49 @@
|
||||||
(ns aaaa-this-has-to-be-first.because-patches
|
(ns aaaa-this-has-to-be-first.because-patches
|
||||||
;; we need pprint loaded first, it patches pprint to not bloat the GraalVM binary
|
;; we need pprint loaded first, it patches pprint to not bloat the GraalVM binary
|
||||||
(:require [babashka.impl.patches.datafy]
|
(:require [babashka.impl.patches.datafy]
|
||||||
[babashka.impl.pprint]))
|
[babashka.impl.pprint]
|
||||||
|
))
|
||||||
|
|
||||||
|
;; Enable this for scanning requiring usage:
|
||||||
|
(def enable-require-scan
|
||||||
|
"(do
|
||||||
|
(def old-require require)
|
||||||
|
(def old-resolve resolve)
|
||||||
|
|
||||||
|
(def our-requiring-resolve (fn [sym]
|
||||||
|
(let [ns (symbol (namespace sym))]
|
||||||
|
(old-require ns)
|
||||||
|
(old-resolve sym))))
|
||||||
|
|
||||||
|
(defn static-requiring-resolve [form _ _]
|
||||||
|
(prn :req-resolve form :args (rest form))
|
||||||
|
`(let [res# (our-requiring-resolve ~@(rest form))]
|
||||||
|
res#))
|
||||||
|
|
||||||
|
(alter-var-root #'requiring-resolve (constantly @#'static-requiring-resolve))
|
||||||
|
(doto #'requiring-resolve (.setMacro))
|
||||||
|
|
||||||
|
(defn static-require [& [&form _bindings & syms]]
|
||||||
|
(when (meta &form)
|
||||||
|
(prn :require &form (meta &form) *file*))
|
||||||
|
`(old-require ~@syms))
|
||||||
|
(alter-var-root #'require (constantly @#'static-require))
|
||||||
|
(doto #'require (.setMacro))
|
||||||
|
|
||||||
|
(alter-var-root #'clojure.core/serialized-require (constantly (fn [& args]
|
||||||
|
(prn :serialized-req args)))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(defn static-resolve [& [&form _bindings & syms]]
|
||||||
|
(when (meta &form)
|
||||||
|
(prn :require &form (meta &form) *file*))
|
||||||
|
`(old-resolve ~@syms))
|
||||||
|
(alter-var-root #'resolve (constantly @#'static-resolve))
|
||||||
|
(doto #'resolve (.setMacro))
|
||||||
|
")
|
||||||
|
|
||||||
|
|
||||||
|
(when (System/getenv "BABASHKA_REQUIRE_SCAN")
|
||||||
|
(load-string enable-require-scan))
|
||||||
|
;; ---
|
||||||
|
|
|
||||||
|
|
@ -22,30 +22,29 @@
|
||||||
|
|
||||||
Examples:
|
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\".
|
\"6\n\".
|
||||||
|
|
||||||
(-> @(clojure) :exit) starts a clojure REPL, waits for it
|
(-> @(clojure) :exit) starts a clojure REPL, waits for it
|
||||||
to finish and returns the exit code from the process."
|
to finish and returns the exit code from the process."
|
||||||
([] (clojure []))
|
[& args]
|
||||||
([args] (clojure args nil))
|
(let [{:keys [cmd opts prev]} (p/parse-args args)
|
||||||
([args opts]
|
opts (merge {:in :inherit
|
||||||
(let [opts (merge {:in :inherit
|
:out :inherit
|
||||||
:out :inherit
|
:err :inherit
|
||||||
:err :inherit
|
:shutdown p/destroy-tree}
|
||||||
:shutdown p/destroy-tree}
|
opts)]
|
||||||
opts)]
|
(binding [*in* @sci/in
|
||||||
(binding [*in* @sci/in
|
*out* @sci/out
|
||||||
*out* @sci/out
|
*err* @sci/err
|
||||||
*err* @sci/err
|
deps/*dir* (:dir opts)
|
||||||
deps/*dir* (:dir opts)
|
deps/*aux-process-fn* (fn [{:keys [cmd out]}]
|
||||||
deps/*env* (:env opts)
|
(pp/shell (assoc opts :out out :cmd cmd)))
|
||||||
deps/*extra-env* (:extra-env opts)
|
deps/*clojure-process-fn* (fn [{:keys [cmd]}]
|
||||||
deps/*process-fn* (fn
|
(pp/process* {:cmd cmd
|
||||||
([cmd] (pp/process cmd opts))
|
:prev prev
|
||||||
([cmd _] (pp/process cmd opts)))
|
:opts opts}))
|
||||||
deps/*exit-fn* (fn
|
deps/*exit-fn* (fn [{:keys [message]}]
|
||||||
([_])
|
(when message
|
||||||
([_exit-code msg]
|
(throw (Exception. message))))]
|
||||||
(throw (Exception. msg))))]
|
(apply deps/-main cmd))))
|
||||||
(apply deps/-main (map str args))))))
|
|
||||||
|
|
|
||||||
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
|
(ns babashka.impl.cheshire
|
||||||
{:no-doc true}
|
{:no-doc true}
|
||||||
(:require [cheshire.core :as json]
|
(:require [cheshire.core :as json]
|
||||||
|
[cheshire.factory :as fact]
|
||||||
[sci.core :as sci :refer [copy-var]]))
|
[sci.core :as sci :refer [copy-var]]))
|
||||||
|
|
||||||
(def tns (sci/create-ns 'cheshire.core nil))
|
(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
|
(def cheshire-core-namespace
|
||||||
{'encode (copy-var json/encode tns)
|
{'encode (copy-var generate-string tns)
|
||||||
'generate-string (copy-var json/generate-string tns)
|
'generate-string (copy-var generate-string tns)
|
||||||
'encode-stream (copy-var json/encode-stream tns)
|
'encode-stream (copy-var generate-stream tns)
|
||||||
'generate-stream (copy-var json/generate-stream tns)
|
'generate-stream (copy-var generate-stream tns)
|
||||||
;;'encode-smile (copy-var json/encode-smile tns)
|
;;'encode-smile (copy-var json/encode-smile tns)
|
||||||
;;'generate-smile (copy-var json/generate-smile tns)
|
;;'generate-smile (copy-var json/generate-smile tns)
|
||||||
'decode (copy-var json/decode tns)
|
'decode (copy-var parse-string tns)
|
||||||
'parse-string (copy-var json/parse-string tns)
|
'parse-string (copy-var parse-string tns)
|
||||||
'parse-string-strict (copy-var json/parse-string-strict tns)
|
'parse-string-strict (copy-var parse-string-strict tns)
|
||||||
;;'parse-smile (copy-var json/parse-smile tns)
|
;;'parse-smile (copy-var json/parse-smile tns)
|
||||||
'parse-stream (copy-var json/parse-stream tns)
|
'parse-stream (copy-var parse-stream tns)
|
||||||
'parse-stream-strict (copy-var json/parse-stream-strict tns)
|
'parse-stream-strict (copy-var parse-stream-strict tns)
|
||||||
'parsed-seq (copy-var json/parsed-seq tns)
|
'parsed-seq (copy-var parsed-seq tns)
|
||||||
;;'parsed-smile-seq (copy-var json/parsed-smile-seq tns)
|
;;'parsed-smile-seq (copy-var json/parsed-smile-seq tns)
|
||||||
;;'decode-smile (copy-var json/decode-smile tns)
|
;;'decode-smile (copy-var json/decode-smile tns)
|
||||||
'default-pretty-print-options (copy-var json/default-pretty-print-options tns)
|
'default-pretty-print-options (copy-var json/default-pretty-print-options tns)
|
||||||
'create-pretty-printer (copy-var json/create-pretty-printer 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)})
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,22 @@
|
||||||
[babashka.impl.features :as features]
|
[babashka.impl.features :as features]
|
||||||
[babashka.impl.proxy :as proxy]
|
[babashka.impl.proxy :as proxy]
|
||||||
[cheshire.core :as json]
|
[cheshire.core :as json]
|
||||||
|
[clojure.core.async]
|
||||||
|
[sci.core :as sci]
|
||||||
[sci.impl.types :as t]))
|
[sci.impl.types :as t]))
|
||||||
|
|
||||||
|
(set! *warn-on-reflection* true)
|
||||||
|
|
||||||
|
(def has-of-virtual?
|
||||||
|
(some #(= "ofVirtual" (.getName ^java.lang.reflect.Method %))
|
||||||
|
(.getMethods Thread)))
|
||||||
|
|
||||||
|
(def has-domain-sockets?
|
||||||
|
(resolve 'java.net.UnixDomainSocketAddress))
|
||||||
|
|
||||||
|
(def has-graal-process-properties?
|
||||||
|
(resolve 'org.graalvm.nativeimage.ProcessProperties))
|
||||||
|
|
||||||
(def base-custom-map
|
(def base-custom-map
|
||||||
`{clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
|
`{clojure.lang.LineNumberingPushbackReader {:allPublicConstructors true
|
||||||
:allPublicMethods true}
|
:allPublicMethods true}
|
||||||
|
|
@ -45,7 +59,10 @@
|
||||||
{:name "sleep"}
|
{:name "sleep"}
|
||||||
{:name "start"}
|
{:name "start"}
|
||||||
{:name "toString"}
|
{:name "toString"}
|
||||||
{:name "yield"}]}
|
{:name "yield"}
|
||||||
|
~@(when has-of-virtual? [{:name "ofVirtual"}
|
||||||
|
{:name "startVirtualThread"}
|
||||||
|
{:name "isVirtual"}])]}
|
||||||
java.net.URL
|
java.net.URL
|
||||||
{:allPublicConstructors true
|
{:allPublicConstructors true
|
||||||
:allPublicFields true
|
:allPublicFields true
|
||||||
|
|
@ -74,15 +91,30 @@
|
||||||
java.util.Arrays
|
java.util.Arrays
|
||||||
{:methods [{:name "copyOf"}
|
{:methods [{:name "copyOf"}
|
||||||
{:name "copyOfRange"}
|
{:name "copyOfRange"}
|
||||||
{:name "equals"}]}
|
{:name "equals"}
|
||||||
|
{:name "fill"}]}
|
||||||
;; this fixes clojure.lang.Reflector for Java 11
|
;; this fixes clojure.lang.Reflector for Java 11
|
||||||
java.lang.reflect.AccessibleObject
|
java.lang.reflect.AccessibleObject
|
||||||
{:methods [{:name "canAccess"}]}
|
{:methods [{:name "canAccess"}]}
|
||||||
java.lang.reflect.Method
|
java.lang.Package
|
||||||
{:methods [{:name "getName"}]}
|
{:methods [{:name "getName"}]}
|
||||||
|
java.lang.reflect.Member
|
||||||
|
{:methods [{:name "getModifiers"}]}
|
||||||
|
java.lang.reflect.Method
|
||||||
|
{:methods [{:name "getName"}
|
||||||
|
{:name "getModifiers"}
|
||||||
|
{:name "getParameterTypes"}
|
||||||
|
{:name "getReturnType"}]}
|
||||||
|
java.lang.reflect.Modifier
|
||||||
|
{:methods [{:name "isStatic"}]}
|
||||||
|
java.lang.reflect.Field
|
||||||
|
{:methods [{:name "getName"}
|
||||||
|
{:name "getModifiers"}]}
|
||||||
java.lang.reflect.Array
|
java.lang.reflect.Array
|
||||||
{:methods [{:name "newInstance"}
|
{:methods [{:name "newInstance"}
|
||||||
{:name "set"}]}
|
{:name "set"}]}
|
||||||
|
java.lang.Runnable
|
||||||
|
{:methods [{:name "run"}]}
|
||||||
java.net.Inet4Address
|
java.net.Inet4Address
|
||||||
{:methods [{:name "getHostAddress"}]}
|
{:methods [{:name "getHostAddress"}]}
|
||||||
java.net.Inet6Address
|
java.net.Inet6Address
|
||||||
|
|
@ -95,14 +127,22 @@
|
||||||
clojure.lang.RT
|
clojure.lang.RT
|
||||||
{:methods [{:name "aget"}
|
{:methods [{:name "aget"}
|
||||||
{:name "aset"}
|
{:name "aset"}
|
||||||
{:name "aclone"}]}
|
{:name "aclone"}
|
||||||
|
{:name "iter"}
|
||||||
|
;; we expose this via the Compiler/LOADER dynamic var
|
||||||
|
{:name "baseLoader"}]}
|
||||||
clojure.lang.Compiler
|
clojure.lang.Compiler
|
||||||
{:fields [{:name "specials"}
|
{:fields [{:name "specials"}
|
||||||
{:name "CHAR_MAP"}]}
|
{:name "CHAR_MAP"}]}
|
||||||
clojure.lang.PersistentHashMap
|
clojure.lang.PersistentHashMap
|
||||||
{:fields [{:name "EMPTY"}]}
|
{:fields [{:name "EMPTY"}]}
|
||||||
clojure.lang.APersistentVector
|
clojure.lang.APersistentVector
|
||||||
{:methods [{:name "indexOf"}]}
|
{:methods [{:name "indexOf"}
|
||||||
|
{:name "contains"}]}
|
||||||
|
clojure.lang.LazySeq
|
||||||
|
{:allPublicConstructors true,
|
||||||
|
:methods [{:name "indexOf"}
|
||||||
|
{:name "contains"}]}
|
||||||
clojure.lang.ILookup
|
clojure.lang.ILookup
|
||||||
{:methods [{:name "valAt"}]}
|
{:methods [{:name "valAt"}]}
|
||||||
clojure.lang.IPersistentMap
|
clojure.lang.IPersistentMap
|
||||||
|
|
@ -114,22 +154,46 @@
|
||||||
clojure.lang.Ratio
|
clojure.lang.Ratio
|
||||||
{:fields [{:name "numerator"}
|
{:fields [{:name "numerator"}
|
||||||
{:name "denominator"}]}
|
{:name "denominator"}]}
|
||||||
|
clojure.lang.Agent
|
||||||
|
{:fields [{:name "pooledExecutor"}
|
||||||
|
{:name "soloExecutor"}]}
|
||||||
java.util.Iterator
|
java.util.Iterator
|
||||||
{:methods [{:name "hasNext"}
|
{:methods [{:name "hasNext"}
|
||||||
{:name "next"}]}
|
{:name "next"}]}
|
||||||
java.util.TimeZone
|
java.util.TimeZone
|
||||||
{:methods [{:name "getTimeZone"}]}})
|
{:methods [{:name "getTimeZone"}]}
|
||||||
|
java.net.URLClassLoader
|
||||||
|
{:methods [{:name "close"}
|
||||||
|
{:name "findResource"}
|
||||||
|
{:name "findResources"}
|
||||||
|
{:name "getResourceAsStream"}
|
||||||
|
{:name "getURLs"}]}
|
||||||
|
java.lang.ClassLoader
|
||||||
|
{:methods [{:name "getResource"}
|
||||||
|
{:name "getResources"}
|
||||||
|
{:name "getResourceAsStream"}
|
||||||
|
{:name "getParent"}]}
|
||||||
|
clojure.lang.ARef
|
||||||
|
{:methods [{:name "getWatches"}]}
|
||||||
|
clojure.lang.MapEntry
|
||||||
|
{:allPublicConstructors true
|
||||||
|
:methods [{:name "create"}]}})
|
||||||
|
|
||||||
(def custom-map
|
(def custom-map
|
||||||
(cond->
|
(cond->
|
||||||
(merge base-custom-map
|
(merge base-custom-map
|
||||||
proxy/custom-reflect-map)
|
proxy/custom-reflect-map)
|
||||||
features/hsqldb? (assoc `org.hsqldb.dbinfo.DatabaseInformationFull
|
features/hsqldb? (assoc `org.hsqldb.dbinfo.DatabaseInformationFull
|
||||||
{:methods [{:name "<init>"
|
{:methods [{:name "<init>"
|
||||||
:parameterTypes ["org.hsqldb.Database"]}]}
|
:parameterTypes ["org.hsqldb.Database"]}]}
|
||||||
`java.util.ResourceBundle
|
`java.util.ResourceBundle
|
||||||
{:methods [{:name "getBundle"
|
{:methods [{:name "getBundle"
|
||||||
:parameterTypes ["java.lang.String","java.util.Locale","java.lang.ClassLoader"]}]})))
|
:parameterTypes ["java.lang.String","java.util.Locale",
|
||||||
|
"java.lang.ClassLoader"]}]})
|
||||||
|
|
||||||
|
has-graal-process-properties?
|
||||||
|
(assoc `org.graalvm.nativeimage.ProcessProperties
|
||||||
|
{:methods [{:name "exec"}]})))
|
||||||
|
|
||||||
(def java-net-http-classes
|
(def java-net-http-classes
|
||||||
"These classes must be initialized at run time since GraalVM 22.1"
|
"These classes must be initialized at run time since GraalVM 22.1"
|
||||||
|
|
@ -141,6 +205,7 @@
|
||||||
java.net.HttpCookie
|
java.net.HttpCookie
|
||||||
java.net.PasswordAuthentication
|
java.net.PasswordAuthentication
|
||||||
java.net.ProxySelector
|
java.net.ProxySelector
|
||||||
|
java.net.SocketTimeoutException
|
||||||
java.net.http.HttpClient
|
java.net.http.HttpClient
|
||||||
java.net.http.HttpClient$Builder
|
java.net.http.HttpClient$Builder
|
||||||
java.net.http.HttpClient$Redirect
|
java.net.http.HttpClient$Redirect
|
||||||
|
|
@ -158,17 +223,30 @@
|
||||||
java.net.http.WebSocket$Builder
|
java.net.http.WebSocket$Builder
|
||||||
java.net.http.WebSocket$Listener
|
java.net.http.WebSocket$Listener
|
||||||
java.security.cert.X509Certificate
|
java.security.cert.X509Certificate
|
||||||
|
java.security.cert.CertificateFactory
|
||||||
|
java.security.Signature
|
||||||
|
javax.crypto.Cipher
|
||||||
|
javax.crypto.KeyAgreement
|
||||||
javax.crypto.Mac
|
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.crypto.spec.SecretKeySpec
|
||||||
javax.net.ssl.HostnameVerifier ;; clj-http-lite
|
javax.net.ssl.HostnameVerifier ;; clj-http-lite
|
||||||
javax.net.ssl.HttpsURLConnection ;; clj-http-lite
|
javax.net.ssl.HttpsURLConnection ;; clj-http-lite
|
||||||
javax.net.ssl.KeyManagerFactory
|
javax.net.ssl.KeyManagerFactory
|
||||||
javax.net.ssl.SSLContext
|
javax.net.ssl.SSLContext
|
||||||
|
javax.net.ssl.SSLException
|
||||||
javax.net.ssl.SSLParameters
|
javax.net.ssl.SSLParameters
|
||||||
javax.net.ssl.SSLSession ;; clj-http-lite
|
javax.net.ssl.SSLSession ;; clj-http-lite
|
||||||
javax.net.ssl.TrustManager
|
javax.net.ssl.TrustManager
|
||||||
javax.net.ssl.TrustManagerFactory
|
javax.net.ssl.TrustManagerFactory
|
||||||
javax.net.ssl.X509TrustManager
|
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.HttpClientBuilderImpl
|
||||||
jdk.internal.net.http.HttpClientFacade
|
jdk.internal.net.http.HttpClientFacade
|
||||||
jdk.internal.net.http.HttpRequestBuilderImpl
|
jdk.internal.net.http.HttpRequestBuilderImpl
|
||||||
|
|
@ -177,6 +255,10 @@
|
||||||
jdk.internal.net.http.websocket.BuilderImpl
|
jdk.internal.net.http.websocket.BuilderImpl
|
||||||
jdk.internal.net.http.websocket.WebSocketImpl])
|
jdk.internal.net.http.websocket.WebSocketImpl])
|
||||||
|
|
||||||
|
(def thread-builder
|
||||||
|
(try (Class/forName "java.lang.Thread$Builder")
|
||||||
|
(catch Exception _ nil)))
|
||||||
|
|
||||||
(def classes
|
(def classes
|
||||||
`{:all [clojure.lang.ArityException
|
`{:all [clojure.lang.ArityException
|
||||||
clojure.lang.BigInt
|
clojure.lang.BigInt
|
||||||
|
|
@ -201,6 +283,7 @@
|
||||||
java.io.FileOutputStream
|
java.io.FileOutputStream
|
||||||
java.io.FileReader
|
java.io.FileReader
|
||||||
java.io.FileWriter
|
java.io.FileWriter
|
||||||
|
java.io.LineNumberReader
|
||||||
java.io.RandomAccessFile
|
java.io.RandomAccessFile
|
||||||
java.io.InputStream
|
java.io.InputStream
|
||||||
java.io.IOException
|
java.io.IOException
|
||||||
|
|
@ -230,6 +313,7 @@
|
||||||
java.lang.ClassNotFoundException
|
java.lang.ClassNotFoundException
|
||||||
java.lang.Comparable
|
java.lang.Comparable
|
||||||
java.lang.Double
|
java.lang.Double
|
||||||
|
java.lang.Error
|
||||||
java.lang.Exception
|
java.lang.Exception
|
||||||
java.lang.Float
|
java.lang.Float
|
||||||
java.lang.IllegalArgumentException
|
java.lang.IllegalArgumentException
|
||||||
|
|
@ -251,13 +335,21 @@
|
||||||
java.lang.ProcessBuilder$Redirect
|
java.lang.ProcessBuilder$Redirect
|
||||||
java.lang.Runtime
|
java.lang.Runtime
|
||||||
java.lang.RuntimeException
|
java.lang.RuntimeException
|
||||||
|
java.lang.SecurityException
|
||||||
java.lang.Short
|
java.lang.Short
|
||||||
java.lang.StackTraceElement
|
java.lang.StackTraceElement
|
||||||
java.lang.String
|
java.lang.String
|
||||||
java.lang.StringBuilder
|
java.lang.StringBuilder
|
||||||
java.lang.System
|
java.lang.System
|
||||||
java.lang.Throwable
|
java.lang.Throwable
|
||||||
;; java.lang.UnsupportedOperationException
|
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
|
||||||
|
java.lang.ref.Cleaner
|
||||||
java.math.BigDecimal
|
java.math.BigDecimal
|
||||||
java.math.BigInteger
|
java.math.BigInteger
|
||||||
java.math.MathContext
|
java.math.MathContext
|
||||||
|
|
@ -269,12 +361,17 @@
|
||||||
java.net.HttpURLConnection
|
java.net.HttpURLConnection
|
||||||
java.net.InetAddress
|
java.net.InetAddress
|
||||||
java.net.InetSocketAddress
|
java.net.InetSocketAddress
|
||||||
|
java.net.StandardProtocolFamily
|
||||||
java.net.ServerSocket
|
java.net.ServerSocket
|
||||||
java.net.Socket
|
java.net.Socket
|
||||||
java.net.SocketException
|
java.net.SocketException
|
||||||
|
~@(when has-domain-sockets?
|
||||||
|
'[java.net.UnixDomainSocketAddress])
|
||||||
java.net.UnknownHostException
|
java.net.UnknownHostException
|
||||||
java.net.URI
|
java.net.URI
|
||||||
;; java.net.URL, see below
|
java.net.URISyntaxException
|
||||||
|
;; java.net.URL, see custom map
|
||||||
|
java.net.URLConnection
|
||||||
java.net.URLEncoder
|
java.net.URLEncoder
|
||||||
java.net.URLDecoder
|
java.net.URLDecoder
|
||||||
~@(when features/java-nio?
|
~@(when features/java-nio?
|
||||||
|
|
@ -286,8 +383,14 @@
|
||||||
java.nio.MappedByteBuffer
|
java.nio.MappedByteBuffer
|
||||||
java.nio.file.OpenOption
|
java.nio.file.OpenOption
|
||||||
java.nio.file.StandardOpenOption
|
java.nio.file.StandardOpenOption
|
||||||
|
java.nio.channels.ByteChannel
|
||||||
|
java.nio.channels.Channels
|
||||||
java.nio.channels.FileChannel
|
java.nio.channels.FileChannel
|
||||||
java.nio.channels.FileChannel$MapMode
|
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
|
java.nio.charset.Charset
|
||||||
java.nio.charset.CoderResult
|
java.nio.charset.CoderResult
|
||||||
java.nio.charset.CharsetEncoder
|
java.nio.charset.CharsetEncoder
|
||||||
|
|
@ -301,6 +404,7 @@
|
||||||
java.nio.file.FileVisitOption
|
java.nio.file.FileVisitOption
|
||||||
java.nio.file.FileVisitResult
|
java.nio.file.FileVisitResult
|
||||||
java.nio.file.Files
|
java.nio.file.Files
|
||||||
|
java.nio.file.DirectoryStream$Filter
|
||||||
java.nio.file.LinkOption
|
java.nio.file.LinkOption
|
||||||
java.nio.file.NoSuchFileException
|
java.nio.file.NoSuchFileException
|
||||||
java.nio.file.Path
|
java.nio.file.Path
|
||||||
|
|
@ -310,18 +414,28 @@
|
||||||
java.nio.file.attribute.BasicFileAttributes
|
java.nio.file.attribute.BasicFileAttributes
|
||||||
java.nio.file.attribute.FileAttribute
|
java.nio.file.attribute.FileAttribute
|
||||||
java.nio.file.attribute.FileTime
|
java.nio.file.attribute.FileTime
|
||||||
|
java.nio.file.attribute.PosixFileAttributes
|
||||||
java.nio.file.attribute.PosixFilePermission
|
java.nio.file.attribute.PosixFilePermission
|
||||||
java.nio.file.attribute.PosixFilePermissions])
|
java.nio.file.attribute.PosixFilePermissions
|
||||||
java.security.MessageDigest
|
java.nio.file.attribute.UserDefinedFileAttributeView])
|
||||||
java.security.DigestInputStream
|
java.security.DigestInputStream
|
||||||
java.security.Provider
|
java.security.KeyFactory
|
||||||
|
java.security.KeyPairGenerator
|
||||||
|
java.security.KeyPair
|
||||||
java.security.KeyStore
|
java.security.KeyStore
|
||||||
|
java.security.MessageDigest
|
||||||
|
java.security.Provider
|
||||||
java.security.SecureRandom
|
java.security.SecureRandom
|
||||||
java.security.Security
|
java.security.Security
|
||||||
|
java.security.spec.ECGenParameterSpec
|
||||||
|
java.security.spec.PKCS8EncodedKeySpec
|
||||||
|
java.security.spec.X509EncodedKeySpec
|
||||||
java.sql.Date
|
java.sql.Date
|
||||||
java.text.ParseException
|
java.text.ParseException
|
||||||
|
java.text.ParsePosition
|
||||||
;; adds about 200kb, same functionality provided by java.time:
|
;; adds about 200kb, same functionality provided by java.time:
|
||||||
java.text.SimpleDateFormat
|
java.text.SimpleDateFormat
|
||||||
|
java.text.BreakIterator
|
||||||
~@(when features/java-time?
|
~@(when features/java-time?
|
||||||
`[java.time.format.DateTimeFormatter
|
`[java.time.format.DateTimeFormatter
|
||||||
java.time.Clock
|
java.time.Clock
|
||||||
|
|
@ -340,12 +454,14 @@
|
||||||
java.time.Year
|
java.time.Year
|
||||||
java.time.YearMonth
|
java.time.YearMonth
|
||||||
java.time.ZoneRegion
|
java.time.ZoneRegion
|
||||||
|
java.time.zone.ZoneRules
|
||||||
java.time.ZonedDateTime
|
java.time.ZonedDateTime
|
||||||
java.time.ZoneId
|
java.time.ZoneId
|
||||||
java.time.ZoneOffset
|
java.time.ZoneOffset
|
||||||
java.time.format.DateTimeFormatterBuilder
|
java.time.format.DateTimeFormatterBuilder
|
||||||
java.time.format.DateTimeParseException
|
java.time.format.DateTimeParseException
|
||||||
java.time.format.DecimalStyle
|
java.time.format.DecimalStyle
|
||||||
|
java.time.format.FormatStyle
|
||||||
java.time.format.ResolverStyle
|
java.time.format.ResolverStyle
|
||||||
java.time.format.SignStyle
|
java.time.format.SignStyle
|
||||||
java.time.temporal.ChronoField
|
java.time.temporal.ChronoField
|
||||||
|
|
@ -354,21 +470,53 @@
|
||||||
java.time.temporal.TemporalAdjusters
|
java.time.temporal.TemporalAdjusters
|
||||||
java.time.temporal.TemporalAmount
|
java.time.temporal.TemporalAmount
|
||||||
java.time.temporal.TemporalField
|
java.time.temporal.TemporalField
|
||||||
|
java.time.temporal.WeekFields
|
||||||
~(symbol "[Ljava.time.temporal.TemporalField;")
|
~(symbol "[Ljava.time.temporal.TemporalField;")
|
||||||
java.time.format.TextStyle
|
java.time.format.TextStyle
|
||||||
java.time.temporal.Temporal
|
java.time.temporal.Temporal
|
||||||
java.time.temporal.TemporalAccessor
|
java.time.temporal.TemporalAccessor
|
||||||
java.time.temporal.TemporalAdjuster])
|
java.time.temporal.TemporalAdjuster
|
||||||
|
java.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.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.ExecutionException
|
||||||
|
java.util.concurrent.Executor
|
||||||
|
java.util.concurrent.ExecutorService
|
||||||
|
java.util.concurrent.BlockingQueue
|
||||||
|
java.util.concurrent.ArrayBlockingQueue
|
||||||
java.util.concurrent.LinkedBlockingQueue
|
java.util.concurrent.LinkedBlockingQueue
|
||||||
|
java.util.concurrent.ScheduledFuture
|
||||||
java.util.concurrent.ScheduledThreadPoolExecutor
|
java.util.concurrent.ScheduledThreadPoolExecutor
|
||||||
|
java.util.concurrent.Semaphore
|
||||||
|
java.util.concurrent.ThreadFactory
|
||||||
java.util.concurrent.ThreadPoolExecutor
|
java.util.concurrent.ThreadPoolExecutor
|
||||||
|
java.util.concurrent.ThreadPoolExecutor$AbortPolicy
|
||||||
|
java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy
|
||||||
|
java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy
|
||||||
|
java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
|
||||||
|
java.util.concurrent.ExecutorService
|
||||||
java.util.concurrent.ScheduledExecutorService
|
java.util.concurrent.ScheduledExecutorService
|
||||||
java.util.concurrent.Future
|
java.util.concurrent.Future
|
||||||
|
java.util.concurrent.FutureTask
|
||||||
java.util.concurrent.CompletableFuture
|
java.util.concurrent.CompletableFuture
|
||||||
java.util.concurrent.Executors
|
java.util.concurrent.Executors
|
||||||
java.util.concurrent.TimeUnit
|
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.Attributes$Name
|
||||||
java.util.jar.JarFile
|
java.util.jar.JarFile
|
||||||
java.util.jar.JarEntry
|
java.util.jar.JarEntry
|
||||||
|
|
@ -378,9 +526,11 @@
|
||||||
java.util.jar.Manifest
|
java.util.jar.Manifest
|
||||||
java.util.stream.BaseStream
|
java.util.stream.BaseStream
|
||||||
java.util.stream.Stream
|
java.util.stream.Stream
|
||||||
|
java.util.stream.IntStream
|
||||||
java.util.Random
|
java.util.Random
|
||||||
java.util.regex.Matcher
|
java.util.regex.Matcher
|
||||||
java.util.regex.Pattern
|
java.util.regex.Pattern
|
||||||
|
java.util.regex.PatternSyntaxException
|
||||||
java.util.ArrayDeque
|
java.util.ArrayDeque
|
||||||
java.util.ArrayList
|
java.util.ArrayList
|
||||||
java.util.Collections
|
java.util.Collections
|
||||||
|
|
@ -389,7 +539,10 @@
|
||||||
java.util.Base64$Decoder
|
java.util.Base64$Decoder
|
||||||
java.util.Base64$Encoder
|
java.util.Base64$Encoder
|
||||||
java.util.Date
|
java.util.Date
|
||||||
|
java.util.HashMap
|
||||||
|
java.util.HashSet
|
||||||
java.util.IdentityHashMap
|
java.util.IdentityHashMap
|
||||||
|
java.util.InputMismatchException
|
||||||
java.util.List
|
java.util.List
|
||||||
java.util.Locale
|
java.util.Locale
|
||||||
java.util.Map
|
java.util.Map
|
||||||
|
|
@ -404,8 +557,12 @@
|
||||||
java.util.UUID
|
java.util.UUID
|
||||||
java.util.function.Consumer
|
java.util.function.Consumer
|
||||||
java.util.function.Function
|
java.util.function.Function
|
||||||
|
java.util.function.BiConsumer
|
||||||
|
java.util.function.BiFunction
|
||||||
java.util.function.Predicate
|
java.util.function.Predicate
|
||||||
java.util.function.Supplier
|
java.util.function.Supplier
|
||||||
|
java.util.zip.CheckedInputStream
|
||||||
|
java.util.zip.CRC32
|
||||||
java.util.zip.Inflater
|
java.util.zip.Inflater
|
||||||
java.util.zip.InflaterInputStream
|
java.util.zip.InflaterInputStream
|
||||||
java.util.zip.Deflater
|
java.util.zip.Deflater
|
||||||
|
|
@ -435,9 +592,22 @@
|
||||||
~(symbol "[Ljava.util.regex.Pattern;")
|
~(symbol "[Ljava.util.regex.Pattern;")
|
||||||
~(symbol "[Lclojure.core$range;")])
|
~(symbol "[Lclojure.core$range;")])
|
||||||
~@(when features/yaml? '[org.yaml.snakeyaml.error.YAMLException])
|
~@(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
|
:constructors [clojure.lang.Delay
|
||||||
clojure.lang.MapEntry
|
clojure.lang.DynamicClassLoader
|
||||||
clojure.lang.LineNumberingPushbackReader
|
clojure.lang.LineNumberingPushbackReader
|
||||||
java.io.EOFException]
|
java.io.EOFException]
|
||||||
:methods [borkdude.graal.LockFix] ;; support for locking
|
:methods [borkdude.graal.LockFix] ;; support for locking
|
||||||
|
|
@ -449,7 +619,6 @@
|
||||||
;; list above and then everything reachable via the public class will be
|
;; list above and then everything reachable via the public class will be
|
||||||
;; visible in the native image.
|
;; visible in the native image.
|
||||||
:instance-checks [clojure.lang.AFn
|
:instance-checks [clojure.lang.AFn
|
||||||
clojure.lang.Agent
|
|
||||||
clojure.lang.AFunction
|
clojure.lang.AFunction
|
||||||
clojure.lang.AMapEntry ;; for proxy
|
clojure.lang.AMapEntry ;; for proxy
|
||||||
clojure.lang.APersistentMap ;; for proxy
|
clojure.lang.APersistentMap ;; for proxy
|
||||||
|
|
@ -478,20 +647,27 @@
|
||||||
clojure.lang.IRef
|
clojure.lang.IRef
|
||||||
clojure.lang.ISeq
|
clojure.lang.ISeq
|
||||||
clojure.lang.IPersistentVector
|
clojure.lang.IPersistentVector
|
||||||
|
clojure.lang.ITransientSet
|
||||||
clojure.lang.ITransientVector
|
clojure.lang.ITransientVector
|
||||||
clojure.lang.Iterate
|
clojure.lang.Iterate
|
||||||
clojure.lang.LazySeq
|
|
||||||
clojure.lang.LispReader$Resolver
|
clojure.lang.LispReader$Resolver
|
||||||
|
clojure.lang.LongRange
|
||||||
clojure.lang.Named
|
clojure.lang.Named
|
||||||
clojure.lang.Keyword
|
clojure.lang.Keyword
|
||||||
clojure.lang.PersistentArrayMap
|
clojure.lang.PersistentArrayMap
|
||||||
|
clojure.lang.PersistentArrayMap$TransientArrayMap
|
||||||
|
clojure.lang.PersistentHashMap$TransientHashMap
|
||||||
clojure.lang.PersistentHashSet
|
clojure.lang.PersistentHashSet
|
||||||
|
clojure.lang.PersistentHashSet$TransientHashSet
|
||||||
clojure.lang.PersistentList
|
clojure.lang.PersistentList
|
||||||
|
clojure.lang.PersistentList$EmptyList
|
||||||
clojure.lang.PersistentQueue
|
clojure.lang.PersistentQueue
|
||||||
clojure.lang.PersistentStructMap
|
clojure.lang.PersistentStructMap
|
||||||
clojure.lang.PersistentTreeMap
|
clojure.lang.PersistentTreeMap
|
||||||
clojure.lang.PersistentTreeSet
|
clojure.lang.PersistentTreeSet
|
||||||
clojure.lang.PersistentVector
|
clojure.lang.PersistentVector
|
||||||
|
clojure.lang.PersistentVector$TransientVector
|
||||||
|
clojure.lang.Range
|
||||||
clojure.lang.Ratio
|
clojure.lang.Ratio
|
||||||
clojure.lang.ReaderConditional
|
clojure.lang.ReaderConditional
|
||||||
clojure.lang.Repeat
|
clojure.lang.Repeat
|
||||||
|
|
@ -501,16 +677,22 @@
|
||||||
clojure.lang.Sequential
|
clojure.lang.Sequential
|
||||||
clojure.lang.Seqable
|
clojure.lang.Seqable
|
||||||
clojure.lang.Volatile
|
clojure.lang.Volatile
|
||||||
|
;; the only way to check if something is a channel is to
|
||||||
|
;; call instance? on this...
|
||||||
|
clojure.core.async.impl.channels.ManyToManyChannel
|
||||||
java.lang.AbstractMethodError
|
java.lang.AbstractMethodError
|
||||||
java.lang.ExceptionInInitializerError
|
java.lang.ExceptionInInitializerError
|
||||||
java.lang.LinkageError
|
java.lang.LinkageError
|
||||||
java.lang.ThreadDeath
|
java.lang.ThreadDeath
|
||||||
java.lang.VirtualMachineError
|
java.lang.VirtualMachineError
|
||||||
|
java.lang.NoSuchFieldException
|
||||||
java.sql.Timestamp
|
java.sql.Timestamp
|
||||||
java.util.concurrent.atomic.AtomicInteger
|
java.util.concurrent.TimeoutException
|
||||||
java.util.concurrent.atomic.AtomicLong
|
|
||||||
java.util.Collection
|
java.util.Collection
|
||||||
java.util.Map$Entry
|
java.util.Map$Entry
|
||||||
|
java.util.AbstractMap
|
||||||
|
java.util.AbstractSet
|
||||||
|
java.util.AbstractList
|
||||||
~@(when features/xml? ['clojure.data.xml.node.Element])]
|
~@(when features/xml? ['clojure.data.xml.node.Element])]
|
||||||
:custom ~custom-map})
|
:custom ~custom-map})
|
||||||
|
|
||||||
|
|
@ -523,77 +705,150 @@
|
||||||
(:instance-checks classes))
|
(:instance-checks classes))
|
||||||
m (apply hash-map
|
m (apply hash-map
|
||||||
(for [c classes
|
(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))
|
c))
|
||||||
m (assoc m :public-class
|
m (assoc m :public-class
|
||||||
(fn [v]
|
(fn [v]
|
||||||
|
;; (prn :v v)
|
||||||
;; NOTE: a series of instance check, so far, is still cheaper
|
;; NOTE: a series of instance check, so far, is still cheaper
|
||||||
;; than piggybacking on defmulti or defprotocol
|
;; than piggybacking on defmulti or defprotocol
|
||||||
(cond (instance? java.lang.Process v)
|
(let [res (cond (instance? java.lang.Process v)
|
||||||
java.lang.Process
|
java.lang.Process
|
||||||
(instance? java.lang.ProcessHandle v)
|
(instance? java.lang.ProcessHandle v)
|
||||||
java.lang.ProcessHandle
|
java.lang.ProcessHandle
|
||||||
(instance? java.lang.ProcessHandle$Info v)
|
(instance? java.lang.ProcessHandle$Info v)
|
||||||
java.lang.ProcessHandle$Info
|
java.lang.ProcessHandle$Info
|
||||||
;; added for calling .put on .environment from ProcessBuilder
|
;; added for calling .put on .environment from ProcessBuilder
|
||||||
(instance? java.util.Map v)
|
(instance? java.util.Map v)
|
||||||
java.util.Map
|
java.util.Map
|
||||||
;; added for issue #239 regarding clj-http-lite
|
;; added for issue #239 regarding clj-http-lite
|
||||||
;; can potentially be removed due to fix for #1061
|
;; can potentially be removed due to fix for #1061
|
||||||
(instance? java.io.ByteArrayOutputStream v)
|
(instance? java.io.ByteArrayOutputStream v)
|
||||||
java.io.ByteArrayOutputStream
|
java.io.ByteArrayOutputStream
|
||||||
(instance? java.security.MessageDigest v)
|
(instance? java.security.MessageDigest v)
|
||||||
java.security.MessageDigest
|
java.security.MessageDigest
|
||||||
;; streams
|
;; streams
|
||||||
(instance? java.io.InputStream v)
|
(instance? java.io.InputStream v)
|
||||||
java.io.InputStream
|
java.io.InputStream
|
||||||
(instance? java.io.OutputStream v)
|
(instance? java.io.OutputStream v)
|
||||||
java.io.OutputStream
|
java.io.OutputStream
|
||||||
;; java nio
|
;; java nio
|
||||||
(instance? java.nio.file.Path v)
|
(instance? java.nio.file.Path v)
|
||||||
java.nio.file.Path
|
java.nio.file.Path
|
||||||
(instance? java.nio.file.FileSystem v)
|
(instance? java.nio.file.FileSystem v)
|
||||||
java.nio.file.FileSystem
|
java.nio.file.FileSystem
|
||||||
(instance? java.nio.file.PathMatcher v)
|
(instance? java.nio.file.PathMatcher v)
|
||||||
java.nio.file.PathMatcher
|
java.nio.file.PathMatcher
|
||||||
(instance? java.util.stream.BaseStream v)
|
(instance? java.util.stream.Stream v)
|
||||||
java.util.stream.BaseStream
|
java.util.stream.Stream
|
||||||
(instance? java.nio.ByteBuffer v)
|
(instance? java.util.stream.IntStream v)
|
||||||
java.nio.ByteBuffer
|
java.util.stream.IntStream
|
||||||
(instance? java.nio.charset.Charset v)
|
(instance? java.util.stream.BaseStream v)
|
||||||
java.nio.charset.Charset
|
java.util.stream.BaseStream
|
||||||
(instance? java.nio.charset.CharsetEncoder v)
|
(instance? java.nio.ByteBuffer v)
|
||||||
java.nio.charset.CharsetEncoder
|
java.nio.ByteBuffer
|
||||||
(instance? java.nio.CharBuffer v)
|
(instance? java.nio.charset.Charset v)
|
||||||
java.nio.CharBuffer
|
java.nio.charset.Charset
|
||||||
(instance? java.nio.channels.FileChannel v)
|
(instance? java.nio.charset.CharsetEncoder v)
|
||||||
java.nio.channels.FileChannel
|
java.nio.charset.CharsetEncoder
|
||||||
(instance? java.net.CookieStore v)
|
(instance? java.nio.CharBuffer v)
|
||||||
java.net.CookieStore
|
java.nio.CharBuffer
|
||||||
;; this makes interop on reified classes work
|
(instance? java.nio.channels.FileChannel v)
|
||||||
;; see java_net_http_test/interop-test
|
java.nio.channels.FileChannel
|
||||||
(instance? sci.impl.types.IReified v)
|
(instance? java.nio.channels.ServerSocketChannel v)
|
||||||
(first (t/getInterfaces v))
|
java.nio.channels.ServerSocketChannel
|
||||||
;; fix for #1061
|
(instance? java.nio.channels.SocketChannel v)
|
||||||
(instance? java.io.Closeable v)
|
java.nio.channels.SocketChannel
|
||||||
java.io.Closeable
|
(instance? java.net.CookieStore v)
|
||||||
(instance? java.nio.file.attribute.BasicFileAttributes v)
|
java.net.CookieStore
|
||||||
java.nio.file.attribute.BasicFileAttributes
|
;; this makes interop on reified classes work
|
||||||
(instance? java.util.concurrent.Future v)
|
;; see java_net_http_test/interop-test
|
||||||
java.util.concurrent.Future
|
(instance? sci.impl.types.IReified v)
|
||||||
(instance? java.util.concurrent.ScheduledExecutorService v)
|
(first (t/getInterfaces v))
|
||||||
java.util.concurrent.ScheduledExecutorService
|
;; fix for #1061
|
||||||
(instance? java.util.Iterator v)
|
(instance? java.net.URLClassLoader v)
|
||||||
java.util.Iterator
|
java.net.URLClassLoader
|
||||||
;; keep commas for merge friendliness
|
(instance? java.lang.ClassLoader v)
|
||||||
,,,)))]
|
java.lang.ClassLoader
|
||||||
|
(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)
|
||||||
|
java.util.concurrent.ScheduledExecutorService
|
||||||
|
(instance? java.util.concurrent.ExecutorService v)
|
||||||
|
java.util.concurrent.ExecutorService
|
||||||
|
(instance? java.util.Iterator v)
|
||||||
|
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))
|
m))
|
||||||
|
|
||||||
|
|
||||||
(def class-map*
|
(def class-map*
|
||||||
"This contains mapping of symbol to class of all classes that are allowed to be initialized at build time."
|
"This contains mapping of symbol to class of all classes that are
|
||||||
|
allowed to be initialized at build time."
|
||||||
(gen-class-map))
|
(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
|
(def class-map
|
||||||
"A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1"
|
"A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1"
|
||||||
(delay (persistent! (reduce (fn [acc c]
|
(delay (persistent! (reduce (fn [acc c]
|
||||||
|
|
@ -610,6 +865,7 @@
|
||||||
BigInteger java.math.BigInteger
|
BigInteger java.math.BigInteger
|
||||||
Boolean java.lang.Boolean
|
Boolean java.lang.Boolean
|
||||||
Byte java.lang.Byte
|
Byte java.lang.Byte
|
||||||
|
Callable java.util.concurrent.Callable
|
||||||
Character java.lang.Character
|
Character java.lang.Character
|
||||||
CharSequence java.lang.CharSequence
|
CharSequence java.lang.CharSequence
|
||||||
Class java.lang.Class
|
Class java.lang.Class
|
||||||
|
|
@ -617,6 +873,7 @@
|
||||||
ClassNotFoundException java.lang.ClassNotFoundException
|
ClassNotFoundException java.lang.ClassNotFoundException
|
||||||
Comparable java.lang.Comparable
|
Comparable java.lang.Comparable
|
||||||
Double java.lang.Double
|
Double java.lang.Double
|
||||||
|
Error java.lang.Error
|
||||||
Exception java.lang.Exception
|
Exception java.lang.Exception
|
||||||
ExceptionInInitializerError java.lang.ExceptionInInitializerError
|
ExceptionInInitializerError java.lang.ExceptionInInitializerError
|
||||||
IndexOutOfBoundsException java.lang.IndexOutOfBoundsException
|
IndexOutOfBoundsException java.lang.IndexOutOfBoundsException
|
||||||
|
|
@ -625,6 +882,8 @@
|
||||||
Integer java.lang.Integer
|
Integer java.lang.Integer
|
||||||
InterruptedException java.lang.InterruptedException
|
InterruptedException java.lang.InterruptedException
|
||||||
Iterable java.lang.Iterable
|
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
|
File java.io.File
|
||||||
Float java.lang.Float
|
Float java.lang.Float
|
||||||
Long java.lang.Long
|
Long java.lang.Long
|
||||||
|
|
@ -634,21 +893,26 @@
|
||||||
Number java.lang.Number
|
Number java.lang.Number
|
||||||
NumberFormatException java.lang.NumberFormatException
|
NumberFormatException java.lang.NumberFormatException
|
||||||
Object java.lang.Object
|
Object java.lang.Object
|
||||||
|
Runnable java.lang.Runnable
|
||||||
Runtime java.lang.Runtime
|
Runtime java.lang.Runtime
|
||||||
RuntimeException java.lang.RuntimeException
|
RuntimeException java.lang.RuntimeException
|
||||||
Process java.lang.Process
|
Process java.lang.Process
|
||||||
ProcessBuilder java.lang.ProcessBuilder
|
ProcessBuilder java.lang.ProcessBuilder
|
||||||
|
SecurityException java.lang.SecurityException
|
||||||
Short java.lang.Short
|
Short java.lang.Short
|
||||||
StackTraceElement java.lang.StackTraceElement
|
StackTraceElement java.lang.StackTraceElement
|
||||||
String java.lang.String
|
String java.lang.String
|
||||||
StringBuilder java.lang.StringBuilder
|
StringBuilder java.lang.StringBuilder
|
||||||
System java.lang.System
|
System java.lang.System
|
||||||
Thread java.lang.Thread
|
Thread java.lang.Thread
|
||||||
|
ThreadLocal java.lang.ThreadLocal
|
||||||
|
Thread$UncaughtExceptionHandler java.lang.Thread$UncaughtExceptionHandler
|
||||||
Throwable java.lang.Throwable
|
Throwable java.lang.Throwable
|
||||||
VirtualMachineError java.lang.VirtualMachineError
|
VirtualMachineError java.lang.VirtualMachineError
|
||||||
ThreadDeath java.lang.ThreadDeath
|
ThreadDeath java.lang.ThreadDeath
|
||||||
;; UnsupportedOperationException java.lang.UnsupportedOperationException
|
UnsupportedOperationException java.lang.UnsupportedOperationException})
|
||||||
})
|
|
||||||
|
;; (eval (vec (keys imports)))
|
||||||
|
|
||||||
(defn reflection-file-entries []
|
(defn reflection-file-entries []
|
||||||
(let [entries (vec (for [c (sort (concat (:all classes)
|
(let [entries (vec (for [c (sort (concat (:all classes)
|
||||||
|
|
@ -687,15 +951,16 @@
|
||||||
(let [all-entries (reflection-file-entries)]
|
(let [all-entries (reflection-file-entries)]
|
||||||
(spit (or
|
(spit (or
|
||||||
(first args)
|
(first args)
|
||||||
"resources/META-INF/native-image/babashka/babashka/reflect-config.json") (json/generate-string all-entries {:pretty true}))))
|
"resources/META-INF/native-image/babashka/babashka/reflect-config.json")
|
||||||
|
(json/generate-string all-entries {:pretty true}))))
|
||||||
|
|
||||||
(defn public-declared-method? [c m]
|
(defn public-declared-method? [^Class c ^java.lang.reflect.Method m]
|
||||||
(and (= c (.getDeclaringClass m))
|
(and (= c (.getDeclaringClass m))
|
||||||
(not (.getAnnotation m Deprecated))))
|
(not (.getAnnotation m Deprecated))))
|
||||||
|
|
||||||
(defn public-declared-method-names [c]
|
(defn public-declared-method-names [^Class c]
|
||||||
(->> (.getMethods c)
|
(->> (.getMethods c)
|
||||||
(keep (fn [m]
|
(keep (fn [^java.lang.reflect.Method m]
|
||||||
(when (public-declared-method? c m)
|
(when (public-declared-method? c m)
|
||||||
{:class c
|
{:class c
|
||||||
:name (.getName m)})))
|
:name (.getName m)})))
|
||||||
|
|
@ -703,18 +968,24 @@
|
||||||
(sort-by :name)
|
(sort-by :name)
|
||||||
(vec)))
|
(vec)))
|
||||||
|
|
||||||
(defn all-methods []
|
(defn all-classes
|
||||||
|
"Returns every java.lang.Class instance Babashka supports."
|
||||||
|
[]
|
||||||
(->> (reflection-file-entries)
|
(->> (reflection-file-entries)
|
||||||
(map :name)
|
(map :name)
|
||||||
(map #(Class/forName %))
|
(map #(Class/forName %))))
|
||||||
(mapcat public-declared-method-names)))
|
|
||||||
|
(defn all-methods []
|
||||||
|
(mapcat public-declared-method-names (all-classes)))
|
||||||
|
|
||||||
|
(def cns (sci/create-ns 'babashka.classes nil))
|
||||||
|
|
||||||
|
(def classes-namespace
|
||||||
|
{:obj cns
|
||||||
|
'all-classes (sci/copy-var all-classes cns)})
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
(public-declared-method-names java.net.URL)
|
(public-declared-method-names java.net.URL)
|
||||||
(public-declared-method-names java.util.Properties)
|
(public-declared-method-names java.util.Properties)
|
||||||
|
|
||||||
(->> (reflection-file-entries)
|
(all-classes))
|
||||||
(map :name)
|
|
||||||
(map #(Class/forName %)))
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -5,75 +5,64 @@
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[sci.core :as sci])
|
[sci.core :as sci])
|
||||||
(:import [java.util.jar JarFile Manifest]
|
(:import [java.util.jar Manifest]
|
||||||
(java.net URL)))
|
(java.net URL)))
|
||||||
|
|
||||||
(set! *warn-on-reflection* true)
|
(set! *warn-on-reflection* true)
|
||||||
|
|
||||||
(defprotocol IResourceResolver
|
(defn getResource [^babashka.impl.URLClassLoader class-loader resource-paths url?]
|
||||||
(getResource [this paths opts])
|
(some (fn [resource]
|
||||||
(getResources [this paths opts]))
|
(when-let [^java.net.URL res (.findResource class-loader resource)]
|
||||||
|
(if url?
|
||||||
(deftype DirectoryResolver [path]
|
res
|
||||||
IResourceResolver
|
{:file (if (= "jar" (.getProtocol res))
|
||||||
(getResource [_ resource-paths url?]
|
resource
|
||||||
(some
|
(.getFile res))
|
||||||
(fn [resource-path]
|
:source (slurp res)})))
|
||||||
(let [f (io/file path resource-path)]
|
resource-paths))
|
||||||
(when (.exists f)
|
|
||||||
(if url?
|
|
||||||
;; manual conversion, faster than going through .toURI
|
|
||||||
(java.net.URL. "file" nil (.getAbsolutePath f))
|
|
||||||
{:file (.getAbsolutePath f)
|
|
||||||
:source (slurp f)}))))
|
|
||||||
resource-paths)))
|
|
||||||
|
|
||||||
(defn path-from-jar
|
|
||||||
[^java.io.File jar-file resource-paths url?]
|
|
||||||
(with-open [jar (JarFile. jar-file)]
|
|
||||||
(some (fn [path]
|
|
||||||
(when-let [entry (.getEntry jar path)]
|
|
||||||
(if url?
|
|
||||||
;; manual conversion, faster than going through .toURI
|
|
||||||
(java.net.URL. "jar" nil
|
|
||||||
(str "file:" (.getAbsolutePath jar-file) "!/" path))
|
|
||||||
{:file path
|
|
||||||
:source (slurp (.getInputStream jar entry))})))
|
|
||||||
resource-paths)))
|
|
||||||
|
|
||||||
(deftype JarFileResolver [jar-file]
|
|
||||||
IResourceResolver
|
|
||||||
(getResource [_ resource-paths url?]
|
|
||||||
(path-from-jar jar-file resource-paths url?)))
|
|
||||||
|
|
||||||
(defn part->entry [part]
|
|
||||||
(when-not (str/blank? part)
|
|
||||||
(if (str/ends-with? part ".jar")
|
|
||||||
(JarFileResolver. (io/file part))
|
|
||||||
(DirectoryResolver. (io/file part)))))
|
|
||||||
|
|
||||||
(deftype Loader [entries]
|
|
||||||
IResourceResolver
|
|
||||||
(getResource [_ resource-paths opts]
|
|
||||||
(some #(getResource % resource-paths opts) entries))
|
|
||||||
(getResources [_ resource-paths opts]
|
|
||||||
(keep #(getResource % resource-paths opts) entries)))
|
|
||||||
|
|
||||||
(def path-sep (System/getProperty "path.separator"))
|
(def path-sep (System/getProperty "path.separator"))
|
||||||
|
|
||||||
(defn loader [^String classpath]
|
(defn ->url ^java.net.URL [^String s]
|
||||||
(let [parts (.split classpath path-sep)
|
(.toURL (java.io.File. s)))
|
||||||
entries (keep part->entry parts)]
|
|
||||||
(Loader. entries)))
|
|
||||||
|
|
||||||
(defn source-for-namespace [loader namespace opts]
|
(defn new-loader ^babashka.impl.URLClassLoader
|
||||||
|
([paths]
|
||||||
|
(babashka.impl.URLClassLoader. (into-array java.net.URL (map ->url paths)))))
|
||||||
|
|
||||||
|
(def ^babashka.impl.URLClassLoader the-url-loader (delay (new-loader [])))
|
||||||
|
|
||||||
|
(defn add-classpath
|
||||||
|
"Adds extra-classpath, a string as for example returned by clojure
|
||||||
|
-Spath, to the current classpath."
|
||||||
|
[^String extra-classpath]
|
||||||
|
(let [paths (.split extra-classpath path-sep)
|
||||||
|
paths (map ->url paths)
|
||||||
|
loader @the-url-loader]
|
||||||
|
(run! (fn [path]
|
||||||
|
(._addURL ^babashka.impl.URLClassLoader loader path)
|
||||||
|
loader)
|
||||||
|
paths)
|
||||||
|
;; (run! prn (.getURLs the-url-loader))
|
||||||
|
(System/setProperty "java.class.path"
|
||||||
|
(let [system-cp (System/getProperty "java.class.path")]
|
||||||
|
(-> (cond-> system-cp
|
||||||
|
(not (str/blank? system-cp)) (str path-sep))
|
||||||
|
(str extra-classpath)))))
|
||||||
|
nil)
|
||||||
|
|
||||||
|
(defn resource-paths [namespace]
|
||||||
(let [ns-str (name namespace)
|
(let [ns-str (name namespace)
|
||||||
^String ns-str (munge ns-str)
|
^String ns-str (namespace-munge ns-str)
|
||||||
;; do NOT pick the platform specific file separator here, since that doesn't work for searching in .jar files
|
;; do NOT pick the platform specific file separator here, since that doesn't work for searching in .jar files
|
||||||
;; (io/file "foo" "bar/baz") does work on Windows, despite the forward slash
|
;; (io/file "foo" "bar/baz") does work on Windows, despite the forward slash
|
||||||
base-path (.replace ns-str "." "/")
|
base-path (.replace ns-str "." "/")
|
||||||
resource-paths (mapv #(str base-path %) [".bb" ".clj" ".cljc"])]
|
resource-paths (mapv #(str base-path %) [".bb" ".clj" ".cljc"])]
|
||||||
(getResource loader resource-paths opts)))
|
resource-paths))
|
||||||
|
|
||||||
|
(defn source-for-namespace [loader namespace opts]
|
||||||
|
(let [rps (resource-paths namespace)]
|
||||||
|
(getResource loader rps opts)))
|
||||||
|
|
||||||
(defn main-ns [manifest-resource]
|
(defn main-ns [manifest-resource]
|
||||||
(with-open [is (io/input-stream manifest-resource)]
|
(with-open [is (io/input-stream manifest-resource)]
|
||||||
|
|
@ -82,34 +71,21 @@
|
||||||
(.getValue "Main-Class")
|
(.getValue "Main-Class")
|
||||||
(demunge))))
|
(demunge))))
|
||||||
|
|
||||||
(def cp-state (atom nil))
|
|
||||||
|
|
||||||
(defn add-classpath
|
|
||||||
"Adds extra-classpath, a string as for example returned by clojure
|
|
||||||
-Spath, to the current classpath."
|
|
||||||
[extra-classpath]
|
|
||||||
(swap! cp-state
|
|
||||||
(fn [{:keys [:cp]}]
|
|
||||||
(let [new-cp
|
|
||||||
(if-not cp extra-classpath
|
|
||||||
(str cp path-sep extra-classpath))]
|
|
||||||
{:loader (loader new-cp)
|
|
||||||
:cp new-cp})))
|
|
||||||
nil)
|
|
||||||
|
|
||||||
(defn split-classpath
|
(defn split-classpath
|
||||||
"Returns the classpath as a seq of strings, split by the platform
|
"Returns the classpath as a seq of strings, split by the platform
|
||||||
specific path separator."
|
specific path separator."
|
||||||
([^String cp] (vec (.split cp path-sep))))
|
([^String cp] (vec (when cp (.split cp path-sep)))))
|
||||||
|
|
||||||
(defn get-classpath
|
(defn get-classpath
|
||||||
"Returns the current classpath as set by --classpath, BABASHKA_CLASSPATH and add-classpath."
|
"Returns the current classpath as set by --classpath, BABASHKA_CLASSPATH and add-classpath."
|
||||||
[]
|
[]
|
||||||
(:cp @cp-state))
|
(let [cp (System/getProperty "java.class.path")]
|
||||||
|
(when-not (str/blank? cp)
|
||||||
|
cp)))
|
||||||
|
|
||||||
(defn resource
|
(defn resource
|
||||||
(^URL [path] (when-let [st @cp-state] (resource (:loader st) path)))
|
(^URL [path] (resource path @the-url-loader))
|
||||||
(^URL [loader path]
|
(^URL [path loader]
|
||||||
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
|
(if (str/starts-with? path "/") nil ;; non-relative paths always return nil
|
||||||
(getResource loader [path] true))))
|
(getResource loader [path] true))))
|
||||||
|
|
||||||
|
|
@ -128,4 +104,3 @@
|
||||||
(def l (loader cp))
|
(def l (loader cp))
|
||||||
(source-for-namespace l 'babashka.impl.cheshire nil)
|
(source-for-namespace l 'babashka.impl.cheshire nil)
|
||||||
(time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms
|
(time (:file (source-for-namespace l 'cheshire.core nil)))) ;; 20ms -> 2.25ms
|
||||||
|
|
||||||
|
|
|
||||||
41
src/babashka/impl/cli.clj
Normal file
41
src/babashka/impl/cli.clj
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
(ns babashka.impl.cli
|
||||||
|
(:require
|
||||||
|
[babashka.cli]
|
||||||
|
[sci.core :as sci]))
|
||||||
|
|
||||||
|
(def cns (sci/create-ns 'babashka.cli))
|
||||||
|
|
||||||
|
(def cli-namespace
|
||||||
|
(sci/copy-ns babashka.cli cns))
|
||||||
|
|
||||||
|
(defn exec-fn-snippet
|
||||||
|
([sym] (exec-fn-snippet sym nil))
|
||||||
|
([sym extra-opts]
|
||||||
|
(format "
|
||||||
|
(ns exec-%s
|
||||||
|
(:require [babashka.cli :as cli]))
|
||||||
|
(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)
|
||||||
|
ct (babashka.tasks/current-task)
|
||||||
|
exec-args (babashka.cli/merge-opts (:exec-args (:org.babashka/cli ns-meta))
|
||||||
|
(:exec-args (:org.babashka/cli the-var-meta))
|
||||||
|
(:exec-args (:org.babashka/cli ct))
|
||||||
|
(:exec-args ct)
|
||||||
|
(:exec-args extra-opts))
|
||||||
|
cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta)
|
||||||
|
(:org.babashka/cli the-var-meta)
|
||||||
|
(:org.babashka/cli ct)
|
||||||
|
extra-opts)
|
||||||
|
cli-opts (assoc cli-opts :exec-args exec-args)
|
||||||
|
opts (babashka.cli/parse-opts *command-line-args* cli-opts)]
|
||||||
|
(the-var opts))"
|
||||||
|
(random-uuid)
|
||||||
|
(pr-str extra-opts)
|
||||||
|
sym
|
||||||
|
)))
|
||||||
|
|
@ -3,27 +3,14 @@
|
||||||
(:refer-clojure :exclude [future read+string clojure-version with-precision
|
(:refer-clojure :exclude [future read+string clojure-version with-precision
|
||||||
send-via send send-off sync into-array])
|
send-via send send-off sync into-array])
|
||||||
(:require [babashka.impl.common :as common]
|
(:require [babashka.impl.common :as common]
|
||||||
[borkdude.graal.locking :as locking]
|
|
||||||
[clojure.core :as c]
|
[clojure.core :as c]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[sci.core :as sci]
|
[sci.core :as sci]
|
||||||
[sci.impl.namespaces :refer [copy-core-var core-var macrofy]]
|
[sci.impl.copy-vars :refer [copy-core-var new-var macrofy]]
|
||||||
[sci.impl.parser :as parser]
|
[sci.impl.parser :as parser]
|
||||||
[sci.impl.utils :refer [clojure-core-ns]]
|
[sci.impl.utils :refer [clojure-core-ns]]
|
||||||
[sci.impl.vars :as vars]))
|
[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
|
(defn core-dynamic-var
|
||||||
([sym] (core-dynamic-var sym nil))
|
([sym] (core-dynamic-var sym nil))
|
||||||
([sym init-val] (sci/new-dynamic-var sym init-val {:ns clojure-core-ns})))
|
([sym init-val] (sci/new-dynamic-var sym init-val {:ns clojure-core-ns})))
|
||||||
|
|
@ -34,6 +21,9 @@
|
||||||
(def compile-files (core-dynamic-var '*compile-files* false))
|
(def compile-files (core-dynamic-var '*compile-files* false))
|
||||||
(def unchecked-math (core-dynamic-var '*unchecked-math* false))
|
(def unchecked-math (core-dynamic-var '*unchecked-math* false))
|
||||||
(def math-context (core-dynamic-var '*math-context*))
|
(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
|
(defn read+string
|
||||||
"Added for compatibility. Must be used with
|
"Added for compatibility. Must be used with
|
||||||
|
|
@ -62,7 +52,7 @@
|
||||||
The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,
|
The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,
|
||||||
HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP."
|
HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP."
|
||||||
[precision & exprs]
|
[precision & exprs]
|
||||||
(let [[body rm] (if (= (first exprs) :rounding)
|
(let [[body rm] (if (= :rounding (first exprs))
|
||||||
[(next (next exprs))
|
[(next (next exprs))
|
||||||
`((. java.math.RoundingMode ~(second exprs)))]
|
`((. java.math.RoundingMode ~(second exprs)))]
|
||||||
[exprs nil])]
|
[exprs nil])]
|
||||||
|
|
@ -128,7 +118,7 @@
|
||||||
:static true}
|
:static true}
|
||||||
([aseq]
|
([aseq]
|
||||||
(try (clojure.lang.RT/seqToTypedArray (seq aseq))
|
(try (clojure.lang.RT/seqToTypedArray (seq aseq))
|
||||||
(catch IllegalArgumentException _
|
(catch Throwable _
|
||||||
(clojure.lang.RT/seqToTypedArray Object (seq aseq)))))
|
(clojure.lang.RT/seqToTypedArray Object (seq aseq)))))
|
||||||
([type aseq]
|
([type aseq]
|
||||||
(clojure.lang.RT/seqToTypedArray type (seq aseq))))
|
(clojure.lang.RT/seqToTypedArray type (seq aseq))))
|
||||||
|
|
@ -154,11 +144,9 @@
|
||||||
'file-seq (copy-core-var file-seq)
|
'file-seq (copy-core-var file-seq)
|
||||||
'promise (copy-core-var promise)
|
'promise (copy-core-var promise)
|
||||||
'deliver (copy-core-var deliver)
|
'deliver (copy-core-var deliver)
|
||||||
'locking (macrofy 'locking locking*)
|
|
||||||
'shutdown-agents (copy-core-var shutdown-agents)
|
'shutdown-agents (copy-core-var shutdown-agents)
|
||||||
'slurp (copy-core-var slurp)
|
'slurp (copy-core-var slurp)
|
||||||
'spit (copy-core-var spit)
|
'spit (copy-core-var spit)
|
||||||
'time (macrofy 'time time*)
|
|
||||||
'Throwable->map (copy-core-var Throwable->map)
|
'Throwable->map (copy-core-var Throwable->map)
|
||||||
'tap> (copy-core-var tap>)
|
'tap> (copy-core-var tap>)
|
||||||
'add-tap (copy-core-var add-tap)
|
'add-tap (copy-core-var add-tap)
|
||||||
|
|
@ -166,13 +154,16 @@
|
||||||
'*data-readers* data-readers
|
'*data-readers* data-readers
|
||||||
'default-data-readers (copy-core-var default-data-readers)
|
'default-data-readers (copy-core-var default-data-readers)
|
||||||
'xml-seq (copy-core-var xml-seq)
|
'xml-seq (copy-core-var xml-seq)
|
||||||
'read+string (core-var 'read+string (fn [& args]
|
'read+string (new-var 'read+string (fn [& args]
|
||||||
(apply read+string @common/ctx args)))
|
(apply read+string (common/ctx) args)))
|
||||||
'*command-line-args* command-line-args
|
'*command-line-args* command-line-args
|
||||||
'*warn-on-reflection* warn-on-reflection
|
'*warn-on-reflection* warn-on-reflection
|
||||||
'*compile-files* compile-files
|
'*compile-files* compile-files
|
||||||
'*unchecked-math* unchecked-math
|
'*unchecked-math* unchecked-math
|
||||||
'*math-context* math-context
|
'*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)
|
||||||
'-with-precision (sci/copy-var -with-precision clojure-core-ns)
|
'-with-precision (sci/copy-var -with-precision clojure-core-ns)
|
||||||
;; STM
|
;; STM
|
||||||
|
|
@ -183,6 +174,8 @@
|
||||||
'sync (sci/copy-var sync clojure-core-ns)
|
'sync (sci/copy-var sync clojure-core-ns)
|
||||||
'ref (sci/copy-var ref clojure-core-ns)
|
'ref (sci/copy-var ref clojure-core-ns)
|
||||||
'ref-set (sci/copy-var ref-set 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-vals (sci/copy-var update-vals clojure-core-ns)
|
||||||
'update-keys (sci/copy-var update-keys clojure-core-ns)
|
'update-keys (sci/copy-var update-keys clojure-core-ns)
|
||||||
'parse-boolean (sci/copy-var parse-boolean clojure-core-ns)
|
'parse-boolean (sci/copy-var parse-boolean clojure-core-ns)
|
||||||
|
|
@ -195,8 +188,20 @@
|
||||||
'iteration (sci/copy-var iteration clojure-core-ns)
|
'iteration (sci/copy-var iteration clojure-core-ns)
|
||||||
'abs (sci/copy-var abs clojure-core-ns)
|
'abs (sci/copy-var abs clojure-core-ns)
|
||||||
'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns)
|
'StackTraceElement->vec (sci/copy-var StackTraceElement->vec clojure-core-ns)
|
||||||
'memfn (sci/copy-var memfn clojure-core-ns)
|
|
||||||
'into-array (sci/copy-var into-array clojure-core-ns)
|
'into-array (sci/copy-var into-array clojure-core-ns)
|
||||||
'print-method (sci/copy-var print-method clojure-core-ns)
|
'print-method (sci/copy-var print-method clojure-core-ns)
|
||||||
'print-dup (sci/copy-var print-dup clojure-core-ns)}
|
'print-dup (sci/copy-var print-dup clojure-core-ns)
|
||||||
|
'PrintWriter-on (sci/copy-var PrintWriter-on clojure-core-ns)
|
||||||
|
'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)
|
||||||
|
;; 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,33 +2,94 @@
|
||||||
{:no-doc true}
|
{:no-doc true}
|
||||||
(:require [clojure.core.async :as async]
|
(:require [clojure.core.async :as async]
|
||||||
[clojure.core.async.impl.protocols :as protocols]
|
[clojure.core.async.impl.protocols :as protocols]
|
||||||
|
[clojure.core.async.impl.dispatch :as dispatch]
|
||||||
[sci.core :as sci :refer [copy-var]]
|
[sci.core :as sci :refer [copy-var]]
|
||||||
[sci.impl.namespaces :refer [macrofy]]
|
[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))
|
||||||
|
(catch Exception _ nil)))
|
||||||
|
|
||||||
(defn thread-call
|
(defn thread-call
|
||||||
"Executes f in another thread, returning immediately to the calling
|
"Executes f in another thread, returning immediately to the calling
|
||||||
thread. Returns a channel which will receive the result of calling
|
thread. Returns a channel which will receive the result of calling
|
||||||
|
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
|
||||||
|
thread. Returns a channel which will receive the result of calling
|
||||||
f when completed, then close."
|
f when completed, then close."
|
||||||
[f]
|
[f]
|
||||||
(let [c (async/chan 1)]
|
(let [c (async/chan 1)]
|
||||||
(let [binds (vars/get-thread-binding-frame)]
|
(let [returning-to-chan (fn [bf]
|
||||||
(.execute executor
|
#(try
|
||||||
(fn []
|
(when-some [ret (bf)]
|
||||||
(vars/reset-thread-binding-frame binds)
|
(async/>!! c ret))
|
||||||
(try
|
(finally (async/close! c))))
|
||||||
(let [ret (f)]
|
f (vars/binding-conveyor-fn f)]
|
||||||
(when-not (nil? ret)
|
(.execute virtual-executor
|
||||||
(async/>!! c ret)))
|
(-> f returning-to-chan)))
|
||||||
(finally
|
|
||||||
(async/close! c))))))
|
|
||||||
c))
|
c))
|
||||||
|
|
||||||
(defn thread
|
(defn thread
|
||||||
[_ _ & body]
|
[_ _ & 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]
|
||||||
|
`(~'clojure.core.async/-vthread-call (fn [] ~@body)))
|
||||||
|
|
||||||
(defn alt!!
|
(defn alt!!
|
||||||
"Like alt!, except as if by alts!!, will block until completed, and
|
"Like alt!, except as if by alts!!, will block until completed, and
|
||||||
|
|
@ -38,10 +99,19 @@
|
||||||
|
|
||||||
(defn go-loop
|
(defn go-loop
|
||||||
[_ _ bindings & body]
|
[_ _ bindings & body]
|
||||||
(list 'clojure.core.async/thread (list* 'loop bindings body)))
|
(list 'clojure.core.async/go (list* 'loop bindings body)))
|
||||||
|
|
||||||
(def core-async-namespace (sci/create-ns 'clojure.core.async nil))
|
(def core-async-namespace (sci/create-ns 'clojure.core.async nil))
|
||||||
|
|
||||||
|
(defn timeout [ms]
|
||||||
|
(if virtual-executor
|
||||||
|
(let [chan (async/chan nil)]
|
||||||
|
(.execute virtual-executor (fn []
|
||||||
|
(Thread/sleep (long ms))
|
||||||
|
(async/close! chan)))
|
||||||
|
chan)
|
||||||
|
(async/timeout ms)))
|
||||||
|
|
||||||
(def async-namespace
|
(def async-namespace
|
||||||
{:obj core-async-namespace
|
{:obj core-async-namespace
|
||||||
'<!! (copy-var async/<!! core-async-namespace)
|
'<!! (copy-var async/<!! core-async-namespace)
|
||||||
|
|
@ -68,6 +138,8 @@
|
||||||
'mult (copy-var async/mult core-async-namespace)
|
'mult (copy-var async/mult core-async-namespace)
|
||||||
'offer! (copy-var async/offer! core-async-namespace)
|
'offer! (copy-var async/offer! core-async-namespace)
|
||||||
'onto-chan (copy-var async/onto-chan core-async-namespace)
|
'onto-chan (copy-var async/onto-chan core-async-namespace)
|
||||||
|
'onto-chan! (copy-var async/onto-chan! core-async-namespace)
|
||||||
|
'onto-chan!! (copy-var async/onto-chan!! core-async-namespace)
|
||||||
'partition (copy-var async/partition core-async-namespace)
|
'partition (copy-var async/partition core-async-namespace)
|
||||||
'partition-by (copy-var async/partition-by core-async-namespace)
|
'partition-by (copy-var async/partition-by core-async-namespace)
|
||||||
'pipe (copy-var async/pipe core-async-namespace)
|
'pipe (copy-var async/pipe core-async-namespace)
|
||||||
|
|
@ -89,9 +161,13 @@
|
||||||
'take! (copy-var async/take! core-async-namespace)
|
'take! (copy-var async/take! core-async-namespace)
|
||||||
'tap (copy-var async/tap core-async-namespace)
|
'tap (copy-var async/tap core-async-namespace)
|
||||||
'thread (macrofy 'thread thread 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)
|
'thread-call (copy-var thread-call core-async-namespace)
|
||||||
'timeout (copy-var async/timeout core-async-namespace)
|
'-vthread-call (copy-var -vthread-call core-async-namespace)
|
||||||
|
'timeout (copy-var timeout core-async-namespace)
|
||||||
'to-chan (copy-var async/to-chan core-async-namespace)
|
'to-chan (copy-var async/to-chan core-async-namespace)
|
||||||
|
'to-chan! (copy-var async/to-chan! core-async-namespace)
|
||||||
|
'to-chan!! (copy-var async/to-chan!! core-async-namespace)
|
||||||
'toggle (copy-var async/toggle core-async-namespace)
|
'toggle (copy-var async/toggle core-async-namespace)
|
||||||
'transduce (copy-var async/transduce core-async-namespace)
|
'transduce (copy-var async/transduce core-async-namespace)
|
||||||
'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace)
|
'unblocking-buffer? (copy-var async/unblocking-buffer? core-async-namespace)
|
||||||
|
|
@ -103,7 +179,9 @@
|
||||||
'untap (copy-var async/untap core-async-namespace)
|
'untap (copy-var async/untap core-async-namespace)
|
||||||
'untap-all (copy-var async/untap-all core-async-namespace)
|
'untap-all (copy-var async/untap-all core-async-namespace)
|
||||||
;; polyfill
|
;; polyfill
|
||||||
'go (macrofy 'go thread core-async-namespace)
|
'go (if virtual-executor
|
||||||
|
(macrofy 'go -vthread core-async-namespace)
|
||||||
|
(macrofy 'go thread core-async-namespace))
|
||||||
'<! (copy-var async/<!! core-async-namespace {:name '<!})
|
'<! (copy-var async/<!! core-async-namespace {:name '<!})
|
||||||
'>! (copy-var async/>!! core-async-namespace {:name '>!})
|
'>! (copy-var async/>!! core-async-namespace {:name '>!})
|
||||||
'alt! (macrofy 'alt! alt!! core-async-namespace)
|
'alt! (macrofy 'alt! alt!! core-async-namespace)
|
||||||
|
|
@ -115,3 +193,4 @@
|
||||||
(def async-protocols-namespace
|
(def async-protocols-namespace
|
||||||
{:obj async-protocols-ns
|
{:obj async-protocols-ns
|
||||||
'ReadPort (copy-var protocols/ReadPort async-protocols-ns)})
|
'ReadPort (copy-var protocols/ReadPort async-protocols-ns)})
|
||||||
|
;; trigger CI
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
(case os
|
(case os
|
||||||
:mac (sh "open" url)
|
:mac (sh "open" url)
|
||||||
:linux (sh "xdg-open" url)
|
:linux (sh "xdg-open" url)
|
||||||
:windows (sh "cmd" "/C" "start" url)))))
|
:windows (sh "cmd" "/C" "start" (.replace url "&" "^&"))))))
|
||||||
|
|
||||||
(def browse-namespace
|
(def browse-namespace
|
||||||
{'*open-url-script* open-url-script
|
{'*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.repl :refer (source apropos pst dir doc find-doc)]
|
||||||
[clojure.pprint :refer (pp pprint)]])
|
[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
|
(defn repl
|
||||||
"Generic, reusable, read-eval-print loop. By default, reads from *in*,
|
"Generic, reusable, read-eval-print loop. By default, reads from *in*,
|
||||||
writes to *out*, and prints exception summaries to *err*. If you use the
|
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>"
|
:file "<repl>"
|
||||||
:type :sci/error) e)))))))
|
:type :sci/error) e)))))))
|
||||||
(catch Throwable e
|
(catch Throwable e
|
||||||
(caught e)
|
(let [e' (ex-cause e)]
|
||||||
(set! *e e))))]
|
(caught e)
|
||||||
|
(set! *e e')))))]
|
||||||
(with-bindings
|
(with-bindings
|
||||||
(try
|
(try
|
||||||
(init)
|
(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)})
|
||||||
|
|
@ -232,13 +232,13 @@
|
||||||
For additional event types, see the examples in the code.
|
For additional event types, see the examples in the code.
|
||||||
"}
|
"}
|
||||||
babashka.impl.clojure.test
|
babashka.impl.clojure.test
|
||||||
(:require [babashka.impl.common :refer [ctx]]
|
(:require
|
||||||
[clojure.stacktrace :as stack]
|
[babashka.impl.common :refer [ctx]]
|
||||||
[clojure.template :as temp]
|
[clojure.stacktrace :as stack]
|
||||||
[sci.core :as sci]
|
[clojure.template :as temp]
|
||||||
[sci.impl.namespaces :as sci-namespaces]
|
[sci.core :as sci]
|
||||||
[sci.impl.resolve :as resolve]
|
[sci.impl.namespaces :as sci-namespaces]
|
||||||
[sci.impl.vars :as vars]))
|
[sci.impl.resolve :as resolve]))
|
||||||
|
|
||||||
;; Nothing is marked "private" here, so you can rebind things to plug
|
;; Nothing is marked "private" here, so you can rebind things to plug
|
||||||
;; in your own testing or reporting frameworks.
|
;; in your own testing or reporting frameworks.
|
||||||
|
|
@ -297,7 +297,7 @@
|
||||||
current assertion."
|
current assertion."
|
||||||
{:added "1.1"}
|
{:added "1.1"}
|
||||||
[m]
|
[m]
|
||||||
(let [{:keys [:file :line]} (meta (first @testing-vars))]
|
(let [{:keys [:file :line]} (merge m (meta (first @testing-vars)))]
|
||||||
(str
|
(str
|
||||||
;; Uncomment to include namespace in failure report:
|
;; Uncomment to include namespace in failure report:
|
||||||
;;(ns-name (:ns (meta (first *testing-vars*)))) "/ "
|
;;(ns-name (:ns (meta (first *testing-vars*)))) "/ "
|
||||||
|
|
@ -316,8 +316,8 @@
|
||||||
Does nothing if *report-counters* is nil."
|
Does nothing if *report-counters* is nil."
|
||||||
{:added "1.1"}
|
{:added "1.1"}
|
||||||
[name]
|
[name]
|
||||||
(when @report-counters
|
(when-let [rc @report-counters]
|
||||||
(swap! @report-counters update-in [name] (fnil inc 0))))
|
(dosync (commute rc update-in [name] (fnil inc 0)))))
|
||||||
|
|
||||||
;;; TEST RESULT REPORTING
|
;;; TEST RESULT REPORTING
|
||||||
|
|
||||||
|
|
@ -408,7 +408,7 @@
|
||||||
{:added "1.1"}
|
{:added "1.1"}
|
||||||
[x]
|
[x]
|
||||||
(if (symbol? x)
|
(if (symbol? x)
|
||||||
(when-let [v (second (resolve/lookup @ctx x false))]
|
(when-let [v (second (resolve/lookup (ctx) x false))]
|
||||||
(when-let [value (if (instance? sci.lang.Var v)
|
(when-let [value (if (instance? sci.lang.Var v)
|
||||||
(get-possibly-unbound-var v)
|
(get-possibly-unbound-var v)
|
||||||
v)]
|
v)]
|
||||||
|
|
@ -660,14 +660,12 @@
|
||||||
|
|
||||||
;;; DEFINING FIXTURES
|
;;; DEFINING FIXTURES
|
||||||
|
|
||||||
(def ^:private ns->fixtures (atom {}))
|
|
||||||
|
|
||||||
(defn- add-ns-meta
|
(defn- add-ns-meta
|
||||||
"Adds elements in coll to the current namespace metadata as the
|
"Adds elements in coll to the current namespace metadata as the
|
||||||
value of key."
|
value of key."
|
||||||
{:added "1.1"}
|
{:added "1.1"}
|
||||||
[key coll]
|
[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
|
(defmulti use-fixtures
|
||||||
"Wrap test runs in a fixture function to perform setup and
|
"Wrap test runs in a fixture function to perform setup and
|
||||||
|
|
@ -677,10 +675,10 @@
|
||||||
(fn [fixture-type & args] fixture-type))
|
(fn [fixture-type & args] fixture-type))
|
||||||
|
|
||||||
(defmethod use-fixtures :each [fixture-type & args]
|
(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]
|
(defmethod use-fixtures :once [fixture-type & args]
|
||||||
(add-ns-meta ::once-fixtures args))
|
(add-ns-meta :clojure.test/once-fixtures args))
|
||||||
|
|
||||||
(defn- default-fixture
|
(defn- default-fixture
|
||||||
"The default, empty, fixture function. Just calls its argument."
|
"The default, empty, fixture function. Just calls its argument."
|
||||||
|
|
@ -731,10 +729,8 @@
|
||||||
[vars]
|
[vars]
|
||||||
(doseq [[ns vars] (group-by (comp :ns meta) vars)
|
(doseq [[ns vars] (group-by (comp :ns meta) vars)
|
||||||
:when ns]
|
:when ns]
|
||||||
(let [ns-name (sci-namespaces/sci-ns-name ns)
|
(let [once-fixture-fn (join-fixtures (:clojure.test/once-fixtures (meta ns)))
|
||||||
fixtures (get @ns->fixtures ns-name)
|
each-fixture-fn (join-fixtures (:clojure.test/each-fixtures (meta ns)))]
|
||||||
once-fixture-fn (join-fixtures (::once-fixtures fixtures))
|
|
||||||
each-fixture-fn (join-fixtures (::each-fixtures fixtures))]
|
|
||||||
(once-fixture-fn
|
(once-fixture-fn
|
||||||
(fn []
|
(fn []
|
||||||
(doseq [v vars]
|
(doseq [v vars]
|
||||||
|
|
@ -758,7 +754,7 @@
|
||||||
*report-counters*."
|
*report-counters*."
|
||||||
{:added "1.1"}
|
{:added "1.1"}
|
||||||
[ctx ns]
|
[ctx ns]
|
||||||
(sci/binding [report-counters (atom @initial-report-counters)]
|
(sci/binding [report-counters (ref @initial-report-counters)]
|
||||||
(let [ns-obj (sci-namespaces/sci-the-ns ctx ns)]
|
(let [ns-obj (sci-namespaces/sci-the-ns ctx ns)]
|
||||||
(do-report {:type :begin-test-ns, :ns ns-obj})
|
(do-report {:type :begin-test-ns, :ns ns-obj})
|
||||||
;; If the namespace has a test-ns-hook function, call that:
|
;; If the namespace has a test-ns-hook function, call that:
|
||||||
|
|
@ -804,3 +800,39 @@
|
||||||
[summary]
|
[summary]
|
||||||
(and (zero? (:fail summary 0))
|
(and (zero? (:fail summary 0))
|
||||||
(zero? (:error summary 0))))
|
(zero? (:error summary 0))))
|
||||||
|
|
||||||
|
(defn run-test-var
|
||||||
|
"Runs the tests for a single Var, with fixtures executed around the test, and summary output after."
|
||||||
|
{:added "1.11"}
|
||||||
|
[v]
|
||||||
|
(sci/binding [report-counters (ref @initial-report-counters)]
|
||||||
|
(let [ns-obj (-> v meta :ns)
|
||||||
|
summary (do
|
||||||
|
(do-report {:type :begin-test-ns
|
||||||
|
:ns ns-obj})
|
||||||
|
(test-vars [v])
|
||||||
|
(do-report {:type :end-test-ns
|
||||||
|
:ns ns-obj})
|
||||||
|
(assoc @@report-counters :type :summary))]
|
||||||
|
(do-report summary)
|
||||||
|
summary)))
|
||||||
|
|
||||||
|
(defmacro run-test
|
||||||
|
"Runs a single test.
|
||||||
|
Because the intent is to run a single test, there is no check for the namespace test-ns-hook."
|
||||||
|
{:added "1.11"}
|
||||||
|
[test-symbol]
|
||||||
|
(let [test-var (sci/resolve (ctx) test-symbol)]
|
||||||
|
(cond
|
||||||
|
(nil? test-var)
|
||||||
|
(sci/binding [sci/out sci/err]
|
||||||
|
(binding [*out* sci/out]
|
||||||
|
(println "Unable to resolve" test-symbol "to a test function.")))
|
||||||
|
|
||||||
|
(not (-> test-var meta :test))
|
||||||
|
(sci/binding [sci/out sci/err]
|
||||||
|
(binding [*out* sci/out]
|
||||||
|
(println test-symbol "is not a test.")))
|
||||||
|
|
||||||
|
:else
|
||||||
|
`(clojure.test/run-test-var ~test-var))))
|
||||||
|
|
|
||||||
91
src/babashka/impl/clojure/tools/reader.clj
Normal file
91
src/babashka/impl/clojure/tools/reader.clj
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
(ns babashka.impl.clojure.tools.reader
|
||||||
|
(:refer-clojure :exclude [read read-string])
|
||||||
|
(:require
|
||||||
|
[clojure.tools.reader.reader-types :as rt]
|
||||||
|
[edamame.core :as e]
|
||||||
|
[sci.core :as sci]
|
||||||
|
[sci.ctx-store :as ctx]
|
||||||
|
[sci.impl.parser :as p]))
|
||||||
|
|
||||||
|
(def rns (sci/create-ns 'clojure.tools.reader))
|
||||||
|
|
||||||
|
(def default-opts
|
||||||
|
(e/normalize-opts
|
||||||
|
{:all true
|
||||||
|
:row-key :line
|
||||||
|
:col-key :column
|
||||||
|
:location? seq?
|
||||||
|
:end-location false}))
|
||||||
|
|
||||||
|
(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.
|
||||||
|
Returns the object read. If EOF, throws if eof-error? is true.
|
||||||
|
Otherwise returns sentinel. If no stream is provided, *in* will be used.
|
||||||
|
Opts is a persistent map with valid keys:
|
||||||
|
:read-cond - :allow to process reader conditionals, or
|
||||||
|
:preserve to keep all branches
|
||||||
|
:features - persistent set of feature keywords for reader conditionals
|
||||||
|
:eof - on eof, return value unless :eofthrow, then throw.
|
||||||
|
if not specified, will throw
|
||||||
|
***WARNING***
|
||||||
|
Note that read can execute code (controlled by *read-eval*),
|
||||||
|
and as such should be used only with trusted sources.
|
||||||
|
To read data structures only, use clojure.tools.reader.edn/read
|
||||||
|
Note that the function signature of clojure.tools.reader/read and
|
||||||
|
clojure.tools.reader.edn/read is not the same for eof-handling"
|
||||||
|
{:arglists '([] [reader] [opts reader] [reader eof-error? eof-value])}
|
||||||
|
([] (read @sci/in true nil))
|
||||||
|
([reader] (read reader true nil))
|
||||||
|
([{eof :eof :as opts :or {eof :eofthrow}} reader]
|
||||||
|
(let [opts (assoc default-opts
|
||||||
|
:read-cond (:read-cond opts)
|
||||||
|
:features (:features opts)
|
||||||
|
: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)
|
||||||
|
(throw (java.io.EOFException.))
|
||||||
|
eof)
|
||||||
|
v)))
|
||||||
|
([reader eof-error? sentinel]
|
||||||
|
(let [v (e/parse-next reader default-opts)]
|
||||||
|
(if (identical? ::e/eof v)
|
||||||
|
(if eof-error?
|
||||||
|
(throw (java.io.EOFException.))
|
||||||
|
sentinel)
|
||||||
|
v))))
|
||||||
|
|
||||||
|
(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]
|
[clojure.tools.reader.reader-types :as rt]
|
||||||
[sci.core :as sci]))
|
[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))
|
(def rtns (sci/create-ns 'clojure.tools.reader.reader-types))
|
||||||
|
|
||||||
|
|
@ -13,4 +16,6 @@
|
||||||
'peek-char (sci/copy-var rt/peek-char rtns)
|
'peek-char (sci/copy-var rt/peek-char rtns)
|
||||||
'read-char (sci/copy-var rt/read-char rtns)
|
'read-char (sci/copy-var rt/read-char rtns)
|
||||||
'unread (sci/copy-var rt/unread rtns)
|
'unread (sci/copy-var rt/unread rtns)
|
||||||
'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)})
|
'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)
|
||||||
|
'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)
|
||||||
|
'string-push-back-reader (sci/copy-var rt/string-push-back-reader rtns)})
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,11 @@
|
||||||
(ns babashka.impl.common)
|
(ns babashka.impl.common
|
||||||
|
(:require
|
||||||
|
[clojure.java.io :as io]
|
||||||
|
[clojure.string :as str]
|
||||||
|
[sci.ctx-store :as ctx-store]))
|
||||||
|
|
||||||
;; placeholder for ctx
|
;; placeholder for ctx
|
||||||
(def ctx (volatile! nil))
|
(defn ctx [] (ctx-store/get-ctx))
|
||||||
(def bb-edn (volatile! nil))
|
(def bb-edn (volatile! nil))
|
||||||
(def debug (volatile! false))
|
(def debug (volatile! false))
|
||||||
|
(def version (str/trim (slurp (io/resource "BABASHKA_VERSION"))))
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,5 @@
|
||||||
(def data-ns (sci/create-ns 'clojure.data nil))
|
(def data-ns (sci/create-ns 'clojure.data nil))
|
||||||
|
|
||||||
(def data-namespace
|
(def data-namespace
|
||||||
{'diff (copy-var data/diff data-ns)})
|
{'diff (copy-var data/diff data-ns)
|
||||||
|
'equality-partition (copy-var data/equality-partition data-ns)})
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue