Compare commits
993 Commits
claude-cod
...
single-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f55dc0d3b5 | ||
|
|
1b75ad7c5a | ||
|
|
51a7fdb409 | ||
|
|
15dcbf0b7c | ||
|
|
5703bc13d1 | ||
|
|
3f3b925eed | ||
|
|
6fe8a78990 | ||
|
|
6a5566453f | ||
|
|
65420ff3fd | ||
|
|
15306c17e7 | ||
|
|
a5acb871bb | ||
|
|
b10b0dce4b | ||
|
|
060ca28cc3 | ||
|
|
d2448daf08 | ||
|
|
c6a55b0f90 | ||
|
|
7c86d9d269 | ||
|
|
9b42a0ae7b | ||
|
|
610ee2e900 | ||
|
|
658c1e4704 | ||
|
|
44e0478525 | ||
|
|
b13dd15c41 | ||
|
|
03cf63892c | ||
|
|
40f15d3ce7 | ||
|
|
f5b5de0dbd | ||
|
|
50cf80b158 | ||
|
|
40d2b1bfa1 | ||
|
|
bc4750a562 | ||
|
|
4523266d6c | ||
|
|
46fc871718 | ||
|
|
8150ee9bbd | ||
|
|
4f376c4ce5 | ||
|
|
8540e3cc26 | ||
|
|
3220b41358 | ||
|
|
e00e7d8668 | ||
|
|
99dbd78088 | ||
|
|
7437bfc147 | ||
|
|
f67b4aae0e | ||
|
|
3a9e1d2380 | ||
|
|
4e98918192 | ||
|
|
ab5465ec9b | ||
|
|
653d9e616e | ||
|
|
21c90d92c3 | ||
|
|
6165712a53 | ||
|
|
269009d1f3 | ||
|
|
aa5dab0b8c | ||
|
|
d710fb129f | ||
|
|
36573b38fa | ||
|
|
c7fb35e7fc | ||
|
|
558af5e372 | ||
|
|
537d4169ee | ||
|
|
5846360d58 | ||
|
|
4410db3aea | ||
|
|
59326bee8c | ||
|
|
f463fa21bc | ||
|
|
a1cf3cbe6b | ||
|
|
010c5510fc | ||
|
|
ba4b0a30c8 | ||
|
|
dc92ed99e3 | ||
|
|
3e9ef060ed | ||
|
|
1d89072891 | ||
|
|
35fa63c63a | ||
|
|
76da6d5382 | ||
|
|
c3674747f4 | ||
|
|
e537911bc3 | ||
|
|
c21360e3bd | ||
|
|
7ba6f246f3 | ||
|
|
33fc7acca9 | ||
|
|
6d5393cfeb | ||
|
|
0860a98a1e | ||
|
|
f040ca027c | ||
|
|
876368b12d | ||
|
|
8b0cd97ab9 | ||
|
|
39b274db1b | ||
|
|
184d6a5b6d | ||
|
|
2628e7874d | ||
|
|
5b83c629d9 | ||
|
|
18ff09c54a | ||
|
|
3e0e2c6b99 | ||
|
|
c55139ed0c | ||
|
|
623523c6fc | ||
|
|
7d306e5884 | ||
|
|
eabbba2463 | ||
|
|
2c567ae30f | ||
|
|
135ba04d91 | ||
|
|
2f1de41467 | ||
|
|
172fe61ae5 | ||
|
|
18a8fdbf6d | ||
|
|
f41897df9d | ||
|
|
64887b6369 | ||
|
|
fa9d884b60 | ||
|
|
055e8b0b66 | ||
|
|
a442965526 | ||
|
|
52dd381e5b | ||
|
|
490320b47e | ||
|
|
4b90bd4e78 | ||
|
|
019b997680 | ||
|
|
44bf519b74 | ||
|
|
c686b3a7b9 | ||
|
|
0fd603f9cc | ||
|
|
eb6fa6052c | ||
|
|
8a8217b323 | ||
|
|
3b9bcc1158 | ||
|
|
57f96b1561 | ||
|
|
d2bb428aa5 | ||
|
|
2504278fd1 | ||
|
|
9379998665 | ||
|
|
1b3e52d285 | ||
|
|
3f484a9198 | ||
|
|
1175848a78 | ||
|
|
0b06002dd5 | ||
|
|
30405beba7 | ||
|
|
106a53e50c | ||
|
|
b908c7a826 | ||
|
|
ac42020ffb | ||
|
|
194f33bd58 | ||
|
|
7c7b8c0ffa | ||
|
|
e502e8c313 | ||
|
|
a2da60735b | ||
|
|
741cc32efe | ||
|
|
72115f8077 | ||
|
|
1b21d9e703 | ||
|
|
fd85a8b2c5 | ||
|
|
cc5ece8941 | ||
|
|
40898a8923 | ||
|
|
c00f99a8a2 | ||
|
|
386b0c1180 | ||
|
|
d8da5514a1 | ||
|
|
93844dde9b | ||
|
|
22baf07864 | ||
|
|
572463d93a | ||
|
|
5631b69254 | ||
|
|
5b3f884cf5 | ||
|
|
74cc4496a7 | ||
|
|
5c30345bdb | ||
|
|
6c15c95f6a | ||
|
|
0d61f1dc9f | ||
|
|
5879a72692 | ||
|
|
13e7b728bb | ||
|
|
fa987a1031 | ||
|
|
7e2a6fd82b | ||
|
|
9522b3553b | ||
|
|
1e0151089e | ||
|
|
875d28d5e0 | ||
|
|
bbcc5c8da6 | ||
|
|
9b0e848524 | ||
|
|
1adc1c277a | ||
|
|
3bcdb8ae5d | ||
|
|
cc50572fed | ||
|
|
e0633df84c | ||
|
|
d3940c48f9 | ||
|
|
875cde2f6f | ||
|
|
4d295519b8 | ||
|
|
61bf62e6b9 | ||
|
|
8e161473ed | ||
|
|
f9396a3131 | ||
|
|
45ef5471b6 | ||
|
|
ecf6b108a4 | ||
|
|
46460a72d8 | ||
|
|
e132bc2b3f | ||
|
|
c9d8bda4e2 | ||
|
|
1d861f3bd0 | ||
|
|
da0fa68410 | ||
|
|
06868930d5 | ||
|
|
0493b2ab06 | ||
|
|
167b5d0457 | ||
|
|
e6ae405f1b | ||
|
|
6911ca0034 | ||
|
|
0f472619a1 | ||
|
|
45ec88bcf6 | ||
|
|
d52ceacb85 | ||
|
|
49d98e3bdf | ||
|
|
f72cb7a95f | ||
|
|
25949f7010 | ||
|
|
a203a07465 | ||
|
|
124f99efa6 | ||
|
|
f5c3e19c20 | ||
|
|
505ce6bf19 | ||
|
|
eb71b07554 | ||
|
|
b74a36e201 | ||
|
|
9a6a8bc2db | ||
|
|
fde212f961 | ||
|
|
4541eeb4ac | ||
|
|
1873505e72 | ||
|
|
6e3aca9d5a | ||
|
|
f7f44f2538 | ||
|
|
12351f93d8 | ||
|
|
401a3f5a03 | ||
|
|
2f6f6d8cd1 | ||
|
|
d22c0b93b7 | ||
|
|
16efcf7bc4 | ||
|
|
5a6dffed11 | ||
|
|
95d2db505a | ||
|
|
a6544c6cae | ||
|
|
f99fe8e922 | ||
|
|
b6dff656d7 | ||
|
|
e26c2b0ef7 | ||
|
|
b5db6f3d6b | ||
|
|
bde63bb6d3 | ||
|
|
cdd03ce3f9 | ||
|
|
753f612b70 | ||
|
|
8e3ae592e5 | ||
|
|
b8b2c9859b | ||
|
|
4161aa620a | ||
|
|
71cc4d55ad | ||
|
|
8a48603cd9 | ||
|
|
cb519789e7 | ||
|
|
cb53ea46f7 | ||
|
|
ec39dcbd7e | ||
|
|
ad608ccc91 | ||
|
|
8ff9fa1b9b | ||
|
|
89ca56dbe7 | ||
|
|
33032d5ae0 | ||
|
|
515c93f442 | ||
|
|
10205ea677 | ||
|
|
d2541d2426 | ||
|
|
c9490c3bad | ||
|
|
a5cdcada29 | ||
|
|
ed2d5c676f | ||
|
|
13dedb2e85 | ||
|
|
b4f207e44b | ||
|
|
a921faf14f | ||
|
|
533c823dc5 | ||
|
|
87115666c1 | ||
|
|
673da45b3b | ||
|
|
985f298f8b | ||
|
|
f5d3f3267c | ||
|
|
44e9886d68 | ||
|
|
2b426e701c | ||
|
|
03bd660f37 | ||
|
|
4ff5abd06a | ||
|
|
e0e3a17634 | ||
|
|
3db6677747 | ||
|
|
31a355c833 | ||
|
|
fc70115302 | ||
|
|
3739507b28 | ||
|
|
4e37fb0e71 | ||
|
|
d77f3da196 | ||
|
|
59d0ab1124 | ||
|
|
34e6a516c7 | ||
|
|
256179a72a | ||
|
|
61ff81a3ab | ||
|
|
519a9f197f | ||
|
|
c0a3f19b87 | ||
|
|
b5528b9e77 | ||
|
|
73ad3908a7 | ||
|
|
002816ac09 | ||
|
|
b5a11b7497 | ||
|
|
d028448a5f | ||
|
|
27e5abdf8c | ||
|
|
d966ff346c | ||
|
|
dd474a1776 | ||
|
|
cb70a6df23 | ||
|
|
baa82b1ca0 | ||
|
|
5cdc504355 | ||
|
|
e57f223d3a | ||
|
|
e0213e3665 | ||
|
|
f0c19f08a1 | ||
|
|
49d314b70d | ||
|
|
b1de6084e2 | ||
|
|
e6f17ffae9 | ||
|
|
f13a02c0c3 | ||
|
|
f5b3699072 | ||
|
|
ffec482d73 | ||
|
|
7029fd4c6d | ||
|
|
56cdad9c72 | ||
|
|
607cf6efad | ||
|
|
04e0d8a390 | ||
|
|
e97eeccba4 | ||
|
|
ed6e5591e3 | ||
|
|
a3ee9cde79 | ||
|
|
29df8b91d9 | ||
|
|
6c1eeb9f32 | ||
|
|
05462a5212 | ||
|
|
d0418f8377 | ||
|
|
9a01d082ff | ||
|
|
2d5d40a9ab | ||
|
|
f11fb71403 | ||
|
|
4b6f1097f8 | ||
|
|
b649df7214 | ||
|
|
ba43f3ad71 | ||
|
|
c979f78a3d | ||
|
|
f06fded742 | ||
|
|
9dcbcba3f6 | ||
|
|
c852e0b4a1 | ||
|
|
b7711b995b | ||
|
|
6a3a058e28 | ||
|
|
5c0171e37b | ||
|
|
8adcd9ec66 | ||
|
|
467297aeb2 | ||
|
|
fcef77fdef | ||
|
|
490f1c8ab7 | ||
|
|
c50883c866 | ||
|
|
bd3ea3bdab | ||
|
|
ea5e00c5b4 | ||
|
|
ad1d77f1aa | ||
|
|
37cc0ffa9d | ||
|
|
85a5f8efc7 | ||
|
|
de780f53cd | ||
|
|
28ceb5e471 | ||
|
|
e1041fcfa1 | ||
|
|
e7ddf4d260 | ||
|
|
4b006fec6e | ||
|
|
15597535de | ||
|
|
9aa35fff0b | ||
|
|
937ab0ca3d | ||
|
|
8e6d4a8258 | ||
|
|
e68b3f998e | ||
|
|
9c071ffbcb | ||
|
|
4b4b74e49a | ||
|
|
ceff6b3e63 | ||
|
|
5236b54cc3 | ||
|
|
2314c8b5ad | ||
|
|
c90d29f9f1 | ||
|
|
45269fcf32 | ||
|
|
453eab244c | ||
|
|
75ee0f5bc3 | ||
|
|
7114b71dac | ||
|
|
84cf0f564f | ||
|
|
5da40d53c5 | ||
|
|
cdbd112bff | ||
|
|
2baab9c7a0 | ||
|
|
04035f1154 | ||
|
|
9c615e79f0 | ||
|
|
e945330f2f | ||
|
|
efab244107 | ||
|
|
408848d793 | ||
|
|
0cc545526b | ||
|
|
e4ec734dca | ||
|
|
3a3db243a7 | ||
|
|
fef2ff25bd | ||
|
|
5e7d24290e | ||
|
|
42053fe15e | ||
|
|
93b76e1876 | ||
|
|
cf79da01cc | ||
|
|
2a05b062ba | ||
|
|
5453388b07 | ||
|
|
6bd7abb277 | ||
|
|
633a75f2c3 | ||
|
|
1677e13e89 | ||
|
|
8969a6d7d1 | ||
|
|
03a847cc29 | ||
|
|
2f86808554 | ||
|
|
38f130358c | ||
|
|
229118d0bf | ||
|
|
cd1d74091c | ||
|
|
e2f9a61753 | ||
|
|
1139fcded8 | ||
|
|
b8b6d610a7 | ||
|
|
8a3919c960 | ||
|
|
899ff2ef2e | ||
|
|
f70ff1d987 | ||
|
|
bcb23015d4 | ||
|
|
062f726061 | ||
|
|
5742fe8faa | ||
|
|
ef8402cf26 | ||
|
|
07851c4331 | ||
|
|
494462a397 | ||
|
|
a52a292ff4 | ||
|
|
02771d878a | ||
|
|
9b755aab80 | ||
|
|
72975d11c4 | ||
|
|
814e5a95da | ||
|
|
207977e9cd | ||
|
|
58a480de68 | ||
|
|
a3b8bc0136 | ||
|
|
030b3f2168 | ||
|
|
77288ad23d | ||
|
|
859997583f | ||
|
|
d254909d96 | ||
|
|
ac3ea294c7 | ||
|
|
6cef8aea56 | ||
|
|
f5185c6298 | ||
|
|
1d497cd54a | ||
|
|
afa64803aa | ||
|
|
57c718c5e3 | ||
|
|
7184480fc0 | ||
|
|
eb8eefe50b | ||
|
|
131ade90fb | ||
|
|
5ec56ea755 | ||
|
|
b3bf03986e | ||
|
|
d8af6c3ff8 | ||
|
|
c79afd62fc | ||
|
|
98e1166ea0 | ||
|
|
51174fce6b | ||
|
|
fbb663d236 | ||
|
|
c1db8c5a6d | ||
|
|
252c1c0fce | ||
|
|
da0be61b2e | ||
|
|
4efe85990b | ||
|
|
8cc4451ebc | ||
|
|
2b7a5352fb | ||
|
|
80fbc9f9ca | ||
|
|
b917700959 | ||
|
|
0931f01921 | ||
|
|
4e9f101cea | ||
|
|
18776a687a | ||
|
|
ced4a5ec3d | ||
|
|
e0f5809a74 | ||
|
|
a6da2249c0 | ||
|
|
72e14e3ea2 | ||
|
|
746e8174bc | ||
|
|
d5a0699e61 | ||
|
|
fcf51ffefd | ||
|
|
8367dd30a2 | ||
|
|
eb1de2371e | ||
|
|
fbbf273218 | ||
|
|
b1852e2d43 | ||
|
|
b3f4fd20d8 | ||
|
|
63428a43e2 | ||
|
|
b7de348186 | ||
|
|
f142a1dc75 | ||
|
|
86350c8a04 | ||
|
|
ff3d1141cd | ||
|
|
4b11a8aaec | ||
|
|
aebd8322ea | ||
|
|
0125b77c3d | ||
|
|
965d41f3ff | ||
|
|
51c758988e | ||
|
|
ea48474bcf | ||
|
|
3d3f52c6f1 | ||
|
|
eaea377420 | ||
|
|
85bd509d40 | ||
|
|
0b53dc2477 | ||
|
|
69703938b3 | ||
|
|
1bac602009 | ||
|
|
906313b8e0 | ||
|
|
4694ac7ce9 | ||
|
|
295cfce315 | ||
|
|
16d8f21bbd | ||
|
|
d40df5ea08 | ||
|
|
a1acddd7d6 | ||
|
|
43d10c8787 | ||
|
|
b9fe632080 | ||
|
|
1e8153a5e0 | ||
|
|
b1bcf32406 | ||
|
|
5a638013b4 | ||
|
|
5a11a8d3e8 | ||
|
|
216b1b790c | ||
|
|
f647173e41 | ||
|
|
fd969ed8d1 | ||
|
|
d5cb296f50 | ||
|
|
d7a44a0b81 | ||
|
|
4ef802769e | ||
|
|
d96b5a512f | ||
|
|
cefe3d4c0b | ||
|
|
4565e1ce54 | ||
|
|
cc3b0ceecb | ||
|
|
22502a99dc | ||
|
|
7bbc501191 | ||
|
|
7b66df806b | ||
|
|
f4abe9a703 | ||
|
|
0555261a6e | ||
|
|
3eaca42bd5 | ||
|
|
af14a4ef81 | ||
|
|
5ee122bd43 | ||
|
|
02a5a4d511 | ||
|
|
608bb8c1c4 | ||
|
|
f1843ef47f | ||
|
|
1061de72ca | ||
|
|
43f5033b5f | ||
|
|
4bb81a7927 | ||
|
|
e8559895a3 | ||
|
|
c162d0983d | ||
|
|
e8faba9fe8 | ||
|
|
c82a945223 | ||
|
|
90161de265 | ||
|
|
f9e730f12d | ||
|
|
302d1295a5 | ||
|
|
b81d0f94e9 | ||
|
|
ab3f39a82b | ||
|
|
3c8ca416f1 | ||
|
|
de55ea6c3e | ||
|
|
5462e2fb61 | ||
|
|
d6acba4756 | ||
|
|
f7e14433ef | ||
|
|
8f4cda8597 | ||
|
|
56f420c38d | ||
|
|
1ff83fcb70 | ||
|
|
dfbebdfce3 | ||
|
|
ec224e251e | ||
|
|
e73e604d4c | ||
|
|
cf6a83436c | ||
|
|
17e8ae6b28 | ||
|
|
023f079151 | ||
|
|
0e5e5cd2c5 | ||
|
|
8749431e5d | ||
|
|
f15681fc90 | ||
|
|
09fff2ff41 | ||
|
|
6d3d404d1d | ||
|
|
605cabe101 | ||
|
|
ee52f219dc | ||
|
|
ce3b11810c | ||
|
|
6841c08ff7 | ||
|
|
f7f8f6b911 | ||
|
|
e1b1e18500 | ||
|
|
7f3a4a1463 | ||
|
|
3ecfbb74e1 | ||
|
|
84af10f4c0 | ||
|
|
386693ede9 | ||
|
|
5578b587a5 | ||
|
|
f5f8a13af9 | ||
|
|
1d3e4d8cf6 | ||
|
|
50678b84b7 | ||
|
|
a6642444d6 | ||
|
|
f80ca9eb75 | ||
|
|
f2b782b9d6 | ||
|
|
dba7e427b5 | ||
|
|
230de54068 | ||
|
|
ab2d8b1120 | ||
|
|
8f2690e850 | ||
|
|
afb0b91f02 | ||
|
|
96071d15ce | ||
|
|
772ad84d24 | ||
|
|
799e6f90cd | ||
|
|
6c623919a1 | ||
|
|
104f820b1b | ||
|
|
067621099e | ||
|
|
1662b32dee | ||
|
|
a952fb7e8e | ||
|
|
263547ba24 | ||
|
|
b892464ed6 | ||
|
|
5b0b40b8e5 | ||
|
|
33b628834d | ||
|
|
9472a252df | ||
|
|
7fff64eaf7 | ||
|
|
457526c9ef | ||
|
|
b932a8fd5c | ||
|
|
8d0ee0743d | ||
|
|
95c42197c3 | ||
|
|
dfe5951475 | ||
|
|
f08b7961fb | ||
|
|
7c75d0ef53 | ||
|
|
b75e530b78 | ||
|
|
ac444667ff | ||
|
|
00dc257b65 | ||
|
|
35a641b26f | ||
|
|
f383f9a753 | ||
|
|
807acae216 | ||
|
|
620117bb3f | ||
|
|
0ac23e079e | ||
|
|
db6300be72 | ||
|
|
2f84c10b82 | ||
|
|
53a2d9e079 | ||
|
|
0351cbdf3a | ||
|
|
afa28d75bf | ||
|
|
6994d6ca24 | ||
|
|
3533f67824 | ||
|
|
b0e6c762c7 | ||
|
|
04462007be | ||
|
|
02596269e1 | ||
|
|
5300bf8bfc | ||
|
|
96eefff546 | ||
|
|
688c93d4bc | ||
|
|
3f8676b1c0 | ||
|
|
6cf7606754 | ||
|
|
8661c9a1d6 | ||
|
|
164f9b0d4b | ||
|
|
c20859f4eb | ||
|
|
52d7235fee | ||
|
|
0ae799bed8 | ||
|
|
c8546e2af3 | ||
|
|
bd0a271edd | ||
|
|
54a306d031 | ||
|
|
0b36b9a2e6 | ||
|
|
0be751ab44 | ||
|
|
dd1a150343 | ||
|
|
bc4be9159f | ||
|
|
d196582116 | ||
|
|
801e9b6e6b | ||
|
|
5af0a1720b | ||
|
|
58e15efc82 | ||
|
|
9fcd2fef34 | ||
|
|
fe41e9bb1a | ||
|
|
7a8727b98d | ||
|
|
e17c8f0671 | ||
|
|
800067c2d2 | ||
|
|
7a7e09163b | ||
|
|
d29b63a097 | ||
|
|
a81c9c884c | ||
|
|
e30c325250 | ||
|
|
782daee511 | ||
|
|
d7eae1df71 | ||
|
|
dbb22cd0ed | ||
|
|
afffb18b57 | ||
|
|
9e01e38352 | ||
|
|
ad9d43e0fa | ||
|
|
44c866ebba | ||
|
|
af2fafe17f | ||
|
|
5373dfac4d | ||
|
|
7937ecf662 | ||
|
|
7437449749 | ||
|
|
0581f1c141 | ||
|
|
79afb5dec2 | ||
|
|
6c890a3a28 | ||
|
|
c890601b2e | ||
|
|
1ae53cb922 | ||
|
|
d7912c544b | ||
|
|
2842276e6d | ||
|
|
fa63153010 | ||
|
|
54974e31dc | ||
|
|
ed8d735bbd | ||
|
|
c5b8e1c3fe | ||
|
|
1d61926cf5 | ||
|
|
4e6bbcdd5e | ||
|
|
7f30bb16dd | ||
|
|
132336c0be | ||
|
|
0eac0bb2bd | ||
|
|
f00b28668a | ||
|
|
a0184a91d6 | ||
|
|
32f5b9105b | ||
|
|
5c0f8d8ede | ||
|
|
6e6449b724 | ||
|
|
424be8573c | ||
|
|
cb1b6f7856 | ||
|
|
04246335c6 | ||
|
|
0f49dafa5d | ||
|
|
92c221ceb2 | ||
|
|
bc92e04aea | ||
|
|
f2004162a1 | ||
|
|
3ef1bf8739 | ||
|
|
9308cc12ba | ||
|
|
9c2464e3e3 | ||
|
|
52d243cbcf | ||
|
|
487893a6c6 | ||
|
|
e3d85f8506 | ||
|
|
222e1beb38 | ||
|
|
3f59c806d8 | ||
|
|
23161f4b9b | ||
|
|
b91c475c4c | ||
|
|
506b418891 | ||
|
|
9c73ab5fe4 | ||
|
|
3e4d36e7ab | ||
|
|
2919662edb | ||
|
|
fb06c2b571 | ||
|
|
d52a4e35da | ||
|
|
693181cc44 | ||
|
|
0f62c5c292 | ||
|
|
81da34e617 | ||
|
|
caffffd802 | ||
|
|
5b7c4d6f26 | ||
|
|
9c0c457fc8 | ||
|
|
93b2148bb5 | ||
|
|
ccc1a876be | ||
|
|
eacc2176ed | ||
|
|
471ff47c6f | ||
|
|
32b3f46331 | ||
|
|
eddc872446 | ||
|
|
b3d4d2fc8e | ||
|
|
272a353462 | ||
|
|
ec316302da | ||
|
|
3d810c0f87 | ||
|
|
dc8381925b | ||
|
|
caa4add50e | ||
|
|
754d708240 | ||
|
|
f454edadb8 | ||
|
|
b1c25efba4 | ||
|
|
0c2d3afa18 | ||
|
|
e47f333669 | ||
|
|
5cb20c2f50 | ||
|
|
0f7f07f684 | ||
|
|
dc3975479f | ||
|
|
2a76f70a69 | ||
|
|
1d2a6aa95b | ||
|
|
ebcced6bd4 | ||
|
|
b424828108 | ||
|
|
818bacef5f | ||
|
|
07399694ef | ||
|
|
bd5d9811ee | ||
|
|
65a5384994 | ||
|
|
ec15bbf4b4 | ||
|
|
3e65e9f158 | ||
|
|
38a58700f6 | ||
|
|
d405ed82e3 | ||
|
|
a4313c3960 | ||
|
|
58648d1de4 | ||
|
|
5cca6cd94d | ||
|
|
bc50403dcb | ||
|
|
94a9847fbf | ||
|
|
f454566dae | ||
|
|
b6c2815bf3 | ||
|
|
5a00c58b32 | ||
|
|
9825858b19 | ||
|
|
0d756faa0c | ||
|
|
34e647af26 | ||
|
|
8edafd083c | ||
|
|
557e7d0f34 | ||
|
|
8b2a8b4d42 | ||
|
|
0e53e2bd21 | ||
|
|
8fa039f6dc | ||
|
|
1c5bc70adb | ||
|
|
07235bbde0 | ||
|
|
7c0ca3369b | ||
|
|
be86f32a0f | ||
|
|
d9147bd92c | ||
|
|
d55b0e247a | ||
|
|
61b7eeda25 | ||
|
|
3a8479078c | ||
|
|
a743c27bcd | ||
|
|
139d1605fa | ||
|
|
a6f9bb8167 | ||
|
|
b405045f94 | ||
|
|
a669530a55 | ||
|
|
a6ef327bdd | ||
|
|
dafbd09482 | ||
|
|
87ca8ab2d3 | ||
|
|
8827164777 | ||
|
|
8285908e3a | ||
|
|
58f4e0a9dd | ||
|
|
431184652f | ||
|
|
3cfcb03cf5 | ||
|
|
76a5231a6f | ||
|
|
ab296e8d6c | ||
|
|
fcb6e8415b | ||
|
|
38762f1b74 | ||
|
|
d415393100 | ||
|
|
7db950f952 | ||
|
|
c9caad50a4 | ||
|
|
be81440458 | ||
|
|
fc0a1777ec | ||
|
|
4c6c580964 | ||
|
|
d3fafe9cf2 | ||
|
|
8fc63096b8 | ||
|
|
f53785e010 | ||
|
|
ee5d61525c | ||
|
|
2f4a3d35c2 | ||
|
|
c1763bd9d7 | ||
|
|
22e028af3a | ||
|
|
e58ecd7290 | ||
|
|
a69c66d0e1 | ||
|
|
29efdb4287 | ||
|
|
655907c7bb | ||
|
|
8c57a1b48a | ||
|
|
770207290a | ||
|
|
802890a8a3 | ||
|
|
3709509a67 | ||
|
|
0b91af3d7c | ||
|
|
c0d38f98a7 | ||
|
|
6a34d8b120 | ||
|
|
319b45efb0 | ||
|
|
ce33f7c3b9 | ||
|
|
251fb3d05c | ||
|
|
a59d8af558 | ||
|
|
e8ff64fc77 | ||
|
|
0beb4fd1ec | ||
|
|
f508020b18 | ||
|
|
61b06cb9ca | ||
|
|
c21a754c1a | ||
|
|
cebcccd81a | ||
|
|
479f6ec15e | ||
|
|
e42004d8bd | ||
|
|
3b9ba47ce5 | ||
|
|
6376201ee2 | ||
|
|
7f92780e9e | ||
|
|
9e13274e72 | ||
|
|
92fac6cabb | ||
|
|
aca9b98060 | ||
|
|
d25b43a3cb | ||
|
|
fd2f465639 | ||
|
|
b7f5e23707 | ||
|
|
9e7f0b903a | ||
|
|
232ce151c3 | ||
|
|
5d6b82d6ee | ||
|
|
1b0ceb2c48 | ||
|
|
c42252c802 | ||
|
|
dd9c170d8d | ||
|
|
c88a5b5bc5 | ||
|
|
aa0bd12ed3 | ||
|
|
a0bee28c26 | ||
|
|
ea279ca19b | ||
|
|
a8656deb25 | ||
|
|
8ebc12b933 | ||
|
|
edb69d6dbb | ||
|
|
8aac6aac61 | ||
|
|
691d1430f8 | ||
|
|
2adc027178 | ||
|
|
e3e035ac6e | ||
|
|
c7ee8b29d2 | ||
|
|
a23481188c | ||
|
|
0a4625fdbe | ||
|
|
ac81ee5c25 | ||
|
|
99613cfe0d | ||
|
|
e515a2d6d0 | ||
|
|
0c0aaf5490 | ||
|
|
0bc9646ca0 | ||
|
|
40507a0e21 | ||
|
|
562617890f | ||
|
|
9e4fb1181c | ||
|
|
6422238118 | ||
|
|
c4cb9263f6 | ||
|
|
003777b77d | ||
|
|
76133ade49 | ||
|
|
f29902368b | ||
|
|
2c106817a4 | ||
|
|
da5cd4e7cf | ||
|
|
04bf793795 | ||
|
|
fa9ea2a5a9 | ||
|
|
a04e9bd9b0 | ||
|
|
85b3ab5d5f | ||
|
|
41e3110f20 | ||
|
|
213535773b | ||
|
|
c1e301eda6 | ||
|
|
d82bf686b6 | ||
|
|
fe3792cda9 | ||
|
|
8278732860 | ||
|
|
0fb515cbc6 | ||
|
|
2d038e518e | ||
|
|
fc56c810f9 | ||
|
|
fd18b7708f | ||
|
|
1c113a608e | ||
|
|
5fabb3e1ec | ||
|
|
6da77fce6f | ||
|
|
f947b70c35 | ||
|
|
90b9fea551 | ||
|
|
8574e882e9 | ||
|
|
609807dc33 | ||
|
|
698012db51 | ||
|
|
8006d49537 | ||
|
|
0c154e49de | ||
|
|
eb3cc6d1cc | ||
|
|
af3156b9dd | ||
|
|
0f158889c6 | ||
|
|
85411a4abc | ||
|
|
1586c15e04 | ||
|
|
827c5d8b2e | ||
|
|
6d588fef7a | ||
|
|
c1d7e63ac0 | ||
|
|
486a5904a4 | ||
|
|
b0c1eddc38 | ||
|
|
ff6f759dbd | ||
|
|
06d74f2209 | ||
|
|
b11300d091 | ||
|
|
01b2c8c140 | ||
|
|
2ab279f7bb | ||
|
|
cfd1cd8c3b | ||
|
|
a7ff114fed | ||
|
|
6b5b200b71 | ||
|
|
e8acf5e4b1 | ||
|
|
a180c257e1 | ||
|
|
f990334130 | ||
|
|
ebd7ea407f | ||
|
|
79daf9d2bd | ||
|
|
d8cd6914d6 | ||
|
|
85194c8080 | ||
|
|
a32c124933 | ||
|
|
b0065a0c8e | ||
|
|
a43bdf804d | ||
|
|
3584a5c83b | ||
|
|
8ccc4df47d | ||
|
|
1a4744e18c | ||
|
|
75dd83ba81 | ||
|
|
3e4d4a5116 | ||
|
|
e26c89311e | ||
|
|
193cb3819f | ||
|
|
7d4053a93e | ||
|
|
be5453c13c | ||
|
|
f1a4c76719 | ||
|
|
976ba29134 | ||
|
|
9044b07a76 | ||
|
|
135f97a0df | ||
|
|
decbc2e2a2 | ||
|
|
fddd39230b | ||
|
|
448bdd0569 | ||
|
|
ac02214b9c | ||
|
|
ebaaae8bec | ||
|
|
b8da46c9d8 | ||
|
|
38b3b0f2fc | ||
|
|
67ef0e3962 | ||
|
|
c3c706604d | ||
|
|
a19342a4ce | ||
|
|
93b36bddbe | ||
|
|
407172b445 | ||
|
|
a7a413a1dc | ||
|
|
d103f4b875 | ||
|
|
cbae9e265c | ||
|
|
ea655a010d | ||
|
|
9b87335e1b | ||
|
|
d1a2dce450 | ||
|
|
8a42850c4f | ||
|
|
cd07ef0afa | ||
|
|
e85940a30c | ||
|
|
0b9e27d15a | ||
|
|
b3cce298ba | ||
|
|
446c01c5f8 | ||
|
|
9ff33ca64f | ||
|
|
42065b3426 | ||
|
|
6ca51d16a1 | ||
|
|
8ad62ccfd5 | ||
|
|
793e17b386 | ||
|
|
5d669bbc5d | ||
|
|
66cc680762 | ||
|
|
34a054d0e0 | ||
|
|
6c366b8e71 | ||
|
|
6b427efbfc | ||
|
|
d2a3ef856a | ||
|
|
2c8a5bd7ef | ||
|
|
92506a847b | ||
|
|
4b33f7157e | ||
|
|
bf2d148954 | ||
|
|
0ea88ad4d5 | ||
|
|
8544c33213 | ||
|
|
47da0a3d1e | ||
|
|
da77b1cc6c | ||
|
|
bce438f8b0 | ||
|
|
85f05af834 | ||
|
|
3ccadd4160 | ||
|
|
f396378f43 | ||
|
|
546a40bb49 | ||
|
|
5638ee1c81 | ||
|
|
e17f0eb452 | ||
|
|
93bd0995b9 | ||
|
|
0df7a6a8d4 | ||
|
|
9daf822736 | ||
|
|
fe3085dc88 | ||
|
|
163269fda0 | ||
|
|
052474813d | ||
|
|
8e8314cc7e | ||
|
|
6552bcd10f | ||
|
|
3fa1acbdcf | ||
|
|
30e0b718f4 | ||
|
|
f152b8e5c3 | ||
|
|
24debc3158 | ||
|
|
5242b6d15e | ||
|
|
28c0e9458d | ||
|
|
e9fb8e782f | ||
|
|
dd76006c42 | ||
|
|
c96816b0fc | ||
|
|
3e8400f143 | ||
|
|
8b1d0548b1 | ||
|
|
adb4c4a5de | ||
|
|
4f9ced2fda | ||
|
|
163528e95c | ||
|
|
8f62a989d7 | ||
|
|
d56e0511d2 | ||
|
|
ea566a0a2e | ||
|
|
f7a66b2fac | ||
|
|
1fcabbe944 | ||
|
|
af0188ade1 | ||
|
|
bcc7bd2cda | ||
|
|
520c64839c | ||
|
|
6214e2896a | ||
|
|
2761c8dd36 | ||
|
|
81058dea6a | ||
|
|
447a73372d | ||
|
|
2ba02a78dd | ||
|
|
e038159085 | ||
|
|
6bad11bfeb | ||
|
|
e3e81e4da8 | ||
|
|
587c5e0a6f | ||
|
|
632777c91a | ||
|
|
436c0804fa | ||
|
|
1bb8bd14fe | ||
|
|
82cde67228 | ||
|
|
bde4df5206 | ||
|
|
d676b8a2ca | ||
|
|
ed132646b0 | ||
|
|
b5363f3a7e | ||
|
|
5b4ed4413c | ||
|
|
bc4517243c | ||
|
|
111908b790 | ||
|
|
e1266af965 | ||
|
|
e19c9f9013 | ||
|
|
254b87fd5f | ||
|
|
7cdf5d3116 | ||
|
|
a9c878d2b2 | ||
|
|
163d5afe2a | ||
|
|
d92762277c | ||
|
|
6c5c5e409f | ||
|
|
2b3f6833e7 | ||
|
|
5e9d964237 | ||
|
|
81c0d0b0fa | ||
|
|
6734dbaa02 | ||
|
|
f0b61b8aeb | ||
|
|
09790c4c6e | ||
|
|
624a6c53db | ||
|
|
d7ae787f0e | ||
|
|
bb5c6874de | ||
|
|
0e2edd80e6 | ||
|
|
6720fb7987 | ||
|
|
8df5d81d69 | ||
|
|
3a5bde5087 | ||
|
|
f81d576487 | ||
|
|
9a4f9cc59d | ||
|
|
33a444d442 | ||
|
|
17476b91f5 | ||
|
|
38e1e87c87 | ||
|
|
cc3f0a5d59 | ||
|
|
61860a1d1a | ||
|
|
656b31eddb | ||
|
|
e53749f67c | ||
|
|
601217f9f9 | ||
|
|
cb2c515dc6 | ||
|
|
0d35a0ac4c | ||
|
|
c137105f73 |
@@ -11,6 +11,7 @@
|
||||
:def-fn {:level :warning}
|
||||
:dynamic-var-not-earmuffed {:level :warning}
|
||||
:equals-expected-position {:level :warning, :only-in-test-assertion true}
|
||||
:equals-true {:level :warning}
|
||||
:keyword-binding {:level :warning}
|
||||
:main-without-gen-class {:level :warning}
|
||||
:minus-one {:level :warning}
|
||||
@@ -42,7 +43,6 @@
|
||||
|
||||
#_:docstring-leading-trailing-whitespace
|
||||
#_:equals-false
|
||||
#_:equals-true
|
||||
#_:used-underscored-binding
|
||||
|
||||
;;
|
||||
@@ -58,9 +58,11 @@
|
||||
:metabase/check-defmulti-arglists {:level :warning}
|
||||
:metabase/check-me-humanize {:level :warning}
|
||||
:metabase/defsetting-must-specify-export {:level :warning}
|
||||
:metabase/defsetting-namespace {:level :warning}
|
||||
:metabase/mbql-query-first-arg {:level :warning}
|
||||
:metabase/missing-test-expr-requires-in-cljs {:level :warning}
|
||||
:metabase/modules {:level :warning} ; more config in `.clj-kondo/config/modules/config.edn`
|
||||
:metabase/namespace-name {:level :warning}
|
||||
:metabase/require-shape-checker {:level :warning}
|
||||
:metabase/test-helpers-use-non-thread-safe-functions {:level :warning} ; more config in `.clj-kondo/config/test-helpers/config.edn`
|
||||
:metabase/validate-logging {:level :warning}
|
||||
@@ -91,7 +93,6 @@
|
||||
metabase.test.data.users/with-group-for-user
|
||||
metabase.test.data/with-empty-h2-app-db
|
||||
metabase.test.util.log/with-log-level
|
||||
metabase.test.util.misc/with-single-admin-user
|
||||
metabase.test.util/with-all-users-permission
|
||||
metabase.test.util/with-discarded-collections-perms-changes
|
||||
metabase.test.util/with-env-keys-renamed-by
|
||||
@@ -123,7 +124,6 @@
|
||||
metabase.test/with-model-cleanup
|
||||
metabase.test/with-non-admin-groups-no-root-collection-for-namespace-perms
|
||||
metabase.test/with-non-admin-groups-no-root-collection-perms
|
||||
metabase.test/with-single-admin-user
|
||||
metabase.test/with-temp-env-var-value
|
||||
metabase.test/with-temp-vals-in-db
|
||||
metabase.test/with-temporary-raw-setting-values
|
||||
@@ -234,6 +234,10 @@
|
||||
(metabase.lib.util.match/match-one)
|
||||
(metabase.lib.util.match/replace)
|
||||
(metabase.lib.util.match/replace-in)
|
||||
(metabase.driver-api.core/match)
|
||||
(metabase.driver-api.core/match-one)
|
||||
(metabase.driver-api.core/replace)
|
||||
(metabase.driver-api.core/replace-in)
|
||||
(metabase.query-processor.middleware.cache-backend.interface/with-cached-results)
|
||||
(metabase.util.regex/rx [opt])
|
||||
(metabase.util/prog1 [<>])
|
||||
@@ -242,20 +246,14 @@
|
||||
|
||||
:deprecated-var
|
||||
{:exclude
|
||||
{metabase.cmd/dump {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.cmd/load {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.db.data-migrations/data-migrations {:namespaces ["metabase\\.db\\.data-migrations"]}
|
||||
metabase.db.data-migrations/defmigration {:namespaces ["metabase\\.db\\.data-migrations"]}
|
||||
metabase.db.data-migrations/run-migration-if-needed! {:namespaces ["metabase\\.db\\.data-migrations"]}
|
||||
{metabase.cmd.core/dump {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.cmd.core/load {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sql {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver.sql-jdbc.execute/set-time-zone-if-supported! {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver/current-db-time {:namespaces ["metabase.*"]}
|
||||
metabase.driver/supports? {:namespaces ["metabase.*"]}
|
||||
metabase.premium-features.premium-features/enable-enhancements? {:namespaces ["metabase\\.models.*"]}
|
||||
metabase.query-processor.middleware.resolve-joins/maybe-resolve-source-table {:namespaces ["metabase.*"]}
|
||||
metabase.query-processor.util/normalize-token {:namespaces ["metabase.*"]}
|
||||
schema.core/both {:namespaces ["metabase.*"]}
|
||||
schema.core/either {:namespaces ["metabase.*"]}}}
|
||||
metabase.query-processor.util/normalize-token {:namespaces ["metabase.*"]}}}
|
||||
|
||||
:discouraged-var
|
||||
{clojure.core/print {:message "Use metabase.util.log instead of clojure.core/print"}
|
||||
@@ -288,7 +286,8 @@
|
||||
me.flowthing.pp/pprint {:message "Use metabase.util.log instead of me.flowthing.pp/pprint"}
|
||||
medley.core/random-uuid {:message "Use clojure.core/random-uuid instead of medley.core/random-uuid"}
|
||||
metabase.driver/database-supports? {:message "Use metabase.driver.util/supports? instead of metabase.driver/database-supports?"}
|
||||
metabase.lib.equality/find-column-indexes-for-refs {:message "Use lib.equality/closest-matches-in-metadata or lib.equality/find-closest-matches-for-refs instead of lib.equality/find-column-indexes-for-refs"}}
|
||||
metabase.lib.equality/find-column-indexes-for-refs {:message "Use lib.equality/closest-matches-in-metadata or lib.equality/find-closest-matches-for-refs instead of lib.equality/find-column-indexes-for-refs"}
|
||||
next.jdbc/active-tx? {:message "Use metabase.app-db.core/in-transaction? to see if we are in a transaction"}}
|
||||
|
||||
:discouraged-namespace
|
||||
{camel-snake-kebab.core {:message "CSK is not Turkish-safe, use the versions in metabase.util instead."}
|
||||
@@ -309,219 +308,90 @@
|
||||
|
||||
:consistent-alias
|
||||
{:aliases
|
||||
{buddy.core.hash buddy-hash
|
||||
cheshire.generate json.generate
|
||||
clojure.tools.logging log
|
||||
clj-http.client http
|
||||
clj-ldap.client ldap
|
||||
clj-time.coerce time.coerce
|
||||
clj-time.format time.format
|
||||
clojure.core.async a
|
||||
clojure.core.match clojure.core.match ; Prefer :refer [match]
|
||||
clojure.data data
|
||||
clojure.math.combinatorics math.combo
|
||||
clojure.pprint pprint
|
||||
clojure.spec.alpha s
|
||||
clojure.string str
|
||||
clojure.test t
|
||||
clojure.tools.build.api b
|
||||
clojure.tools.namespace.dependency ns.deps
|
||||
clojure.tools.namespace.find ns.find
|
||||
clojure.tools.namespace.parse ns.parse
|
||||
colorize.core colorize
|
||||
environ.core env
|
||||
hiccup.core hiccup
|
||||
hiccup.util hiccup.util
|
||||
honey.sql sql
|
||||
honey.sql.helpers sql.helpers
|
||||
java-time.api t
|
||||
macaw.core macaw
|
||||
malli.core mc
|
||||
malli.error me
|
||||
malli.experimental mx
|
||||
malli.generator mg
|
||||
malli.provider mp
|
||||
malli.transform mtx
|
||||
malli.util mut
|
||||
medley.core m
|
||||
metabase-enterprise.audit-app.pages.common common
|
||||
metabase-enterprise.sandbox.api.table table
|
||||
metabase-enterprise.sandbox.api.util sandbox.api.util
|
||||
metabase-enterprise.database-routing.core database-routing
|
||||
metabase-enterprise.test met
|
||||
metabase.analytics.sdk sdk
|
||||
metabase.analytics.stats stats
|
||||
metabase.analysis.native-query-analyzer nqa
|
||||
metabase.analysis.native-query-analyzer.parameter-substitution nqa.sub
|
||||
metabase.analyze.query-results qr
|
||||
metabase.analyze.classifiers.category classifiers.category
|
||||
metabase.analyze.classifiers.core classifiers
|
||||
metabase.analyze.classifiers.name classifiers.name
|
||||
metabase.analyze.classifiers.no-preview-display classifiers.no-preview-display
|
||||
metabase.analyze.classifiers.text-fingerprint classifiers.text-fingerprint
|
||||
metabase.analyze.fingerprint.fingerprinters fingerprinters
|
||||
metabase.analyze.fingerprint.insights insights
|
||||
metabase.analyze.fingerprint.schema fingerprint.schema
|
||||
metabase.api.common api
|
||||
metabase.channel.core channel
|
||||
metabase.channel.render.core channel.render
|
||||
metabase.cloud-migration.core cloud-migration
|
||||
metabase.cmd.copy.h2 copy.h2
|
||||
metabase.config config
|
||||
metabase.config.file config.file
|
||||
metabase.connection-pool connection-pool
|
||||
metabase.db.connection mdb.connection
|
||||
metabase.db.jdbc-protocols mdb.jdbc-protocols
|
||||
metabase.db.metadata-queries metadata-queries
|
||||
metabase.db.spec mdb.spec
|
||||
metabase.db.query mdb.query
|
||||
metabase.driver.common.parameters params
|
||||
metabase.driver.common.parameters.dates params.dates
|
||||
metabase.driver.common.parameters.operators params.ops
|
||||
metabase.driver.common.parameters.parse params.parse
|
||||
metabase.driver.common.parameters.values params.values
|
||||
metabase.driver.druid.client druid.client
|
||||
metabase.driver.druid.execute druid.execute
|
||||
metabase.driver.druid.js druid.js
|
||||
metabase.driver.druid.query-processor druid.qp
|
||||
metabase.driver.druid.sync druid.sync
|
||||
metabase.driver.impl driver.impl
|
||||
metabase.driver.mongo.execute mongo.execute
|
||||
metabase.driver.mongo.parameters mongo.params
|
||||
metabase.driver.mongo.query-processor mongo.qp
|
||||
metabase.driver.mongo.util mongo.util
|
||||
metabase.driver.sql driver.sql
|
||||
metabase.driver.sql-jdbc.common sql-jdbc.common
|
||||
metabase.driver.sql-jdbc.connection sql-jdbc.conn
|
||||
metabase.driver.sql-jdbc.execute sql-jdbc.execute
|
||||
metabase.driver.sql-jdbc.execute.diagnostic sql-jdbc.execute.diagnostic
|
||||
metabase.driver.sql-jdbc.execute.legacy-impl sql-jdbc.legacy
|
||||
metabase.driver.sql-jdbc.execute.old-impl sql-jdbc.execute.old
|
||||
metabase.driver.sql-jdbc.sync sql-jdbc.sync
|
||||
metabase.driver.sql-jdbc.sync.common sql-jdbc.sync.common
|
||||
metabase.driver.sql-jdbc.sync.describe-database sql-jdbc.describe-database
|
||||
metabase.driver.sql-jdbc.sync.describe-table sql-jdbc.describe-table
|
||||
metabase.driver.sql-jdbc.sync.interface sql-jdbc.sync.interface
|
||||
metabase.driver.sql-jdbc.test-util sql-jdbc.tu
|
||||
metabase.driver.sql.parameters.substitute sql.params.substitute
|
||||
metabase.driver.sql.parameters.substitution sql.params.substitution
|
||||
metabase.eid-translation.core eid-translation
|
||||
metabase.formatter formatter
|
||||
metabase.http-client client
|
||||
metabase.legacy-mbql.normalize mbql.normalize
|
||||
metabase.legacy-mbql.schema mbql.s
|
||||
metabase.legacy-mbql.util mbql.u
|
||||
metabase.lib.util lib.util
|
||||
metabase.lib.util.match lib.util.match
|
||||
metabase.login-history.core login-history
|
||||
metabase.model-persistence.core model-persistence
|
||||
metabase.models.dependency dependency
|
||||
metabase.models.interface mi
|
||||
metabase.models.setting setting
|
||||
metabase.notification.core notification
|
||||
metabase.notification.payload.core notification.payload
|
||||
metabase.notification.test-util notification.tu
|
||||
metabase.permissions.core perms
|
||||
metabase.plugins.initialize plugins.init
|
||||
metabase.public-settings public-settings
|
||||
metabase.public-sharing.core public-sharing
|
||||
metabase.premium-features.core premium-features
|
||||
metabase.pulse.core pulse
|
||||
metabase.pulse.render render
|
||||
metabase.pulse.render.body body
|
||||
metabase.pulse.render.style style
|
||||
metabase.pulse.test-util pulse.test-util
|
||||
metabase.pulse.parameters pulse-params
|
||||
metabase.query-processor-test qp.test
|
||||
metabase.query-processor.context qp.context
|
||||
metabase.query-processor.error-type qp.error-type
|
||||
metabase.query-processor.interface qp.i
|
||||
metabase.query-processor.middleware.add-dimension-projections qp.add-dimension-projections
|
||||
metabase.query-processor.middleware.add-implicit-clauses qp.add-implicit-clauses
|
||||
metabase.query-processor.middleware.add-implicit-joins qp.add-implicit-joins
|
||||
metabase.query-processor.middleware.auto-bucket-datetimes qp.auto-bucket-datetimes
|
||||
metabase.query-processor.middleware.constraints qp.constraints
|
||||
metabase.query-processor.middleware.cumulative-aggregations qp.cumulative-aggregations
|
||||
metabase.query-processor.middleware.parameters.mbql qp.mbql
|
||||
metabase.query-processor.middleware.parameters.native qp.native
|
||||
metabase.query-processor.middleware.permissions qp.perms
|
||||
metabase.query-processor.middleware.pre-alias-aggregations qp.pre-alias-aggregations
|
||||
metabase.query-processor.middleware.resolve-fields qp.resolve-fields
|
||||
metabase.query-processor.middleware.resolve-referenced qp.resolve-referenced
|
||||
metabase.query-processor.middleware.resolve-source-table qp.resolve-source-table
|
||||
metabase.query-processor.middleware.wrap-value-literals qp.wrap-value-literals
|
||||
metabase.query-processor.pivot qp.pivot
|
||||
metabase.query-processor.streaming qp.streaming
|
||||
metabase.query-processor.streaming.interface qp.si
|
||||
metabase.query-processor.streaming.xlsx qp.xlsx
|
||||
metabase.query-processor.timezone qp.timezone
|
||||
metabase.query-processor.util qp.util
|
||||
metabase.request.core request
|
||||
metabase.revisions.core revisions
|
||||
metabase.search.config search.config
|
||||
metabase.search.filter search.filter
|
||||
metabase.search.in-place.filter search.in-place.filter
|
||||
metabase.search.in-place.util search.util
|
||||
metabase.search.in-place.scoring scoring
|
||||
metabase.server.core server
|
||||
metabase.server.protocols server.protocols
|
||||
metabase.sso.core sso
|
||||
metabase.sync.analyze.fingerprint sync.fingerprint
|
||||
metabase.sync.field-values sync.field-values
|
||||
metabase.sync.interface i
|
||||
metabase.sync.schedules sync.schedules
|
||||
metabase.sync.sync-metadata.crufty crufty
|
||||
metabase.sync.sync-metadata.fields.our-metadata fields.our-metadata
|
||||
metabase.sync.util sync-util
|
||||
metabase.sync.util-test sync.util-test
|
||||
metabase.test mt
|
||||
metabase.test.data.dataset-definitions defs
|
||||
metabase.test.data.env.impl tx.env.impl
|
||||
metabase.test.data.impl data.impl
|
||||
metabase.test.data.users test.users
|
||||
metabase.test.domain-entities test.de
|
||||
metabase.test.mock.util mock.util
|
||||
metabase.test.sync test.sync
|
||||
metabase.test.redefs test.redefs
|
||||
metabase.test.util.js test.js
|
||||
metabase.test.util.timezone test.tz
|
||||
metabase.timeline.core timeline
|
||||
metabase.timeseries-query-processor-test.util tqpt
|
||||
metabase.util.cron u.cron
|
||||
metabase.util.currency currency
|
||||
metabase.util.date-2 u.date
|
||||
metabase.util.date-2.common u.date.common
|
||||
metabase.util.date-2.parse u.date.parse
|
||||
metabase.util.embed embed
|
||||
metabase.util.encryption encryption
|
||||
metabase.util.encryption-test encryption-test
|
||||
metabase.util.files u.files
|
||||
metabase.util.grouper grouper
|
||||
metabase.util.honey-sql-2 h2x
|
||||
metabase.util.i18n i18n
|
||||
metabase.util.i18n.impl i18n.impl
|
||||
metabase.util.jvm u.jvm
|
||||
metabase.util.log log
|
||||
metabase.util.macros u.macros
|
||||
metabase.util.malli mu
|
||||
metabase.util.malli.schema ms
|
||||
metabase.util.markdown markdown
|
||||
metabase.util.password u.password
|
||||
metabase.util.schema su
|
||||
metabase.util.ui-logic ui-logic
|
||||
metabase.util.urls urls
|
||||
metabase.xrays.core xrays
|
||||
metabuild-common.core u
|
||||
metabuild-common.output out
|
||||
metabuild-common.shell shell
|
||||
monger.collection mcoll
|
||||
ring.mock.request ring.mock
|
||||
ring.util.codec codec
|
||||
ring.util.response response
|
||||
ring.adapter.jetty9.servlet servlet
|
||||
saml20-clj.core saml
|
||||
toucan.db db
|
||||
toucan.models models}}}
|
||||
{buddy.core.hash buddy-hash
|
||||
cheshire.generate json.generate
|
||||
clj-http.client http
|
||||
clj-ldap.client ldap
|
||||
clj-time.coerce time.coerce
|
||||
clj-time.format time.format
|
||||
clojure.core.async a
|
||||
clojure.core.match clojure.core.match
|
||||
clojure.data data
|
||||
clojure.math.combinatorics math.combo
|
||||
clojure.pprint pprint
|
||||
clojure.spec.alpha s
|
||||
clojure.string str
|
||||
clojure.test t
|
||||
clojure.tools.build.api b
|
||||
clojure.tools.logging log
|
||||
clojure.tools.namespace.dependency ns.deps
|
||||
clojure.tools.namespace.find ns.find
|
||||
clojure.tools.namespace.parse ns.parse
|
||||
colorize.core colorize
|
||||
environ.core env
|
||||
hiccup.core hiccup
|
||||
hiccup.util hiccup.util
|
||||
honey.sql sql
|
||||
honey.sql.helpers sql.helpers
|
||||
java-time.api t
|
||||
macaw.core macaw
|
||||
malli.core mc
|
||||
malli.error me
|
||||
malli.experimental mx
|
||||
malli.generator mg
|
||||
malli.provider mp
|
||||
malli.transform mtx
|
||||
malli.util mut
|
||||
medley.core m
|
||||
metabase-enterprise.database-routing.core database-routing
|
||||
metabase.analyze.classifiers.core classifiers
|
||||
metabase.channel.core channel
|
||||
metabase.channel.render.core channel.render
|
||||
metabase.cloud-migration.core cloud-migration
|
||||
metabase.eid-translation.core eid-translation
|
||||
metabase.login-history.core login-history
|
||||
metabase.model-persistence.core model-persistence
|
||||
metabase.notification.core notification
|
||||
metabase.notification.payload.core notification.payload
|
||||
metabase.permissions.core perms
|
||||
metabase.premium-features.core premium-features
|
||||
metabase.public-sharing.core public-sharing
|
||||
metabase.pulse.core pulse
|
||||
metabase.query-permissions.core query-perms
|
||||
metabase.request.core request
|
||||
metabase.revisions.core revisions
|
||||
metabase.server.core server
|
||||
metabase.settings.core setting
|
||||
metabase.sso.core sso
|
||||
metabase.timeline.core timeline
|
||||
metabase.util.cron u.cron
|
||||
metabase.util.currency currency
|
||||
metabase.util.date-2 u.date
|
||||
metabase.util.date-2.common u.date.common
|
||||
metabase.util.date-2.parse u.date.parse
|
||||
metabase.util.embed embed
|
||||
metabase.util.encryption encryption
|
||||
metabase.util.encryption-test encryption-test
|
||||
metabase.util.files u.files
|
||||
metabase.util.grouper grouper
|
||||
metabase.util.honey-sql-2 h2x
|
||||
metabase.util.i18n i18n
|
||||
metabase.util.i18n.impl i18n.impl
|
||||
metabase.util.jvm u.jvm
|
||||
metabase.util.log log
|
||||
metabase.util.macros u.macros
|
||||
metabase.util.malli mu
|
||||
metabase.util.malli.schema ms
|
||||
metabase.util.markdown markdown
|
||||
metabase.util.password u.password
|
||||
metabase.util.ui-logic ui-logic
|
||||
metabase.xrays.core xrays
|
||||
monger.collection mcoll
|
||||
ring.mock.request ring.mock
|
||||
ring.util.codec codec
|
||||
ring.util.response response
|
||||
saml20-clj.core saml
|
||||
toucan2.core t2}}}
|
||||
|
||||
:lint-as
|
||||
{cljs.cache/defcache clojure.core/deftype
|
||||
@@ -530,37 +400,37 @@
|
||||
clojure.test.check.clojure-test/defspec clojure.test/deftest
|
||||
clojure.test.check.properties/for-all clojure.core/let
|
||||
clojurewerkz.quartzite.jobs/defjob clojure.core/defn
|
||||
instaparse.core/defparser clojure.core/def
|
||||
metabase-enterprise.serialization.test-util/with-dbs clojure.core/fn
|
||||
metabase-enterprise.serialization.test-util/with-random-dump-dir clojure.core/let
|
||||
metabase-enterprise.content-translation.routes-test/with-new-secret-key! clojure.core/fn
|
||||
metabase.actions.test-util/with-actions clojure.core/let
|
||||
metabase.api.common/let-404 clojure.core/let
|
||||
metabase.app-db.custom-migrations.util/with-temp-scheduler! clojure.core/fn
|
||||
metabase.app-db.custom-migrations/define-migration clj-kondo.lint-as/def-catch-all
|
||||
metabase.app-db.custom-migrations/define-reversible-migration clj-kondo.lint-as/def-catch-all
|
||||
metabase.app-db.liquibase/with-liquibase clojure.core/let
|
||||
metabase.app-db.schema-migrations-test.impl/with-temp-empty-app-db clojure.core/let
|
||||
metabase.channel.impl.http-test/with-captured-http-requests clojure.core/fn
|
||||
metabase.channel.impl.http-test/with-server clojure.core/let
|
||||
metabase.dashboard-subscription-test/with-dashboard-sub-for-card clojure.core/let
|
||||
metabase.db.custom-migrations/define-migration clj-kondo.lint-as/def-catch-all
|
||||
metabase.db.custom-migrations/define-reversible-migration clj-kondo.lint-as/def-catch-all
|
||||
metabase.db.custom-migrations.util/with-temp-scheduler! clojure.core/fn
|
||||
metabase.db.liquibase/with-liquibase clojure.core/let
|
||||
metabase.db.schema-migrations-test.impl/with-temp-empty-app-db clojure.core/let
|
||||
metabase.collections.models.collection-test/with-collection-in-location clojure.core/let
|
||||
metabase.driver.mongo.connection/with-mongo-client clojure.core/let
|
||||
metabase.driver.mongo.connection/with-mongo-database clojure.core/let
|
||||
metabase.driver.mongo.query-processor/mongo-let clojure.core/let
|
||||
metabase.driver.sql-jdbc.actions/with-jdbc-transaction clojure.core/let
|
||||
metabase.driver.sql-jdbc.connection.ssh-tunnel/with-ssh-tunnel clojure.core/let
|
||||
metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection clojure.core/let
|
||||
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info clojure.core/fn
|
||||
metabase.models.collection-test/with-collection-in-location clojure.core/let
|
||||
metabase.driver-api.core/defsetting hooks.metabase.settings.models.setting/defsetting
|
||||
metabase.models.json-migration/def-json-migration clj-kondo.lint-as/def-catch-all
|
||||
metabase.models.setting/defsetting clj-kondo.lint-as/def-catch-all
|
||||
metabase.models.setting.multi-setting/define-multi-setting clojure.core/def
|
||||
metabase.models.util.spec-update/define-spec clojure.core/def
|
||||
metabase.notification.test-util/with-temp-notification clojure.core/let
|
||||
metabase.notification.test-util/with-card-notification clojure.core/let
|
||||
metabase.notification.test-util/with-system-event-notification! clojure.core/let
|
||||
metabase.public-settings.premium-features/defenterprise-schema clj-kondo.lint-as/def-catch-all
|
||||
metabase.public-settings.premium-features/define-premium-feature clojure.core/def
|
||||
metabase.notification.test-util/with-temp-notification clojure.core/let
|
||||
metabase.premium-features.core/defenterprise-schema clj-kondo.lint-as/def-catch-all
|
||||
metabase.premium-features.core/define-premium-feature clojure.core/def
|
||||
metabase.premium-features.defenterprise/defenterprise-schema clj-kondo.lint-as/def-catch-all
|
||||
metabase.premium-features.settings/define-premium-feature clojure.core/def
|
||||
metabase.pulse.dashboard-subscription-test/with-dashboard-sub-for-card clojure.core/let
|
||||
metabase.pulse.send-test/with-pulse-for-card clojure.core/let
|
||||
metabase.query-processor-test.pipeline-queries-test/pmbql-query clojure.core/->
|
||||
metabase.query-processor-test.pipeline-queries-test/run-pmbql-query clojure.core/->
|
||||
@@ -569,25 +439,29 @@
|
||||
metabase.query-processor.middleware.process-userland-query-test/with-query-execution! clojure.core/let
|
||||
metabase.query-processor.setup/with-qp-setup clojure.core/let
|
||||
metabase.search.api-test/do-test-users clojure.core/let
|
||||
metabase.settings.core/define-multi-setting clojure.core/def
|
||||
metabase.settings.core/defsetting clj-kondo.lint-as/def-catch-all
|
||||
metabase.settings.models.setting.multi-setting/define-multi-setting clojure.core/def
|
||||
metabase.settings.models.setting/defsetting clj-kondo.lint-as/def-catch-all
|
||||
metabase.sso.ldap/with-ldap-connection clojure.core/fn
|
||||
metabase.sync.util/sum-for clojure.core/for
|
||||
metabase.sync.util/with-emoji-progress-bar clojure.core/let
|
||||
metabase.task/defjob clojure.core/defn
|
||||
metabase.task.core/defjob clojure.core/defn
|
||||
metabase.task.impl/defjob clojure.core/defn
|
||||
metabase.test.data.interface/defdataset clojure.core/def
|
||||
metabase.test.data.interface/defdataset-edn clojure.core/def
|
||||
metabase.test.gentest/defgentest clojure.test/deftest
|
||||
metabase.test/defdataset clojure.core/def
|
||||
metabase.test/let-url clojure.core/let
|
||||
metabase.test/with-actions clojure.core/let
|
||||
metabase.test/with-grouper-batches! clojure.core/fn
|
||||
metabase.test/with-open-channels clojure.core/let
|
||||
metabase.test/with-single-admin-user clojure.core/fn
|
||||
metabase.test/with-single-admin-user! clojure.core/fn
|
||||
metabase.test/with-temp-dir clojure.core/let
|
||||
metabase.test/with-temp-empty-app-db clojure.core/let
|
||||
metabase.test/with-temp-file clojure.core/let
|
||||
metabase.test/with-user-in-groups clojure.core/let
|
||||
metabase.test.gentest/defgentest clojure.test/deftest
|
||||
metabase.upload-test/with-upload-table! clojure.core/let
|
||||
metabase.util/with-timer-ms clojure.core/fn
|
||||
metabase.upload.impl-test/with-upload-table! clojure.core/let
|
||||
metabase.util.files/with-open-path-to-resource clojure.core/let
|
||||
metabase.util.malli.defn/defn schema.core/defn
|
||||
metabase.util.malli.defn/defn- schema.core/defn
|
||||
@@ -597,7 +471,7 @@
|
||||
metabase.util.malli/defn- schema.core/defn
|
||||
metabase.util.malli/fn schema.core/fn
|
||||
metabase.util.namespaces/import-fns potemkin/import-vars
|
||||
metabase.util.ssh/with-ssh-tunnel clojure.core/let
|
||||
metabase.util/with-timer-ms clojure.core/fn
|
||||
metabase.xrays.domain-entities.malli/defn schema.core/defn
|
||||
metabuild-common.core/with-open-jar-file-system clojure.core/let
|
||||
metabuild-common.files/with-open-jar-file-system clojure.core/let
|
||||
@@ -628,26 +502,29 @@
|
||||
metabase-enterprise.audit-app.pages-test/with-temp-objects hooks.common/with-one-binding
|
||||
metabase-enterprise.cache.config-test/with-temp-persist-models hooks.common/with-seven-bindings
|
||||
metabase-enterprise.serialization.test-util/with-temp-dpc hooks.toucan2.tools.with-temp/with-temp
|
||||
metabase.api.card-test/with-card-param-values-fixtures hooks.common/let-one-with-optional-value
|
||||
metabase.api.card-test/with-temp-native-card! hooks.common/with-two-bindings
|
||||
metabase.api.card-test/with-temp-native-card-with-params! hooks.common/with-two-bindings
|
||||
metabase.api.collection-test/with-french-user-and-personal-collection! hooks.common/with-two-top-level-bindings
|
||||
metabase.api.common.internal-test/with-jetty-server hooks.common/with-one-binding
|
||||
metabase.api.dashboard-test/with-chain-filter-fixtures hooks.common/let-one-with-optional-value
|
||||
metabase.api.dashboard-test/with-simple-dashboard-with-tabs hooks.common/with-one-binding
|
||||
metabase.api.embed-test/do-response-formats hooks.common/with-two-bindings
|
||||
metabase.api.embed-test/with-chain-filter-fixtures! hooks.common/let-one-with-optional-value
|
||||
metabase.api.embed-test/with-temp-card hooks.common/let-one-with-optional-value
|
||||
metabase.api.embed-test/with-temp-dashcard hooks.common/let-one-with-optional-value
|
||||
metabase.api.macros/defendpoint hooks.metabase.api.macros/defendpoint
|
||||
metabase.api.user-test/with-temp-user-email! hooks.common/with-one-binding
|
||||
metabase.app-db.schema-migrations-test.impl/test-migrations hooks.metabase.app-db.schema-migrations-test.impl/test-migrations
|
||||
metabase.channel.render.js.svg/with-static-viz-context hooks.common/with-one-top-level-binding
|
||||
metabase.channel.template.handlebars-helper/defhelper hooks.metabase.channel.template.handlebars-helper/defhelper
|
||||
metabase.channel.template.handlebars-test/with-temp-template! hooks.common/with-vec-first-binding
|
||||
metabase.dashboard-subscription-test/with-link-card-fixture-for-dashboard hooks.common/let-second
|
||||
metabase.db.schema-migrations-test.impl/test-migrations hooks.metabase.db.schema-migrations-test.impl/test-migrations
|
||||
metabase.classloader.core/require hooks.clojure.core.require/lint-require
|
||||
metabase.classloader.impl/require hooks.clojure.core.require/lint-require
|
||||
metabase.collections.api-test/with-french-user-and-personal-collection! hooks.common/with-two-top-level-bindings
|
||||
metabase.collections.models.collection-test/with-collection-hierarchy! hooks.common/let-one-with-optional-value
|
||||
metabase.collections.models.collection-test/with-personal-and-impersonal-collections hooks.common/with-two-bindings
|
||||
metabase.dashboards.api-test/with-chain-filter-fixtures hooks.common/let-one-with-optional-value
|
||||
metabase.dashboards.api-test/with-simple-dashboard-with-tabs hooks.common/with-one-binding
|
||||
metabase.dashboards.models.dashboard-tab-test/with-dashtab-in-personal-collection hooks.common/with-one-top-level-binding
|
||||
metabase.dashboards.models.dashboard-test/with-dash-in-collection! hooks.common/with-three-bindings
|
||||
metabase.driver.bigquery-cloud-sdk-test/calculate-bird-scarcity hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
|
||||
metabase.driver.oracle-test/with-temp-user hooks.common/let-one-with-optional-value
|
||||
metabase.driver/register! hooks.metabase.driver/register!
|
||||
metabase.driver-api/defenterprise hooks.metabase.premium-features.defenterprise/defenterprise
|
||||
metabase.embedding.api.embed-test/do-response-formats hooks.common/with-two-bindings
|
||||
metabase.embedding.api.embed-test/with-chain-filter-fixtures! hooks.common/let-one-with-optional-value
|
||||
metabase.embedding.api.embed-test/with-temp-card hooks.common/let-one-with-optional-value
|
||||
metabase.embedding.api.embed-test/with-temp-dashcard hooks.common/let-one-with-optional-value
|
||||
metabase.legacy-mbql.schema.macros/defclause hooks.metabase.legacy-mbql.schemas.macros/defclause
|
||||
metabase.lib.schema.mbql-clause/define-catn-mbql-clause hooks.metabase.lib.schema.mbql-clause/define-mbql-clause
|
||||
metabase.lib.schema.mbql-clause/define-mbql-clause hooks.metabase.lib.schema.mbql-clause/define-mbql-clause
|
||||
@@ -658,18 +535,10 @@
|
||||
metabase.model-persistence.api-test/with-persistence-setup! hooks.common/with-one-top-level-binding
|
||||
metabase.model-persistence.api-test/with-setup! hooks.common/with-one-top-level-binding
|
||||
metabase.model-persistence.test-util/with-persistence-enabled! hooks.metabase.model-persistence.test-util/with-persistence-enabled!
|
||||
metabase.models.collection-test/with-collection-hierarchy! hooks.common/let-one-with-optional-value
|
||||
metabase.models.collection-test/with-personal-and-impersonal-collections hooks.common/with-two-bindings
|
||||
metabase.models.dashboard-tab-test/with-dashtab-in-personal-collection hooks.common/with-one-top-level-binding
|
||||
metabase.models.dashboard-test/with-dash-in-collection! hooks.common/with-three-bindings
|
||||
metabase.models.interface/define-batched-hydration-method hooks.metabase.models.interface/define-hydration-method
|
||||
metabase.models.interface/define-simple-hydration-method hooks.metabase.models.interface/define-hydration-method
|
||||
metabase.models.setting.multi-setting/define-multi-setting hooks.metabase.models.setting/define-multi-setting
|
||||
metabase.models.setting.multi-setting/define-multi-setting-impl hooks.metabase.models.setting/define-multi-setting-impl
|
||||
metabase.models.setting/defsetting hooks.metabase.models.setting/defsetting
|
||||
metabase.permissions.core/allow-changing-all-users-group-members hooks.common/do*
|
||||
metabase.permissions.core/disable-perms-cache hooks.common/do*
|
||||
metabase.plugins.classloader/require hooks.clojure.core.require/lint-require
|
||||
metabase.premium-features.core/defenterprise hooks.metabase.premium-features.defenterprise/defenterprise
|
||||
metabase.premium-features.defenterprise/defenterprise hooks.metabase.premium-features.defenterprise/defenterprise
|
||||
metabase.public-sharing.api-test/with-required-param-card! hooks.common/with-one-binding
|
||||
@@ -677,19 +546,29 @@
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard hooks.common/let-one-with-optional-value
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard-and-card hooks.common/with-three-bindings
|
||||
metabase.pulse.api.alert-test/with-alert-in-collection! hooks.common/with-four-bindings
|
||||
metabase.pulse.dashboard-subscription-test/with-link-card-fixture-for-dashboard hooks.common/let-second
|
||||
metabase.pulse.models.pulse-test/with-dashboard-subscription-in-collection! hooks.common/with-four-bindings
|
||||
metabase.pulse.models.pulse-test/with-pulse-in-collection! hooks.common/with-four-bindings
|
||||
metabase.pulse.test-util/checkins-query-card hooks.metabase.test.data/$ids
|
||||
metabase.queries.api.card-test/with-card-param-values-fixtures hooks.common/let-one-with-optional-value
|
||||
metabase.queries.api.card-test/with-temp-native-card! hooks.common/with-two-bindings
|
||||
metabase.queries.api.card-test/with-temp-native-card-with-params! hooks.common/with-two-bindings
|
||||
metabase.query-processor-test.expressions-test/calculate-bird-scarcity hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
|
||||
metabase.query-processor-test.filter-test/count-with-filter-clause hooks.metabase.test.data/$ids
|
||||
metabase.query-processor.middleware.cache-test/with-mock-cache! hooks.common/with-two-bindings
|
||||
metabase.request.core/with-current-request hooks.common/with-used-first-arg
|
||||
metabase.request.core/with-current-user hooks.common/with-used-first-arg
|
||||
metabase.request.core/with-limit-and-offset hooks.common/with-used-first-two-args
|
||||
metabase.sample-data-test/with-temp-sample-database-db hooks.common/with-one-binding
|
||||
metabase.sample-data.impl-test/with-temp-sample-database-db hooks.common/with-one-binding
|
||||
metabase.search.api-test/with-search-items-in-collection hooks.metabase.search.api-test/with-search-items-in-collection
|
||||
metabase.search.api-test/with-search-items-in-root-collection hooks.common/do*
|
||||
metabase.server.streaming-response-test/with-start-execution-chan hooks.common/with-one-binding
|
||||
metabase.settings.core/define-multi-setting hooks.metabase.settings.models.setting/define-multi-setting
|
||||
metabase.settings.core/define-multi-setting-impl hooks.metabase.settings.models.setting/define-multi-setting-impl
|
||||
metabase.settings.core/defsetting hooks.metabase.settings.models.setting/defsetting
|
||||
metabase.settings.models.setting.multi-setting/define-multi-setting hooks.metabase.settings.models.setting/define-multi-setting
|
||||
metabase.settings.models.setting.multi-setting/define-multi-setting-impl hooks.metabase.settings.models.setting/define-multi-setting-impl
|
||||
metabase.settings.models.setting/defsetting hooks.metabase.settings.models.setting/defsetting
|
||||
metabase.stale-test/with-stale-items hooks.toucan2.tools.with-temp/with-temp
|
||||
metabase.test.data.datasets/test-driver hooks.metabase.test.data.datasets/test-driver
|
||||
metabase.test.data.datasets/test-drivers hooks.metabase.test.data.datasets/test-drivers
|
||||
@@ -699,15 +578,15 @@
|
||||
metabase.test.data/mbql-query hooks.metabase.test.data/mbql-query
|
||||
metabase.test.data/run-mbql-query hooks.metabase.test.data/mbql-query
|
||||
metabase.test.gentest/iterate hooks.metabase.test.gentest/iterate*
|
||||
metabase.test.util.async/with-open-channels hooks.common/let-with-optional-value-for-last-binding
|
||||
metabase.test.util.generators.jvm/with-random-cards hooks.metabase.test.util.generators.jvm/with-random-cards
|
||||
metabase.test.util.log/with-log-level hooks.common/with-ignored-first-arg
|
||||
metabase.test.util/discard-setting-changes hooks.common/with-ignored-first-arg
|
||||
metabase.test.util/with-column-remappings hooks.common/with-ignored-first-arg
|
||||
metabase.test.util/with-non-admin-groups-no-root-collection-perms hooks.common/do*
|
||||
metabase.test.util/with-prometheus-system! hooks.common/with-two-bindings
|
||||
metabase.test.util/with-temp-file hooks.metabase.test.util/with-temp-file
|
||||
metabase.test.util/with-temporary-setting-values hooks.metabase.test.util/with-temporary-setting-values
|
||||
metabase.test.util.async/with-open-channels hooks.common/let-with-optional-value-for-last-binding
|
||||
metabase.test.util.generators.jvm/with-random-cards hooks.metabase.test.util.generators.jvm/with-random-cards
|
||||
metabase.test.util.log/with-log-level hooks.common/with-ignored-first-arg
|
||||
metabase.test/$ids hooks.metabase.test.data/$ids
|
||||
metabase.test/dataset hooks.metabase.test.data/dataset
|
||||
metabase.test/discard-setting-changes hooks.common/with-ignored-first-arg
|
||||
@@ -722,14 +601,15 @@
|
||||
metabase.test/with-log-messages-for-level hooks.metabase.util.log.capture/with-log-messages-for-level
|
||||
metabase.test/with-non-admin-groups-no-root-collection-perms hooks.common/do*
|
||||
metabase.test/with-persistence-enabled! hooks.metabase.model-persistence.test-util/with-persistence-enabled!
|
||||
metabase.test/with-prometheus-system! hooks.common/with-two-bindings
|
||||
metabase.test/with-temp hooks.toucan2.tools.with-temp/with-temp
|
||||
metabase.test/with-temp-file hooks.metabase.test.util/with-temp-file
|
||||
metabase.test/with-prometheus-system! hooks.common/with-two-bindings
|
||||
metabase.test/with-temporary-setting-values hooks.metabase.test.util/with-temporary-setting-values
|
||||
metabase.util.i18n/tru hooks.metabase.util.i18n/tru
|
||||
metabase.users.api-test/with-temp-user-email! hooks.common/with-one-binding
|
||||
metabase.util.i18n/deferred-trs hooks.metabase.util.i18n/deferred-trs
|
||||
metabase.util.i18n/deferred-tru hooks.metabase.util.i18n/deferred-tru
|
||||
metabase.util.i18n/trs hooks.metabase.util.i18n/trs
|
||||
metabase.util.i18n/deferred-trs hooks.metabase.util.i18n/deferred-trs
|
||||
metabase.util.i18n/tru hooks.metabase.util.i18n/tru
|
||||
metabase.util.log.capture/with-log-messages-for-level hooks.metabase.util.log.capture/with-log-messages-for-level
|
||||
metabase.util.log/debug hooks.metabase.util.log/info
|
||||
metabase.util.log/debugf hooks.metabase.util.log/infof
|
||||
@@ -749,43 +629,43 @@
|
||||
metabase.xrays.api.automagic-dashboards-test/with-indexed-model! hooks.metabase.xrays.api.automagic-dashboards-test/with-indexed-model!}
|
||||
|
||||
:macroexpand
|
||||
{clojurewerkz.quartzite.jobs/build macros.quartz/build-job
|
||||
clojurewerkz.quartzite.schedule.cron/schedule macros.quartz/schedule
|
||||
clojurewerkz.quartzite.schedule.simple/schedule macros.quartz/simple-schedule
|
||||
clojurewerkz.quartzite.triggers/build macros.quartz/build-trigger
|
||||
metabase-enterprise.database-routing.e2e-test/with-temp-dbs! macros.metabase-enterprise.database-routing.e2e-test/with-temp-dbs!
|
||||
metabase-enterprise.impersonation.util-test/with-impersonations! macros.metabase-enterprise.impersonation.util-test/with-impersonations!
|
||||
metabase-enterprise.query-reference-validation.api-test/with-test-setup! macros.metabase-enterprise.query-reference-validation.api-test/with-test-setup!
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.serialization.test-util/with-world macros.metabase-enterprise.serialization.test-util/with-world
|
||||
metabase-enterprise.test/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.test/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase.api.card-test/with-ordered-items macros.metabase.api.card-test/with-ordered-items
|
||||
metabase.api.collection-test/with-collection-hierarchy! macros.metabase.api.collection-test/with-collection-hierarchy!
|
||||
metabase.api.collection-test/with-some-children-of-collection! macros.metabase.api.collection-test/with-some-children-of-collection!
|
||||
metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing! macros.metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing!
|
||||
metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing! macros.metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing!
|
||||
metabase.lib.common/defop macros.metabase.lib.common/defop
|
||||
metabase.lib.filter/deffilter macros.metabase.lib.filter/deffilter
|
||||
metabase.models.params.chain-filter-test/chain-filter macros.metabase.models.params.chain-filter-test/chain-filter
|
||||
metabase.models.params.chain-filter-test/chain-filter-search macros.metabase.models.params.chain-filter-test/chain-filter
|
||||
metabase.models.query-analysis-test/with-test-setup macros.metabase.models.query-analysis-test/with-test-setup
|
||||
metabase.models.user-test/with-groups macros.metabase.models.user-test/with-groups
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing!
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing!
|
||||
metabase.query-analysis.task.test-setup/with-test-setup! macros.metabase.query-analysis.task.test-setup/with-test-setup!
|
||||
metabase.query-processor.streaming/streaming-response macros.metabase.query-processor.streaming/streaming-response
|
||||
metabase.server.statistics-handler-test/with-server macros.metabase.server.statistics-handler-test/with-server
|
||||
metabase.test.data.users/with-group-for-user macros.metabase.test.data.users/with-group-for-user
|
||||
metabase.test.util/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
|
||||
metabase.test.util/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
|
||||
metabase.test/with-group-for-user macros.metabase.test.data.users/with-group-for-user
|
||||
metabase.test/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
|
||||
metabase.test/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
|
||||
metabase.util.namespaces/import-fn macros.metabase.util.namespaces/import-fn
|
||||
metabase.xrays.domain-entities.malli/define-getters-and-setters macros.metabase.xrays.domain-entities.malli/define-getters-and-setters
|
||||
metabase.xrays.related-test/with-world macros.metabase.xrays.related-test/with-world}}
|
||||
{clojurewerkz.quartzite.jobs/build macros.quartz/build-job
|
||||
clojurewerkz.quartzite.schedule.cron/schedule macros.quartz/schedule
|
||||
clojurewerkz.quartzite.schedule.simple/schedule macros.quartz/simple-schedule
|
||||
clojurewerkz.quartzite.triggers/build macros.quartz/build-trigger
|
||||
metabase-enterprise.database-routing.e2e-test/with-temp-dbs! macros.metabase-enterprise.database-routing.e2e-test/with-temp-dbs!
|
||||
metabase-enterprise.impersonation.util-test/with-impersonations! macros.metabase-enterprise.impersonation.util-test/with-impersonations!
|
||||
metabase-enterprise.query-reference-validation.api-test/with-test-setup! macros.metabase-enterprise.query-reference-validation.api-test/with-test-setup!
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.serialization.test-util/with-world macros.metabase-enterprise.serialization.test-util/with-world
|
||||
metabase-enterprise.test/with-gtaps! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase-enterprise.test/with-gtaps-for-user! macros.metabase-enterprise.sandbox.test-util/with-gtaps!
|
||||
metabase.collections.api-test/with-collection-hierarchy! macros.metabase.collections.api-test/with-collection-hierarchy!
|
||||
metabase.collections.api-test/with-some-children-of-collection! macros.metabase.collections.api-test/with-some-children-of-collection!
|
||||
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing! macros.metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing!
|
||||
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing! macros.metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing!
|
||||
metabase.lib.common/defop macros.metabase.lib.common/defop
|
||||
metabase.lib.filter/deffilter macros.metabase.lib.filter/deffilter
|
||||
metabase.parameters.chain-filter-test/chain-filter macros.metabase.parameters.chain-filter-test/chain-filter
|
||||
metabase.parameters.chain-filter-test/chain-filter-search macros.metabase.parameters.chain-filter-test/chain-filter
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing!
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing! macros.metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing!
|
||||
metabase.queries.api.card-test/with-ordered-items macros.metabase.queries.api.card-test/with-ordered-items
|
||||
metabase.query-analysis.models.query-analysis-test/with-test-setup macros.metabase.query-analysis.models.query-analysis-test/with-test-setup
|
||||
metabase.query-analysis.task.test-setup/with-test-setup! macros.metabase.query-analysis.task.test-setup/with-test-setup!
|
||||
metabase.query-processor.streaming/streaming-response macros.metabase.query-processor.streaming/streaming-response
|
||||
metabase.server.statistics-handler-test/with-server macros.metabase.server.statistics-handler-test/with-server
|
||||
metabase.test.data.users/with-group-for-user macros.metabase.test.data.users/with-group-for-user
|
||||
metabase.test.util/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
|
||||
metabase.test.util/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
|
||||
metabase.test/with-group-for-user macros.metabase.test.data.users/with-group-for-user
|
||||
metabase.test/with-temp-env-var-value! macros.metabase.test.util/with-temp-env-var-value!
|
||||
metabase.test/with-temporary-raw-setting-values macros.metabase.test.util/with-temporary-raw-setting-values
|
||||
metabase.users.models.user-test/with-groups! macros.metabase.users.models.user-test/with-groups!
|
||||
metabase.util.namespaces/import-fn macros.metabase.util.namespaces/import-fn
|
||||
metabase.xrays.domain-entities.malli/define-getters-and-setters macros.metabase.xrays.domain-entities.malli/define-getters-and-setters
|
||||
metabase.xrays.related-test/with-world macros.metabase.xrays.related-test/with-world}}
|
||||
|
||||
:config-in-comment
|
||||
{:linters {:unresolved-symbol {:level :off}}}
|
||||
@@ -835,8 +715,9 @@
|
||||
{:inline-def {:level :off}
|
||||
:missing-docstring {:level :off}
|
||||
:private-call {:level :off}
|
||||
:discouraged-var {metabase.driver/database-supports? {:level :off}}
|
||||
:metabase/defsetting-must-specify-export {:level :off}
|
||||
:discouraged-var {metabase.driver/database-supports? {:level :off}}}
|
||||
:metabase/defsetting-namespace {:level :off}}
|
||||
|
||||
:hooks
|
||||
{:analyze-call
|
||||
@@ -904,10 +785,10 @@
|
||||
toucan2.core {:message "Don't use application database directly in QP code; use QP Store/metadata provider"}}
|
||||
|
||||
:discouraged-var
|
||||
{medley.core/map-keys {:message "Use clojure.core/update-keys"}
|
||||
medley.core/map-vals {:message "Use clojure.core/update-vals"}
|
||||
metabase.db.query/query {:message "Don't use application database directly in QP code; use QP Store/metadata provider"}
|
||||
metabase.db.query/reducible-query {:message "Don't use application database directly in QP code; use QP Store/metadata provider"}}}}
|
||||
{medley.core/map-keys {:message "Use clojure.core/update-keys"}
|
||||
medley.core/map-vals {:message "Use clojure.core/update-vals"}
|
||||
metabase.app-db.core/query {:message "Don't use application database directly in QP code; use QP Store/metadata provider"}
|
||||
metabase.app-db.core/reducible-query {:message "Don't use application database directly in QP code; use QP Store/metadata provider"}}}}
|
||||
|
||||
general-qp-and-driver-test-namespaces
|
||||
{:linters
|
||||
|
||||
@@ -49,36 +49,43 @@
|
||||
metabase.actions.models/insert!
|
||||
metabase.analytics.snowplow-test/fake-track-event-impl!
|
||||
metabase.analytics.snowplow/track-event-impl!
|
||||
metabase.app-db.core/finish-db-setup!
|
||||
metabase.app-db.core/migrate!
|
||||
metabase.app-db.core/setup-db!
|
||||
metabase.app-db.schema-migrations-test.impl/run-migrations-in-range!
|
||||
metabase.app-db.setup/migrate!
|
||||
metabase.app-db.setup/setup-db!
|
||||
metabase.channel.email-test/reset-inbox!
|
||||
metabase.channel.email/send-email!
|
||||
metabase.cmd.dump-to-h2/dump-to-h2!
|
||||
metabase.cmd.load-from-h2/load-from-h2!
|
||||
metabase.content-verification.models.moderation-review/create-review!
|
||||
metabase.core.core/ensure-audit-db-installed!
|
||||
metabase.db.schema-migrations-test.impl/run-migrations-in-range!
|
||||
metabase.db.setup/migrate!
|
||||
metabase.db.setup/setup-db!
|
||||
metabase.db/migrate!
|
||||
metabase.db/setup-db!
|
||||
metabase.driver.mongo-test/create-database-from-row-maps!
|
||||
metabase.driver.postgres-test/create-enums-db!
|
||||
metabase.driver.postgres-test/drop-if-exists-and-create-db!
|
||||
metabase.driver.sql-jdbc.execute/execute-statement!
|
||||
metabase.indexed-entities.models.model-index/add-values!
|
||||
metabase.driver.sql-jdbc.connection.ssh-tunnel-test/start-mock-servers!
|
||||
metabase.driver.sql-jdbc.connection.ssh-tunnel-test/stop-mock-servers!
|
||||
metabase.indexed-entities.task.index-values/job-init!
|
||||
metabase.model-persistence.models.persisted-info/ready-database!
|
||||
metabase.model-persistence.task.persist-refresh/job-init!
|
||||
metabase.model-persistence.task.persist-refresh/refresh-tables!
|
||||
metabase.model-persistence.task.persist-refresh/schedule-persistence-for-database!
|
||||
metabase.models.collection.graph-test/clear-graph-revisions!
|
||||
metabase.models.collection.graph-test/do-with-n-temp-users-with-personal-collections!
|
||||
metabase.models.field-values/create-or-update-full-field-values!
|
||||
metabase.models.moderation-review/create-review!
|
||||
metabase.models.on-demand-test/add-dashcard-with-parameter-mapping!
|
||||
metabase.models.setting-test/test-user-local-allowed-setting!
|
||||
metabase.models.setting-test/test-user-local-only-setting!
|
||||
metabase.models.setting.cache/restore-cache!
|
||||
metabase.models.setting/set!
|
||||
metabase.models.setting/validate-settings-formatting!
|
||||
metabase.permissions.core/grant-application-permissions!
|
||||
metabase.permissions.core/grant-collection-read-permissions!
|
||||
metabase.permissions.core/grant-collection-readwrite-permissions!
|
||||
metabase.permissions.core/grant-full-data-permissions!
|
||||
metabase.permissions.core/grant-native-readwrite-permissions!
|
||||
metabase.permissions.core/grant-permissions!
|
||||
metabase.permissions.core/revoke-application-permissions!
|
||||
metabase.permissions.core/revoke-data-perms!
|
||||
metabase.permissions.core/update-data-perms-graph!
|
||||
metabase.permissions.core/update-group-permissions!
|
||||
metabase.permissions.models.collection.graph-test/clear-graph-revisions!
|
||||
metabase.permissions.models.collection.graph-test/do-with-n-temp-users-with-personal-collections!
|
||||
metabase.permissions.models.permissions/grant-application-permissions!
|
||||
metabase.permissions.models.permissions/grant-collection-read-permissions!
|
||||
metabase.permissions.models.permissions/grant-collection-readwrite-permissions!
|
||||
@@ -96,7 +103,12 @@
|
||||
metabase.query-processor.streaming.interface/begin!
|
||||
metabase.query-processor.streaming.interface/finish!
|
||||
metabase.query-processor.streaming.interface/write-row!
|
||||
metabase.sample-data/try-to-extract-sample-database!
|
||||
metabase.sample-data.impl/try-to-extract-sample-database!
|
||||
metabase.settings.models.setting-test/test-user-local-allowed-setting!
|
||||
metabase.settings.models.setting-test/test-user-local-only-setting!
|
||||
metabase.settings.models.setting.cache/restore-cache!
|
||||
metabase.settings.models.setting/set!
|
||||
metabase.settings.models.setting/validate-settings-formatting!
|
||||
metabase.setup.core/create-token!
|
||||
metabase.sso.ldap-test-util/start-ldap-server!
|
||||
metabase.sync.core/sync-database!
|
||||
@@ -104,7 +116,8 @@
|
||||
metabase.sync.sync-metadata/sync-db-metadata!
|
||||
metabase.sync.util-test/sync-database!
|
||||
metabase.sync.util/store-sync-summary!
|
||||
metabase.task/delete-task!
|
||||
metabase.task.core/delete-task!
|
||||
metabase.task.impl/delete-task!
|
||||
metabase.test.data.bigquery-cloud-sdk/execute!
|
||||
metabase.test.data.impl.get-or-create/set-test-db-permissions!
|
||||
metabase.test.data.impl/copy-db-tables-and-fields!
|
||||
@@ -126,7 +139,6 @@
|
||||
metabase.test/initialize-if-needed!
|
||||
metabase.test/test-helpers-set-global-values!
|
||||
metabase.test/with-temp-env-var-value!
|
||||
metabase.upload-test/set-local-infile!
|
||||
metabase.upload.impl-test/set-local-infile!
|
||||
metabase.util.files/create-dir-if-not-exists!
|
||||
metabase.util.ssh-test/start-mock-servers!
|
||||
metabase.util.ssh-test/stop-mock-servers!}}}}
|
||||
metabase.warehouse-schema.models.field-values/create-or-update-full-field-values!}}}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
(ns macros.metabase.api.collection-test)
|
||||
(ns macros.metabase.collections.api-test)
|
||||
|
||||
(defmacro with-collection-hierarchy! [bindings & body]
|
||||
`(let [~'a nil
|
||||
@@ -1,4 +1,4 @@
|
||||
(ns macros.metabase.api.embed-test)
|
||||
(ns macros.metabase.embedding.api.embed-test)
|
||||
|
||||
(defmacro with-embedding-enabled-and-temp-card-referencing!
|
||||
[table-kw field-kw [card-binding] & body]
|
||||
@@ -1,4 +0,0 @@
|
||||
(ns macros.metabase.models.params.chain-filter-test)
|
||||
|
||||
(defmacro chain-filter [& _]
|
||||
`(metabase.models.params.chain-filter/chain-filter nil nil))
|
||||
@@ -1,9 +0,0 @@
|
||||
(ns macros.metabase.models.user-test)
|
||||
|
||||
(defmacro with-groups [bindings & body]
|
||||
`(let ~(into []
|
||||
(comp (partition-all 3)
|
||||
(mapcat (fn [[group-binding properties members]]
|
||||
[group-binding [properties members]])))
|
||||
bindings)
|
||||
~@body))
|
||||
@@ -0,0 +1,4 @@
|
||||
(ns macros.metabase.parameters.chain-filter-test)
|
||||
|
||||
(defmacro chain-filter [& _]
|
||||
`(metabase.parameters.chain-filter/chain-filter nil nil))
|
||||
@@ -1,4 +1,4 @@
|
||||
(ns macros.metabase.api.card-test)
|
||||
(ns macros.metabase.queries.api.card-test)
|
||||
|
||||
(defmacro with-ordered-items
|
||||
[collection model-and-name-syms & body]
|
||||
@@ -1,4 +1,4 @@
|
||||
(ns macros.metabase.models.query-analysis-test)
|
||||
(ns macros.metabase.query-analysis.models.query-analysis-test)
|
||||
|
||||
(defmacro with-test-setup [& body]
|
||||
`(let [~'card-id 1
|
||||
9
.clj-kondo/macros/metabase/users/models/user_test.clj
Normal file
@@ -0,0 +1,9 @@
|
||||
(ns macros.metabase.users.models.user-test)
|
||||
|
||||
(defmacro with-groups! [bindings & body]
|
||||
`(let ~(into []
|
||||
(comp (partition-all 3)
|
||||
(mapcat (fn [[group-binding properties members]]
|
||||
[group-binding [properties members]])))
|
||||
bindings)
|
||||
~@body))
|
||||
@@ -1,6 +1,7 @@
|
||||
(ns hooks.clojure.core.ns
|
||||
(:require
|
||||
[clj-kondo.hooks-api :as hooks]
|
||||
[clojure.string :as str]
|
||||
[hooks.common]
|
||||
[hooks.common.modules :as modules]))
|
||||
|
||||
@@ -59,12 +60,15 @@
|
||||
(printf "Don't know how to figure out what namespace is being required in %s\n" (pr-str node)))))
|
||||
args)))
|
||||
|
||||
(defn- ns-form-node->ns-symb-node [ns-form-node]
|
||||
(some (fn [node]
|
||||
(when (and (hooks/token-node? node)
|
||||
(not= (hooks/sexpr node) 'ns))
|
||||
node))
|
||||
(:children ns-form-node)))
|
||||
|
||||
(defn- ns-form-node->ns-symb [ns-form-node]
|
||||
(some-> (some (fn [node]
|
||||
(when (and (hooks/token-node? node)
|
||||
(not= (hooks/sexpr node) 'ns))
|
||||
node))
|
||||
(:children ns-form-node))
|
||||
(some-> (ns-form-node->ns-symb-node ns-form-node)
|
||||
hooks/sexpr))
|
||||
|
||||
(defn- lint-modules [ns-form-node config]
|
||||
@@ -83,9 +87,33 @@
|
||||
:message error
|
||||
:type :metabase/modules))))))))
|
||||
|
||||
(defn- lint-namespace-name [ns-form-node]
|
||||
(when-let [ns-symb-node (ns-form-node->ns-symb-node ns-form-node)]
|
||||
(when-not (contains? (hooks.common/ignored-linters ns-symb-node) :metabase/namespace-name)
|
||||
(let [parts (str/split (str (hooks/sexpr ns-symb-node)) #"\.")]
|
||||
(when (and (<= (count parts) 2)
|
||||
(#{"metabase" "metabase-enterprise"} (first parts))
|
||||
;; exclude test namespaces for now
|
||||
(not (str/ends-with? (last parts) "test")))
|
||||
(hooks/reg-finding! (assoc (meta ns-symb-node)
|
||||
:message "Metabase namespaces should have the form metabase[-enterprise].<module>.* [:metabase/namespace-name]"
|
||||
:type :metabase/namespace-name)))))))
|
||||
|
||||
(defn lint-ns [x]
|
||||
(doto (:node x)
|
||||
lint-require-shapes
|
||||
lint-requires-on-new-lines
|
||||
(lint-modules (modules/config x)))
|
||||
(lint-modules (modules/config x))
|
||||
lint-namespace-name)
|
||||
x)
|
||||
|
||||
(comment
|
||||
(lint-ns
|
||||
{:node (hooks/parse-string
|
||||
(pr-str
|
||||
'(ns hooks.clojure.core.ns
|
||||
(:require
|
||||
[clj-kondo.hooks-api :as hooks]
|
||||
[clojure.string :as str]
|
||||
[hooks.common]
|
||||
[hooks.common.modules :as modules]))))}))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
(ns hooks.metabase.db.schema-migrations-test.impl
|
||||
(ns hooks.metabase.app-db.schema-migrations-test.impl
|
||||
(:require [clj-kondo.hooks-api :as hooks]))
|
||||
|
||||
(defn test-migrations
|
||||
@@ -1,9 +1,15 @@
|
||||
(ns hooks.metabase.models.setting
|
||||
(ns hooks.metabase.settings.models.setting
|
||||
(:require
|
||||
[clj-kondo.hooks-api :as hooks]
|
||||
[hooks.common :as common]))
|
||||
|
||||
;;; TODO -- move this into
|
||||
(defn lint-defsetting-namespace [node context]
|
||||
(when-not (re-matches #"^metabase(?:-enterprise)?\.[^\.]+\.settings$" (name (:ns context)))
|
||||
(hooks/reg-finding! (assoc (meta node)
|
||||
:message "All defsettings should live in metabase[-enterprise].<module>.settings namespaces"
|
||||
:type :metabase/defsetting-namespace))))
|
||||
|
||||
;;; TODO -- move this into a Kondo config file in `.clj-kondo/config/`
|
||||
(def ^:private ignored-implicit-export?
|
||||
'#{active-users-count
|
||||
admin-email
|
||||
@@ -22,7 +28,6 @@
|
||||
database-enable-actions
|
||||
deprecation-notice-version
|
||||
dismissed-custom-dashboard-toast
|
||||
dismissed-onboarding-sidebar-link
|
||||
email-configured?
|
||||
email-from-address
|
||||
email-from-name
|
||||
@@ -170,8 +175,17 @@
|
||||
version-info
|
||||
version-info-last-checked})
|
||||
|
||||
(defn- defsetting-lint [node setting-name docstring options-list]
|
||||
(let [anon-binding (common/with-macro-meta (hooks/token-node '_) node)
|
||||
(defn- lint-defsetting-export [node]
|
||||
(let [[_defsetting setting-name _docstring & options] (:children node)]
|
||||
(when (nil? (second (drop-while (comp not #{[:k :export?]} first) options)))
|
||||
(when-not (contains? ignored-implicit-export? (:value setting-name))
|
||||
(hooks/reg-finding! (assoc (meta node)
|
||||
:message "Setting definition must provide an explicit value for :export? indicating whether the setting should be exported or not with serialization."
|
||||
:type :metabase/defsetting-must-specify-export))))))
|
||||
|
||||
(defn- defsetting-replacement-node [node]
|
||||
(let [[_defsetting setting-name docstring & options-list] (:children node)
|
||||
anon-binding (common/with-macro-meta (hooks/token-node '_) node)
|
||||
;; (defn my-setting [] ...)
|
||||
getter-node (-> (list
|
||||
(hooks/token-node 'defn)
|
||||
@@ -191,26 +205,19 @@
|
||||
hooks/list-node
|
||||
(with-meta (meta node))
|
||||
common/add-lsp-ignore-unused-public-var-metadata)]
|
||||
|
||||
(when (nil? (second (drop-while (comp not #{[:k :export?]} first) options-list)))
|
||||
(when-not (contains? ignored-implicit-export? (:value setting-name))
|
||||
(hooks/reg-finding! (assoc (meta node)
|
||||
:message "Setting definition must provide an explicit value for :export? indicating whether the setting should be exported or not with serialization."
|
||||
:type :metabase/defsetting-must-specify-export))))
|
||||
|
||||
{:node (-> (hooks/list-node
|
||||
(list
|
||||
(hooks/token-node 'let)
|
||||
;; include description and the options map so they can get validated as well.
|
||||
(hooks/vector-node
|
||||
[anon-binding docstring
|
||||
anon-binding (hooks/map-node options-list)])
|
||||
(hooks/reg-keyword! (-> (hooks/keyword-node (keyword (hooks/sexpr setting-name)))
|
||||
(with-meta (meta setting-name)))
|
||||
'metabase.models.setting/defsetting)
|
||||
getter-node
|
||||
setter-node))
|
||||
(with-meta (meta node)))}))
|
||||
(-> (hooks/list-node
|
||||
(list
|
||||
(hooks/token-node 'let)
|
||||
;; include description and the options map so they can get validated as well.
|
||||
(hooks/vector-node
|
||||
[anon-binding docstring
|
||||
anon-binding (hooks/map-node options-list)])
|
||||
(hooks/reg-keyword! (-> (hooks/keyword-node (keyword (hooks/sexpr setting-name)))
|
||||
(with-meta (meta setting-name)))
|
||||
'metabase.settings.models.setting/defsetting)
|
||||
getter-node
|
||||
setter-node))
|
||||
(with-meta (meta node)))))
|
||||
|
||||
(defn defsetting
|
||||
"Rewrite a [[metabase.models.defsetting]] form like
|
||||
@@ -226,10 +233,21 @@
|
||||
|
||||
for linting purposes."
|
||||
[{:keys [node], :as context}]
|
||||
(let [[setting-name docstring & options] (rest (:children node))]
|
||||
(merge
|
||||
context
|
||||
(defsetting-lint node setting-name docstring options))))
|
||||
(lint-defsetting-namespace node context)
|
||||
(lint-defsetting-export node)
|
||||
(update context :node defsetting-replacement-node))
|
||||
|
||||
(defn define-multi-setting-replacement-node [node]
|
||||
(let [[defsetting setting-name docstring thunk & options] (:children node)]
|
||||
(-> (hooks/list-node
|
||||
(list*
|
||||
defsetting
|
||||
setting-name
|
||||
docstring
|
||||
(hooks/token-node :multi-thunk) thunk
|
||||
options))
|
||||
(with-meta (meta node))
|
||||
defsetting-replacement-node)))
|
||||
|
||||
(defn define-multi-setting
|
||||
"Rewrite a [[metabase.models.define-multi-setting]] form like
|
||||
@@ -245,10 +263,7 @@
|
||||
|
||||
for linting purposes."
|
||||
[{:keys [node], :as context}]
|
||||
(let [[setting-name docstring thunk & options] (rest (:children node))]
|
||||
(merge
|
||||
context
|
||||
(defsetting-lint node setting-name docstring (concat options [(hooks/token-node :multi-thunk) thunk])))))
|
||||
(update context :node define-multi-setting-replacement-node))
|
||||
|
||||
(defn define-multi-setting-impl
|
||||
[context]
|
||||
@@ -289,6 +304,6 @@
|
||||
:type :integer
|
||||
:default 0
|
||||
:getter (fn []
|
||||
(if-not ((requiring-resolve 'metabase.db/db-is-set-up?))
|
||||
(if-not ((requiring-resolve 'metabase.app-db.core/db-is-set-up?))
|
||||
0
|
||||
(cached-active-users-count)))))))
|
||||
@@ -20,15 +20,17 @@
|
||||
(lint-ns form (assoc-in config [:linters :metabase/modules :level] :warning)))
|
||||
|
||||
(deftest ^:parallel module-checker-allowed-modules-test
|
||||
(is (=? [{:message "Module task should not be used in the api module. [:metabase/modules api :uses]"
|
||||
:type :metabase/modules}]
|
||||
(lint-modules
|
||||
'(ns metabase.api.search
|
||||
(:require
|
||||
[metabase.request.core :as request]
|
||||
[metabase.task :as task]))
|
||||
'{:metabase/modules {api {:uses #{request}}
|
||||
request {:api #{metabase.request.core}}}}))))
|
||||
(are [task-namespace] (=? [{:message "Module task should not be used in the api module. [:metabase/modules api :uses]"
|
||||
:type :metabase/modules}]
|
||||
(lint-modules
|
||||
'(ns metabase.api.search
|
||||
(:require
|
||||
[metabase.request.core :as request]
|
||||
[task-namespace :as task]))
|
||||
'{:metabase/modules {api {:uses #{request}}
|
||||
request {:api #{metabase.request.core}}}}))
|
||||
metabase.task
|
||||
metabase.task.core))
|
||||
|
||||
(deftest ^:parallel module-checker-api-namespaces-test
|
||||
(is (=? [{:message "Namespace metabase.search.config is not an allowed external API namespace for the search module. [:metabase/modules search :api]"
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
(ns hooks.metabase.settings.models.setting-test
|
||||
(:require
|
||||
[clj-kondo.hooks-api :as hooks]
|
||||
[clojure.test :refer :all]
|
||||
[hooks.metabase.settings.models.setting]))
|
||||
|
||||
#_{:clj-kondo/ignore [:metabase/validate-deftest]}
|
||||
(deftest ^:parallel defsetting-test
|
||||
(let [node (-> '(defsetting active-users-count
|
||||
(deferred-tru "Cached number of active users. Refreshed every 5 minutes.")
|
||||
:visibility :admin
|
||||
:type :integer
|
||||
:default 0
|
||||
:getter (fn []
|
||||
(if-not ((requiring-resolve 'metabase.app-db.core/db-is-set-up?))
|
||||
0
|
||||
(cached-active-users-count))))
|
||||
pr-str
|
||||
hooks/parse-string)]
|
||||
(is (= '(let [_ (deferred-tru "Cached number of active users. Refreshed every 5 minutes.")
|
||||
_ {:default 0
|
||||
:type :integer
|
||||
:getter (fn []
|
||||
(if-not ((requiring-resolve 'metabase.app-db.core/db-is-set-up?))
|
||||
0
|
||||
(cached-active-users-count)))
|
||||
:visibility :admin}]
|
||||
:active-users-count
|
||||
(defn active-users-count "Docstring." [])
|
||||
(defn active-users-count! "Docstring." [_value-or-nil]))
|
||||
(-> {:node node, :ns 'hooks.metabase.settings.models.setting-test}
|
||||
hooks.metabase.settings.models.setting/defsetting
|
||||
:node
|
||||
hooks/sexpr)))))
|
||||
535
.cljfmt.edn
@@ -81,269 +81,272 @@
|
||||
throttle.core/with-throttling [[:block 1]]
|
||||
;; the rest of the stuff in this list is generated automatically based on `:style/indent` specs
|
||||
;; by running [[dev.generate-cljfmt-config/specs]]... use that code to update this list
|
||||
metabase-enterprise.impersonation.util-test/with-impersonations! [[:inner 0]]
|
||||
metabase-enterprise.cache.config-test/with-temp-persist-models [[:block 1]]
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps! [[:inner 0]]
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! [[:inner 0]]
|
||||
metabase-enterprise.sandbox.test-util/with-user-attributes [[:block 2]]
|
||||
metabase-enterprise.serialization.test-util/with-dbs [[:inner 0]]
|
||||
metabase-enterprise.serialization.test-util/with-random-dump-dir [[:block 1]]
|
||||
metabase-enterprise.serialization.test-util/with-world [[:block 0]]
|
||||
metabase-enterprise.sso.integrations.jwt-test/with-users-with-email-deleted [[:block 1]]
|
||||
metabase-enterprise.test/with-gtaps! [[:inner 0]]
|
||||
metabase-enterprise.test/with-gtaps-for-user! [[:inner 0]]
|
||||
metabase-enterprise.test/with-user-attributes [[:block 2]]
|
||||
metabase.actions.actions-test/with-actions-test-data-and-actions-permissively-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions [[:block 1]]
|
||||
metabase.actions.test-util/with-actions-disabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-test-data [[:inner 0]]
|
||||
metabase.actions.test-util/with-actions-test-data-and-actions-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-test-data-tables [[:block 1]]
|
||||
metabase.actions.test-util/with-empty-db [[:inner 0]]
|
||||
metabase.actions.test-util/with-temp-test-data [[:inner 0]]
|
||||
metabase.api.card-test/with-cards-in-readable-collection [[:block 1]]
|
||||
metabase.api.card-test/with-cards-in-writeable-collection [[:block 1]]
|
||||
metabase.api.card-test/with-ordered-items [[:inner 0]]
|
||||
metabase.api.card-test/with-temp-native-card! [[:block 1]]
|
||||
metabase.api.card-test/with-temp-native-card-with-params! [[:block 1]]
|
||||
metabase.api.collection-test/with-collection-hierarchy [[:block 1]]
|
||||
metabase.api.collection-test/with-french-user-and-personal-collection [[:block 2]]
|
||||
metabase.api.collection-test/with-some-children-of-collection [[:block 1]]
|
||||
metabase.api.common/check [[:default]]
|
||||
metabase.api.common/define-routes [[:block 0]]
|
||||
metabase.api.common/let-404 [[:block 1]]
|
||||
metabase.api.embed-test/do-response-formats [[:block 1]]
|
||||
metabase.api.embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
|
||||
metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing [[:block 3]]
|
||||
metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing [[:block 3]]
|
||||
metabase.api.embed-test/with-new-secret-key [[:block 0]]
|
||||
metabase.api.embed-test/with-temp-card [[:block 1]]
|
||||
metabase.api.embed-test/with-temp-dashcard [[:block 1]]
|
||||
metabase.api.preview-embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
|
||||
metabase.api.preview-embed-test/with-new-secret-key [[:block 0]]
|
||||
metabase.cmd.copy/step [[:block 1]]
|
||||
metabase.cmd.copy/with-connection-rollback-only [[:block 1]]
|
||||
metabase.cmd.copy/with-disabled-db-constraints [[:block 2]]
|
||||
metabase.config/build-type-case [[:block 0]]
|
||||
metabase.dashboard-subscription-test/with-link-card-fixture-for-dashboard [[:block 2]]
|
||||
metabase.db.liquibase/with-liquibase [[:block 1]]
|
||||
metabase.db.liquibase/with-scope-locked [[:block 1]]
|
||||
metabase.db.schema-migrations-test.impl/test-migrations [[:block 2]]
|
||||
metabase.db/with-application-db [[:inner 0]]
|
||||
metabase.driver.bigquery-cloud-sdk.query-processor/with-temporal-type [[:default]]
|
||||
metabase.driver.druid.client/DELETE [[:default]]
|
||||
metabase.driver.druid.client/GET [[:default]]
|
||||
metabase.driver.druid.client/POST [[:default]]
|
||||
metabase.driver.druid.query-processor-test/druid-query [[:block 0]]
|
||||
metabase.driver.druid.query-processor-test/druid-query-returning-rows [[:block 0]]
|
||||
metabase.driver.mongo.query-processor/mongo-let [[:block 1]]
|
||||
metabase.driver.sql-jdbc.actions/with-jdbc-transaction [[:block 1]]
|
||||
metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection [[:block 1]]
|
||||
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info [[:block 1]]
|
||||
metabase.driver.sql.query-processor/apply-top-level-clause [[:default]]
|
||||
metabase.driver/with-driver [[:block 1]]
|
||||
metabase.lib.binning/with-binning [[:default]]
|
||||
metabase.lib.core/with-binning [[:default]]
|
||||
metabase.lib.core/with-join-alias [[:default]]
|
||||
metabase.lib.core/with-join-conditions [[:default]]
|
||||
metabase.lib.join/with-join-alias [[:default]]
|
||||
metabase.lib.join/with-join-conditions [[:default]]
|
||||
metabase.lib.test-util.macros/$ids [[:inner 0]]
|
||||
metabase.lib.test-util.macros/mbql-query [[:inner 0]]
|
||||
metabase.lib.util.match/match [[:inner 0]]
|
||||
metabase.lib.util.match/match-one [[:inner 0]]
|
||||
metabase.lib.util.match/replace [[:inner 0]]
|
||||
metabase.lib.util.match/replace-in [[:inner 0]]
|
||||
metabase.models.collection-test/with-collection-hierarchy [[:block 1]]
|
||||
metabase.models.collection-test/with-current-user-perms-for-collections [[:block 1]]
|
||||
metabase.models.collection-test/with-personal-and-impersonal-collections [[:block 1]]
|
||||
metabase.models.dashboard-test/with-dash-in-collection [[:inner 0]]
|
||||
metabase.models.interface/define-batched-hydration-method [[:inner 0]]
|
||||
metabase.models.interface/define-simple-hydration-method [[:inner 0]]
|
||||
metabase.models.params.chain-filter-test/with-clean-field-values-for-field [[:block 1]]
|
||||
metabase.models.params.chain-filter-test/with-fk-field-to-field-remapping [[:block 0]]
|
||||
metabase.models.params.chain-filter-test/with-human-readable-values-remapping [[:block 0]]
|
||||
metabase.models.setting.multi-setting/define-multi-setting [[:inner 0]]
|
||||
metabase.models.setting/defsetting [[:block 1]]
|
||||
metabase.models.task-history/with-task-history [[:block 1]]
|
||||
metabase.permissions.core/allow-changing-all-users-group-members [[:block 0]]
|
||||
metabase.permissions.core/disable-perms-cache [[:block 0]]
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing [[:block 3]]
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing [[:block 3]]
|
||||
metabase.public-sharing.api-test/with-temp-public-card [[:block 1]]
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard [[:block 1]]
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard-and-card [[:block 1]]
|
||||
metabase.pulse.api.alert-test/with-alert-in-collection [[:block 1]]
|
||||
metabase.pulse.models.pulse-test/with-dashboard-subscription-in-collection [[:block 1]]
|
||||
metabase.pulse.models.pulse-test/with-pulse-in-collection [[:inner 0]]
|
||||
metabase.query-processor-test.pipeline-queries-test/pmbql-query [[:block 1]]
|
||||
metabase.query-processor-test.pipeline-queries-test/run-pmbql-query [[:block 1]]
|
||||
metabase.query-processor.debug/debug> [[:block 0]]
|
||||
metabase.query-processor.error-type/deferror [[:block 1]]
|
||||
metabase.query-processor.middleware.cache-backend.interface/with-cached-results [[:block 4]]
|
||||
metabase.query-processor.middleware.process-userland-query-test/with-query-execution [[:block 1]]
|
||||
metabase.query-processor.store/cached [[:block 1]]
|
||||
metabase.query-processor.store/with-metadata-provider [[:inner 0]]
|
||||
metabase.query-processor.streaming/streaming-response [[:block 1]]
|
||||
metabase.query-processor.test-util/format-rows-by [[:default]]
|
||||
metabase.request.core/as-admin [[:block 0]]
|
||||
metabase.request.core/with-current-request [[:inner 0]]
|
||||
metabase.request.core/with-current-user [[:inner 0]]
|
||||
metabase.request.core/with-limit-and-offset [[:inner 0]]
|
||||
metabase.request.session/as-admin [[:block 0]]
|
||||
metabase.request.session/with-current-user [[:inner 0]]
|
||||
metabase.sample-data-test/with-temp-sample-database-db [[:block 1]]
|
||||
metabase.search.api-test/do-test-users [[:block 1]]
|
||||
metabase.server.middleware.session/as-admin [[:block 0]]
|
||||
metabase.server.middleware.session/with-current-user [[:inner 0]]
|
||||
metabase.server.streaming-response-test/with-streaming-response-thread-pool [[:block 0]]
|
||||
metabase.server.streaming-response-test/with-test-driver-db! [[:block 0]]
|
||||
metabase.server.streaming-response/streaming-response [[:block 2]]
|
||||
metabase.session.api/http-401-on-error [[:block 0]]
|
||||
metabase.sync.fetch-metadata/log-if-error [[:block 1]]
|
||||
metabase.sync.sync-metadata.fields-test/with-test-db [[:block 0]]
|
||||
metabase.sync.util/do-with-start-and-finish-debug-logging [[:default]]
|
||||
metabase.sync.util/sum-for [[:block 1]]
|
||||
metabase.sync.util/sync-operation [[:block 3]]
|
||||
metabase.sync.util/with-db-logging-disabled [[:default]]
|
||||
metabase.sync.util/with-duplicate-ops-prevented [[:default]]
|
||||
metabase.sync.util/with-emoji-progress-bar [[:block 1]]
|
||||
metabase.sync.util/with-error-handling [[:block 1]]
|
||||
metabase.sync.util/with-start-and-finish-logging [[:default]]
|
||||
metabase.sync.util/with-start-and-finish-logging* [[:default]]
|
||||
metabase.sync.util/with-sync-events [[:default]]
|
||||
metabase.task/rerun-on-error [[:block 1]]
|
||||
metabase.test/$ids [[:inner 0]]
|
||||
metabase.test/as-admin [[:inner 0]]
|
||||
metabase.test/dataset [[:inner 0]]
|
||||
metabase.test/discard-setting-changes [[:block 1]]
|
||||
metabase.test/format-rows-by [[:default]]
|
||||
metabase.test/let-url [[:block 1]]
|
||||
metabase.test/mbql-query [[:inner 0]]
|
||||
metabase.test/native-query [[:block 0]]
|
||||
metabase.test/query [[:block 1]]
|
||||
metabase.test/run-mbql-query [[:inner 0]]
|
||||
metabase.test/test-driver [[:inner 0]]
|
||||
metabase.test/test-drivers [[:inner 0]]
|
||||
metabase.test/test-helpers-set-global-values! [[:block 0]]
|
||||
metabase.test/throw-if-called! [[:block 1]]
|
||||
metabase.test/with-actions [[:block 1]]
|
||||
metabase.test/with-actions-disabled [[:block 0]]
|
||||
metabase.test/with-actions-enabled [[:block 0]]
|
||||
metabase.test/with-actions-test-data [[:inner 0]]
|
||||
metabase.test/with-actions-test-data-and-actions-enabled [[:block 0]]
|
||||
metabase.test/with-actions-test-data-tables [[:block 1]]
|
||||
metabase.test/with-additional-premium-features [[:block 1]]
|
||||
metabase.test/with-current-user [[:inner 0]]
|
||||
metabase.test/with-driver [[:block 1]]
|
||||
metabase.test/with-empty-db [[:inner 0]]
|
||||
metabase.test/with-empty-h2-app-db [[:block 0]]
|
||||
metabase.test/with-metadata-provider [[:inner 0]]
|
||||
metabase.test/with-premium-features [[:block 1]]
|
||||
metabase.test/with-temp [[:inner 0]]
|
||||
metabase.test/with-temp-copy-of-db [[:block 0]]
|
||||
metabase.test/with-temp-scheduler [[:block 0]]
|
||||
metabase.test/with-temp-test-data [[:inner 0]]
|
||||
metabase.test/with-temp-vals-in-db [[:block 3]]
|
||||
metabase.test/with-test-user [[:inner 0]]
|
||||
metabase.test/with-user-in-groups [[:inner 0]]
|
||||
metabase.test.data/$ids [[:inner 0]]
|
||||
metabase.test.data/dataset [[:inner 0]]
|
||||
metabase.test.data/mbql-query [[:inner 0]]
|
||||
metabase.test.data/native-query [[:block 0]]
|
||||
metabase.test.data/query [[:block 1]]
|
||||
metabase.test.data/run-mbql-query [[:inner 0]]
|
||||
metabase.test.data/with-empty-h2-app-db [[:block 0]]
|
||||
metabase.test.data/with-temp-copy-of-db [[:block 0]]
|
||||
metabase.test.data.datasets/test-driver [[:inner 0]]
|
||||
metabase.test.data.datasets/test-drivers [[:inner 0]]
|
||||
metabase.test.data.one-off-dbs/with-blank-db [[:block 0]]
|
||||
metabase.test.data.one-off-dbs/with-blueberries-db [[:block 0]]
|
||||
metabase.test.data.users/with-test-user [[:inner 0]]
|
||||
metabase.test.util/discard-setting-changes [[:block 1]]
|
||||
metabase.test.util/let-url [[:block 1]]
|
||||
metabase.test.util/throw-if-called! [[:block 1]]
|
||||
metabase.test.util/with-temp-scheduler [[:block 0]]
|
||||
metabase.test.util/with-temp-vals-in-db [[:block 3]]
|
||||
metabase.test.util/with-user-in-groups [[:inner 0]]
|
||||
metabase.test.util.public-settings/with-additional-premium-features [[:block 1]]
|
||||
metabase.test.util.public-settings/with-premium-features [[:block 1]]
|
||||
metabase.test.util.thread-local/test-helpers-set-global-values! [[:block 0]]
|
||||
metabase.timeseries-query-processor-test.util/test-timeseries-drivers [[:block 0]]
|
||||
metabase.timeseries-query-processor-test/run-mbql-query [[:inner 0]]
|
||||
metabase.upload-test/with-upload-table! [[:inner 0]]
|
||||
metabase.upload.types/with-currency [[:default]]
|
||||
metabase.upload.types/with-parens [[:default]]
|
||||
metabase.util/auto-retry [[:block 1]]
|
||||
metabase.util/case-enum [[:block 1]]
|
||||
metabase.util/ignore-exceptions [[:block 0]]
|
||||
metabase.util/or-with [[:block 1]]
|
||||
metabase.util/profile [[:block 1]]
|
||||
metabase.util/prog1 [[:inner 0]]
|
||||
metabase.util/varargs [[:inner 0]]
|
||||
metabase.util/with-us-locale [[:block 0]]
|
||||
metabase.util.async/cancelable-thread [[:block 0]]
|
||||
metabase.util.date-2/with-time-zone-same-instant [[:default]]
|
||||
metabase.util.encryption-test/with-secret-key [[:block 1]]
|
||||
metabase.util.honey-sql-2/with-database-type-info [[:default]]
|
||||
metabase.util.i18n/deferred-trs [[:default]]
|
||||
metabase.util.i18n/deferred-tru [[:default]]
|
||||
metabase.util.i18n/trs [[:default]]
|
||||
metabase.util.i18n/trsn [[:default]]
|
||||
metabase.util.i18n/tru [[:default]]
|
||||
metabase.util.i18n/trun [[:default]]
|
||||
metabase.util.jvm/auto-retry [[:block 1]]
|
||||
metabase.util.jvm/varargs [[:block 1]]
|
||||
metabase.util.jvm/with-us-locale [[:block 0]]
|
||||
metabase.util.malli/disable-enforcement [[:block 0]]
|
||||
metabase.util.malli/with [[:default]]
|
||||
metabase.util.malli/with-api-error-message [[:default]]
|
||||
metabase.util.namespaces/import-fns [[:default]]
|
||||
metabase.util.queue-test/await-test-while [[:block 1]]
|
||||
metabuild-common.core/exit-when-finished-nonzero-on-exception [[:block 0]]
|
||||
metabuild-common.core/step [[:block 1]]
|
||||
metabuild-common.entrypoint/exit-when-finished-nonzero-on-exception [[:block 0]]
|
||||
metabuild-common.steps/step [[:block 1]]
|
||||
methodical.core/defmethod [[:inner 0]]
|
||||
methodical.core/defmulti [[:inner 0]]
|
||||
methodical.core/with-dispatcher [[:default]]
|
||||
methodical.core/with-method-table [[:default]]
|
||||
methodical.core/with-prefers [[:default]]
|
||||
methodical.interface/with-dispatcher [[:default]]
|
||||
methodical.interface/with-method-table [[:default]]
|
||||
methodical.interface/with-prefers [[:default]]
|
||||
methodical.macros/defmethod [[:inner 0]]
|
||||
methodical.macros/defmulti [[:inner 0]]
|
||||
saml20-clj.sp.response/validate-confirmation-datas [[:block 1]]
|
||||
toucan2.connection/with-transaction [[:block 1]]
|
||||
toucan2.core/build [[:block 0]]
|
||||
toucan2.core/compile [[:block 0]]
|
||||
toucan2.core/debug [[:block 0]]
|
||||
toucan2.core/define-after-insert [[:inner 0]]
|
||||
toucan2.core/define-after-select [[:inner 0]]
|
||||
toucan2.core/define-after-update [[:inner 0]]
|
||||
toucan2.core/define-before-delete [[:inner 0]]
|
||||
toucan2.core/define-before-insert [[:inner 0]]
|
||||
toucan2.core/define-before-select [[:inner 0]]
|
||||
toucan2.core/define-default-fields [[:inner 0]]
|
||||
toucan2.core/define-named-query [[:block 1]]
|
||||
toucan2.core/deftransforms [[:block 1]]
|
||||
toucan2.core/with-transaction [[:block 1]]
|
||||
toucan2.tools.after/define-after-impl [[:default]]
|
||||
toucan2.tools.after-insert/define-after-insert [[:inner 0]]
|
||||
toucan2.tools.after-select/define-after-select [[:inner 0]]
|
||||
toucan2.tools.after-update/define-after-update [[:inner 0]]
|
||||
toucan2.tools.before-delete/define-before-delete [[:inner 0]]
|
||||
toucan2.tools.before-insert/define-before-insert [[:inner 0]]
|
||||
toucan2.tools.before-select/define-before-select [[:inner 0]]
|
||||
toucan2.tools.compile/build [[:block 0]]
|
||||
toucan2.tools.compile/compile [[:block 0]]
|
||||
toucan2.tools.compile/resolved [[:block 0]]
|
||||
toucan2.tools.debug/debug [[:block 0]]
|
||||
toucan2.tools.default-fields/define-default-fields [[:inner 0]]
|
||||
toucan2.tools.named-query/define-named-query [[:block 1]]
|
||||
toucan2.tools.simple-out-transform/define-out-transform [[:inner 0]]
|
||||
toucan2.tools.transformed/deftransforms [[:block 1]]
|
||||
toucan2.tools.with-temp/with-temp [[:inner 0]]
|
||||
toucan2.util/try-with-error-context [[:inner 0]]}}
|
||||
metabase-enterprise.cache.config-test/with-temp-persist-models [[:block 1]]
|
||||
metabase-enterprise.impersonation.util-test/with-impersonations! [[:inner 0]]
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps! [[:inner 0]]
|
||||
metabase-enterprise.sandbox.test-util/with-gtaps-for-user! [[:inner 0]]
|
||||
metabase-enterprise.sandbox.test-util/with-user-attributes [[:block 2]]
|
||||
metabase-enterprise.serialization.test-util/with-dbs [[:inner 0]]
|
||||
metabase-enterprise.serialization.test-util/with-random-dump-dir [[:block 1]]
|
||||
metabase-enterprise.serialization.test-util/with-world [[:block 0]]
|
||||
metabase-enterprise.sso.integrations.jwt-test/with-users-with-email-deleted [[:block 1]]
|
||||
metabase-enterprise.test/with-gtaps! [[:inner 0]]
|
||||
metabase-enterprise.test/with-gtaps-for-user! [[:inner 0]]
|
||||
metabase-enterprise.test/with-user-attributes [[:block 2]]
|
||||
metabase.actions.actions-test/with-actions-test-data-and-actions-permissively-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions [[:block 1]]
|
||||
metabase.actions.test-util/with-actions-disabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-test-data [[:inner 0]]
|
||||
metabase.actions.test-util/with-actions-test-data-and-actions-enabled [[:block 0]]
|
||||
metabase.actions.test-util/with-actions-test-data-tables [[:block 1]]
|
||||
metabase.actions.test-util/with-empty-db [[:inner 0]]
|
||||
metabase.actions.test-util/with-temp-test-data [[:inner 0]]
|
||||
metabase.api.common/check [[:default]]
|
||||
metabase.api.common/define-routes [[:block 0]]
|
||||
metabase.api.common/let-404 [[:block 1]]
|
||||
metabase.app-db.core/with-application-db [[:inner 0]]
|
||||
metabase.app-db.liquibase/with-liquibase [[:block 1]]
|
||||
metabase.app-db.liquibase/with-scope-locked [[:block 1]]
|
||||
metabase.app-db.schema-migrations-test.impl/test-migrations [[:block 2]]
|
||||
metabase.cmd.copy/step [[:block 1]]
|
||||
metabase.cmd.copy/with-connection-rollback-only [[:block 1]]
|
||||
metabase.cmd.copy/with-disabled-db-constraints [[:block 2]]
|
||||
metabase.collections.api-test/with-collection-hierarchy [[:block 1]]
|
||||
metabase.collections.api-test/with-french-user-and-personal-collection [[:block 2]]
|
||||
metabase.collections.api-test/with-some-children-of-collection [[:block 1]]
|
||||
metabase.collections.models.collection-test/with-collection-hierarchy [[:block 1]]
|
||||
metabase.collections.models.collection-test/with-current-user-perms-for-collections [[:block 1]]
|
||||
metabase.collections.models.collection-test/with-personal-and-impersonal-collections [[:block 1]]
|
||||
metabase.config/build-type-case [[:block 0]]
|
||||
metabase.dashboards.models.dashboard-test/with-dash-in-collection [[:inner 0]]
|
||||
metabase.driver.bigquery-cloud-sdk.query-processor/with-temporal-type [[:default]]
|
||||
metabase.driver.druid.client/DELETE [[:default]]
|
||||
metabase.driver.druid.client/GET [[:default]]
|
||||
metabase.driver.druid.client/POST [[:default]]
|
||||
metabase.driver.druid.query-processor-test/druid-query [[:block 0]]
|
||||
metabase.driver.druid.query-processor-test/druid-query-returning-rows [[:block 0]]
|
||||
metabase.driver.mongo.query-processor/mongo-let [[:block 1]]
|
||||
metabase.driver.sql-jdbc.actions/with-jdbc-transaction [[:block 1]]
|
||||
metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection [[:block 1]]
|
||||
metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info [[:block 1]]
|
||||
metabase.driver.sql.query-processor/apply-top-level-clause [[:default]]
|
||||
metabase.driver/with-driver [[:block 1]]
|
||||
metabase.embedding.api.embed-test/do-response-formats [[:block 1]]
|
||||
metabase.embedding.api.embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
|
||||
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-card-referencing [[:block 3]]
|
||||
metabase.embedding.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing [[:block 3]]
|
||||
metabase.embedding.api.embed-test/with-new-secret-key [[:block 0]]
|
||||
metabase.embedding.api.embed-test/with-temp-card [[:block 1]]
|
||||
metabase.embedding.api.embed-test/with-temp-dashcard [[:block 1]]
|
||||
metabase.embedding.api.preview-embed-test/with-embedding-enabled-and-new-secret-key [[:block 0]]
|
||||
metabase.embedding.api.preview-embed-test/with-new-secret-key [[:block 0]]
|
||||
metabase.lib.binning/with-binning [[:default]]
|
||||
metabase.lib.core/with-binning [[:default]]
|
||||
metabase.lib.core/with-join-alias [[:default]]
|
||||
metabase.lib.core/with-join-conditions [[:default]]
|
||||
metabase.lib.join/with-join-alias [[:default]]
|
||||
metabase.lib.join/with-join-conditions [[:default]]
|
||||
metabase.lib.test-util.macros/$ids [[:inner 0]]
|
||||
metabase.lib.test-util.macros/mbql-query [[:inner 0]]
|
||||
metabase.lib.util.match/match [[:inner 0]]
|
||||
metabase.lib.util.match/match-one [[:inner 0]]
|
||||
metabase.lib.util.match/replace [[:inner 0]]
|
||||
metabase.lib.util.match/replace-in [[:inner 0]]
|
||||
metabase.models.interface/define-batched-hydration-method [[:inner 0]]
|
||||
metabase.models.interface/define-simple-hydration-method [[:inner 0]]
|
||||
metabase.parameters.chain-filter-test/with-clean-field-values-for-field [[:block 1]]
|
||||
metabase.parameters.chain-filter-test/with-fk-field-to-field-remapping [[:block 0]]
|
||||
metabase.parameters.chain-filter-test/with-human-readable-values-remapping [[:block 0]]
|
||||
metabase.permissions.core/allow-changing-all-users-group-members [[:block 0]]
|
||||
metabase.permissions.core/disable-perms-cache [[:block 0]]
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-card-referencing [[:block 3]]
|
||||
metabase.public-sharing.api-test/with-sharing-enabled-and-temp-dashcard-referencing [[:block 3]]
|
||||
metabase.public-sharing.api-test/with-temp-public-card [[:block 1]]
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard [[:block 1]]
|
||||
metabase.public-sharing.api-test/with-temp-public-dashboard-and-card [[:block 1]]
|
||||
metabase.pulse.api.alert-test/with-alert-in-collection [[:block 1]]
|
||||
metabase.pulse.dashboard-subscription-test/with-link-card-fixture-for-dashboard [[:block 2]]
|
||||
metabase.pulse.models.pulse-test/with-dashboard-subscription-in-collection [[:block 1]]
|
||||
metabase.pulse.models.pulse-test/with-pulse-in-collection [[:inner 0]]
|
||||
metabase.queries.api.card-test/with-cards-in-readable-collection [[:block 1]]
|
||||
metabase.queries.api.card-test/with-cards-in-writeable-collection [[:block 1]]
|
||||
metabase.queries.api.card-test/with-ordered-items [[:inner 0]]
|
||||
metabase.queries.api.card-test/with-temp-native-card! [[:block 1]]
|
||||
metabase.queries.api.card-test/with-temp-native-card-with-params! [[:block 1]]
|
||||
metabase.query-processor-test.pipeline-queries-test/pmbql-query [[:block 1]]
|
||||
metabase.query-processor-test.pipeline-queries-test/run-pmbql-query [[:block 1]]
|
||||
metabase.query-processor.debug/debug> [[:block 0]]
|
||||
metabase.query-processor.error-type/deferror [[:block 1]]
|
||||
metabase.query-processor.middleware.cache-backend.interface/with-cached-results [[:block 4]]
|
||||
metabase.query-processor.middleware.process-userland-query-test/with-query-execution [[:block 1]]
|
||||
metabase.query-processor.store/cached [[:block 1]]
|
||||
metabase.query-processor.store/with-metadata-provider [[:inner 0]]
|
||||
metabase.query-processor.streaming/streaming-response [[:block 1]]
|
||||
metabase.query-processor.test-util/format-rows-by [[:default]]
|
||||
metabase.request.core/as-admin [[:block 0]]
|
||||
metabase.request.core/with-current-request [[:inner 0]]
|
||||
metabase.request.core/with-current-user [[:inner 0]]
|
||||
metabase.request.core/with-limit-and-offset [[:inner 0]]
|
||||
metabase.request.session/as-admin [[:block 0]]
|
||||
metabase.request.session/with-current-user [[:inner 0]]
|
||||
metabase.sample-data.impl-test/with-temp-sample-database-db [[:block 1]]
|
||||
metabase.search.api-test/do-test-users [[:block 1]]
|
||||
metabase.server.middleware.session/as-admin [[:block 0]]
|
||||
metabase.server.middleware.session/with-current-user [[:inner 0]]
|
||||
metabase.server.streaming-response-test/with-streaming-response-thread-pool [[:block 0]]
|
||||
metabase.server.streaming-response-test/with-test-driver-db! [[:block 0]]
|
||||
metabase.server.streaming-response/streaming-response [[:block 2]]
|
||||
metabase.session.api/http-401-on-error [[:block 0]]
|
||||
metabase.settings.core/define-multi-setting [[:inner 0]]
|
||||
metabase.settings.core/defsetting [[:block 1]]
|
||||
metabase.settings.models.setting.multi-setting/define-multi-setting [[:inner 0]]
|
||||
metabase.settings.models.setting/defsetting [[:block 1]]
|
||||
metabase.sync.fetch-metadata/log-if-error [[:block 1]]
|
||||
metabase.sync.sync-metadata.fields-test/with-test-db [[:block 0]]
|
||||
metabase.sync.util/do-with-start-and-finish-debug-logging [[:default]]
|
||||
metabase.sync.util/sum-for [[:block 1]]
|
||||
metabase.sync.util/sync-operation [[:block 3]]
|
||||
metabase.sync.util/with-db-logging-disabled [[:default]]
|
||||
metabase.sync.util/with-duplicate-ops-prevented [[:default]]
|
||||
metabase.sync.util/with-emoji-progress-bar [[:block 1]]
|
||||
metabase.sync.util/with-error-handling [[:block 1]]
|
||||
metabase.sync.util/with-start-and-finish-logging [[:default]]
|
||||
metabase.sync.util/with-start-and-finish-logging* [[:default]]
|
||||
metabase.sync.util/with-sync-events [[:default]]
|
||||
metabase.task-history.models.task-history/with-task-history [[:block 1]]
|
||||
metabase.task.core/rerun-on-error [[:block 1]]
|
||||
metabase.task.impl/rerun-on-error [[:block 1]]
|
||||
metabase.test.data.datasets/test-driver [[:inner 0]]
|
||||
metabase.test.data.datasets/test-drivers [[:inner 0]]
|
||||
metabase.test.data.one-off-dbs/with-blank-db [[:block 0]]
|
||||
metabase.test.data.one-off-dbs/with-blueberries-db [[:block 0]]
|
||||
metabase.test.data.users/with-test-user [[:inner 0]]
|
||||
metabase.test.data/$ids [[:inner 0]]
|
||||
metabase.test.data/dataset [[:inner 0]]
|
||||
metabase.test.data/mbql-query [[:inner 0]]
|
||||
metabase.test.data/native-query [[:block 0]]
|
||||
metabase.test.data/query [[:block 1]]
|
||||
metabase.test.data/run-mbql-query [[:inner 0]]
|
||||
metabase.test.data/with-empty-h2-app-db! [[:block 0]]
|
||||
metabase.test.data/with-temp-copy-of-db [[:block 0]]
|
||||
metabase.test.util.public-settings/with-additional-premium-features [[:block 1]]
|
||||
metabase.test.util.public-settings/with-premium-features [[:block 1]]
|
||||
metabase.test.util.thread-local/test-helpers-set-global-values! [[:block 0]]
|
||||
metabase.test.util/discard-setting-changes [[:block 1]]
|
||||
metabase.test.util/let-url [[:block 1]]
|
||||
metabase.test.util/throw-if-called! [[:block 1]]
|
||||
metabase.test.util/with-temp-scheduler [[:block 0]]
|
||||
metabase.test.util/with-temp-vals-in-db [[:block 3]]
|
||||
metabase.test.util/with-user-in-groups [[:inner 0]]
|
||||
metabase.test/$ids [[:inner 0]]
|
||||
metabase.test/as-admin [[:inner 0]]
|
||||
metabase.test/dataset [[:inner 0]]
|
||||
metabase.test/discard-setting-changes [[:block 1]]
|
||||
metabase.test/format-rows-by [[:default]]
|
||||
metabase.test/let-url [[:block 1]]
|
||||
metabase.test/mbql-query [[:inner 0]]
|
||||
metabase.test/native-query [[:block 0]]
|
||||
metabase.test/query [[:block 1]]
|
||||
metabase.test/run-mbql-query [[:inner 0]]
|
||||
metabase.test/test-driver [[:inner 0]]
|
||||
metabase.test/test-drivers [[:inner 0]]
|
||||
metabase.test/test-helpers-set-global-values! [[:block 0]]
|
||||
metabase.test/throw-if-called! [[:block 1]]
|
||||
metabase.test/with-actions [[:block 1]]
|
||||
metabase.test/with-actions-disabled [[:block 0]]
|
||||
metabase.test/with-actions-enabled [[:block 0]]
|
||||
metabase.test/with-actions-test-data [[:inner 0]]
|
||||
metabase.test/with-actions-test-data-and-actions-enabled [[:block 0]]
|
||||
metabase.test/with-actions-test-data-tables [[:block 1]]
|
||||
metabase.test/with-additional-premium-features [[:block 1]]
|
||||
metabase.test/with-current-user [[:inner 0]]
|
||||
metabase.test/with-driver [[:block 1]]
|
||||
metabase.test/with-empty-db [[:inner 0]]
|
||||
metabase.test/with-empty-h2-app-db! [[:block 0]]
|
||||
metabase.test/with-metadata-provider [[:inner 0]]
|
||||
metabase.test/with-premium-features [[:block 1]]
|
||||
metabase.test/with-temp [[:inner 0]]
|
||||
metabase.test/with-temp-copy-of-db [[:block 0]]
|
||||
metabase.test/with-temp-scheduler [[:block 0]]
|
||||
metabase.test/with-temp-test-data [[:inner 0]]
|
||||
metabase.test/with-temp-vals-in-db [[:block 3]]
|
||||
metabase.test/with-test-user [[:inner 0]]
|
||||
metabase.test/with-user-in-groups [[:inner 0]]
|
||||
metabase.timeseries-query-processor-test.util/test-timeseries-drivers [[:block 0]]
|
||||
metabase.timeseries-query-processor-test/run-mbql-query [[:inner 0]]
|
||||
metabase.upload.impl-test/with-upload-table! [[:inner 0]]
|
||||
metabase.upload.types/with-currency [[:default]]
|
||||
metabase.upload.types/with-parens [[:default]]
|
||||
metabase.util.async/cancelable-thread [[:block 0]]
|
||||
metabase.util.date-2/with-time-zone-same-instant [[:default]]
|
||||
metabase.util.encryption-test/with-secret-key [[:block 1]]
|
||||
metabase.util.honey-sql-2/with-database-type-info [[:default]]
|
||||
metabase.util.i18n/deferred-trs [[:default]]
|
||||
metabase.util.i18n/deferred-tru [[:default]]
|
||||
metabase.util.i18n/trs [[:default]]
|
||||
metabase.util.i18n/trsn [[:default]]
|
||||
metabase.util.i18n/tru [[:default]]
|
||||
metabase.util.i18n/trun [[:default]]
|
||||
metabase.util.jvm/auto-retry [[:block 1]]
|
||||
metabase.util.jvm/varargs [[:block 1]]
|
||||
metabase.util.jvm/with-us-locale [[:block 0]]
|
||||
metabase.util.malli/disable-enforcement [[:block 0]]
|
||||
metabase.util.malli/with [[:default]]
|
||||
metabase.util.malli/with-api-error-message [[:default]]
|
||||
metabase.util.namespaces/import-fns [[:default]]
|
||||
metabase.util.queue-test/await-test-while [[:block 1]]
|
||||
metabase.util/auto-retry [[:block 1]]
|
||||
metabase.util/case-enum [[:block 1]]
|
||||
metabase.util/ignore-exceptions [[:block 0]]
|
||||
metabase.util/or-with [[:block 1]]
|
||||
metabase.util/profile [[:block 1]]
|
||||
metabase.util/prog1 [[:inner 0]]
|
||||
metabase.util/varargs [[:inner 0]]
|
||||
metabase.util/with-us-locale [[:block 0]]
|
||||
metabuild-common.core/exit-when-finished-nonzero-on-exception [[:block 0]]
|
||||
metabuild-common.core/step [[:block 1]]
|
||||
metabuild-common.entrypoint/exit-when-finished-nonzero-on-exception [[:block 0]]
|
||||
metabuild-common.steps/step [[:block 1]]
|
||||
methodical.core/defmethod [[:inner 0]]
|
||||
methodical.core/defmulti [[:inner 0]]
|
||||
methodical.core/with-dispatcher [[:default]]
|
||||
methodical.core/with-method-table [[:default]]
|
||||
methodical.core/with-prefers [[:default]]
|
||||
methodical.interface/with-dispatcher [[:default]]
|
||||
methodical.interface/with-method-table [[:default]]
|
||||
methodical.interface/with-prefers [[:default]]
|
||||
methodical.macros/defmethod [[:inner 0]]
|
||||
methodical.macros/defmulti [[:inner 0]]
|
||||
saml20-clj.sp.response/validate-confirmation-datas [[:block 1]]
|
||||
toucan2.connection/with-transaction [[:block 1]]
|
||||
toucan2.core/build [[:block 0]]
|
||||
toucan2.core/compile [[:block 0]]
|
||||
toucan2.core/debug [[:block 0]]
|
||||
toucan2.core/define-after-insert [[:inner 0]]
|
||||
toucan2.core/define-after-select [[:inner 0]]
|
||||
toucan2.core/define-after-update [[:inner 0]]
|
||||
toucan2.core/define-before-delete [[:inner 0]]
|
||||
toucan2.core/define-before-insert [[:inner 0]]
|
||||
toucan2.core/define-before-select [[:inner 0]]
|
||||
toucan2.core/define-default-fields [[:inner 0]]
|
||||
toucan2.core/define-named-query [[:block 1]]
|
||||
toucan2.core/deftransforms [[:block 1]]
|
||||
toucan2.core/with-transaction [[:block 1]]
|
||||
toucan2.tools.after-insert/define-after-insert [[:inner 0]]
|
||||
toucan2.tools.after-select/define-after-select [[:inner 0]]
|
||||
toucan2.tools.after-update/define-after-update [[:inner 0]]
|
||||
toucan2.tools.after/define-after-impl [[:default]]
|
||||
toucan2.tools.before-delete/define-before-delete [[:inner 0]]
|
||||
toucan2.tools.before-insert/define-before-insert [[:inner 0]]
|
||||
toucan2.tools.before-select/define-before-select [[:inner 0]]
|
||||
toucan2.tools.compile/build [[:block 0]]
|
||||
toucan2.tools.compile/compile [[:block 0]]
|
||||
toucan2.tools.compile/resolved [[:block 0]]
|
||||
toucan2.tools.debug/debug [[:block 0]]
|
||||
toucan2.tools.default-fields/define-default-fields [[:inner 0]]
|
||||
toucan2.tools.named-query/define-named-query [[:block 1]]
|
||||
toucan2.tools.simple-out-transform/define-out-transform [[:inner 0]]
|
||||
toucan2.tools.transformed/deftransforms [[:block 1]]
|
||||
toucan2.tools.with-temp/with-temp [[:inner 0]]
|
||||
toucan2.util/try-with-error-context [[:inner 0]]}}
|
||||
|
||||
32
.eslintrc.js
@@ -6,7 +6,7 @@
|
||||
// can use this flag to enable it. This is set to true in CI
|
||||
const shouldLintCssModules =
|
||||
process.env.LINT_CSS_MODULES === "true" || process.env.CI;
|
||||
const plugins = ["react", "no-only-tests"];
|
||||
const plugins = ["react", "no-only-tests", "ttag", "i18next"];
|
||||
if (shouldLintCssModules) {
|
||||
plugins.push("postcss-modules");
|
||||
}
|
||||
@@ -118,7 +118,7 @@ module.exports = {
|
||||
],
|
||||
},
|
||||
],
|
||||
complexity: ["error", { max: 54 }],
|
||||
complexity: ["error", { max: 55 }],
|
||||
...(shouldLintCssModules
|
||||
? {
|
||||
"postcss-modules/no-undef-class": "error",
|
||||
@@ -149,6 +149,7 @@ module.exports = {
|
||||
"plugin:import/typescript",
|
||||
"plugin:depend/recommended",
|
||||
"plugin:storybook/recommended",
|
||||
"plugin:i18next/recommended",
|
||||
],
|
||||
settings: {
|
||||
"import/internal-regex": "^metabase/|^metabase-lib/",
|
||||
@@ -195,12 +196,15 @@ module.exports = {
|
||||
"*.unit.spec.*",
|
||||
"frontend/src/metabase/admin/**/*",
|
||||
"frontend/src/metabase/setup/**/*",
|
||||
"enterprise/frontend/src/metabase-enterprise/whitelabel/**/*",
|
||||
"frontend/lint/**/*",
|
||||
"*.stories.*",
|
||||
"stories-data.*",
|
||||
"e2e/**/*",
|
||||
"**/tests/*",
|
||||
"release/**/*",
|
||||
"webpack.config.js",
|
||||
"rspack.config.js",
|
||||
],
|
||||
rules: {
|
||||
"no-color-literals": "off",
|
||||
@@ -208,6 +212,22 @@ module.exports = {
|
||||
"no-literal-metabase-strings": "off",
|
||||
},
|
||||
},
|
||||
{
|
||||
files: [
|
||||
"*.unit.spec.*",
|
||||
"frontend/lint/**/*",
|
||||
"*.stories.*",
|
||||
"stories-data.*",
|
||||
"e2e/**/*",
|
||||
"**/tests/*",
|
||||
"release/**/*",
|
||||
"webpack.config.js",
|
||||
"rspack.config.js",
|
||||
],
|
||||
rules: {
|
||||
"i18next/no-literal-string": "off",
|
||||
},
|
||||
},
|
||||
{
|
||||
extends: ["plugin:@typescript-eslint/recommended"],
|
||||
files: ["*.ts", "*.tsx"],
|
||||
@@ -258,9 +278,9 @@ module.exports = {
|
||||
"jest/expect-expect": [
|
||||
"error",
|
||||
{
|
||||
"assertFunctionNames": ["expect*", "assert*"],
|
||||
"additionalTestBlockFunctions": []
|
||||
}
|
||||
assertFunctionNames: ["expect*", "assert*"],
|
||||
additionalTestBlockFunctions: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -291,7 +311,7 @@ module.exports = {
|
||||
selector: "Literal[value=/mb-base-color-/]",
|
||||
message:
|
||||
"You may not use base colors in the application, use semantic colors instead. (see colors.module.css)",
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
7
.github/CODEOWNERS
vendored
@@ -13,12 +13,15 @@ src/metabase/analytics/prometheus.clj @metabase/cloud-ops
|
||||
deps.edn @metabase/backend-developers
|
||||
|
||||
docs @metabase/tech-writers
|
||||
docs/developers-guide # exclude from tech-writer ownership
|
||||
|
||||
#
|
||||
# Backend modules <=> teams that own them
|
||||
#
|
||||
|
||||
# modules/drivers @metabase/drivers
|
||||
src/metabase/driver/sql_jdbc/actions.clj @metabase/core-workflows
|
||||
test/metabase/driver/sql_jdbc/actions_test.clj @metabase/core-workflows
|
||||
|
||||
# enterprise/backend/src/metabase_enterprise/advanced_config @metabase/core-backend-admin-webapp
|
||||
# enterprise/backend/test/metabase_enterprise/advanced_config @metabase/core-backend-admin-webapp
|
||||
@@ -92,8 +95,8 @@ docs @metabase/tech-writers
|
||||
# enterprise/backend/src/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
|
||||
# enterprise/backend/test/metabase_enterprise/upload_management @metabase/core-backend-admin-webapp
|
||||
|
||||
# src/metabase/actions @metabase/core-backend-admin-webapp
|
||||
# test/metabase/actions @metabase/core-backend-admin-webapp
|
||||
src/metabase/actions @metabase/core-backend-admin-webapp
|
||||
test/metabase/actions @metabase/core-backend-admin-webapp
|
||||
|
||||
# src/metabase/activity_feed @metabase/core-backend-admin-webapp
|
||||
# test/metabase/activity_feed @metabase/core-backend-admin-webapp
|
||||
|
||||
15
.github/actions/create-backport/action.yml
vendored
@@ -23,7 +23,7 @@ runs:
|
||||
GITHUB_TOKEN: ${{ inputs.github-token }}
|
||||
COMMIT: ${{ inputs.backport-commit }}
|
||||
shell: bash
|
||||
run: |
|
||||
run: | # bash
|
||||
git config --global user.email "metabase-bot@metabase.com"
|
||||
git config --global user.name "Metabase bot"
|
||||
|
||||
@@ -35,6 +35,8 @@ runs:
|
||||
git checkout -b ${BACKPORT_BRANCH}
|
||||
git cherry-pick ${COMMIT} || true
|
||||
|
||||
CONFLICT_LIST=$(git ls-files -u)
|
||||
|
||||
CONFLICTS=$(git ls-files -u | wc -l)
|
||||
if [ "$CONFLICTS" -gt 0 ]; then
|
||||
git cherry-pick --abort
|
||||
@@ -46,7 +48,7 @@ runs:
|
||||
echo "git reset HEAD~1" > ./backport.sh
|
||||
echo "rm ./backport.sh" >> ./backport.sh
|
||||
echo "git cherry-pick ${COMMIT}" >> ./backport.sh
|
||||
echo "echo 'Resolve conflicts and force push this branch'" >> ./backport.sh
|
||||
echo "echo 'Resolve conflicts and force push this branch.\n\nTo backport translations run: bin/i18n/merge-translations <release-branch>'" >> ./backport.sh
|
||||
chmod +x ./backport.sh
|
||||
git add ./backport.sh
|
||||
git commit -m "Add backport resolution script"
|
||||
@@ -55,7 +57,14 @@ runs:
|
||||
#${ORIGINAL_PULL_REQUEST_NUMBER}
|
||||
> [!IMPORTANT]
|
||||
> Manual conflict resolution is required.
|
||||
Checkout the branch and run \`./backport.sh\` script. Force push your changes after cherry-picking.
|
||||
> Checkout the branch and run \`./backport.sh\` script. Force push your changes after cherry-picking. Check the box below when done.
|
||||
|
||||
Conflicts:
|
||||
\`\`\`shell
|
||||
${CONFLICT_LIST}
|
||||
\`\`\`
|
||||
|
||||
- [ ] Conflicts resolved
|
||||
END
|
||||
)
|
||||
else
|
||||
|
||||
24
.github/actions/notify-pull-request/action.yml
vendored
@@ -1,29 +1,40 @@
|
||||
name: Notify Pull Request
|
||||
inputs:
|
||||
remove-previous-comment:
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
add-new-comment:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
message:
|
||||
required: true
|
||||
include-log:
|
||||
required: false
|
||||
default: true
|
||||
remove-previous-comment:
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Remove previous pull-request comment
|
||||
uses: actions/github-script@v7
|
||||
if: inputs.remove-previous-comment == 'true'
|
||||
if: ${{ inputs.remove-previous-comment == 'true' && always() && github.event_name == 'pull_request' }}
|
||||
with:
|
||||
script: |
|
||||
const pr = context.payload.pull_request ?? context.payload.issue;
|
||||
|
||||
if (!pr) {
|
||||
console.error("This action can only be run on pull requests");
|
||||
return;
|
||||
}
|
||||
|
||||
const { owner, repo } = context.repo;
|
||||
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: context.issue.number,
|
||||
issue_number: pr.number,
|
||||
}).catch(console.error);
|
||||
|
||||
if (!comments) {
|
||||
@@ -43,6 +54,7 @@ runs:
|
||||
|
||||
- name: Notify pull-request
|
||||
uses: actions/github-script@v7
|
||||
if: ${{ inputs.add-new-comment == 'true' && always() && github.event_name == 'pull_request' }}
|
||||
id: notify-pull-request
|
||||
with:
|
||||
result-encoding: string
|
||||
|
||||
7
.github/actions/prepare-cypress/action.yml
vendored
@@ -1,6 +1,12 @@
|
||||
name: Prepare cypress environment
|
||||
description: Cypress preparation steps
|
||||
|
||||
inputs:
|
||||
working-directory:
|
||||
description: "Optional working directory for yarn commands"
|
||||
required: false
|
||||
default: "."
|
||||
|
||||
outputs:
|
||||
chrome-path:
|
||||
description: Path to the custom Chrome executable
|
||||
@@ -33,3 +39,4 @@ runs:
|
||||
yarn cypress cache list
|
||||
yarn cypress verify
|
||||
shell: bash
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
7
.github/actions/test-driver/action.yml
vendored
@@ -38,3 +38,10 @@ runs:
|
||||
list-suites: failed
|
||||
list-tests: failed
|
||||
fail-on-error: false
|
||||
- name: Upload Logs on Failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-logs-${{ github.job }}
|
||||
path: logs/test-log.json
|
||||
retention-days: 1
|
||||
|
||||
@@ -18,6 +18,9 @@ inputs:
|
||||
required: true
|
||||
trunk-api-token:
|
||||
required: true
|
||||
variant:
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
@@ -45,10 +48,11 @@ runs:
|
||||
aws s3 cp ${OUTPUT_FILE}.zip s3://$BUCKET/$DATE/$GITHUB_RUN_ID/$GITHUB_RUN_ATTEMPT/
|
||||
|
||||
- name: Upload results to Trunk
|
||||
if: ${{ always() }}
|
||||
if: ${{ always() && !(github.event_name == 'pull_request' && github.event.pull_request.draft == true) }}
|
||||
uses: trunk-io/analytics-uploader@main
|
||||
with:
|
||||
junit-paths: ${{ inputs.input-path }}
|
||||
variant: ${{ inputs.variant || inputs.output-name }}
|
||||
org-slug: metabase
|
||||
token: ${{ inputs.trunk-api-token }}
|
||||
continue-on-error: true
|
||||
|
||||
2
.github/auto_request_review.yml
vendored
@@ -6,7 +6,7 @@ files:
|
||||
# migrations related files
|
||||
'resources/migrations/**':
|
||||
- team:core-workflows
|
||||
'src/metabase/db/custom_migrations.clj':
|
||||
'src/metabase/app_db/custom_migrations.clj':
|
||||
- team:core-workflows
|
||||
|
||||
options:
|
||||
|
||||
15
.github/file-paths.yaml
vendored
@@ -40,6 +40,7 @@ frontend_specs: &frontend_specs
|
||||
- "frontend/test/**"
|
||||
- "frontend/**/tests/**"
|
||||
- "frontend/**/*.unit.*"
|
||||
- "enterprise/frontend/**/*.unit.*"
|
||||
- ".github/**/*.unit.spec.*"
|
||||
- "jest.config.js"
|
||||
- "jest.tz.unit.conf.json"
|
||||
@@ -110,25 +111,33 @@ e2e_ci: &e2e_ci
|
||||
e2e_specs: &e2e_specs
|
||||
- "**/*.cy.*.js"
|
||||
- "**/*.cy.*.ts"
|
||||
- "e2e/runner/**"
|
||||
- "e2e/support/**"
|
||||
- "e2e/snapshot*/**"
|
||||
|
||||
e2e_cross_version: &e2e_cross_version
|
||||
- ".github/workflows/e2e-cross-version.yml"
|
||||
- "e2e/test/scenarios/cross-version/**"
|
||||
|
||||
e2e_embedding_sdk_compatibility:
|
||||
- *default
|
||||
- *e2e_ci
|
||||
- *frontend_sources
|
||||
- "e2e/embedding-sdk-host-apps/**"
|
||||
- "e2e/runner/embedding-sdk/**"
|
||||
- "e2e/runner/test-host-app/**/*.cy.*.js"
|
||||
- "e2e/runner/test-host-app/**/*.cy.*.ts"
|
||||
|
||||
e2e_all:
|
||||
- *default
|
||||
- *e2e_ci
|
||||
- *sources
|
||||
- *e2e_specs
|
||||
- "e2e/**"
|
||||
|
||||
snowplow:
|
||||
- ".github/workflows/snowplow.yml"
|
||||
- "snowplow/**"
|
||||
|
||||
documentation:
|
||||
- ".typedoc/**"
|
||||
- "docs/**"
|
||||
- "**/*.md"
|
||||
|
||||
|
||||
83
.github/scripts/build-e2e-matrix.js
vendored
@@ -1,6 +1,36 @@
|
||||
function buildMatrix(inputSpecs, inputChunks) {
|
||||
const java = 21;
|
||||
const defaultRunner = "ubuntu-22.04";
|
||||
// This script is used in .github/workflows/e2e-matrix-builder.yml
|
||||
// its aim is to split the e2e test matrix into multiple jobs
|
||||
// grouping some specific tests together, other tests are split into chunks
|
||||
|
||||
const DEFAULT_SPEC_PATTERN = "./e2e/test/scenarios/**/*.cy.spec.*";
|
||||
const EMBEDDING_SDK_SPEC_PATTERN =
|
||||
"./e2e/test/scenarios/embedding-sdk/**.cy.spec.*";
|
||||
|
||||
const specialTestConfigs = [
|
||||
{
|
||||
name: "embedding-sdk",
|
||||
specs: EMBEDDING_SDK_SPEC_PATTERN,
|
||||
},
|
||||
{
|
||||
name: "oss-subset",
|
||||
edition: "oss",
|
||||
tags: "@OSS @smoke+-@EE",
|
||||
specs: DEFAULT_SPEC_PATTERN,
|
||||
},
|
||||
{ name: "mongo", tags: "@mongo", specs: DEFAULT_SPEC_PATTERN },
|
||||
];
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} inputSpecs - specs, which were changed in the PR, separated by comma
|
||||
* .e.g e2e/test/scenarios/onboarding/command-palette.cy.spec.js,e2e/test/scenarios/question/document-title.cy.spec.js
|
||||
* or a pattern like DEFAULT_SPEC_PATTERN
|
||||
*/
|
||||
function buildMatrix(options, inputSpecs, inputChunks) {
|
||||
const { java, defaultRunner } = options;
|
||||
|
||||
// number of specs per chunk when running specific specs
|
||||
const SPECS_PER_CHUNK = 5;
|
||||
|
||||
const defaultOptions = {
|
||||
"java-version": java,
|
||||
@@ -8,38 +38,47 @@ function buildMatrix(inputSpecs, inputChunks) {
|
||||
edition: "ee",
|
||||
};
|
||||
|
||||
const allSpecs = inputSpecs ?? "./e2e/test/scenarios/**/*.cy.spec.*";
|
||||
const isDefaultSpecPattern =
|
||||
inputSpecs === "" || inputSpecs === DEFAULT_SPEC_PATTERN;
|
||||
|
||||
// see config.js function getSplittableSpecs for logic that excludes some tests from auto splitting
|
||||
const specialTests = [
|
||||
{
|
||||
name: "embedding-sdk",
|
||||
specs: "./e2e/test/scenarios/embedding-sdk/**.cy.spec.*",
|
||||
},
|
||||
{
|
||||
name: "oss-subset",
|
||||
edition: "oss",
|
||||
tags: "@OSS @smoke+-@EE",
|
||||
specs: allSpecs,
|
||||
},
|
||||
{ name: "mongo", tags: "@mongo", specs: allSpecs },
|
||||
];
|
||||
console.log("Processed specs value:", inputSpecs);
|
||||
console.log("Is default pattern:", isDefaultSpecPattern);
|
||||
|
||||
const regularChunks = inputChunks - specialTests.length;
|
||||
let regularChunks;
|
||||
if (isDefaultSpecPattern) {
|
||||
regularChunks = inputChunks - specialTestConfigs.length;
|
||||
} else {
|
||||
// when pattern is not default, it means we passed some custom list of the changed specs
|
||||
// so we need to calculate how many chunks we need to run
|
||||
const matchingSpecsCount = inputSpecs.split(",").length;
|
||||
regularChunks = Math.max(
|
||||
1,
|
||||
Math.ceil(matchingSpecsCount / SPECS_PER_CHUNK),
|
||||
);
|
||||
}
|
||||
|
||||
const regularTests = new Array(regularChunks).fill(1).map((files, index) => ({
|
||||
name: `e2e-group-${index + 1}`,
|
||||
// works when specs less than 5, otherwise seems all chunks will contain
|
||||
// same specs
|
||||
...(!isDefaultSpecPattern && {
|
||||
specs: inputSpecs
|
||||
.split(",")
|
||||
.slice(SPECS_PER_CHUNK * index, SPECS_PER_CHUNK * (index + 1))
|
||||
.join(","),
|
||||
}),
|
||||
}));
|
||||
|
||||
// regular chunks need to come before special chunks
|
||||
const testSets = [...regularTests, ...specialTests];
|
||||
const testSets = isDefaultSpecPattern
|
||||
? regularTests.concat(specialTestConfigs)
|
||||
: regularTests;
|
||||
|
||||
const config = testSets.map((options) => ({
|
||||
...defaultOptions,
|
||||
...options,
|
||||
}));
|
||||
|
||||
return { config, regularChunks };
|
||||
return { config, regularChunks, isDefaultSpecPattern };
|
||||
}
|
||||
|
||||
module.exports = { buildMatrix };
|
||||
|
||||
66
.github/scripts/build-e2e-matrix.unit.spec.js
vendored
@@ -1,27 +1,34 @@
|
||||
const { buildMatrix } = require("./build-e2e-matrix");
|
||||
|
||||
describe("buildMatrix", () => {
|
||||
const options = {
|
||||
java: "11",
|
||||
defaultRunner: "ubuntu-22.04",
|
||||
};
|
||||
const testBuildMatrix = (entry, chunks) =>
|
||||
buildMatrix(options, entry, chunks);
|
||||
|
||||
it("should calculate correct regular chunks with default parameters", () => {
|
||||
const result = buildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 30);
|
||||
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 30);
|
||||
|
||||
expect(result.regularChunks).toBe(27);
|
||||
});
|
||||
|
||||
it("should create correct number of configuration objects", () => {
|
||||
const result = buildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
|
||||
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
|
||||
|
||||
expect(result.config.length).toBe(10);
|
||||
});
|
||||
|
||||
it("should apply default specs path when null is provided", () => {
|
||||
const result = buildMatrix(null, 5);
|
||||
it("should apply default specs path when empty entry is provided", () => {
|
||||
const result = testBuildMatrix("", 5);
|
||||
|
||||
expect(result.regularChunks).toBe(2);
|
||||
expect(result.config.length).toBe(5);
|
||||
});
|
||||
|
||||
it("should name regular test groups sequentially", () => {
|
||||
const result = buildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
|
||||
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 10);
|
||||
const regularTests = result.config.filter((cfg) =>
|
||||
cfg.name.startsWith("e2e-group-"),
|
||||
);
|
||||
@@ -32,7 +39,7 @@ describe("buildMatrix", () => {
|
||||
});
|
||||
|
||||
it("should handle case when input chunks equals special tests count", () => {
|
||||
const result = buildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 3);
|
||||
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 3);
|
||||
|
||||
expect(result.regularChunks).toBe(0);
|
||||
expect(result.config.length).toBe(3);
|
||||
@@ -40,4 +47,51 @@ describe("buildMatrix", () => {
|
||||
expect(result.config[1].name).toBe("oss-subset");
|
||||
expect(result.config[2].name).toBe("mongo");
|
||||
});
|
||||
|
||||
it("should correctly calculate regularChunks for non-default spec pattern", () => {
|
||||
const entry = "file.cy.spec.js,".repeat(12).slice(0, -1);
|
||||
const result = testBuildMatrix(entry, 10);
|
||||
|
||||
// For 12 matching specs with SPECS_PER_CHUNK=5, we expect ceil(12/5) = 3 chunks
|
||||
expect(result.regularChunks).toBe(3);
|
||||
|
||||
const firstGroupSpecs = result.config[0].specs.split(",").length;
|
||||
const secondGroupSpecs = result.config[1].specs.split(",").length;
|
||||
const thirdGroupSpecs = result.config[2].specs.split(",").length;
|
||||
|
||||
expect(firstGroupSpecs).toBe(5);
|
||||
expect(secondGroupSpecs).toBe(5);
|
||||
expect(thirdGroupSpecs).toBe(2);
|
||||
});
|
||||
|
||||
it("should return isDefaultSpecPattern as true when empty or default value is provided", () => {
|
||||
let result = testBuildMatrix("", 5);
|
||||
|
||||
expect(result.isDefaultSpecPattern).toBe(true);
|
||||
|
||||
result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 5);
|
||||
|
||||
expect(result.isDefaultSpecPattern).toBe(true);
|
||||
});
|
||||
|
||||
it("should return isDefaultSpecPattern as false when non-default spec pattern is provided", () => {
|
||||
const result = testBuildMatrix("test1.cy.spec.js,test2.cy.spec.js", 1);
|
||||
|
||||
expect(result.isDefaultSpecPattern).toBe(false);
|
||||
});
|
||||
|
||||
it("should return special test configs when default spec pattern is provided", () => {
|
||||
const result = testBuildMatrix("./e2e/test/scenarios/**/*.cy.spec.*", 50);
|
||||
|
||||
expect(result.config[47].name).toBe("embedding-sdk");
|
||||
expect(result.config[48].name).toBe("oss-subset");
|
||||
expect(result.config[49].name).toBe("mongo");
|
||||
});
|
||||
|
||||
it("should not return special test configs when non-default spec pattern is provided", () => {
|
||||
const result = testBuildMatrix("test1.cy.spec.js,test2.cy.spec.js", 50);
|
||||
|
||||
expect(result.config.length).toBe(1);
|
||||
expect(result.config[0].name).toBe("e2e-group-1");
|
||||
});
|
||||
});
|
||||
|
||||
59
.github/scripts/update-pr-with-issues.js
vendored
@@ -49,6 +49,55 @@ function httpsRequest(options, data = null) {
|
||||
});
|
||||
}
|
||||
|
||||
// Makes an HTTPS request with exponential backoff retry logic
|
||||
async function httpsRequestWithBackoff(options, data = null, backoffOptions = {}) {
|
||||
// Set default backoff options:
|
||||
const {
|
||||
maxRetries = 8,
|
||||
totalDurationSeconds = 60
|
||||
} = backoffOptions;
|
||||
|
||||
let retries = 0;
|
||||
let delay = 500; // Start with a .5 second delay
|
||||
|
||||
// Calculate a reasonable initial delay based on total duration and max retries
|
||||
// This helps distribute the retry attempts across the total allowed duration
|
||||
const totalDurationMs = totalDurationSeconds * 1000;
|
||||
|
||||
// Track the start time
|
||||
const startTime = Date.now();
|
||||
|
||||
// Ensure data is stringified if it's an object
|
||||
const requestData = data ? (typeof data === 'string' ? data : JSON.stringify(data)) : null;
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
const response = await httpsRequest(options, requestData);
|
||||
return response; // Success: Return the data
|
||||
|
||||
} catch (error) {
|
||||
retries++;
|
||||
|
||||
const elapsedMs = Date.now() - startTime;
|
||||
const timeRemaining = totalDurationMs - elapsedMs;
|
||||
|
||||
// Stop retrying if we've hit max retries or exceeded the total duration
|
||||
if (retries >= maxRetries || timeRemaining <= 0) {
|
||||
console.error(`Failed after ${retries} retries (${Math.round(elapsedMs/1000)}s elapsed):`);
|
||||
throw error;
|
||||
}
|
||||
|
||||
// Calculate the next delay with exponential backoff and jitter
|
||||
delay = Math.min(delay * 2 * (0.8 + Math.random() * 0.4), timeRemaining);
|
||||
|
||||
console.log(`Request failed (attempt ${retries}/${maxRetries}). Retrying in ${Math.round(delay)}ms... (${Math.round(timeRemaining/1000)}s remaining)`);
|
||||
|
||||
// Wait for the calculated delay before trying again
|
||||
await new Promise(resolve => setTimeout(resolve, delay));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function link_issues(github) {
|
||||
|
||||
try {
|
||||
@@ -98,7 +147,11 @@ async function link_issues(github) {
|
||||
attachments {
|
||||
nodes {url}}}}}}`});
|
||||
|
||||
const linearData = await httpsRequest({
|
||||
console.log('--- Linear API query ---');
|
||||
console.log(linearQuery);
|
||||
console.log('----- End of query -----');
|
||||
|
||||
const linearData = await httpsRequestWithBackoff({
|
||||
hostname: 'api.linear.app',
|
||||
path: '/graphql',
|
||||
method: 'POST',
|
||||
@@ -106,7 +159,9 @@ async function link_issues(github) {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': linearApiKey
|
||||
}
|
||||
}, linearQuery);
|
||||
},
|
||||
linearQuery,
|
||||
{ maxRetries: 8, totalDurationSeconds: 60 });
|
||||
|
||||
console.log('Linear API response:');
|
||||
console.log(JSON.stringify(linearData) + "\n");
|
||||
|
||||
19
.github/team.json
vendored
@@ -11,7 +11,8 @@
|
||||
"appleby",
|
||||
"uladzimirdev",
|
||||
"wzimrin",
|
||||
"ericnormand"
|
||||
"ericnormand",
|
||||
"galdre"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -19,7 +20,8 @@
|
||||
"label": ".Team/SemanticLayer",
|
||||
"members": [
|
||||
"kamilmielnik",
|
||||
"lbrdnk"
|
||||
"lbrdnk",
|
||||
"bronsa"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -61,7 +63,6 @@
|
||||
"npfitz",
|
||||
"johnswanson",
|
||||
"rafpaf",
|
||||
"sloansparger",
|
||||
"iethree",
|
||||
"nvoxland",
|
||||
"fraserdrops",
|
||||
@@ -76,7 +77,8 @@
|
||||
"kulyk",
|
||||
"tsplude",
|
||||
"lorem--ipsum",
|
||||
"noahmoss"
|
||||
"noahmoss",
|
||||
"bpander"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -91,13 +93,20 @@
|
||||
"name": "Metabot",
|
||||
"label": ".Team/Metabot",
|
||||
"members": [
|
||||
"retro",
|
||||
"sloansparger",
|
||||
"somtom"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Product Growth",
|
||||
"label": ".Team/ProductGrowth",
|
||||
"members": ["nemanjaglumac"]
|
||||
"members": ["nemanjaglumac", "chodorowicz"]
|
||||
},
|
||||
{
|
||||
"name": "Cloud",
|
||||
"label": "cloud",
|
||||
"members": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
14
.github/workflows/auto-backport.yml
vendored
@@ -1,18 +1,16 @@
|
||||
name: Auto-backport
|
||||
run-name: Auto Backport ${{ github.event.pull_request.title }}
|
||||
on:
|
||||
pull_request:
|
||||
types: [closed, labeled]
|
||||
|
||||
jobs:
|
||||
create-backport:
|
||||
if: | # the PR must be closed and have a backport label
|
||||
(github.event.pull_request.merged == true || github.event.action == 'closed') && (
|
||||
if: | # the PR must be merged and have a backport label
|
||||
github.event.pull_request.merged == true && (
|
||||
contains(github.event.pull_request.labels.*.name, 'backport') ||
|
||||
contains(github.event.pull_request.labels.*.name, 'double-backport') ||
|
||||
contains(github.event.pull_request.labels.*.name, 'triple-backport') ||
|
||||
github.event.label.name == 'backport' ||
|
||||
github.event.label.name == 'double-backport' ||
|
||||
github.event.label.name == 'triple-backport'
|
||||
contains(github.event.pull_request.labels.*.name, 'triple-backport')
|
||||
)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -76,7 +74,7 @@ jobs:
|
||||
github-token-2: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Double Backport
|
||||
if: ${{ fromJson(steps.how-many-backports.outputs.result) >= 2 }}
|
||||
if: ${{ always() && fromJson(steps.how-many-backports.outputs.result) >= 2 }}
|
||||
uses: ./.github/actions/create-backport
|
||||
with:
|
||||
target-version: ${{ fromJson(steps.get-latest-release-version.outputs.result).secondLatest }}
|
||||
@@ -85,7 +83,7 @@ jobs:
|
||||
github-token-2: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Triple Backport
|
||||
if: ${{ fromJson(steps.how-many-backports.outputs.result) >= 3 }}
|
||||
if: ${{ always() && fromJson(steps.how-many-backports.outputs.result) >= 3 }}
|
||||
uses: ./.github/actions/create-backport
|
||||
with:
|
||||
target-version: ${{ fromJson(steps.get-latest-release-version.outputs.result).thirdLatest }}
|
||||
|
||||
12
.github/workflows/backend.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
with:
|
||||
m2-cache-key: 'kondo'
|
||||
- name: Run clj-kondo
|
||||
run: ./bin/kondo.sh
|
||||
run: ./bin/mage kondo
|
||||
|
||||
be-linter-eastwood:
|
||||
if: ${{ !inputs.skip }}
|
||||
@@ -153,6 +153,14 @@ jobs:
|
||||
list-tests: failed
|
||||
fail-on-error: false
|
||||
|
||||
- name: Upload Logs on Failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-logs-${{ matrix.java-version }}-${{ matrix.job.edition }}-${{ github.job }}
|
||||
path: logs/test-log.json
|
||||
retention-days: 1
|
||||
|
||||
# checks that all the namespaces we actually ship can be compiled, without any dependencies that we don't ship (such
|
||||
# as `:dev` dependencies). See #27009 for more context.
|
||||
be-check:
|
||||
@@ -185,7 +193,7 @@ jobs:
|
||||
with:
|
||||
m2-cache-key: 'cljfmt'
|
||||
- name: Run cljfmt
|
||||
run: clojure -T:cljfmt check
|
||||
run: ./bin/mage cljfmt-all --force-check
|
||||
|
||||
be-tests-result:
|
||||
needs:
|
||||
|
||||
1
.github/workflows/chromatic.yml
vendored
@@ -18,7 +18,6 @@ jobs:
|
||||
timeout-minutes: 3
|
||||
outputs:
|
||||
frontend_all: ${{ steps.changes.outputs.frontend_all }}
|
||||
e2e_specs: ${{ steps.changes.outputs.e2e_specs }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test which files changed
|
||||
|
||||
20
.github/workflows/containerize-jar.yml
vendored
@@ -13,6 +13,11 @@ on:
|
||||
type: string
|
||||
commit:
|
||||
type: string
|
||||
release:
|
||||
type: string
|
||||
default: 'true'
|
||||
build-args:
|
||||
type: string
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
artifact-name:
|
||||
@@ -56,7 +61,7 @@ jobs:
|
||||
const version = "${{ inputs.tag }}".split('-')[0];
|
||||
|
||||
if (!isValidVersionString(version)) {
|
||||
return "linux/amd64";
|
||||
return "linux/amd64,linux/arm64";
|
||||
}
|
||||
// versions before 53 need to be handled differently
|
||||
const buildInfo = getBuildRequirements(version);
|
||||
@@ -66,8 +71,8 @@ jobs:
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
|
||||
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
|
||||
- name: Set up QEMU
|
||||
if: contains(steps.platforms.outputs.result, 'arm')
|
||||
uses: docker/setup-qemu-action@v3
|
||||
@@ -84,6 +89,7 @@ jobs:
|
||||
tags: ${{ inputs.repo }}:${{ inputs.tag }}
|
||||
no-cache: true
|
||||
push: true
|
||||
build-args: ${{ inputs.build-args }}
|
||||
|
||||
# we need to do this to get the nice fallback behavior of the legacy manifest file
|
||||
- name: Build container (x86 only)
|
||||
@@ -103,8 +109,8 @@ jobs:
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
|
||||
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
|
||||
- name: Pull the container image
|
||||
run: docker pull ${{ inputs.repo }}:${{ inputs.tag }}
|
||||
- name: Launch container
|
||||
@@ -123,8 +129,8 @@ jobs:
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_RELEASE_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_RELEASE_TOKEN }}
|
||||
username: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_USERNAME || secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ inputs.release == 'true' && secrets.DOCKERHUB_RELEASE_TOKEN || secrets.DOCKERHUB_TOKEN }}
|
||||
- name: Pull the container image
|
||||
run: docker pull ${{ inputs.repo }}:${{ inputs.tag }}
|
||||
- name: Launch container
|
||||
|
||||
37
.github/workflows/docs_bump_detected.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
name: Docs Bump Detected
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-x.[0-9]+.x'
|
||||
paths:
|
||||
- 'docs/**'
|
||||
|
||||
jobs:
|
||||
push_workflow_to_docs_metabase_github_io_job:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
SOURCE_BRANCH: ${{ github.head_ref || github.ref }}
|
||||
TARGET_BRANCH: ${{ github.event.pull_request.base.ref }}
|
||||
steps:
|
||||
- name: Report changed docs files exist
|
||||
run: |
|
||||
echo "A change in the docs directory was detected."
|
||||
|
||||
- name: Trigger repo dispatch
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
script: | #js
|
||||
github.rest.repos.createDispatchEvent({
|
||||
owner: "${{ github.repository_owner }}",
|
||||
repo: "docs.metabase.github.io",
|
||||
event_type: "docs_update",
|
||||
client_payload: {
|
||||
source_branch: process.env.SOURCE_BRANCH,
|
||||
target_branch: process.env.TARGET_BRANCH}});
|
||||
36
.github/workflows/docs_merge_detected.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Docs Merge Detected
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-x.[0-9]+.x'
|
||||
paths:
|
||||
- 'docs/**'
|
||||
|
||||
jobs:
|
||||
push_and_merge_workflow_to_docs_metabase_github_io_job:
|
||||
if: github.event.pull_request.merged == true
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
SOURCE_BRANCH: ${{ github.head_ref || github.ref }}
|
||||
TARGET_BRANCH: ${{ github.event.pull_request.base.ref }}
|
||||
steps:
|
||||
- name: Report changed docs files exist
|
||||
run: |
|
||||
echo "A PR with changes to the docs directory was merged."
|
||||
|
||||
- name: Trigger repo dispatch
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
script: | #js
|
||||
github.rest.repos.createDispatchEvent({
|
||||
owner: "${{ github.repository_owner }}",
|
||||
repo: "docs.metabase.github.io",
|
||||
event_type: "docs_merge",
|
||||
client_payload: {
|
||||
source_branch: process.env.SOURCE_BRANCH,
|
||||
target_branch: process.env.TARGET_BRANCH}});
|
||||
225
.github/workflows/drivers.yml
vendored
@@ -12,33 +12,6 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
be-tests-h2:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
name: H2
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test H2 driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-h2'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-athena-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -108,6 +81,53 @@ jobs:
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-clickhouse-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: clickhouse
|
||||
MB_CLICKHOUSE_TEST_HOST: localhost
|
||||
MB_CLICKHOUSE_TEST_PORT: 8123
|
||||
MB_CLICKHOUSE_TEST_OLD_PORT: 8124
|
||||
MB_CLICKHOUSE_TEST_NGINX_PORT: 8127
|
||||
name: Clickhouse
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Add ClickHouse TLS instance to /etc/hosts
|
||||
run: |
|
||||
sudo echo "127.0.0.1 server.clickhouseconnect.test" | sudo tee -a /etc/hosts
|
||||
- name: Start ClickHouse in Docker
|
||||
uses: hoverkraft-tech/compose-action@v2.0.0
|
||||
with:
|
||||
compose-file: "modules/drivers/clickhouse/docker-compose.yml"
|
||||
down-flags: "--volumes"
|
||||
services: |
|
||||
clickhouse
|
||||
clickhouse_tls
|
||||
clickhouse_older_version
|
||||
clickhouse_cluster_node1
|
||||
clickhouse_cluster_node2
|
||||
nginx
|
||||
- name: Test Clickhouse driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-clickhouse-ee'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-druid-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -143,6 +163,41 @@ jobs:
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-druid-jdbc-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: druid-jdbc
|
||||
services:
|
||||
druid:
|
||||
image: metabase/druid:29.0.1-json-no-ingestion
|
||||
ports:
|
||||
- "8888:8888"
|
||||
env:
|
||||
CLUSTER_SIZE: nano-quickstart
|
||||
name: Druid (JDBC)
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test Druid JDBC driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-druid-jdbc-ee'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-databricks-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -177,27 +232,54 @@ jobs:
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-druid-jdbc-ee:
|
||||
be-tests-databricks-multi-catalog-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: druid-jdbc
|
||||
services:
|
||||
druid:
|
||||
image: metabase/druid:29.0.1-json-no-ingestion
|
||||
ports:
|
||||
- "8888:8888"
|
||||
env:
|
||||
CLUSTER_SIZE: nano-quickstart
|
||||
name: Druid (JDBC)
|
||||
DRIVERS: databricks
|
||||
MB_DATABRICKS_TEST_MULTI_LEVEL_SCHEMA: true
|
||||
MB_DATABRICKS_TEST_HOST: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HOST }}
|
||||
MB_DATABRICKS_TEST_HTTP_PATH: ${{ secrets.MB_DATABRICKS_JDBC_TEST_HTTP_PATH }}
|
||||
MB_DATABRICKS_TEST_TOKEN: ${{ secrets.MB_DATABRICKS_JDBC_TEST_TOKEN }}
|
||||
MB_DATABRICKS_TEST_CATALOG: 'metabase_ci'
|
||||
MB_DATABRICKS_TEST_CLIENT_ID: ${{ secrets.MB_DATABRICKS_JDBC_TEST_CLIENT_ID }}
|
||||
MB_DATABRICKS_TEST_OAUTH_SECRET: ${{ secrets.MB_DATABRICKS_JDBC_TEST_OAUTH_SECRET }}
|
||||
name: Databricks (Multi-Catalog)
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test Druid JDBC driver
|
||||
- name: Test Databricks driver with multi-catalog
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-druid-jdbc-ee'
|
||||
junit-name: 'be-tests-databricks-multi-catalog-ee'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-h2:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
name: H2
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test H2 driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-h2'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
@@ -346,12 +428,9 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: MongoDB 4.4
|
||||
junit-name: be-tests-mongo-4-4-ee
|
||||
image: metabase/qa-databases:mongo-sample-4.4
|
||||
- name: MongoDB 5.0
|
||||
junit-name: be-tests-mongo-5-0-ee
|
||||
image: metabase/qa-databases:mongo-sample-5.0
|
||||
- name: MongoDB 6.0
|
||||
junit-name: be-tests-mongo-6-0-ee
|
||||
image: metabase/qa-databases:mongo-sample-6
|
||||
- name: MongoDB Latest
|
||||
junit-name: be-tests-mongo-latest-ee
|
||||
image: mongo:latest
|
||||
@@ -398,12 +477,9 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: MongoDB 4.4
|
||||
junit-name: be-tests-mongo-4-4-ee
|
||||
image: metabase/qa-databases:mongo-sample-4.4
|
||||
- name: MongoDB 5.0
|
||||
junit-name: be-tests-mongo-5-0-ssl-ee
|
||||
image: metabase/qa-databases:mongo-sample-5.0
|
||||
- name: MongoDB 6.0
|
||||
junit-name: be-tests-mongo-6-0-ssl-ee
|
||||
image: metabase/qa-databases:mongo-sample-6
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: mongo
|
||||
@@ -1004,53 +1080,6 @@ jobs:
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-clickhouse-ee:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: clickhouse
|
||||
MB_CLICKHOUSE_TEST_HOST: localhost
|
||||
MB_CLICKHOUSE_TEST_PORT: 8123
|
||||
MB_CLICKHOUSE_TEST_OLD_PORT: 8124
|
||||
MB_CLICKHOUSE_TEST_NGINX_PORT: 8127
|
||||
name: Clickhouse
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Add ClickHouse TLS instance to /etc/hosts
|
||||
run: |
|
||||
sudo echo "127.0.0.1 server.clickhouseconnect.test" | sudo tee -a /etc/hosts
|
||||
- name: Start ClickHouse in Docker
|
||||
uses: hoverkraft-tech/compose-action@v2.0.0
|
||||
with:
|
||||
compose-file: "modules/drivers/clickhouse/docker-compose.yml"
|
||||
down-flags: "--volumes"
|
||||
services: |
|
||||
clickhouse
|
||||
clickhouse_tls
|
||||
clickhouse_older_version
|
||||
clickhouse_cluster_node1
|
||||
clickhouse_cluster_node2
|
||||
nginx
|
||||
- name: Test Clickhouse driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-clickhouse-ee'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
drivers-tests-result:
|
||||
needs:
|
||||
# if you add a driver job, you must add it to this list for it to be a required check
|
||||
|
||||
@@ -3,10 +3,6 @@ name: E2E Cross-version Component Tests for Embedding SDK
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
files-changed:
|
||||
name: Check which files changed
|
||||
@@ -86,7 +82,7 @@ jobs:
|
||||
- name: Prepare uberjar artifact
|
||||
uses: ./.github/actions/prepare-uberjar-artifact
|
||||
with:
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar-cross-version
|
||||
|
||||
resolve-sdk-version:
|
||||
if: |
|
||||
@@ -168,7 +164,7 @@ jobs:
|
||||
- name: Retrieve uberjar artifact for ee
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar-cross-version
|
||||
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
|
||||
@@ -13,6 +13,11 @@ on:
|
||||
type: string
|
||||
required: true
|
||||
default: "master"
|
||||
total-shards:
|
||||
description: "Total number of parallel test shards"
|
||||
type: number
|
||||
required: false
|
||||
default: 4
|
||||
workflow_call:
|
||||
inputs:
|
||||
fe-ref:
|
||||
@@ -23,9 +28,38 @@ on:
|
||||
description: "Backend git ref to use"
|
||||
type: string
|
||||
required: true
|
||||
total-shards:
|
||||
description: "Total number of parallel test shards"
|
||||
type: number
|
||||
required: false
|
||||
default: 4
|
||||
|
||||
jobs:
|
||||
cross-version-for-breaking-changes:
|
||||
generate-matrix:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix_json: ${{ steps.set_matrix.outputs.matrix_json }}
|
||||
shards_total: ${{ steps.set_matrix.outputs.shards_total }}
|
||||
steps:
|
||||
- name: Set up shard matrix
|
||||
id: set_matrix
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
# generate an output like `{"matrixJson": "{\"shard\": [1, 2, 3, 4]}", "shardsTotal": 4}` to be used in the other jobs
|
||||
script: |
|
||||
const totalShards = parseInt(process.env.TOTAL_SHARDS_INPUT, 10);
|
||||
|
||||
const matrix = { shard: Array.from({ length: totalShards }, (_, i) => i + 1) };
|
||||
|
||||
console.log("Generated matrix JSON", matrix);
|
||||
console.log(`Total shards: ${totalShards}`);
|
||||
|
||||
core.setOutput('matrix_json', JSON.stringify(matrix));
|
||||
core.setOutput('shards_total', totalShards);
|
||||
env:
|
||||
TOTAL_SHARDS_INPUT: ${{ inputs.total-shards }}
|
||||
|
||||
build-jar:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 45
|
||||
|
||||
@@ -33,8 +67,12 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Prepare frontend environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
- name: Prepare Node.js
|
||||
# We're not using `actions/prepare-frontend` because we don't want to install deps from the root repo
|
||||
# nor we want to touch the cache as we'll be potentially be installing different versions of packages
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
@@ -46,13 +84,61 @@ jobs:
|
||||
MB_EDITION: ee
|
||||
CYPRESS_CI: true
|
||||
run: |
|
||||
bash bin/backward-compatibility-test.sh \
|
||||
node bin/backward-compatibility-test.js \
|
||||
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
|
||||
build
|
||||
|
||||
- name: Upload Uberjar
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: metabase-jar-cross-version
|
||||
path: .tmp/metabase-be/target/uberjar/metabase.jar
|
||||
if-no-files-found: error
|
||||
|
||||
run-breaking-changes-tests:
|
||||
needs: [build-jar, generate-matrix]
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 45
|
||||
env:
|
||||
TOTAL_SHARDS: ${{ needs.generate-matrix.outputs.shards_total }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix_json) }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Prepare Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: ".nvmrc"
|
||||
|
||||
- name: Prepare back-end environment
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: cross-version-uberjar
|
||||
|
||||
- name: Download Uberjar
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-jar-cross-version
|
||||
path: .tmp/metabase-be/target/uberjar/
|
||||
|
||||
- name: Download FE repo
|
||||
run: |
|
||||
git clone --depth 1 -b ${{ inputs.fe-ref }} https://github.com/metabase/metabase.git .tmp/metabase-fe
|
||||
|
||||
- name: Install FE dependencies
|
||||
working-directory: .tmp/metabase-fe
|
||||
run: |
|
||||
yarn install
|
||||
|
||||
- name: Prepare Cypress environment
|
||||
id: cypress-prep
|
||||
uses: ./.github/actions/prepare-cypress
|
||||
with:
|
||||
working-directory: .tmp/metabase-fe
|
||||
|
||||
- name: Run the tests
|
||||
env:
|
||||
@@ -61,9 +147,9 @@ jobs:
|
||||
CYPRESS_NO_FEATURES_TOKEN: ${{ secrets.E2E_STARTER_TOKEN }}
|
||||
CYPRESS_CI: true
|
||||
run: |
|
||||
bash bin/backward-compatibility-test.sh \
|
||||
node bin/backward-compatibility-test.js \
|
||||
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
|
||||
start > /dev/null & \
|
||||
bash bin/backward-compatibility-test.sh \
|
||||
node bin/backward-compatibility-test.js \
|
||||
${{ inputs.fe-ref }} ${{ inputs.be-ref }} \
|
||||
test
|
||||
test ${{ matrix.shard}}/${{ env.TOTAL_SHARDS }}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
name: E2E Sample Apps tests
|
||||
name: E2E Embedding SDK Compatibility tests
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -6,27 +6,11 @@ on:
|
||||
- "master"
|
||||
- "release-**"
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
types: [opened, synchronize, reopened]
|
||||
branches:
|
||||
- "master"
|
||||
- "release-**"
|
||||
|
||||
env:
|
||||
# we must support last two stable releases
|
||||
SUPPORTED_RELEASES_COUNT: 2
|
||||
TEST_SUITES: |
|
||||
[
|
||||
"metabase-nodejs-react-sdk-embedding-sample-e2e",
|
||||
"metabase-nextjs-sdk-embedding-sample-e2e",
|
||||
"shoppy-e2e"
|
||||
]
|
||||
TEST_SUITES_TO_RUN_IN_MASTER_ONLY: |
|
||||
[
|
||||
"shoppy-e2e"
|
||||
]
|
||||
SAMPLE_APP_MAIN_BRANCH_NAME: "main"
|
||||
SAMPLE_APP_STABLE_RELEASE_BRANCH_NAME_SUFFIX: "stable"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
@@ -37,7 +21,7 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 3
|
||||
outputs:
|
||||
e2e_all: ${{ steps.changes.outputs.e2e_all }}
|
||||
e2e_embedding_sdk_compatibility: ${{ steps.changes.outputs.e2e_embedding_sdk_compatibility }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test which files changed
|
||||
@@ -87,6 +71,21 @@ jobs:
|
||||
!cancelled()
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
# we must support last two stable releases
|
||||
SUPPORTED_RELEASES_COUNT: 2
|
||||
TEST_SUITES: |
|
||||
[
|
||||
"metabase-nodejs-react-sdk-embedding-sample-e2e",
|
||||
"metabase-nextjs-sdk-embedding-sample-e2e",
|
||||
"shoppy-e2e"
|
||||
]
|
||||
TEST_SUITES_TO_RUN_IN_MASTER_ONLY: |
|
||||
[
|
||||
"shoppy-e2e"
|
||||
]
|
||||
SAMPLE_APP_MAIN_BRANCH_NAME: "main"
|
||||
SAMPLE_APP_STABLE_RELEASE_BRANCH_NAME_SUFFIX: "stable"
|
||||
outputs:
|
||||
branch_name: ${{ fromJson(steps.build-sample-apps-data.outputs.result).branch_name }}
|
||||
matrix: ${{ toJSON(fromJson(steps.build-sample-apps-data.outputs.result).matrix) }}
|
||||
@@ -150,7 +149,7 @@ jobs:
|
||||
needs: [files-changed, get-build-requirements, get-sample-apps-data]
|
||||
if: |
|
||||
!cancelled() &&
|
||||
needs.files-changed.outputs.e2e_all == 'true' &&
|
||||
needs.files-changed.outputs.e2e_embedding_sdk_compatibility == 'true' &&
|
||||
fromJSON(needs.get-sample-apps-data.outputs.matrix)[0] != null
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 25
|
||||
@@ -192,38 +191,48 @@ jobs:
|
||||
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
|
||||
path: resources/embedding-sdk
|
||||
|
||||
e2e-tests:
|
||||
e2e-sample-apps-tests:
|
||||
needs: [get-build-requirements, get-sample-apps-data, build]
|
||||
strategy:
|
||||
matrix:
|
||||
test_suite: ${{ fromJSON(needs.get-sample-apps-data.outputs.matrix) }}
|
||||
environment: ["production", "development"]
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success'
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 45
|
||||
name: e2e-sample-app-${{ matrix.test_suite }}-tests
|
||||
name: e2e-sample-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
|
||||
env:
|
||||
MB_EDITION: ee
|
||||
DISPLAY: ""
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
|
||||
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
|
||||
# Any env starting with `CYPRESS_` will be available to all Cypress tests via `Cypress.env()`
|
||||
# Example: you can get `CYPRESS_FOO` with `Cypress.env("FOO")`
|
||||
CYPRESS_ALL_FEATURES_TOKEN: ${{ secrets.ENTERPRISE_TOKEN }}
|
||||
CYPRESS_NO_FEATURES_TOKEN: ${{ secrets.E2E_STARTER_TOKEN }}
|
||||
CYPRESS_PULL_REQUEST_ID: ${{ github.event.pull_request.number || '' }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: true
|
||||
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title || github.event.head_commit.message || github.event.head.sha }}
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
# Sample Apps testing variables
|
||||
CYPRESS_CI: true
|
||||
TEST_SUITE: ${{ matrix.test_suite }}
|
||||
SAMPLE_APP_BRANCH_NAME: ${{ needs.get-sample-apps-data.outputs.branch_name }}
|
||||
SAMPLE_APP_ENVIRONMENT: ${{ matrix.environment }}
|
||||
permissions:
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# We have to use the latest version that does not have this issue https://github.com/docker/compose/pull/12752
|
||||
- name: Set up Docker Compose
|
||||
uses: docker/setup-compose-action@v1
|
||||
with:
|
||||
version: latest
|
||||
|
||||
- name: Get Sample App name
|
||||
id: get-sample-app-name
|
||||
shell: bash
|
||||
run: |
|
||||
test_suite="${{ matrix.test_suite }}"
|
||||
echo "sample_app_name=${test_suite%-e2e}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Retrieve uberjar artifact for ee
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -245,6 +254,7 @@ jobs:
|
||||
- name: Check if sample app branch exists
|
||||
id: check-sample-app-branch
|
||||
run: |
|
||||
TEST_SUITE="${{ matrix.test_suite }}"
|
||||
REPO_NAME="${TEST_SUITE%-e2e}"
|
||||
REPO_URL="https://github.com/metabase/${REPO_NAME}.git"
|
||||
echo "Checking if branch '${SAMPLE_APP_BRANCH_NAME}' exists in ${REPO_URL}..."
|
||||
@@ -254,21 +264,131 @@ jobs:
|
||||
echo "sample_app_branch_exists=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Prepare and launch Sample Apps
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' }}
|
||||
run: npx tsx ./e2e/runner/start-sample-app-containers/start-ci.ts
|
||||
- name: Configure AWS credentials
|
||||
if: ${{ matrix.test_suite == 'shoppy-e2e' }}
|
||||
uses: aws-actions/configure-aws-credentials@v4
|
||||
with:
|
||||
role-to-assume: ${{ secrets.SHOPPY_IAM_ROLE }}
|
||||
role-session-name: GitHub_to_AWS_via_FederatedOIDC
|
||||
aws-region: us-east-1
|
||||
|
||||
- name: Download Shoppy's App DB PostgreSQL dump from S3
|
||||
if: ${{ matrix.test_suite == 'shoppy-e2e' }}
|
||||
run: |
|
||||
aws s3 cp s3://${{ secrets.SHOPPY_METABASE_APP_DB_S3_BUCKET }}/${{ secrets.SHOPPY_METABASE_APP_DB_S3_KEY }} ./e2e/tmp/db_dumps/shoppy_metabase_app_db_dump.sql
|
||||
|
||||
- name: Prepare and launch Sample Apps for shoppy-e2e test suite
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && matrix.test_suite == 'shoppy-e2e' }}
|
||||
env:
|
||||
METABASE_APP_DB_USER: ${{ secrets.SHOPPY_METABASE_APP_DB_USER }}
|
||||
METABASE_APP_DB: ${{ secrets.SHOPPY_METABASE_APP_DB_DATABASE }}
|
||||
run: npx tsx ./e2e/runner/embedding-sdk/sample-apps/start-ci.ts shoppy-e2e
|
||||
|
||||
- name: Prepare and launch Sample Apps for other test suites
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && matrix.test_suite != 'shoppy-e2e' }}
|
||||
run: npx tsx ./e2e/runner/embedding-sdk/sample-apps/start-ci.ts ${{ matrix.test_suite }}
|
||||
|
||||
- name: Run e2e tests for Sample App
|
||||
id: run-e2e-tests
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' }}
|
||||
continue-on-error: true
|
||||
run: node e2e/runner/run_cypress_ci.js ${{ matrix.test_suite }} --browser ${{ steps.cypress-prep.outputs.chrome-path }}
|
||||
|
||||
- name: Upload Cypress Artifacts upon failure
|
||||
uses: actions/upload-artifact@v4
|
||||
if: ${{ steps.check-sample-app-branch.outputs.branch_exists == 'true' && steps.run-e2e-tests.outcome != 'success' }}
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && steps.run-e2e-tests.outcome != 'success' }}
|
||||
with:
|
||||
name: cypress-recording-sample-app-${{ matrix.test_suite }}-latest
|
||||
path: |
|
||||
./cypress
|
||||
./logs/test.log
|
||||
./e2e/tmp/${{ steps.get-sample-app-name.outputs.sample_app_name }}/cypress
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Fail job if tests failed
|
||||
if: ${{ steps.check-sample-app-branch.outputs.sample_app_branch_exists == 'true' && steps.run-e2e-tests.outcome != 'success' }}
|
||||
run: |
|
||||
exit 1
|
||||
|
||||
e2e-host-apps-tests:
|
||||
needs: [ get-build-requirements, build ]
|
||||
strategy:
|
||||
matrix:
|
||||
test_suite: [
|
||||
"vite-6-host-app-e2e",
|
||||
"next-15-app-router-host-app-e2e",
|
||||
"next-15-pages-router-host-app-e2e",
|
||||
"angular-20-host-app-e2e",
|
||||
]
|
||||
environment: [ "production", "development" ]
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success'
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 45
|
||||
name: e2e-host-app-${{ matrix.test_suite }}-tests-${{ matrix.environment }}-bundle
|
||||
env:
|
||||
MB_EDITION: ee
|
||||
DISPLAY: ""
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number || '' }}
|
||||
HASH: ${{ github.event.pull_request.head.sha || github.sha }}-${{ github.run_attempt }}
|
||||
CYPRESS_ALL_FEATURES_TOKEN: ${{ secrets.ENTERPRISE_TOKEN }}
|
||||
CYPRESS_IS_EMBEDDING_SDK: true
|
||||
TZ: US/Pacific # to make node match the instance tz
|
||||
CYPRESS_CI: true
|
||||
HOST_APP_ENVIRONMENT: ${{ matrix.environment }}
|
||||
permissions:
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Retrieve uberjar artifact for ee
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-ee-${{ github.event.pull_request.head.sha || github.sha }}-uberjar
|
||||
|
||||
- name: Retrieve Embedding SDK dist artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
|
||||
path: ${{ github.workspace }}/resources/embedding-sdk
|
||||
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
|
||||
- name: Prepare Cypress environment
|
||||
id: cypress-prep
|
||||
uses: ./.github/actions/prepare-cypress
|
||||
|
||||
- name: Prepare JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: "temurin"
|
||||
|
||||
- name: Run Metabase
|
||||
run: node e2e/runner/run_cypress_ci.js start
|
||||
|
||||
- name: Generate database snapshots
|
||||
run: node e2e/runner/run_cypress_ci.js snapshot
|
||||
|
||||
- name: Prepare and launch Host App
|
||||
run: npx tsx ./e2e/runner/embedding-sdk/host-apps/start-ci.ts ${{ matrix.test_suite }}
|
||||
|
||||
- name: Run e2e tests for Host App
|
||||
id: run-e2e-tests
|
||||
continue-on-error: true
|
||||
run: node e2e/runner/run_cypress_ci.js ${{ matrix.test_suite }} --browser ${{ steps.cypress-prep.outputs.chrome-path }}
|
||||
|
||||
- name: Upload Cypress Artifacts upon failure
|
||||
uses: actions/upload-artifact@v4
|
||||
if: ${{ steps.run-e2e-tests.outcome != 'success' }}
|
||||
with:
|
||||
name: cypress-recording-host-app-${{ matrix.test_suite }}-${{ matrix.environment }}-latest
|
||||
path: |
|
||||
./cypress
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Fail job if tests failed
|
||||
if: ${{ steps.run-e2e-tests.outcome != 'success' }}
|
||||
run: |
|
||||
exit 1
|
||||
20
.github/workflows/e2e-matrix-builder.yml
vendored
@@ -16,6 +16,8 @@ on:
|
||||
value: ${{ jobs.build-matrix.outputs.matrix }}
|
||||
regularChunks:
|
||||
value: ${{ jobs.build-matrix.outputs.regularChunks }}
|
||||
isDefaultSpecPattern:
|
||||
value: ${{ jobs.build-matrix.outputs.isDefaultSpecPattern }}
|
||||
|
||||
jobs:
|
||||
build-matrix:
|
||||
@@ -24,12 +26,18 @@ jobs:
|
||||
outputs:
|
||||
matrix: ${{ steps.matrix.outputs.config }}
|
||||
regularChunks: ${{ steps.matrix.outputs.regularChunks }}
|
||||
isDefaultSpecPattern: ${{ steps.matrix.outputs.isDefaultSpecPattern }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
.github
|
||||
sparse-checkout-cone-mode: false
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/Jod # 22.x.x
|
||||
- uses: actions/github-script@v7
|
||||
- name: Build e2e matrix
|
||||
uses: actions/github-script@v7
|
||||
id: matrix
|
||||
env:
|
||||
chunks: ${{ inputs.chunks }}
|
||||
@@ -38,10 +46,18 @@ jobs:
|
||||
const { buildMatrix } = require('${{ github.workspace }}/.github/scripts/build-e2e-matrix.js');
|
||||
const inputSpecs = "${{ inputs.specs }}";
|
||||
const inputChunks = Number(process.env.chunks);
|
||||
const { config, regularChunks } = buildMatrix(inputSpecs, inputChunks);
|
||||
const java = 21;
|
||||
const defaultRunner = "ubuntu-22.04";
|
||||
const options = {
|
||||
java,
|
||||
defaultRunner,
|
||||
};
|
||||
const { config, regularChunks, isDefaultSpecPattern } = buildMatrix(options, inputSpecs, inputChunks);
|
||||
|
||||
core.setOutput("regularChunks", JSON.stringify(regularChunks));
|
||||
core.setOutput("config", JSON.stringify({ include: config }));
|
||||
core.setOutput("isDefaultSpecPattern", JSON.stringify(isDefaultSpecPattern));
|
||||
|
||||
console.log({ regularChunks });
|
||||
console.log("matrix config", config);
|
||||
console.log("isDefaultSpecPattern", isDefaultSpecPattern);
|
||||
|
||||
1
.github/workflows/e2e-test.yml
vendored
@@ -157,6 +157,7 @@ jobs:
|
||||
with:
|
||||
input-path: ./target/junit
|
||||
output-name: e2e-${{ inputs.name }}
|
||||
variant: e2e-tests
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
|
||||
15
.github/workflows/e2e-tests.yml
vendored
@@ -6,6 +6,10 @@ on:
|
||||
skip:
|
||||
type: boolean
|
||||
default: false
|
||||
specs:
|
||||
type: string
|
||||
required: false
|
||||
default: ""
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-e2e
|
||||
@@ -16,6 +20,7 @@ jobs:
|
||||
uses: ./.github/workflows/e2e-matrix-builder.yml
|
||||
with:
|
||||
chunks: 50
|
||||
specs: ${{ inputs.specs }}
|
||||
|
||||
# if this is a test on a release branch, we need to check the build requirements
|
||||
get-build-requirements:
|
||||
@@ -75,7 +80,7 @@ jobs:
|
||||
|
||||
- name: Build uberjar with ./bin/build.sh
|
||||
timeout-minutes: 10
|
||||
run: ./bin/build.sh
|
||||
run: ./bin/build.sh
|
||||
shell: bash
|
||||
|
||||
- name: Prepare uberjar artifact
|
||||
@@ -139,14 +144,16 @@ jobs:
|
||||
flaky-e2e-tests:
|
||||
name: Flaky e2e Tests
|
||||
uses: ./.github/workflows/e2e-test.yml
|
||||
needs: build
|
||||
needs:
|
||||
- build
|
||||
- e2e-matrix-builder
|
||||
# skip flaky test run if only e2e specs changed as an optimization
|
||||
if: |
|
||||
!cancelled() && needs.build.result == 'success'
|
||||
!cancelled() && needs.build.result == 'success' && needs.e2e-matrix-builder.outputs.isDefaultSpecPattern == 'true'
|
||||
secrets: inherit
|
||||
with:
|
||||
name: Flaky
|
||||
tags: "@flaky"
|
||||
specs: "./e2e/test/scenarios/**/*.cy.spec.*"
|
||||
|
||||
e2e-tests-result:
|
||||
needs:
|
||||
|
||||
58
.github/workflows/embedding-sdk.yml
vendored
@@ -6,7 +6,7 @@ on:
|
||||
- "master"
|
||||
- "release-**"
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}
|
||||
@@ -91,6 +91,55 @@ jobs:
|
||||
- name: Run frontend embedding SDK snippets type check
|
||||
run: yarn run embedding-sdk:docs-snippets:type-check
|
||||
|
||||
embedding-sdk-api-documentation-generation-validation:
|
||||
needs: [files-changed, build]
|
||||
if: |
|
||||
needs.files-changed.outputs.frontend_embedding_sdk_sources == 'true' &&
|
||||
needs.build.result == 'success'
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Prepare front-end environment
|
||||
uses: ./.github/actions/prepare-frontend
|
||||
- name: Retrieve Embedding SDK dist artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
|
||||
path: ${{ github.workspace }}/resources/embedding-sdk
|
||||
- name: Generate documentation to check for generation errors
|
||||
id: docs-generation
|
||||
continue-on-error: true
|
||||
shell: bash
|
||||
run: |
|
||||
set -o pipefail
|
||||
yarn embedding-sdk:docs:generate:pure --emit none 2>&1 \
|
||||
| tee /dev/stdout \
|
||||
| tee >( tail -n 10 \
|
||||
| sed '1s/^/output<<EOF\n/' \
|
||||
| sed '$aEOF' \
|
||||
>> "$GITHUB_OUTPUT" )
|
||||
exit ${PIPESTATUS[0]}
|
||||
- name: Comment on PR if 'not included in the documentation' error happens
|
||||
uses: ./.github/actions/notify-pull-request
|
||||
with:
|
||||
remove-previous-comment: true
|
||||
add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'not included in the documentation') }}
|
||||
message: "📝 Some exported from `@metabase/embedding-sdk-react` types reference other types that are not exported, i.e. internal types.<br><br>The internal type reference breaks API documentation generation for the SDK and also may unexpectedly increase the output size of the type declaration file.<br><br>Please check the CI logs to find the name of such type.<br><br>- If a type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, refactor types to prevent referencing other types that are not exported from SDK.<br><br>You can run `yarn embedding-sdk:docs:generate` locally to verify that the issue has been resolved."
|
||||
include-log: true
|
||||
- name: Comment on PR if 'Failed to resolve link' error happens
|
||||
uses: ./.github/actions/notify-pull-request
|
||||
with:
|
||||
remove-previous-comment: true
|
||||
add-new-comment: ${{ steps.docs-generation.outcome == 'failure' && contains(steps.docs-generation.outputs.output, 'Failed to resolve link') }}
|
||||
message: "📝 A typedoc `{@link <TYPE_NAME>}` annotation is found that can't be resolved.<br><br>Most likely it happens when the referenced type is not exported. Please check the CI logs to find the name of such type.<br><br>- If a referenced in `{@link}` type should be publicly available in the SDK, add a description to it or a TypeDoc annotation and export it from SDK.<br>- If a type is internal and should _not_ be publicly exposed, change types to prevent unexported type reference in `{@link}` annotation.<br><br>You can run `yarn embedding-sdk:docs:generate` locally to verify that the issue has been resolved."
|
||||
include-log: true
|
||||
- name: Fail Job
|
||||
if: ${{ steps.docs-generation.outcome == 'failure' }}
|
||||
run: exit 1
|
||||
|
||||
sdk-e2e-tests:
|
||||
uses: ./.github/workflows/e2e-component-tests-embedding-sdk.yml
|
||||
needs: [build]
|
||||
@@ -99,12 +148,14 @@ jobs:
|
||||
cached-embedding-sdk-dist-artifact-name: embedding-sdk-${{ github.event.pull_request.head.sha || github.sha }}
|
||||
|
||||
e2e-component-tests-embedding-sdk-cross-version:
|
||||
if: ${{ startsWith(inputs.branch, 'release-x.') }}
|
||||
# run on: every push on release branches, and every pr that targets a release branch
|
||||
if: ${{ startsWith(github.ref, 'refs/heads/release-x.') || (github.event_name == 'pull_request' && startsWith(github.base_ref, 'release-x.')) }}
|
||||
uses: ./.github/workflows/e2e-component-tests-embedding-sdk-cross-version.yml
|
||||
secrets: inherit
|
||||
|
||||
cross-version-for-breaking-changes:
|
||||
if: github.event_name == 'pull_request'
|
||||
# run on: every pr that targets a release branch
|
||||
if: ${{ github.event_name == 'pull_request' && startsWith(github.base_ref, 'release-x.') }}
|
||||
uses: ./.github/workflows/e2e-cross-version-for-breaking-changes.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -115,6 +166,7 @@ jobs:
|
||||
needs:
|
||||
- embedding-sdk-cli-snippets-type-check
|
||||
- embedding-sdk-docs-snippets-type-check
|
||||
- embedding-sdk-api-documentation-generation-validation
|
||||
- sdk-e2e-tests
|
||||
- e2e-component-tests-embedding-sdk-cross-version
|
||||
if: always() && !cancelled()
|
||||
|
||||
12
.github/workflows/frontend.yml
vendored
@@ -6,6 +6,9 @@ on:
|
||||
skip:
|
||||
type: boolean
|
||||
default: false
|
||||
skip-lint:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }}-frontend
|
||||
@@ -13,7 +16,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
fe-lint:
|
||||
if: ${{ !inputs.skip }}
|
||||
if: ${{ !inputs.skip-lint }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
@@ -24,6 +27,13 @@ jobs:
|
||||
uses: ./.github/actions/prepare-backend
|
||||
with:
|
||||
m2-cache-key: "cljs"
|
||||
- name: Restore ESLint cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .eslintcache
|
||||
key: eslintcache-${{ hashFiles('yarn.lock', '.eslintrc.js') }}
|
||||
restore-keys: |
|
||||
eslintcache-
|
||||
- name: Compile CLJS
|
||||
run: yarn build-pure:cljs
|
||||
- name: Find CSS variables that are used but never defined
|
||||
|
||||
2
.github/workflows/migrations.yml
vendored
@@ -19,4 +19,4 @@ jobs:
|
||||
with:
|
||||
m2-cache-key: lint-migrations
|
||||
- name: Verify Liquibase Migrations
|
||||
run: ./bin/lint-migrations-file.sh
|
||||
run: ./bin/mage lint-migrations
|
||||
|
||||
9
.github/workflows/release-embedding-sdk.yml
vendored
@@ -15,7 +15,8 @@ on:
|
||||
- release-x.52.x
|
||||
- release-x.53.x
|
||||
- release-x.54.x
|
||||
- metabot-v3-main
|
||||
- release-x.55.x
|
||||
- esbuild-main
|
||||
|
||||
concurrency:
|
||||
# We want to ensure only one job is running at a time per branch because
|
||||
@@ -392,10 +393,10 @@ jobs:
|
||||
run: |
|
||||
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
|
||||
# Please keep the value in sync with `inputs.branch`'s release branch
|
||||
npm publish --tag ${{fromJson('{"master": "nightly", "release-x.51.x": "51-stable", "release-x.52.x": "52-stable", "release-x.53.x": "53-stable", "release-x.54.x": "54-stable", "metabot-v3-main": "55-metabot"}')[inputs.branch]}}
|
||||
npm publish --tag ${{fromJson('{"master": "nightly", "release-x.51.x": "51-stable", "release-x.52.x": "52-stable", "release-x.53.x": "53-stable", "release-x.54.x": "54-stable", "release-x.55.x": "55-stable", "esbuild-main": "56-esbuild"}')[inputs.branch]}}
|
||||
|
||||
- name: Add `latest` tag to the latest release branch (`release-x.54.x`) deployment
|
||||
if: ${{ inputs.branch == 'release-x.54.x' }}
|
||||
- name: Add `latest` tag to the latest release branch (`release-x.55.x`) deployment
|
||||
if: ${{ inputs.branch == 'release-x.55.x' }}
|
||||
working-directory: sdk
|
||||
run: |
|
||||
npm dist-tag add @metabase/embedding-sdk-react@${{ env.sdk_version }} latest
|
||||
|
||||
22
.github/workflows/release.yml
vendored
@@ -402,6 +402,28 @@ jobs:
|
||||
}
|
||||
});
|
||||
|
||||
trigger-ee-extra-pr:
|
||||
needs: verify-s3-download
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
script: | # js
|
||||
const version = '${{ inputs.version }}';
|
||||
const enterpriseVersion = version.replace(/^v0\./, "v1.");
|
||||
|
||||
github.rest.repos.createDispatchEvent({
|
||||
owner: '${{ github.repository_owner }}',
|
||||
repo: 'metabase-ee-extra',
|
||||
event_type: 'update-ee-extra-build',
|
||||
client_payload: {
|
||||
version: enterpriseVersion,
|
||||
auto: 'true', // always auto-merge
|
||||
}
|
||||
});
|
||||
|
||||
draft-release-notes:
|
||||
if: ${{ !inputs.auto }}
|
||||
needs: add-extra-tags
|
||||
|
||||
11
.github/workflows/run-tests.yml
vendored
@@ -15,6 +15,9 @@ jobs:
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
e2e_all: ${{ steps.changes.outputs.e2e_all }}
|
||||
e2e_all_files: ${{ steps.changes.outputs.e2e_all_files }}
|
||||
e2e_specs: ${{ steps.changes.outputs.e2e_specs }}
|
||||
e2e_specs_files: ${{ steps.changes.outputs.e2e_specs_files }}
|
||||
backend_all: ${{ steps.changes.outputs.backend_all }}
|
||||
frontend_all: ${{ steps.changes.outputs.frontend_all }}
|
||||
frontend_sources: ${{ steps.changes.outputs.frontend_sources }}
|
||||
@@ -25,6 +28,8 @@ jobs:
|
||||
id: changes
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
# comma separated list of files
|
||||
list-files: csv
|
||||
filters: .github/file-paths.yaml
|
||||
|
||||
static-viz-files-changed:
|
||||
@@ -79,6 +84,7 @@ jobs:
|
||||
secrets: inherit
|
||||
with:
|
||||
skip: ${{ needs.files-changed.outputs.frontend_all != 'true' }}
|
||||
skip-lint: ${{ needs.files-changed.outputs.frontend_all != 'true' && needs.files-changed.outputs.e2e_specs != 'true' }}
|
||||
|
||||
e2e-tests:
|
||||
needs: files-changed
|
||||
@@ -86,3 +92,8 @@ jobs:
|
||||
secrets: inherit
|
||||
with:
|
||||
skip: ${{ needs.files-changed.outputs.e2e_all != 'true' }}
|
||||
# here we pass result from files-changed, which is a list of files, comma separated
|
||||
# e.g. e2e/test/scenarios/onboarding/command-palette.cy.spec.js,e2e/test/scenarios/question/document-title.cy.spec.js
|
||||
# e2e_all_files includes all changes which trigger all e2e tests, if the list of changes files is included in the
|
||||
# list of changed specs files, then only specs are changed and we can run only those specs
|
||||
specs: ${{ needs.files-changed.outputs.e2e_all_files == needs.files-changed.outputs.e2e_specs_files && needs.files-changed.outputs.e2e_specs_files || '' }}
|
||||
|
||||
17
.github/workflows/snyk.yml
vendored
@@ -29,12 +29,23 @@ jobs:
|
||||
- uses: snyk/actions/setup@0.4.0
|
||||
- name: Generate all pom.xml
|
||||
run: .github/scripts/write-poms.sh
|
||||
- name: Run snyk
|
||||
- name: Run snyk main project
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: snyk test --all-projects --sarif-file-output=snyk.sarif
|
||||
run: snyk test --all-projects --exclude="modules" --sarif-file-output=snyk-main.sarif
|
||||
- name: Upload result to GitHub Code Scanning
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: snyk.sarif
|
||||
sarif_file: snyk-main.sarif
|
||||
category: main-project
|
||||
- name: Run snyk drivers
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
continue-on-error: true
|
||||
run: cd modules && snyk test --all-projects --sarif-file-output=snyk-drivers.sarif
|
||||
- name: Upload result to GitHub Code Scanning
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: modules/snyk-drivers.sarif
|
||||
category: drivers
|
||||
|
||||
2
.github/workflows/translation-update.yml
vendored
@@ -108,7 +108,7 @@ jobs:
|
||||
- name: Auto approve PR
|
||||
uses: juliangruber/approve-pull-request-action@v1
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github-token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
number: ${{ steps.create_pr.outputs.pr_number }}
|
||||
|
||||
- name: Enable Pull Request Automerge
|
||||
|
||||
329
.github/workflows/uberjar.yml
vendored
@@ -1,12 +1,15 @@
|
||||
name: Build + Docker Uberjar
|
||||
|
||||
# This workflow builds an uberjar and pushes it to dockerhub for any branch, either on-demand,
|
||||
# or automatically for the listed branches
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- metabot-v3-second-try
|
||||
- master
|
||||
- metabot-v3-main
|
||||
- feature-visualizer
|
||||
- "internal-tools"
|
||||
- internal-tools
|
||||
paths-ignore:
|
||||
# config files
|
||||
- ".**"
|
||||
@@ -23,16 +26,63 @@ on:
|
||||
description: "Optional full-length commit SHA-1 hash"
|
||||
|
||||
jobs:
|
||||
get-container-info:
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 5
|
||||
name: Get container info
|
||||
outputs:
|
||||
editions: ${{ toJson(fromJson(steps.info.outputs.result).editions) }}
|
||||
ee: ${{ toJson(fromJson(steps.info.outputs.result).ee) }}
|
||||
oss: ${{ toJson(fromJson(steps.info.outputs.result).oss) }}
|
||||
steps:
|
||||
- name: Get docker repo and tag
|
||||
id: info
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: | # js
|
||||
const branch = '${{ github.head_ref || github.ref_name }}';
|
||||
const owner = '${{ github.repository_owner }}';
|
||||
|
||||
console.log(`Branch: ${branch}`);
|
||||
|
||||
if (branch === "master") {
|
||||
return {
|
||||
editions: ["ee", "oss"],
|
||||
ee: {
|
||||
repo: `${owner}/metabase-enterprise-head`,
|
||||
tag: "latest"
|
||||
},
|
||||
oss: {
|
||||
repo: `${owner}/metabase-head`,
|
||||
tag: "latest"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
editions: ["ee"],
|
||||
ee: {
|
||||
repo: `${owner}/metabase-dev`,
|
||||
tag: branch.replaceAll("/", "-"), // slashes make docker sad
|
||||
},
|
||||
};
|
||||
|
||||
- name: Print output
|
||||
run: |
|
||||
echo "${{ steps.info.outputs.result }}"
|
||||
|
||||
build:
|
||||
needs: get-container-info
|
||||
name: Build MB ${{ matrix.edition }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
matrix:
|
||||
edition: [ee, oss]
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
env:
|
||||
MB_EDITION: ${{ matrix.edition }}
|
||||
INTERACTIVE: false
|
||||
SKIP_LICENSES: true # faster builds for dev
|
||||
steps:
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v4
|
||||
@@ -50,16 +100,16 @@ jobs:
|
||||
- name: Prepare uberjar artifact
|
||||
uses: ./.github/actions/prepare-uberjar-artifact
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
|
||||
check_jar_health:
|
||||
check-jar-health:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Is ${{ matrix.edition }} (java ${{ matrix.java-version }}) healthy?
|
||||
needs: build
|
||||
needs: [build, get-container-info]
|
||||
timeout-minutes: 10
|
||||
strategy:
|
||||
matrix:
|
||||
edition: [ee, oss]
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
java-version: [21]
|
||||
steps:
|
||||
- name: Prepare JRE (Java Run-time Environment)
|
||||
@@ -72,248 +122,53 @@ jobs:
|
||||
- uses: actions/download-artifact@v4
|
||||
name: Retrieve uberjar artifact
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
|
||||
name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
- name: Launch uberjar
|
||||
run: >-
|
||||
java --add-opens java.base/java.nio=ALL-UNNAMED -jar ./target/uberjar/metabase.jar &
|
||||
- name: Wait for Metabase to start
|
||||
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
|
||||
|
||||
containerize_test_and_push_container:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Containerize ${{ matrix.edition }}
|
||||
needs: check_jar_health
|
||||
containerize:
|
||||
needs: [check-jar-health, get-container-info]
|
||||
strategy:
|
||||
matrix:
|
||||
edition: [ee, oss]
|
||||
fail-fast: false
|
||||
services:
|
||||
registry:
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: read
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Extract and clean branch name
|
||||
shell: bash
|
||||
run: echo "branch=$(echo $GITHUB_REF_NAME | sed 's/[^-._a-zA-Z0-9]/-/g')" >> $GITHUB_OUTPUT
|
||||
id: extract_branch
|
||||
- name: Verify the intended tag of the container image
|
||||
run: echo "Container image will be tagged as ${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}"
|
||||
- name: Check out the code (Dockerfile needed)
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.inputs.commit }}
|
||||
- name: Download uploaded artifacts to insert into container
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
|
||||
path: bin/docker/
|
||||
- name: Move the ${{ matrix.edition }} uberjar to the context dir
|
||||
run: mv bin/docker/target/uberjar/metabase.jar bin/docker/.
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v2.5.0
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Build ${{ matrix.edition }} container
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: bin/docker/.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
network: host
|
||||
tags: localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.sha }}
|
||||
no-cache: true
|
||||
push: true
|
||||
- name: Launch ${{ matrix.edition }} container
|
||||
run: docker run --rm -dp 3000:3000 localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}
|
||||
timeout-minutes: 5
|
||||
- name: Is Docker running?
|
||||
run: docker ps
|
||||
- name: Wait for Metabase to start and reach 100% health
|
||||
run: while ! curl 'http://localhost:3000/api/health' | grep '{"status":"ok"}'; do sleep 1; done
|
||||
timeout-minutes: 3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
uses: ./.github/workflows/containerize-jar.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
artifact-name: metabase-${{ matrix.edition }}-${{ github.event.inputs.commit || github.sha }}-uberjar
|
||||
commit: ${{ github.event.inputs.commit || github.sha }}
|
||||
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
|
||||
tag: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).tag }}
|
||||
release: "false"
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.event.inputs.commit || github.sha }}
|
||||
|
||||
- name: Retag and push images if master (ee) - should be cached at this point
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: bin/docker/.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
network: host
|
||||
tags: ${{ github.repository_owner }}/metabase-enterprise-head:latest
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.sha }}
|
||||
no-cache: false
|
||||
push: true
|
||||
|
||||
# TODO: remove when we're done testing metabot
|
||||
- name: Retag and push images if metabot-v3-second-try (ee) - should be cached at this point
|
||||
if: ${{ (github.ref_name == 'metabot-v3-second-try') && matrix.edition == 'ee' }}
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: bin/docker/.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
network: host
|
||||
tags: ${{ github.repository_owner }}/metabase-enterprise-head:metabot
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.sha }}
|
||||
no-cache: false
|
||||
push: true
|
||||
|
||||
- name: Retag and push images if master (oss) - should be cached at this point
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: bin/docker/.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
network: host
|
||||
tags: ${{ github.repository_owner }}/metabase-head:latest
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.sha }}
|
||||
no-cache: false
|
||||
push: true
|
||||
|
||||
- name: Run Trivy vulnerability scanner if master (ee)
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
|
||||
uses: aquasecurity/trivy-action@0.29.0
|
||||
env:
|
||||
TRIVY_OFFLINE_SCAN: true
|
||||
with:
|
||||
image-ref: docker.io/${{ github.repository_owner }}/metabase-enterprise-head:latest
|
||||
format: sarif
|
||||
output: trivy-results.sarif
|
||||
version: "v0.57.1"
|
||||
|
||||
- name: Run Trivy vulnerability scanner if master (oss)
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
|
||||
uses: aquasecurity/trivy-action@0.29.0
|
||||
env:
|
||||
TRIVY_OFFLINE_SCAN: true
|
||||
with:
|
||||
image-ref: docker.io/${{ github.repository_owner }}/metabase-head:latest
|
||||
format: sarif
|
||||
output: trivy-results.sarif
|
||||
version: "v0.57.1"
|
||||
|
||||
- name: Run Trivy vulnerability scanner if dev branch
|
||||
if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee' }}
|
||||
uses: aquasecurity/trivy-action@0.29.0
|
||||
env:
|
||||
TRIVY_OFFLINE_SCAN: true
|
||||
with:
|
||||
version: "v0.57.1"
|
||||
image-ref: docker.io/${{ github.repository_owner }}/metabase-dev:${{ steps.extract_branch.outputs.branch }}
|
||||
format: sarif
|
||||
output: trivy-results.sarif
|
||||
|
||||
- name: Upload Trivy scan results to GitHub Security tab if master (ee)
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'ee' }}
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: "trivy-results.sarif"
|
||||
|
||||
- name: Upload Trivy scan results to GitHub Security tab if master (oss)
|
||||
if: ${{ (github.ref_name == 'master') && matrix.edition == 'oss' }}
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: "trivy-results.sarif"
|
||||
|
||||
- name: Upload Trivy scan results to GitHub Security tab if dev branch
|
||||
if: ${{ !(startsWith(github.ref_name,'master') || startsWith(github.ref_name,'backport')) && matrix.edition == 'ee' }}
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
sarif_file: "trivy-results.sarif"
|
||||
|
||||
containerize_multi_arch:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Containerize multi-arch ${{ matrix.edition }}
|
||||
needs: check_jar_health
|
||||
run-trivy:
|
||||
needs: [get-container-info, containerize]
|
||||
strategy:
|
||||
matrix:
|
||||
edition: [ee, oss]
|
||||
services:
|
||||
registry:
|
||||
image: registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
edition: ${{ fromJson(needs.get-container-info.outputs.editions) }}
|
||||
runs-on: ubuntu-22.04
|
||||
name: Run Trivy vulnerability scanner
|
||||
steps:
|
||||
- name: Extract and clean branch name
|
||||
shell: bash
|
||||
run: echo "branch=$(echo $GITHUB_REF_NAME | sed 's/[^-._a-zA-Z0-9]/-/g')" >> $GITHUB_OUTPUT
|
||||
id: extract_branch
|
||||
- name: Verify the intended tag of the container image
|
||||
run: echo "Container image will be tagged as ${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}"
|
||||
- name: Check out the code (Dockerfile needed)
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.inputs.commit }}
|
||||
- name: Download uploaded artifacts to insert into container
|
||||
uses: actions/download-artifact@v4
|
||||
ref: ${{ github.event.inputs.commit || github.sha }}
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@0.29.0
|
||||
env:
|
||||
TRIVY_OFFLINE_SCAN: true
|
||||
repo: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).repo }}
|
||||
tag: ${{ fromJson(needs.get-container-info.outputs[matrix.edition]).tag }}
|
||||
with:
|
||||
name: metabase-${{ matrix.edition }}-${{ github.sha }}-uberjar
|
||||
path: bin/docker/
|
||||
- name: Move the ${{ matrix.edition }} uberjar to the context dir
|
||||
run: mv bin/docker/target/uberjar/metabase.jar bin/docker/.
|
||||
# We need it for multi-arch build
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
image-ref: docker.io/${{ env.repo }}:${{ env.tag }}
|
||||
format: sarif
|
||||
output: trivy-results.sarif
|
||||
version: "v0.57.1"
|
||||
- name: Upload Trivy scan results to GitHub Security tab
|
||||
uses: github/codeql-action/upload-sarif@v3
|
||||
with:
|
||||
platforms: "arm64"
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v2.5.0
|
||||
with:
|
||||
driver-opts: network=host
|
||||
# Build experimental ubuntu-based images only for master
|
||||
- name: Build ${{ matrix.edition }} Ubuntu based multi-arch container
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: bin/docker/.
|
||||
platforms: linux/amd64,linux/arm64
|
||||
file: bin/docker/Dockerfile_ubuntu
|
||||
network: host
|
||||
tags: localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}-ubuntu
|
||||
build-args: |
|
||||
GIT_COMMIT_SHA=${{ github.sha }}
|
||||
no-cache: true
|
||||
push: true
|
||||
- name: Launch ${{ matrix.edition }} Ubuntu based container
|
||||
run: docker run --rm -dp 3001:3000 localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-${{ matrix.edition }}-ubuntu
|
||||
timeout-minutes: 5
|
||||
- name: Is Docker with Ubuntu running?
|
||||
run: docker ps
|
||||
- name: Wait for Ubuntu-based Metabase container to start and reach 100% health
|
||||
run: while ! curl 'http://localhost:3001/api/health' | grep '{"status":"ok"}'; do sleep 1; done
|
||||
timeout-minutes: 3
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ github.ref_name == 'master' }}
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
# Push experimental ubuntu image only for versions based on a master
|
||||
- name: Install regctl
|
||||
if: ${{ github.ref_name == 'master' }}
|
||||
uses: regclient/actions/regctl-installer@main
|
||||
with:
|
||||
release: "v0.4.7"
|
||||
- name: Switch regctl to point to localhost:5000 via http
|
||||
if: ${{ github.ref_name == 'master' }}
|
||||
run: regctl registry set --tls disabled localhost:5000
|
||||
- name: Retag and push ubuntu-based images if master (ee)
|
||||
if: ${{ (matrix.edition == 'ee') && (github.ref_name == 'master') }}
|
||||
run: regctl image copy localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-ee-ubuntu ${{ github.repository_owner }}/metabase-enterprise-head:latest-ubuntu
|
||||
- name: Retag and push ubuntu-based images if master (oss)
|
||||
if: ${{ (matrix.edition == 'oss') && (github.ref_name == 'master') }}
|
||||
run: regctl image copy localhost:5000/metabase-dev:${{ steps.extract_branch.outputs.branch }}-oss-ubuntu ${{ github.repository_owner }}/metabase-head:latest-ubuntu
|
||||
sarif_file: "trivy-results.sarif"
|
||||
|
||||
15
.gitignore
vendored
@@ -6,6 +6,7 @@
|
||||
*.po~
|
||||
*.sqlite
|
||||
*.trace.db
|
||||
*.trace.db.old
|
||||
*.xcworkspacedata
|
||||
.DS_Store
|
||||
.\#*
|
||||
@@ -43,6 +44,9 @@
|
||||
/frontend/test/snapshots/*
|
||||
/e2e/snapshots/*
|
||||
/e2e/tmp/*
|
||||
!/e2e/tmp/db_dumps
|
||||
/e2e/tmp/db_dumps/*
|
||||
!/e2e/tmp/db_dumps/.gitkeep
|
||||
/lein-plugins/*/target
|
||||
/local
|
||||
/locales/metabase-*.pot
|
||||
@@ -54,7 +58,10 @@
|
||||
/reset-password-artifacts
|
||||
/resources/frontend_client/app/dist/
|
||||
/resources/frontend_client/app/locales
|
||||
/resources/frontend_client/app/embed.js
|
||||
/resources/frontend_client/tmp-embed-js/
|
||||
/resources/frontend_client/embed.html
|
||||
/resources/frontend_client/embed-sdk.html
|
||||
/resources/frontend_client/index.html
|
||||
/resources/frontend_client/public.html
|
||||
/resources/embedding-sdk
|
||||
@@ -130,8 +137,16 @@ modules/drivers/*/.lsp/*
|
||||
|
||||
# jar downloader
|
||||
/jars/
|
||||
|
||||
# metabot
|
||||
llm-payloads
|
||||
|
||||
/bin/bb
|
||||
|
||||
.aider*
|
||||
/config.yml
|
||||
CLAUDE.local.md
|
||||
|
||||
.eslintcache
|
||||
|
||||
/logs
|
||||
|
||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 17 KiB |