mirror of
https://github.com/LiteyukiStudio/LiteyukiBot.git
synced 2025-07-18 02:50:33 +00:00
Compare commits
955 Commits
Author | SHA1 | Date | |
---|---|---|---|
5566e9294f | |||
ae464ed3ea | |||
add5174e93 | |||
fe85f1e612 | |||
efb13340f0 | |||
56996ef082 | |||
fec96e694d | |||
a4e423168c | |||
20eb1809f1 | |||
66c88d8a30 | |||
7aaa589a51 | |||
84133b2f27 | |||
1de7d81693 | |||
4cbf043547 | |||
7d755581cb | |||
b634352c95 | |||
1d35ab21f8 | |||
7a006bc6fd | |||
26c9cb7e35 | |||
fc017c8255 | |||
908812a3d9 | |||
6c7d073cb1 | |||
8677286bd4 | |||
232ffcf714 | |||
6871bc0d22 | |||
641c16ee7a | |||
75c67bdffc | |||
3a60450358 | |||
7b97210a31 | |||
d97145ee5e | |||
bc3a4355c3 | |||
d835a32683 | |||
aedea1acb9 | |||
3bce8325c1 | |||
d1c1320963 | |||
317e07eb71 | |||
37749ae15e | |||
f94c10de61 | |||
5ccef735be | |||
262002b49a | |||
40c6ba6d9e | |||
60093b562b | |||
30880ec13b | |||
cc1d82312a | |||
efca13d397 | |||
3a8c09d6db | |||
cc1bb8e5e4 | |||
93c17b6026 | |||
fd3f6272f1 | |||
4d87a3c0b7 | |||
86f47ee411 | |||
1d6b8d60f3 | |||
3890704045 | |||
b0761e9873 | |||
291314de93 | |||
fd835e9406 | |||
d681c5645a | |||
d0619f1fe8 | |||
b022a364e3 | |||
df00c61dd8 | |||
94a021bab0 | |||
6b20e9eae0 | |||
0a35a3c6f8 | |||
2e75c7bc65 | |||
3341505715 | |||
bdde9c45fd | |||
7bf94a15c8 | |||
4510477026 | |||
86e50e369b | |||
796fc6f233 | |||
80c6875567 | |||
ab89cd1c72 | |||
5e454bc971 | |||
70bfb0fcee | |||
13b95c2732 | |||
ef5866343d | |||
d5ccd105a2 | |||
20ad8dc53f | |||
de9c91d8bd | |||
6b64a0c379 | |||
f117da7ff3 | |||
f548a07230 | |||
e2e53c21fa | |||
3eaf23a56b | |||
4a5dd1f727 | |||
c2cb416b4e | |||
5cd528d5e9 | |||
980fca650b | |||
9c525141f6 | |||
3d218a0e8d | |||
db385f597b | |||
98a9d6413a | |||
a77f97fd4b | |||
e6ea1b700f | |||
596f4d06ea | |||
8e3d3b3b5d | |||
a34ad87e01 | |||
6c4c7f34cd | |||
0c859957b4 | |||
fbb9ed82ee | |||
b469c9420e | |||
aa4d930cc4 | |||
76be748160 | |||
a9dd37b8a5 | |||
5900d621f2 | |||
7442a3651b | |||
413f438689 | |||
1fc4999b09 | |||
975446a096 | |||
98cdd2f4b8 | |||
c0beec0429 | |||
614d78b3fa | |||
24b0f345e4 | |||
0ae10aa1b2 | |||
9fe7478840 | |||
efca0bc7b3 | |||
50c5e99b98 | |||
7415efcc90 | |||
5bb4584e6a | |||
795a6f3f76 | |||
fa74e08514 | |||
e6cf6e0c68 | |||
6789c16773 | |||
cdea0f8563 | |||
9df55671ac | |||
d96c6f13c1 | |||
bce1bf8704 | |||
8eb626b8da | |||
e6505d335b | |||
c8cb341afb | |||
e99cb88b13 | |||
78c3e299d0 | |||
23338437e9 | |||
f95899aebd | |||
5df10c66b6 | |||
811d1594cd | |||
c162208638 | |||
679d6597d8 | |||
f402799f28 | |||
60542d7426 | |||
db1fb58717 | |||
7d5675ec97 | |||
d8c50752f7 | |||
c674b837bb | |||
d867996072 | |||
7ef36c6933 | |||
982aae4dbf | |||
b5d3c6aaa8 | |||
5537bc32df | |||
5c0c723c5d | |||
0ed3b307d9 | |||
53a603d4ee | |||
fbf906bea7 | |||
a87e8bc3e8 | |||
a16a67dbc9 | |||
4c2231feb5 | |||
3932dd60da | |||
3c6380cb82 | |||
2612f99f35 | |||
0b4b9a6241 | |||
2d100885ee | |||
cb335720b7 | |||
dc8ad30b84 | |||
09e00652c3 | |||
b5b15c82f8 | |||
72e71124b8 | |||
d2be2acc95 | |||
d95614e960 | |||
dad9482d7a | |||
fff5d09ad9 | |||
e6ffd1fcc0 | |||
a97747b7c4 | |||
1921dcd023 | |||
18af1d00bd | |||
30cdc1da23 | |||
bb84958ce4 | |||
44de3fd00a | |||
39b1920532 | |||
aa591ec29e | |||
310c3f065d | |||
2311ef82c3 | |||
b4b931fc95 | |||
d1b887fcaa | |||
5a2990770c | |||
1d0f0a2539 | |||
dbc4d83b08 | |||
da905d21bd | |||
7d91079500 | |||
81a006a308 | |||
be59e241c6 | |||
e493139d85 | |||
1f59ec2ef9 | |||
20d05f609d | |||
0f9683de89 | |||
c805db3371 | |||
58d0d12c1f | |||
359683dbae | |||
94cab8b743 | |||
837447b6e4 | |||
ad52eade07 | |||
9cae3edb6b | |||
0860b61ccd | |||
d125c52b50 | |||
d485e095ae | |||
499caca7e3 | |||
83a2d36209 | |||
8b77ced05e | |||
49a9617f08 | |||
06aa919d9b | |||
77b77c285b | |||
bdc32b26fe | |||
736125f4ee | |||
89cb75f105 | |||
34a6261f27 | |||
ae18bfaee1 | |||
8510b0ed3f | |||
967f1a0e5b | |||
6c1fc62ef1 | |||
433c6b3b85 | |||
ee1ae5a071 | |||
49a15d512e | |||
fd1d73cc32 | |||
29c2aa9404 | |||
0ec1195930 | |||
d7a625bedb | |||
3854376210 | |||
5253d0e515 | |||
3bc7fa82b1 | |||
7d98d5819d | |||
8316c0ff63 | |||
315b8c91e5 | |||
405eb10a8a | |||
c3072e93c7 | |||
ae34ff622d | |||
d2704818d9 | |||
2ab4184314 | |||
9aade6599c | |||
2f87b06c83 | |||
8bb3f15bd9 | |||
7f198c83b5 | |||
f70c75e9c4 | |||
be5a4b270d | |||
50c0216435 | |||
4910de74fd | |||
f12b6854b7 | |||
b0b61fbaf7 | |||
7c0b0df6ed | |||
cb3ee4b72f | |||
3a3ef4d6ae | |||
9b3dea840e | |||
ca89fa7efd | |||
4705eac79c | |||
ebe0c5bcbb | |||
93c287bbd9 | |||
0defb00ede | |||
81c1d0286d | |||
fb25005bd5 | |||
2eb5aae23f | |||
a7d0560932 | |||
391f112bb3 | |||
bc8d13ba8a | |||
e8ec2ee28a | |||
b6c8fcbccd | |||
71476560e4 | |||
aa2d182840 | |||
4bf8512a7d | |||
a3a31a2c94 | |||
9ed4c1abb1 | |||
a9c6ea0452 | |||
9e2bbe2e5c | |||
598bff8c49 | |||
eb7c8300fa | |||
287ab63091 | |||
0c942d9806 | |||
237789e0d4 | |||
e656fa6a48 | |||
6dcb085b53 | |||
55a427e344 | |||
43eef20b71 | |||
b8fdb4146e | |||
cdbede7135 | |||
85a3a9ad52 | |||
943e0c2665 | |||
fd4d680e87 | |||
0b763135c9 | |||
832cc2ec44 | |||
3160b4be69 | |||
775596b5bf | |||
84782a92d8 | |||
6e817111cb | |||
cd8d631348 | |||
af37e61d05 | |||
803b65e08e | |||
aa9abde63a | |||
9c35abc6e2 | |||
1af95a15aa | |||
d2b693b1e0 | |||
b05bbf2f19 | |||
37ed3b0824 | |||
b56ec5ce38 | |||
1fb3f6cd58 | |||
1dfe1a5819 | |||
5d194b8ebe | |||
78810d2ca8 | |||
87d4202ed3 | |||
1d0b18291e | |||
16df5706ff | |||
1b24157f08 | |||
8ba50b7bd6 | |||
502ccb46bb | |||
fcbc410f1a | |||
85a7c28a3a | |||
7bd0da9316 | |||
212c338fcd | |||
137270b886 | |||
079b940d8e | |||
e396db67ce | |||
f37b469ab9 | |||
0a3363ebce | |||
53291822c0 | |||
5f5dcc7f99 | |||
9d27abfe04 | |||
4b4f030fe3 | |||
d5b0f947e0 | |||
9e6372185f | |||
0e125f7c81 | |||
a3ea422ec3 | |||
8d78e643e0 | |||
aa9cae7008 | |||
48085a946d | |||
8e27f6b9b0 | |||
f980e77a4a | |||
01798f7b11 | |||
03057c8ef9 | |||
ee851116d8 | |||
d367903946 | |||
66ade9efc6 | |||
ff41e72378 | |||
169f1645a4 | |||
c3914b2b15 | |||
b356524a9e | |||
85a13251a5 | |||
0417805e46 | |||
d3f1e35a12 | |||
ff585ac7c2 | |||
1b692dd13f | |||
dd00e6ecec | |||
222250bc41 | |||
c36e706731 | |||
adc9b76688 | |||
2e3ea96972 | |||
9b07d41f86 | |||
65ad377099 | |||
a61357f4e2 | |||
60403b2a4f | |||
624afa57ba | |||
36a39e1ed7 | |||
4a872c3435 | |||
90b9d1af1e | |||
551ca06ea7 | |||
61c0cf2c2d | |||
e801a99f67 | |||
beebfe7deb | |||
32e1963d5a | |||
facf5bedb1 | |||
035d43fb18 | |||
0d5f9fee52 | |||
3cb03fa4dc | |||
47ef3f2a49 | |||
8568c7bb99 | |||
02cf058552 | |||
c9157f0e2c | |||
83325e63ea | |||
37b8d969b1 | |||
298bdc7b8c | |||
81a191f8ba | |||
c3fc5d429b | |||
b08c934c78 | |||
1b1ddbdd8d | |||
0d16d53cb7 | |||
6c39ed8ab5 | |||
2f8999b5ad | |||
7107d03b72 | |||
3bd40e7271 | |||
8ace3e68f4 | |||
f69feb1def | |||
9fb423d5e0 | |||
e9df67a661 | |||
b6871ea13a | |||
cb84a7d0d9 | |||
25f7540f86 | |||
c29a3fd6d4 | |||
ab48396db9 | |||
51982b63c3 | |||
2b537d27ec | |||
16930e96aa | |||
d63ba4943a | |||
5d22f20ce3 | |||
2451849fd6 | |||
61680d9e87 | |||
850dd75822 | |||
6ba983fae3 | |||
ca34f9c2a1 | |||
0fb5b84392 | |||
39a9c39924 | |||
13692228c6 | |||
f22f4d229d | |||
97dbf42a4d | |||
041a219151 | |||
c137f2f916 | |||
6ef3b09ec9 | |||
263b78e995 | |||
0d87848a7e | |||
44ad0832ba | |||
93ced26e07 | |||
363daf6251 | |||
a6b1d1c9e0 | |||
576d8c23b3 | |||
c232c6e5f6 | |||
5d6ae52157 | |||
01e6256ed4 | |||
dbc114a529 | |||
4d77af8f0c | |||
c36a925bb5 | |||
605dd035d4 | |||
7526ae13d7 | |||
0eb41f70d2 | |||
a4c7ee738c | |||
8d4602c40d | |||
bb20d9623d | |||
73cc28d1cf | |||
ae54cd923c | |||
9d3c9a7d70 | |||
92a4274be7 | |||
4800b3f46c | |||
cce593b2f4 | |||
c491642713 | |||
5b4dd638a4 | |||
8440952167 | |||
4e4227e204 | |||
effb01d43c | |||
28d730a2ca | |||
0bd135a5c9 | |||
5522391942 | |||
7576355e95 | |||
c9e518f2ed | |||
593cf2407b | |||
bdb4c76d70 | |||
7cce805d39 | |||
b9d3ecc15d | |||
ec5eae08f7 | |||
c1edf31577 | |||
5262c04e46 | |||
8b01943d14 | |||
35823be13e | |||
4162ea33ff | |||
1787ef4db7 | |||
38b13611c9 | |||
52fa143e75 | |||
89047a0c8a | |||
9fbded7d6a | |||
c657781599 | |||
ecbe1ff79e | |||
d6811ab9b3 | |||
d45170db3e | |||
6e63768c71 | |||
1424bc2cf6 | |||
051fe3d15d | |||
fcae485071 | |||
2e9a7fdf94 | |||
570d7e18a4 | |||
8ac53970a3 | |||
dd3e108e10 | |||
c29bd81ffb | |||
a1173e4d84 | |||
d877e30a05 | |||
33ad54090d | |||
83ee6cfdbd | |||
f48971a0c4 | |||
a4b71aa73c | |||
4b7df662e8 | |||
4cd7b6718b | |||
ac2a94dda0 | |||
de7e65b32a | |||
1b283261c3 | |||
39cbfc1baa | |||
e563f18d31 | |||
1d03b3f28f | |||
ae0025a203 | |||
b5bd7acb7f | |||
657e7e52ac | |||
d6341c88cd | |||
bdb1191f9e | |||
3b29b67c0b | |||
cc43e53c4b | |||
a25c900d49 | |||
206651da94 | |||
be28116a98 | |||
4cdf29557c | |||
62928e47eb | |||
9b50b719d9 | |||
def60bf298 | |||
6496b6e463 | |||
6ce4c972a0 | |||
70e3c9968a | |||
074882f092 | |||
c2b3018908 | |||
96c85d9dca | |||
e15aafd781 | |||
9e17b84a5d | |||
c66d470166 | |||
4deb7d11a1 | |||
6f069f83d4 | |||
fa53df1e8a | |||
ba17f9d159 | |||
b558b51601 | |||
3ea0acd48b | |||
c171873fa6 | |||
1ccf94883a | |||
b26f8e0d24 | |||
5bc2725d1b | |||
8e06244311 | |||
0f35613e50 | |||
4cfad0b5ca | |||
c2593e71c0 | |||
bb331232ca | |||
96e8293bf4 | |||
e13464cb7c | |||
c5f8fbe86d | |||
8667706377 | |||
86e47ab226 | |||
10c383d66a | |||
4c65a308d6 | |||
246e43317f | |||
974b97b744 | |||
c914ddc0ee | |||
6509b293db | |||
a72eeb4c3f | |||
309397b72c | |||
077658c68d | |||
322ad19889 | |||
ab9d3d3d3e | |||
06a109d2b5 | |||
351743068a | |||
4e6532ff0d | |||
eaf57f2c33 | |||
7abdac7c9c | |||
002df66878 | |||
251bfaf410 | |||
24722447da | |||
90e7a90bcf | |||
6d3d3fc52c | |||
e843d790b1 | |||
c90ac1d21a | |||
041ceb81d8 | |||
c6f2a29320 | |||
0532d7592e | |||
f9fe1922d4 | |||
88b5b55062 | |||
afe501a06d | |||
43dfc9a940 | |||
7fbfafe2db | |||
f22f8f772a | |||
205b69e5cb | |||
75a4d1fdcb | |||
b3aa5c9e02 | |||
38b496d800 | |||
d2bb672f65 | |||
6c267c6072 | |||
598260895c | |||
e02dfdf5d6 | |||
154b342057 | |||
b8375013a3 | |||
5913528d32 | |||
773137591f | |||
8fa0470187 | |||
bf768b6cb5 | |||
9b8c38cac0 | |||
1f96372196 | |||
148d671b5d | |||
61d91ea0a9 | |||
f9317802f4 | |||
8809459f1b | |||
8f906f2d12 | |||
269dd5ced2 | |||
c063c69dea | |||
d43fe327c2 | |||
d80c4a7c90 | |||
4d274df6b2 | |||
431ebb59c2 | |||
3713bf397c | |||
86c7b70e63 | |||
9cfdd375ca | |||
c4e00e3402 | |||
93e1a0ff77 | |||
f69844717f | |||
5100ca6c77 | |||
857e58d635 | |||
bb9b8a1ced | |||
b240d75552 | |||
0a1d96c434 | |||
fe2ca8b05b | |||
bfb5cf2cf0 | |||
a6408a3397 | |||
5db29c7e2c | |||
a38e2b887c | |||
4a8ddaba2d | |||
e1879bbebd | |||
6b51b5fe9d | |||
acfc70ea50 | |||
fb495d34d5 | |||
af038cb789 | |||
53bc6df30f | |||
ece71ca1e7 | |||
a0079da01b | |||
bd5f6c5205 | |||
9687ddb842 | |||
ae19113141 | |||
8b55156da9 | |||
34ba5ffde3 | |||
e948b9e94e | |||
e3ec25790f | |||
6ea3b2c1e2 | |||
1a930dc604 | |||
e0982f3a24 | |||
18d9ac3249 | |||
7585a5473d | |||
4dd3b4aedc | |||
5a9e8449cc | |||
62a2755ecf | |||
6e66c95487 | |||
5c1170f6fb | |||
dc83d6b469 | |||
46715e17aa | |||
2e4013e948 | |||
b284e52203 | |||
391a183402 | |||
6722eeffa9 | |||
2cfd0de8e3 | |||
778bcf7623 | |||
0fcde73178 | |||
8a0f25b5b0 | |||
0e47e3c163 | |||
0e02af59ca | |||
c4db4dc6a6 | |||
016fe3ef72 | |||
0d3361dc99 | |||
79d8063b5d | |||
7d0b9662f4 | |||
afbcad3a1c | |||
15a329029d | |||
190e7ebdea | |||
65dcf36fe7 | |||
e2779bdfd7 | |||
87061fb5cb | |||
50b851a2c4 | |||
6a4c88a6ba | |||
185b1d8a21 | |||
7046c0d10e | |||
83cd164a45 | |||
33dd2f104d | |||
58278fa735 | |||
f9e5742821 | |||
d37442bc9d | |||
79451ac24f | |||
38f658edf9 | |||
db0542279b | |||
23353a3673 | |||
e0dc840197 | |||
f2fda7f92e | |||
cd0812af42 | |||
6f207a54aa | |||
aaebccf7ab | |||
655fb0999a | |||
c400eae7c8 | |||
3fba4c78dc | |||
9346144f0e | |||
edc86990a7 | |||
83692ffd55 | |||
8e1ec22679 | |||
29867dd187 | |||
0f9b8fcca8 | |||
195c98ddd2 | |||
6e521497db | |||
64ce2a2971 | |||
2781c8bdfb | |||
c45061a95a | |||
16c1ba440c | |||
e271059720 | |||
9743868cce | |||
72742d805c | |||
08564b3ac6 | |||
a76bc3de92 | |||
be0b5e6de1 | |||
bc856b4aa9 | |||
468a534d85 | |||
9bfe173f92 | |||
26a15229cf | |||
a9426ca48f | |||
844f04d555 | |||
731f07e062 | |||
1b3d82ebe2 | |||
b275a646ac | |||
90e059af32 | |||
321f19953d | |||
110b0cfc21 | |||
d9a32328b2 | |||
71faffaa44 | |||
edc0a16cad | |||
c5d2c040fe | |||
813f1c2ded | |||
b965d4d005 | |||
d0c5385534 | |||
eaae8ceaad | |||
ad543dd738 | |||
7df870e65d | |||
263b28b2f9 | |||
4c60f09d94 | |||
86e6397fa7 | |||
6c41a36d8e | |||
955d9f6d62 | |||
14fb96fec2 | |||
e7765a4513 | |||
7e302922c5 | |||
209d636919 | |||
55ea08cf11 | |||
e58e853445 | |||
e97bd0a50b | |||
31f266bf21 | |||
b611ec1714 | |||
4e549af1c9 | |||
54cc57a2b2 | |||
e43cb0ab07 | |||
c1ba64e7c3 | |||
19308ffc53 | |||
6a03003d41 | |||
0e7e731080 | |||
1993b46750 | |||
7ee18c4334 | |||
00166e0ff3 | |||
b43a5827c9 | |||
1619504059 | |||
80a61a6eed | |||
7c551aecb2 | |||
3065122059 | |||
d3f3ee6dfa | |||
d3fce1f145 | |||
83468af6c7 | |||
9365aec559 | |||
9315af3dfd | |||
41e389d690 | |||
c80919ff1e | |||
f446308e2a | |||
724e13180c | |||
2ad2bb4182 | |||
76359ba83e | |||
d8efa08d2f | |||
b87e150e34 | |||
9f3a451b6d | |||
41ee427040 | |||
93569fcd99 | |||
807e552f8a | |||
84e2223dbb | |||
f9e61fd184 | |||
c8851bd696 | |||
9b2b0a7c7d | |||
c15c604752 | |||
65866488c6 | |||
392376248d | |||
d20699ee0f | |||
a5f9247b32 | |||
dd30b64004 | |||
aed63c34c9 | |||
9cf05fd8fd | |||
6a49a70481 | |||
205a28eb56 | |||
f23567194c | |||
bb17d2949a | |||
9e0b065566 | |||
6dffb0f581 | |||
2e37bd546b | |||
37b1346361 | |||
7cecfd1053 | |||
de75849cc3 | |||
edafffcbb5 | |||
ea35147938 | |||
86add474f4 | |||
6c02bfc783 | |||
dcae427c60 | |||
47f00c48c5 | |||
7db0617a5b | |||
19d79d356d | |||
57a302a71e | |||
bff728b7f1 | |||
1e0ebe0d30 | |||
42248dbc71 | |||
d0318c47d3 | |||
388946e56b | |||
b24489ae80 | |||
acb7a752de | |||
16b7347ca3 | |||
8763dfbe85 | |||
3a1e1b6b92 | |||
0b0e63f1d5 | |||
602636520e | |||
1f3231c0b4 | |||
f9ee8c0aed | |||
41b2b13442 | |||
58b756eb67 | |||
e18b9b5317 | |||
d602467b80 | |||
58ebf6efea | |||
7633ab444c | |||
e1a3e9a16c | |||
4ff78d0a6f | |||
7f7a66d639 | |||
1d268e6f97 | |||
97d936f9be | |||
f3e45c895d | |||
fafdbea96c | |||
70cabc2383 | |||
d44b5ea143 | |||
0ac374f5df | |||
a8f6a25369 | |||
1bbd1dd234 | |||
0880623930 | |||
8a8e9c62ab | |||
c5d850ac13 | |||
8eb693aee9 | |||
570a46a840 | |||
6e23542296 | |||
f53aa6aa23 | |||
7baaaebef8 | |||
630b6dc0ce | |||
aaf4a752f7 | |||
adcbc79c1a | |||
b95c2b2e7e | |||
58ab62c03b | |||
7bd1b36ec9 | |||
c7a2ebb4ea | |||
75795a5b13 | |||
505dfe3254 | |||
9594c6163f | |||
f6ee13c263 | |||
f15bd985af | |||
e78a3cdab6 | |||
cf2ba6fe3b | |||
6edad57470 | |||
90216c1a60 | |||
1d352d1fce | |||
0552cdfd05 | |||
980c8e6ee4 | |||
bf51f5a83b | |||
e22fadcf44 | |||
0bdd2d9b1d | |||
bd29df4f67 | |||
4b6226dfd7 | |||
fca93a7c66 | |||
76ce54f68b | |||
e5fd1ce9ae | |||
3932366955 | |||
423ba84908 | |||
5d7c201018 | |||
ac234544a3 | |||
58e603e1ad | |||
90c9ef31a1 | |||
ecbe06a9e8 | |||
0e17762427 | |||
04fc9c3dd7 | |||
eff60d8294 | |||
ee55a9b9e9 | |||
365b2fcba2 | |||
475506273d | |||
e9d2a1fe86 | |||
c2e43fff7a | |||
45c3bf3a5e | |||
d6c7c292d4 | |||
2eb60b3e1b | |||
d4a8aa1f87 | |||
615c7e6681 | |||
23b13595b0 | |||
e85292fdec | |||
573716e24e | |||
ede65d91a1 | |||
987b00d2ad | |||
172f45208f | |||
91b14d568c | |||
581aa7d6cc | |||
cc70a8ab2c | |||
4bfed64586 | |||
788bca7113 | |||
bb27eea0c2 | |||
d239a8a63d | |||
d87bd6c3b2 | |||
d66fd31a4a | |||
9d950a89ba | |||
98634c1f4c | |||
beb6f63199 | |||
45f9afb73c | |||
ccef8ca125 | |||
5a929d3e99 | |||
c6f65d544f | |||
66e18a9c8d | |||
81089523a1 | |||
0e996c07df | |||
fab5be70b3 | |||
71bd9ab000 | |||
de0c073c26 | |||
ca0bfe0181 | |||
4f20089e57 | |||
500c68c6d5 | |||
a0e8bd36c9 | |||
96d7763c7d | |||
ca2c5b0911 | |||
bcc5cb77ad | |||
1aacceecf0 | |||
0bd415961c | |||
367b8a5e5d | |||
0b4217b592 | |||
5737b75d26 | |||
73b593ff98 | |||
2711d8844b | |||
933979ceaa | |||
59506fcc76 | |||
a3d60fb435 | |||
e24c5c912e | |||
ca997f727a | |||
c4b1cb15be | |||
49bf677da5 | |||
3657e6b93b | |||
db900a17d6 | |||
d8a25c6ba5 | |||
71cd7e6250 | |||
a1f99b74cf | |||
79f6d50e82 | |||
14d9f041ce | |||
2b8cb2afb6 | |||
8a1c981666 | |||
fdefedf288 | |||
e351465d97 | |||
ab5dc2200a | |||
0bf56f79f1 | |||
edf390ff43 | |||
15c751b1c8 | |||
9585910623 | |||
d739c4cde6 | |||
3adc265876 | |||
51cb1a87b8 | |||
9e9f6e4ad6 | |||
d1795f0ca8 | |||
433ecf39ee | |||
e7c29c1597 | |||
8303514fa0 | |||
a3f63e383d | |||
12231d08a8 |
21
.github/workflows/liteyuki-pypi-publish.yaml
vendored
Normal file
21
.github/workflows/liteyuki-pypi-publish.yaml
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
name: Liteyuki PyPI Publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
liteyuki-pypi-publish:
|
||||||
|
name: upload release to PyPI (Nightly)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: pdm-project/setup-pdm@v3
|
||||||
|
|
||||||
|
- name: Publish package distributions to PyPI
|
||||||
|
run: pdm publish
|
38
.github/workflows/pytest.yaml
vendored
Normal file
38
.github/workflows/pytest.yaml
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
name: Pytest API Testing
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "v7" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "v7" ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Pytes-API-Testing:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup uv
|
||||||
|
uses: astral-sh/setup-uv@v6
|
||||||
|
with:
|
||||||
|
version: "latest"
|
||||||
|
|
||||||
|
- name: Test with pytest
|
||||||
|
run: |
|
||||||
|
uv run pytest --junitxml=report/report.xml
|
||||||
|
|
||||||
|
- name: Archive Pytest test report
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: SuperTest-test-report
|
||||||
|
path: report
|
||||||
|
|
||||||
|
- name: Upload Pytest report to GitHub
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Pytest-test-report
|
||||||
|
path: report
|
33
.gitignore
vendored
33
.gitignore
vendored
@ -1,12 +1,27 @@
|
|||||||
|
# python and toolchains
|
||||||
|
.mypy_cache/
|
||||||
|
__pycache__/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
# idea
|
# idea
|
||||||
plugin/
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
|
||||||
# config
|
# platform
|
||||||
config.yml
|
# macOS
|
||||||
|
**/.DS_Store
|
||||||
|
# windows
|
||||||
|
Thumbs.db
|
||||||
|
# linux
|
||||||
|
|
||||||
# external plugins
|
# development
|
||||||
/plugins/
|
.env
|
||||||
|
.env.*
|
||||||
# pyc/pyo
|
plugins/
|
||||||
**/*.pyc
|
data/
|
||||||
**/*.pyo
|
configs/
|
||||||
|
config.yaml
|
||||||
|
config-dev.yaml
|
||||||
|
config-prod.yaml
|
1
.python-version
Normal file
1
.python-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.12
|
16
Dockerfile
Normal file
16
Dockerfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
FROM python:3.12-alpine
|
||||||
|
|
||||||
|
WORKDIR /liteyukibot
|
||||||
|
|
||||||
|
COPY main.py .
|
||||||
|
COPY pyproject.toml .
|
||||||
|
COPY liteyukibot/ .
|
||||||
|
COPY uv.lock .
|
||||||
|
|
||||||
|
RUN pip install uv
|
||||||
|
|
||||||
|
ENV UV_COMPILE_BYTECODE=1
|
||||||
|
|
||||||
|
RUN uv venv --python 3.12 && uv sync
|
||||||
|
|
||||||
|
CMD [".venv/bin/python3", "main.py"]
|
42
LISENCE
Normal file
42
LISENCE
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
LSO License
|
||||||
|
LiteyukiStudio Open Source License
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Copyright © 2025 Liteyuki Studio & Snowykami
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Any individual or organization that obtains a copy of this software is hereby granted, free of charge, the relevant rights under this license agreement.
|
||||||
|
These rights include, but are not limited to, the right to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the software.
|
||||||
|
|
||||||
|
This software and its related documentation files (hereinafter referred to as "this software". The "software" includes user manuals, technical documents, API documentation, sample code, etc.) are released in an open - source form on the Internet or other media platforms under this license agreement.
|
||||||
|
Anyone has the right to obtain a copy of this software through proper channels and distribute and/or use it in accordance with this license agreement.
|
||||||
|
|
||||||
|
In case of a conflict with other open - source or non - open - source licenses,
|
||||||
|
unless otherwise specifically stated, all conflicting parts shall be subject to this open - source license agreement.
|
||||||
|
The conflicting parts mainly include:
|
||||||
|
1. Principles of commerciality or profitability
|
||||||
|
2. Legal liability
|
||||||
|
3. Licensed ways of publication and distribution
|
||||||
|
|
||||||
|
During the process of software distribution and dissemination through media or their media exchanges,
|
||||||
|
this license agreement shall be retained by default and distributed and redistributed in the same way. If the distributed project does not include this license agreement, the project can still continue to use this license agreement without additional addition.
|
||||||
|
|
||||||
|
When processing or re - processing the software and its copies for profit purposes,
|
||||||
|
if this license agreement is used, the individual or organization to which the re - processed software belongs can decide on its own to change, add, or delete non - essential license terms.
|
||||||
|
The essential license terms include:
|
||||||
|
1. Distribution of rights and their scope of application
|
||||||
|
2. Disclaimer clause and its final interpretation
|
||||||
|
3. Copyright statement and its legal handling
|
||||||
|
|
||||||
|
However, when obtaining a copy of the software, the following points should still be noted:
|
||||||
|
- The above copyright notice and this license notice must be included in the software copy, and the software and its copies must be used in the same form as the original.
|
||||||
|
- When using the software, the copy must be presented publicly under the same license agreement. The software copy shall not be used for external profit under a non - original license agreement without the permission of the original author.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
The software is provided "as is" without any warranty of any kind, either express or implied,
|
||||||
|
including but not limited to the warranty of merchantability and non - infringement for specific purposes.
|
||||||
|
|
||||||
|
In any case, the author or copyright owner shall not be liable for any claims, damages, or other liabilities arising from the use of the software, whether in contract litigation, infringement litigation, or other forms of litigation. The author and its copyright owner have the right to refuse compensation for any losses caused by the user for personal reasons.
|
130
README.md
130
README.md
@ -1,80 +1,80 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://ks.liteyuki.icu:809/static/img/liteyuki_icon.png" style="width: 30%; margin-top:10%;" alt="a">
|
|
||||||
|
[//]: # (<img src="https://cdn.liteyuki.org/logos/bot.svg" style="align-content: center; width: 50%; margin-top:10%;" alt="a">)
|
||||||
|
[![][banner]][liteyuki-link]
|
||||||
|
<h2><a href="https://bot.liteyuki.org"> <span style="color: #a2d8f4">轻雪</span> <span style="color: #d0e9ff">7</span></a></h2>
|
||||||
|
<h4> <span style="color: #a2d8f4">✨ 轻量,高效,易于扩展✨</span></h4>
|
||||||
|
|
||||||
|
[![][Liteyuki7.0]][liteyuki-link]
|
||||||
|
[![][Python3.12+]][python-link]
|
||||||
|
[![][Usage]][usage-link]
|
||||||
|
[![][Repo]][repo-link]
|
||||||
|
[![][Github]][github-link]
|
||||||
|
[![][LiteyukiLab]][liteyukilab-link]
|
||||||
|

|
||||||
|
|
||||||
|
**👇所有内容请访问👇**
|
||||||
|
[bot.liteyuki.org](https://bot.liteyuki.org)
|
||||||
</div>
|
</div>
|
||||||
<div align=center>
|
|
||||||
<h2>
|
|
||||||
<font color="#d0e9ff">
|
|
||||||
轻雪
|
|
||||||
</font>
|
|
||||||
<font color="#a2d8f4">
|
|
||||||
6.0
|
|
||||||
</font>
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div align=center><h4>轻量,高效,易于扩展</h4></div>
|
|
||||||
|
|
||||||
- 基于[Nonebot2]("https://github.com/nonebot/nonebot2"),有良好的生态支持
|
> 受限的自由才是真正的自由
|
||||||
- 集成了上一代轻雪的优点和~~缺点~~
|
|
||||||
- 支持一切Onebot标准通信,后续会支持更多的平台
|
|
||||||
|
|
||||||
## 手动安装和部署
|
## 关于
|
||||||
|
开发中
|
||||||
|
访问[轻雪7.0](https://bot.liteyuki.org)主页获取更多信息
|
||||||
|
|
||||||
1. 安装`Git`和`Python3.10+`后,使用命令`git clone https://github.com/snowykami/LiteyukiBot` 克隆项目至本地。
|
## 特点及优势
|
||||||
一定要安装Git,Bot自带功能需要git支持
|
|
||||||
2. 切换到轻雪目录,使用`pip install -r requirements.txt`安装依赖
|
|
||||||
|
|
||||||
3. `python main.py`启动!
|
- 化繁为简, 加速开发
|
||||||
|
- 轻量级,快速启动
|
||||||
|
- 模块化设计,易于扩展
|
||||||
|
|
||||||
## 一键部署脚本(复制到本地保存执行)
|
## 服务及支持(敬请期待)
|
||||||
|
- 提供Liteyuki Cloud官方的容器化托管服务(SaaS),无需担心服务器问题
|
||||||
|
|
||||||
#### 提前部署好`Python3.10+`环境和`Git`环境
|
|
||||||
|
|
||||||
#### Windows
|
[Liteyuki7.0]: https://img.shields.io/badge/Liteyuki-7.0-blue?style=for-the-badge
|
||||||
|
|
||||||
|
[Python3.12+]: https://img.shields.io/badge/Python-3.12+-blue?style=for-the-badge
|
||||||
|
|
||||||
|
[Usage]: https://img.shields.io/badge/主页-文档-blue?style=for-the-badge
|
||||||
|
|
||||||
|
[Repo]: https://img.shields.io/badge/官方托管-仓库-blue?style=for-the-badge
|
||||||
|
|
||||||
|
[Github]: https://img.shields.io/badge/Github-仓库-blue?style=for-the-badge
|
||||||
|
|
||||||
|
[LiteyukiLab]: https://img.shields.io/badge/轻雪社区-官方-blue?style=for-the-badge
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[python-link]:https://www.python.org/
|
||||||
|
|
||||||
|
[usage-link]:https://bot.liteyuki.org/
|
||||||
|
|
||||||
|
[liteyuki-link]:https://bot.liteyuki.org/
|
||||||
|
|
||||||
|
[repo-link]:https://git.liteyuki.org/bot/app
|
||||||
|
|
||||||
|
[github-link]:https://github.com/LiteyukiStudio/LiteyukiBot
|
||||||
|
|
||||||
|
[liteyukilab-link]:https://lab.liteyuki.org/@LiteyukiBot
|
||||||
|
|
||||||
|
[banner]: https://socialify.git.ci/LiteyukiStudio/LiteyukiBot/image?description=1&forks=1&issues=1&Plus&pulls=1&stargazers=1&theme=Auto&logo=https%3a%2f%2fcdn.liteyuki.org%2flogos%2fbot.svg
|
||||||
|
|
||||||
|
## 开发环境配置
|
||||||
|
|
||||||
|
1. 项目使用uv进行包管理,你也可以使用uv进行环境管理,[安装uv](https://docs.astral.sh/uv/#installation)
|
||||||
|
|
||||||
|
2. 进入项目目录使用uv同步环境和依赖
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chcp 65001
|
uv sync --all # 安装包括dev和prod的所有依赖
|
||||||
git clone https://github.com/snowykami/LiteyukiBot
|
|
||||||
cd LiteyukiBot
|
|
||||||
pip install -r requirements.txt
|
|
||||||
echo python3 main.py > start.bat
|
|
||||||
echo Install finished! Please run start.bat to start the bot!
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Linux
|
3. VSCode扩展
|
||||||
|
|
||||||
```bash
|
- Python
|
||||||
git clone https://github.com/snowykami/LiteyukiBot
|
- Mypy
|
||||||
cd LiteyukiBot
|
- Ruff
|
||||||
pip install -r requirements.txt
|
|
||||||
echo python3 main.py > start.sh
|
|
||||||
chmod +x start.sh
|
|
||||||
echo Install finished! Please run start.sh to start the bot!
|
|
||||||
```
|
|
||||||
|
|
||||||
## 注意事项
|
4. 环境变量指定ENVIRONMENT=dev或prod或其他,然后加载.env.{}文件,环境变量
|
||||||
|
|
||||||
- 尽可能不要去动配置文件,通过与bot交互进行配置即可,若仍然想自定义配置请在`config.yml`中修改
|
|
||||||
|
|
||||||
- 首次启动会提醒用户注册超级用户
|
|
||||||
|
|
||||||
- Bot会自动检测新版本,若出现新版本,可用`git pull`命令更新
|
|
||||||
|
|
||||||
### Onebot实现端配置
|
|
||||||
|
|
||||||
| 字段 | 参考值 | 说明 |
|
|
||||||
|----|-------------------------------|-------------------------|
|
|
||||||
| 协议 | 反向WebSocket | 轻雪使用反向ws协议进行通信,即轻雪作为服务端 |
|
|
||||||
| 地址 | ws://`host`:`port`/onebot/v11 | 地址取决于配置文件,默认为`20216`端口 |
|
|
||||||
|
|
||||||
### 推荐方案
|
|
||||||
1. 使用`Lagrange.Core`,`Lagrange.Core`支持多种协议
|
|
||||||
2. 云崽的`icqq-plugin`和`ws-plugin`进行通信
|
|
||||||
3. `Go-cqhttp`(目前已经半死不活了)
|
|
||||||
4. 人工实现的`Onebot`协议,自己整一个WebSocket客户端,看着QQ的消息,然后给轻雪传输数据
|
|
||||||
|
|
||||||
请先自行查阅文档,若有困难请联系相关开发者而不是Liteyuki的开发者
|
|
||||||
## 鸣谢
|
|
||||||
|
|
||||||
- html转图片使用的[kexue-z](https://github.com/kexue-z)的[nonebot-plugin-htmlrender](https://github.com/kexue-z/nonebot-plugin-htmlrender)插件的部分代码
|
|
||||||
- 重启方案用的[18870](https://github.com/18870)的[Nonebot-plugin-reboot](https://github.com/18870/nonebot-plugin-reboot)插件的部分代码
|
|
||||||
- Lagrange.Core的测试环境支持
|
|
0
cli/__main__.py
Normal file
0
cli/__main__.py
Normal file
@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Liteyuki Default",
|
|
||||||
"version": "1.0"
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Liteyuki Language Pack",
|
|
||||||
"version": "1.0"
|
|
||||||
}
|
|
12
docker-compose-dev.yaml
Normal file
12
docker-compose-dev.yaml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
services:
|
||||||
|
server:
|
||||||
|
container_name: liteyukibot
|
||||||
|
image: liteyukibot:v7
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- ./plugins:/liteyukibot/plugins
|
||||||
|
- ./data:/liteyukibot/data
|
||||||
|
- ./configs:/liteyukibot/configs
|
||||||
|
- ./config.yaml:/liteyukibot/config.yaml
|
||||||
|
ports:
|
||||||
|
- "8090:8080"
|
16
docker-compose-example.yaml
Normal file
16
docker-compose-example.yaml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
services:
|
||||||
|
liteyukibot:
|
||||||
|
container_name: bot
|
||||||
|
# Liteyuki latest: reg.liteyuki.org/bot/app:latest
|
||||||
|
# Liteyuki nightly: reg.liteyuki.org/bot/app:nightly
|
||||||
|
# GHCR latest: ghcr.io/liteyukistudio/bot-app:latest 暂未发布
|
||||||
|
# Docker Hub latest: docker.io/liteyukistudio/bot-app:latest 暂未发布
|
||||||
|
image: reg.liteyuki.org/bot/app:latest
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- ./configs:/liteyukibot/configs # 配置目录,包含配置文件
|
||||||
|
- ./data:/liteyukibot/data # 数据目录,包含下载器安装的插件目录
|
||||||
|
- ./plugins:/liteyukibot/plugins # 外部插件目录,插件开发者可用
|
||||||
|
- ./config.yaml:/liteyukibot/config.yaml # 配置文件,包含所有配置项
|
||||||
|
ports:
|
||||||
|
- "8090:8080"
|
7
liteyukibot/__init__.py
Normal file
7
liteyukibot/__init__.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from .daemon import Daemon
|
||||||
|
from .log import logger
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"Daemon",
|
||||||
|
"logger"
|
||||||
|
]
|
0
liteyukibot/adapter/__init__.py
Normal file
0
liteyukibot/adapter/__init__.py
Normal file
19
liteyukibot/asgi/__init__.py
Normal file
19
liteyukibot/asgi/__init__.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import uvicorn
|
||||||
|
from fastapi import FastAPI
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
def get_app() -> FastAPI:
|
||||||
|
"""获取 FastAPI 实例"""
|
||||||
|
return app
|
||||||
|
|
||||||
|
@app.get("/")
|
||||||
|
async def root():
|
||||||
|
return {"message": "Hello LiteyukiBot"}
|
||||||
|
|
||||||
|
|
||||||
|
async def run_app(**kwargs):
|
||||||
|
"""ASGI app 启动函数,在所有插件加载完后任务启动"""
|
||||||
|
config = uvicorn.Config(app, **kwargs, log_config=None)
|
||||||
|
server = uvicorn.Server(config)
|
||||||
|
await server.serve()
|
115
liteyukibot/config.py
Normal file
115
liteyukibot/config.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
import tomllib
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import yaml # type: ignore[import]
|
||||||
|
|
||||||
|
type RawConfig = dict[str, Any]
|
||||||
|
|
||||||
|
def load_from_yaml(file_path: str) -> RawConfig:
|
||||||
|
"""从yaml文件中加载配置并返回字典
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path (str): yaml文件路径
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, Any]: 配置字典
|
||||||
|
"""
|
||||||
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
|
return yaml.safe_load(file)
|
||||||
|
|
||||||
|
def load_from_json(file_path: str) -> RawConfig:
|
||||||
|
"""从json文件中加载配置并返回字典
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path (str): json文件路径
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, Any]: 配置字典
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
|
return json.load(file)
|
||||||
|
|
||||||
|
def load_from_toml(file_path: str) -> RawConfig:
|
||||||
|
"""从toml文件中加载配置并返回字典
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path (str): toml文件路径
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, Any]: 配置字典
|
||||||
|
"""
|
||||||
|
with open(file_path, "rb") as file:
|
||||||
|
return tomllib.load(file)
|
||||||
|
|
||||||
|
def merge_dicts(base: RawConfig, new: RawConfig) -> RawConfig:
|
||||||
|
"""递归合并两个字典
|
||||||
|
|
||||||
|
Args:
|
||||||
|
base (dict[str, Any]): 原始字典
|
||||||
|
new (dict[str, Any]): 新的字典
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, Any]: 合并后的字典
|
||||||
|
"""
|
||||||
|
for key, value in new.items():
|
||||||
|
if key in base and isinstance(base[key], dict) and isinstance(value, dict):
|
||||||
|
# 如果当前键对应的值是字典,则递归合并
|
||||||
|
base[key] = merge_dicts(base[key], value)
|
||||||
|
else:
|
||||||
|
# 否则直接更新值
|
||||||
|
base[key] = value
|
||||||
|
return base
|
||||||
|
|
||||||
|
def flatten_dict(d: RawConfig, parent_key: str = '', sep: str = '.') -> RawConfig:
|
||||||
|
"""将嵌套字典扁平化
|
||||||
|
|
||||||
|
Args:
|
||||||
|
d (dict[str, Any]): 嵌套字典
|
||||||
|
parent_key (str, optional): 父键名. 默认值为 ''
|
||||||
|
sep (str, optional): 分隔符. 默认值为 '.'
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict[str, Any]: 扁平化字典
|
||||||
|
|
||||||
|
Example:
|
||||||
|
input_dict = {
|
||||||
|
"server": {
|
||||||
|
"host": "localhost",
|
||||||
|
"port: 8080
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output_dict = flatten_dict(input_dict)
|
||||||
|
output_dict = {
|
||||||
|
"server.host": "localhost",
|
||||||
|
"server.port": 8080
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
items: list[tuple[str, Any]] = []
|
||||||
|
for k, v in d.items():
|
||||||
|
new_key = f"{parent_key}{sep}{k}" if parent_key else k
|
||||||
|
if isinstance(v, dict):
|
||||||
|
items.extend(flatten_dict(v, new_key, sep=sep).items())
|
||||||
|
else:
|
||||||
|
items.append((new_key, v))
|
||||||
|
return dict(items)
|
||||||
|
|
||||||
|
def load_from_dir(dir_path: str) -> RawConfig:
|
||||||
|
"""从目录中加载配置文件
|
||||||
|
|
||||||
|
Args:
|
||||||
|
dir_path (str): 目录路径
|
||||||
|
"""
|
||||||
|
config: RawConfig = {}
|
||||||
|
for file_name in os.listdir(dir_path):
|
||||||
|
if file_name.endswith(".yaml") or file_name.endswith(".yml"):
|
||||||
|
config = merge_dicts(config, load_from_yaml(os.path.join(dir_path, file_name)) or {})
|
||||||
|
elif file_name.endswith(".json"):
|
||||||
|
config = merge_dicts(config, load_from_json(os.path.join(dir_path, file_name)) or {})
|
||||||
|
elif file_name.endswith(".toml"):
|
||||||
|
config = merge_dicts(config, load_from_toml(os.path.join(dir_path, file_name)) or {})
|
||||||
|
|
||||||
|
return config
|
15
liteyukibot/context/__init__.py
Normal file
15
liteyukibot/context/__init__.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
class Context:
|
||||||
|
def __init__(self):
|
||||||
|
self._context = {}
|
||||||
|
|
||||||
|
def set(self, key, value):
|
||||||
|
self._context[key] = value
|
||||||
|
|
||||||
|
def get(self, key):
|
||||||
|
return self._context.get(key)
|
||||||
|
|
||||||
|
def clear(self):
|
||||||
|
self._context.clear()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"Context({self._context})"
|
0
liteyukibot/context/bot.py
Normal file
0
liteyukibot/context/bot.py
Normal file
0
liteyukibot/context/message.py
Normal file
0
liteyukibot/context/message.py
Normal file
0
liteyukibot/context/session.py
Normal file
0
liteyukibot/context/session.py
Normal file
0
liteyukibot/context/user.py
Normal file
0
liteyukibot/context/user.py
Normal file
71
liteyukibot/daemon.py
Normal file
71
liteyukibot/daemon.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import asyncio
|
||||||
|
from typing import Type
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
from .asgi import run_app
|
||||||
|
from .config import RawConfig, flatten_dict, load_from_dir, merge_dicts
|
||||||
|
from .log import logger, set_level
|
||||||
|
from .utils import pretty_format
|
||||||
|
|
||||||
|
|
||||||
|
class Daemon:
|
||||||
|
"""Liteyuki 的 守护进程
|
||||||
|
"""
|
||||||
|
def __init__(self, **kwargs: RawConfig):
|
||||||
|
"""Liteyuki Daemon Init
|
||||||
|
Args:
|
||||||
|
**kwargs: 其他配置项
|
||||||
|
"""
|
||||||
|
# 加载配置项
|
||||||
|
self.config: RawConfig = kwargs
|
||||||
|
# 获取配置文件目录
|
||||||
|
if isinstance(config_dir := kwargs.get("config_dir", None), str):
|
||||||
|
self.config = merge_dicts(self.config, load_from_dir(config_dir))
|
||||||
|
# 插入扁平化配置
|
||||||
|
self.config = merge_dicts(self.config, flatten_dict(self.config))
|
||||||
|
|
||||||
|
# 初始化日志
|
||||||
|
set_level(self.config.get("log_level", "INFO"))
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
"configs: %s" % pretty_format(self.config, indent=2)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def _run(self):
|
||||||
|
"""liteyukibot事件循环入口
|
||||||
|
"""
|
||||||
|
# load plugins
|
||||||
|
|
||||||
|
# run asgi app
|
||||||
|
asyncio.create_task(
|
||||||
|
run_app(
|
||||||
|
host=self.config.get("host", "127.0.0.1"),
|
||||||
|
port=self.config.get("port", 8080),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# 挂起
|
||||||
|
logger.info("Liteyuki Daemon is running...")
|
||||||
|
await asyncio.Event().wait()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Daemon入口函数
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
asyncio.run(self._run())
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
logger.info("Liteyuki Daemon is exiting...")
|
||||||
|
|
||||||
|
def bind_config[T: BaseModel](self, model: Type[T]) -> T:
|
||||||
|
"""将配置绑定到 Pydantic 模型,推荐使用`pydantic.Field`声明扁平化键字段名
|
||||||
|
|
||||||
|
Args:
|
||||||
|
model (Type[T]): Pydantic 模型类
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
T: 绑定后的模型实例
|
||||||
|
"""
|
||||||
|
if not issubclass(model, BaseModel):
|
||||||
|
raise TypeError("The provided model must be a subclass of BaseModel.")
|
||||||
|
return model(**self.config)
|
39
liteyukibot/log.py
Normal file
39
liteyukibot/log.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import inspect
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from yukilog import default_debug_and_trace_format, default_format, get_logger
|
||||||
|
|
||||||
|
logger = get_logger("INFO")
|
||||||
|
|
||||||
|
class LoguruHandler(logging.Handler):
|
||||||
|
def emit(self, record: logging.LogRecord):
|
||||||
|
try:
|
||||||
|
level = logger.level(record.levelname).name
|
||||||
|
except ValueError:
|
||||||
|
level = str(record.levelno)
|
||||||
|
|
||||||
|
frame, depth = inspect.currentframe(), 0
|
||||||
|
while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__):
|
||||||
|
frame = frame.f_back
|
||||||
|
depth += 1
|
||||||
|
|
||||||
|
logger.opt(depth=depth, exception=record.exc_info).log(
|
||||||
|
level, record.getMessage()
|
||||||
|
)
|
||||||
|
|
||||||
|
# 替换 logging 的全局日志器
|
||||||
|
root_logger = logging.getLogger()
|
||||||
|
root_logger.handlers = [LoguruHandler()] # 只保留 LoguruHandler
|
||||||
|
root_logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
|
def set_level(level: str):
|
||||||
|
"""设置日志级别
|
||||||
|
|
||||||
|
Args:
|
||||||
|
level (str): 日志级别
|
||||||
|
"""
|
||||||
|
logger.remove()
|
||||||
|
logger.add(sys.stdout, format=default_format if level not in ["DEBUG", "TRACE"] else default_debug_and_trace_format, level=level)
|
||||||
|
logging.getLogger().setLevel(level)
|
24
liteyukibot/utils/__init__.py
Normal file
24
liteyukibot/utils/__init__.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def pretty_print(obj: Any, indent: int=2) -> None:
|
||||||
|
"""
|
||||||
|
更好地打印对象
|
||||||
|
|
||||||
|
Args:
|
||||||
|
obj (Any): 要打印的对象
|
||||||
|
"""
|
||||||
|
print(json.dumps(obj, indent=indent, ensure_ascii=False))
|
||||||
|
|
||||||
|
def pretty_format(obj: Any, indent: int =2 ) -> str:
|
||||||
|
"""
|
||||||
|
更好地格式化对象
|
||||||
|
|
||||||
|
Args:
|
||||||
|
obj (Any): 要格式化的对象
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 格式化后的字符串
|
||||||
|
"""
|
||||||
|
return json.dumps(obj, indent=indent, ensure_ascii=False)
|
9
main.py
9
main.py
@ -1,6 +1,5 @@
|
|||||||
from src.liteyuki import *
|
from liteyukibot import Daemon, config
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
liteyuki = Liteyuki()
|
daemon = Daemon(**config.load_from_yaml("config.yaml") or {})
|
||||||
app = liteyuki.get_asgi()
|
daemon.run()
|
||||||
liteyuki.run(app="main:app")
|
|
||||||
|
56
pyproject.toml
Normal file
56
pyproject.toml
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
[project]
|
||||||
|
name = "liteyukibot"
|
||||||
|
version = "7.0.0"
|
||||||
|
description = "neo-liteyukibot is coming soon!"
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
dependencies = [
|
||||||
|
"fastapi>=0.115.12",
|
||||||
|
"hypercorn>=0.17.3",
|
||||||
|
"loguru>=0.7.3",
|
||||||
|
"pip>=25.1",
|
||||||
|
"pydantic>=2.11.3",
|
||||||
|
"pyyaml>=6.0.2",
|
||||||
|
"uvicorn>=0.34.2",
|
||||||
|
"yukilog>=0.1.1",
|
||||||
|
]
|
||||||
|
|
||||||
|
# 开发依赖
|
||||||
|
[dependency-groups]
|
||||||
|
dev = [
|
||||||
|
"mypy>=1.15.0",
|
||||||
|
"pytest>=8.3.5",
|
||||||
|
"ruff>=0.11.7",
|
||||||
|
]
|
||||||
|
|
||||||
|
# 辅助工具配置
|
||||||
|
[tool.ruff]
|
||||||
|
line-length = 140
|
||||||
|
src = ["liteyukibot", "cli", "main.py"]
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
select = ["I", "F", "E"]
|
||||||
|
|
||||||
|
|
||||||
|
# 构建相关
|
||||||
|
[build-system]
|
||||||
|
requires = ["pdm-backend >= 2.4.0"]
|
||||||
|
build-backend = "pdm.backend"
|
||||||
|
|
||||||
|
[tool.pdm.build]
|
||||||
|
includes = ["liteyukibot"]
|
||||||
|
|
||||||
|
|
||||||
|
# 索引和源
|
||||||
|
[[tool.uv.index]]
|
||||||
|
name = "liteyuki-pypi"
|
||||||
|
url = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi/simple"
|
||||||
|
publish-url = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi"
|
||||||
|
explicit = true
|
||||||
|
|
||||||
|
|
||||||
|
# 从轻雪源安装的包请在此标记
|
||||||
|
[tool.uv.sources]
|
||||||
|
yukilog = [
|
||||||
|
{ index = "liteyuki-pypi" },
|
||||||
|
]
|
2
pytest.ini
Normal file
2
pytest.ini
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[pytest]
|
||||||
|
testpaths = tests # 指定测试目录
|
@ -1 +0,0 @@
|
|||||||
nonebot2[fastapi]
|
|
@ -1,33 +0,0 @@
|
|||||||
import os
|
|
||||||
import yaml
|
|
||||||
from nonebot import logger
|
|
||||||
|
|
||||||
|
|
||||||
def load_config() -> dict[str, any]:
|
|
||||||
"""
|
|
||||||
Load config from config.yml
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
config = {
|
|
||||||
'host': '0.0.0.0',
|
|
||||||
'port': 20216,
|
|
||||||
'nickname': ['Liteyuki'],
|
|
||||||
'command_start': [''],
|
|
||||||
}
|
|
||||||
|
|
||||||
if not os.path.exists('config.yml'):
|
|
||||||
logger.warning('warn.config_file_not_found')
|
|
||||||
with open('config.yml', 'w', encoding='utf-8') as f:
|
|
||||||
f.write(yaml.dump(config, indent=4))
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
with open('config.yml', 'r', encoding='utf-8') as f:
|
|
||||||
config.update(yaml.load(f, Loader=yaml.FullLoader))
|
|
||||||
logger.success('success.config_loaded')
|
|
||||||
# 格式化后写入
|
|
||||||
with open('config.yml', 'w', encoding='utf-8') as f:
|
|
||||||
f.write(yaml.dump(config, indent=4))
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f'error.load_config: {e}')
|
|
||||||
|
|
||||||
return config
|
|
@ -1,46 +0,0 @@
|
|||||||
from typing import Any, Optional
|
|
||||||
from nonebot import DOTENV_TYPE
|
|
||||||
import nonebot
|
|
||||||
from nonebot import logger
|
|
||||||
from nonebot.adapters.onebot.v11 import Adapter as OnebotV11Adapter
|
|
||||||
from nonebot.adapters.onebot.v12 import Adapter as OnebotV12Adapter
|
|
||||||
|
|
||||||
from src.api.utils import load_config
|
|
||||||
|
|
||||||
app = None
|
|
||||||
adapters = [
|
|
||||||
OnebotV11Adapter,
|
|
||||||
OnebotV12Adapter
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Liteyuki:
|
|
||||||
def __init__(self, *, _env_file: Optional[DOTENV_TYPE] = None, **kwargs: Any):
|
|
||||||
print(
|
|
||||||
'\033[34m' + r''' __ ______ ________ ________ __ __ __ __ __ __ ______
|
|
||||||
/ | / |/ |/ |/ \ / |/ | / |/ | / |/ |
|
|
||||||
$$ | $$$$$$/ $$$$$$$$/ $$$$$$$$/ $$ \ /$$/ $$ | $$ |$$ | /$$/ $$$$$$/
|
|
||||||
$$ | $$ | $$ | $$ |__ $$ \/$$/ $$ | $$ |$$ |/$$/ $$ |
|
|
||||||
$$ | $$ | $$ | $$ | $$ $$/ $$ | $$ |$$ $$< $$ |
|
|
||||||
$$ | $$ | $$ | $$$$$/ $$$$/ $$ | $$ |$$$$$ \ $$ |
|
|
||||||
$$ |_____ _$$ |_ $$ | $$ |_____ $$ | $$ \__$$ |$$ |$$ \ _$$ |_
|
|
||||||
$$ |/ $$ | $$ | $$ | $$ | $$ $$/ $$ | $$ |/ $$ |
|
|
||||||
$$$$$$$$/ $$$$$$/ $$/ $$$$$$$$/ $$/ $$$$$$/ $$/ $$/ $$$$$$/ ''' + '\033[0m'
|
|
||||||
)
|
|
||||||
|
|
||||||
kwargs = load_config()
|
|
||||||
self.nonebot = nonebot
|
|
||||||
self.nonebot.init(_env_file=_env_file, **kwargs)
|
|
||||||
self.driver = self.nonebot.get_driver()
|
|
||||||
|
|
||||||
def run(self, *args, **kwargs):
|
|
||||||
for adapter in adapters:
|
|
||||||
self.driver.register_adapter(adapter)
|
|
||||||
self.nonebot.load_plugin('src.liteyuki_main')
|
|
||||||
self.nonebot.load_plugins('src/builtin')
|
|
||||||
self.nonebot.load_plugins('plugins')
|
|
||||||
# Todo: load from database
|
|
||||||
self.nonebot.run(*args, **kwargs)
|
|
||||||
|
|
||||||
def get_asgi(self):
|
|
||||||
return self.nonebot.get_asgi()
|
|
@ -1,16 +0,0 @@
|
|||||||
from nonebot import on_command
|
|
||||||
from nonebot.adapters.onebot.v11.event import MessageEvent
|
|
||||||
from nonebot.permission import SUPERUSER
|
|
||||||
import os
|
|
||||||
folders = ['plugins']
|
|
||||||
for folder in folders:
|
|
||||||
if not os.path.exists(folder):
|
|
||||||
os.makedirs(folder)
|
|
||||||
|
|
||||||
echo = on_command('echo', permission=SUPERUSER, priority=5)
|
|
||||||
|
|
||||||
|
|
||||||
@echo.handle()
|
|
||||||
async def _(event: MessageEvent):
|
|
||||||
print(event.get_message())
|
|
||||||
await echo.finish(event.get_message())
|
|
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
153
tests/test_config.py
Normal file
153
tests/test_config.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
import tempfile
|
||||||
|
|
||||||
|
from liteyukibot import config
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigModel(BaseModel):
|
||||||
|
name: str
|
||||||
|
version: int
|
||||||
|
server_host: str = Field(alias="server.host")
|
||||||
|
server_port: int = Field(alias="server.port")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_from_yaml():
|
||||||
|
"""测试从yaml文件路径加载配置项"""
|
||||||
|
yaml_content = """
|
||||||
|
name: LiteyukiBot
|
||||||
|
version: 7.0.0
|
||||||
|
"""
|
||||||
|
with tempfile.NamedTemporaryFile("w", delete=False, suffix=".yaml") as temp_file:
|
||||||
|
temp_file.write(yaml_content)
|
||||||
|
temp_file_path = temp_file.name
|
||||||
|
|
||||||
|
result = config.load_from_yaml(temp_file_path)
|
||||||
|
assert result["name"] == "LiteyukiBot"
|
||||||
|
assert result["version"] == "7.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_from_json():
|
||||||
|
"""测试从json文件路径加载配置"""
|
||||||
|
json_content = '{"name": "LiteyukiBot", "version": "7.0.0"}'
|
||||||
|
with tempfile.NamedTemporaryFile("w", delete=False, suffix=".json") as temp_file:
|
||||||
|
temp_file.write(json_content)
|
||||||
|
temp_file_path = temp_file.name
|
||||||
|
|
||||||
|
result = config.load_from_json(temp_file_path)
|
||||||
|
assert result["name"] == "LiteyukiBot"
|
||||||
|
assert result["version"] == "7.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_from_toml():
|
||||||
|
"""测试从toml文件路径加载配置"""
|
||||||
|
toml_content = """
|
||||||
|
[info]
|
||||||
|
name = "LiteyukiBot"
|
||||||
|
version = "7.0.0"
|
||||||
|
"""
|
||||||
|
with tempfile.NamedTemporaryFile("w", delete=False, suffix=".toml") as temp_file:
|
||||||
|
temp_file.write(toml_content)
|
||||||
|
temp_file_path = temp_file.name
|
||||||
|
|
||||||
|
result = config.load_from_toml(temp_file_path)
|
||||||
|
assert result["info"]["name"] == "LiteyukiBot"
|
||||||
|
assert result["info"]["version"] == "7.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
def test_flatten_dict():
|
||||||
|
"""测试扁平化字典"""
|
||||||
|
nested_dict = {
|
||||||
|
"name": "LiteyukiBot",
|
||||||
|
"version": {
|
||||||
|
"major": 7,
|
||||||
|
"minor": 0,
|
||||||
|
"patch": 0
|
||||||
|
},
|
||||||
|
"server": {
|
||||||
|
"db": {
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 8080
|
||||||
|
},
|
||||||
|
"tags": ["tag1", "tag2"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flat_dict = config.flatten_dict(nested_dict)
|
||||||
|
assert flat_dict["name"] == "LiteyukiBot"
|
||||||
|
assert flat_dict["version.major"] == 7
|
||||||
|
assert flat_dict["version.minor"] == 0
|
||||||
|
assert flat_dict["version.patch"] == 0
|
||||||
|
assert flat_dict["server.db.host"] == "localhost"
|
||||||
|
assert flat_dict["server.db.port"] == 8080
|
||||||
|
assert flat_dict["server.tags"] == ["tag1", "tag2"]
|
||||||
|
|
||||||
|
def test_merge_to_config():
|
||||||
|
"""测试合并配置"""
|
||||||
|
old_config = {
|
||||||
|
"name": "LiteyukiBot",
|
||||||
|
"version": 7,
|
||||||
|
"server": {
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 8080
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.merge_to_config(old_config)
|
||||||
|
assert config.config["name"] == "LiteyukiBot"
|
||||||
|
new_config = {
|
||||||
|
"version": 8,
|
||||||
|
"server": {
|
||||||
|
"port": 9090
|
||||||
|
},
|
||||||
|
"new_key": "new_value"
|
||||||
|
}
|
||||||
|
|
||||||
|
config.merge_to_config(new_config)
|
||||||
|
|
||||||
|
# config
|
||||||
|
assert config.config["name"] == "LiteyukiBot"
|
||||||
|
assert config.config["version"] == 8
|
||||||
|
assert config.config["server"]["host"] == "localhost"
|
||||||
|
assert config.config["server"]["port"] == 9090
|
||||||
|
assert config.config["new_key"] == "new_value"
|
||||||
|
# test flatten_config
|
||||||
|
assert config.flat_config["name"] == "LiteyukiBot"
|
||||||
|
assert config.flat_config["version"] == 8
|
||||||
|
assert config.flat_config["server.host"] == "localhost"
|
||||||
|
assert config.flat_config["server.port"] == 9090
|
||||||
|
assert config.flat_config["new_key"] == "new_value"
|
||||||
|
|
||||||
|
def test_get_config():
|
||||||
|
"""测试获取配置项"""
|
||||||
|
config_data = {
|
||||||
|
"name": "LiteyukiBot",
|
||||||
|
"version": 7,
|
||||||
|
"server": {
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 8080
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.merge_to_config(config_data)
|
||||||
|
assert config.get("name") == "LiteyukiBot"
|
||||||
|
assert config.get("version") == 7
|
||||||
|
assert config.get("server.host") == "localhost"
|
||||||
|
assert config.get("server.port") == 8080
|
||||||
|
assert config.get("non_existent_key", default="default_value") == "default_value"
|
||||||
|
assert config.get("non_existent_key", default=42) == 42
|
||||||
|
|
||||||
|
|
||||||
|
def test_bind():
|
||||||
|
"""测试配置项绑定到模型"""
|
||||||
|
config_data = {
|
||||||
|
"name": "LiteyukiBot",
|
||||||
|
"version": 7,
|
||||||
|
"server": {
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 8080
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.merge_to_config(config_data)
|
||||||
|
bound_model = config.bind(ConfigModel)
|
||||||
|
assert bound_model.name == "LiteyukiBot"
|
||||||
|
assert bound_model.version == 7
|
||||||
|
assert bound_model.server_host == "localhost"
|
||||||
|
assert bound_model.server_port == 8080
|
0
tests/test_hypercorn.py
Normal file
0
tests/test_hypercorn.py
Normal file
12
tests/test_log.py
Normal file
12
tests/test_log.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from liteyukibot import log, logger
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_level():
|
||||||
|
logger.info("Testing logger level")
|
||||||
|
logger.debug("Debug message")
|
||||||
|
log.set_level("DEBUG")
|
||||||
|
logger.debug("Debug message after level change")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test_set_level()
|
||||||
|
print("测试完成,你应该只会看到一次debug信息")
|
469
uv.lock
generated
Normal file
469
uv.lock
generated
Normal file
@ -0,0 +1,469 @@
|
|||||||
|
version = 1
|
||||||
|
revision = 1
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "annotated-types"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyio"
|
||||||
|
version = "4.9.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "idna" },
|
||||||
|
{ name = "sniffio" },
|
||||||
|
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "click"
|
||||||
|
version = "8.1.8"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorama"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fastapi"
|
||||||
|
version = "0.115.12"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "pydantic" },
|
||||||
|
{ name = "starlette" },
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "h11"
|
||||||
|
version = "0.16.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "h2"
|
||||||
|
version = "4.2.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "hpack" },
|
||||||
|
{ name = "hyperframe" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/1b/38/d7f80fd13e6582fb8e0df8c9a653dcc02b03ca34f4d72f34869298c5baf8/h2-4.2.0.tar.gz", hash = "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f", size = 2150682 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl", hash = "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0", size = 60957 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hpack"
|
||||||
|
version = "4.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hypercorn"
|
||||||
|
version = "0.17.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "h11" },
|
||||||
|
{ name = "h2" },
|
||||||
|
{ name = "priority" },
|
||||||
|
{ name = "wsproto" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/7e/3a/df6c27642e0dcb7aff688ca4be982f0fb5d89f2afd3096dc75347c16140f/hypercorn-0.17.3.tar.gz", hash = "sha256:1b37802ee3ac52d2d85270700d565787ab16cf19e1462ccfa9f089ca17574165", size = 44409 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl", hash = "sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547", size = 61742 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyperframe"
|
||||||
|
version = "6.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "idna"
|
||||||
|
version = "3.10"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iniconfig"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "liteyukibot"
|
||||||
|
version = "7.0.0"
|
||||||
|
source = { editable = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "fastapi" },
|
||||||
|
{ name = "hypercorn" },
|
||||||
|
{ name = "loguru" },
|
||||||
|
{ name = "pip" },
|
||||||
|
{ name = "pydantic" },
|
||||||
|
{ name = "pyyaml" },
|
||||||
|
{ name = "uvicorn" },
|
||||||
|
{ name = "yukilog" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dev-dependencies]
|
||||||
|
dev = [
|
||||||
|
{ name = "mypy" },
|
||||||
|
{ name = "pytest" },
|
||||||
|
{ name = "ruff" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [
|
||||||
|
{ name = "fastapi", specifier = ">=0.115.12" },
|
||||||
|
{ name = "hypercorn", specifier = ">=0.17.3" },
|
||||||
|
{ name = "loguru", specifier = ">=0.7.3" },
|
||||||
|
{ name = "pip", specifier = ">=25.1" },
|
||||||
|
{ name = "pydantic", specifier = ">=2.11.3" },
|
||||||
|
{ name = "pyyaml", specifier = ">=6.0.2" },
|
||||||
|
{ name = "uvicorn", specifier = ">=0.34.2" },
|
||||||
|
{ name = "yukilog", specifier = ">=0.1.1", index = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi/simple" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata.requires-dev]
|
||||||
|
dev = [
|
||||||
|
{ name = "mypy", specifier = ">=1.15.0" },
|
||||||
|
{ name = "pytest", specifier = ">=8.3.5" },
|
||||||
|
{ name = "ruff", specifier = ">=0.11.7" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "loguru"
|
||||||
|
version = "0.7.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
|
{ name = "win32-setctime", marker = "sys_platform == 'win32'" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mypy"
|
||||||
|
version = "1.15.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "mypy-extensions" },
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mypy-extensions"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "packaging"
|
||||||
|
version = "25.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pip"
|
||||||
|
version = "25.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/79/67/c06f625e2968c417052b3a4a0eef40656d5d4d44033e57b40ec474af1d28/pip-25.1.tar.gz", hash = "sha256:272bdd1289f80165e9070a4f881e8f9e1001bbb50378561d1af20e49bf5a2200", size = 1939624 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e0/f0/8a2806114cd36e282823fd4d8e88e3b94dc943c2569c350d0c826a49db38/pip-25.1-py3-none-any.whl", hash = "sha256:13b4aa0aaad055020a11bec8a1c2a70a2b2d080e12d89b962266029fff0a16ba", size = 1824948 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pluggy"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "priority"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f5/3c/eb7c35f4dcede96fca1842dac5f4f5d15511aa4b52f3a961219e68ae9204/priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0", size = 24792 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa", size = 8946 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pydantic"
|
||||||
|
version = "2.11.3"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "annotated-types" },
|
||||||
|
{ name = "pydantic-core" },
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
{ name = "typing-inspection" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pydantic-core"
|
||||||
|
version = "2.33.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest"
|
||||||
|
version = "8.3.5"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
|
{ name = "iniconfig" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pluggy" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyyaml"
|
||||||
|
version = "6.0.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruff"
|
||||||
|
version = "0.11.7"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/5b/89/6f9c9674818ac2e9cc2f2b35b704b7768656e6b7c139064fc7ba8fbc99f1/ruff-0.11.7.tar.gz", hash = "sha256:655089ad3224070736dc32844fde783454f8558e71f501cb207485fe4eee23d4", size = 4054861 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b4/ec/21927cb906c5614b786d1621dba405e3d44f6e473872e6df5d1a6bca0455/ruff-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:d29e909d9a8d02f928d72ab7837b5cbc450a5bdf578ab9ebee3263d0a525091c", size = 10245403 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/af/fec85b6c2c725bcb062a354dd7cbc1eed53c33ff3aa665165871c9c16ddf/ruff-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dd1fb86b168ae349fb01dd497d83537b2c5541fe0626e70c786427dd8363aaee", size = 11007166 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/31/9a/2d0d260a58e81f388800343a45898fd8df73c608b8261c370058b675319a/ruff-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3d7d2e140a6fbbc09033bce65bd7ea29d6a0adeb90b8430262fbacd58c38ada", size = 10378076 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c2/c4/9b09b45051404d2e7dd6d9dbcbabaa5ab0093f9febcae664876a77b9ad53/ruff-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4809df77de390a1c2077d9b7945d82f44b95d19ceccf0c287c56e4dc9b91ca64", size = 10557138 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/5e/5e/f62a1b6669870a591ed7db771c332fabb30f83c967f376b05e7c91bccd14/ruff-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3a0c2e169e6b545f8e2dba185eabbd9db4f08880032e75aa0e285a6d3f48201", size = 10095726 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/45/59/a7aa8e716f4cbe07c3500a391e58c52caf665bb242bf8be42c62adef649c/ruff-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49b888200a320dd96a68e86736cf531d6afba03e4f6cf098401406a257fcf3d6", size = 11672265 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/e3/101a8b707481f37aca5f0fcc3e42932fa38b51add87bfbd8e41ab14adb24/ruff-0.11.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2b19cdb9cf7dae00d5ee2e7c013540cdc3b31c4f281f1dacb5a799d610e90db4", size = 12331418 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/dd/71/037f76cbe712f5cbc7b852e4916cd3cf32301a30351818d32ab71580d1c0/ruff-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64e0ee994c9e326b43539d133a36a455dbaab477bc84fe7bfbd528abe2f05c1e", size = 11794506 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ca/de/e450b6bab1fc60ef263ef8fcda077fb4977601184877dce1c59109356084/ruff-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bad82052311479a5865f52c76ecee5d468a58ba44fb23ee15079f17dd4c8fd63", size = 13939084 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502", size = 11450441 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/7d/1b048eb460517ff9accd78bca0fa6ae61df2b276010538e586f834f5e402/ruff-0.11.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:169027e31c52c0e36c44ae9a9c7db35e505fee0b39f8d9fca7274a6305295a92", size = 10441060 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3a/57/8dc6ccfd8380e5ca3d13ff7591e8ba46a3b330323515a4996b991b10bd5d/ruff-0.11.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:305b93f9798aee582e91e34437810439acb28b5fc1fee6b8205c78c806845a94", size = 10058689 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/23/bf/20487561ed72654147817885559ba2aa705272d8b5dee7654d3ef2dbf912/ruff-0.11.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a681db041ef55550c371f9cd52a3cf17a0da4c75d6bd691092dfc38170ebc4b6", size = 11073703 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/9d/27/04f2db95f4ef73dccedd0c21daf9991cc3b7f29901a4362057b132075aa4/ruff-0.11.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:07f1496ad00a4a139f4de220b0c97da6d4c85e0e4aa9b2624167b7d4d44fd6b6", size = 11532822 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/72/43b123e4db52144c8add336581de52185097545981ff6e9e58a21861c250/ruff-0.11.7-py3-none-win32.whl", hash = "sha256:f25dfb853ad217e6e5f1924ae8a5b3f6709051a13e9dad18690de6c8ff299e26", size = 10362436 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/c5/a0/3e58cd76fdee53d5c8ce7a56d84540833f924ccdf2c7d657cb009e604d82/ruff-0.11.7-py3-none-win_amd64.whl", hash = "sha256:0a931d85959ceb77e92aea4bbedfded0a31534ce191252721128f77e5ae1f98a", size = 11566676 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/68/ca/69d7c7752bce162d1516e5592b1cc6b6668e9328c0d270609ddbeeadd7cf/ruff-0.11.7-py3-none-win_arm64.whl", hash = "sha256:778c1e5d6f9e91034142dfd06110534ca13220bfaad5c3735f6cb844654f6177", size = 10677936 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sniffio"
|
||||||
|
version = "1.3.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "starlette"
|
||||||
|
version = "0.46.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "anyio" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "4.13.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-inspection"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "typing-extensions" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uvicorn"
|
||||||
|
version = "0.34.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "click" },
|
||||||
|
{ name = "h11" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "win32-setctime"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wsproto"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "h11" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yukilog"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = { registry = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "loguru" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi/files/yukilog/1.0.11/yukilog-1.0.11.tar.gz", hash = "sha256:84d1fbb2825b2e9b2bffa00617ec4d6b7a4723f7a9b100a9500b1f419d04faad" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://git.liteyuki.org/api/packages/LiteyukiStudio/pypi/files/yukilog/1.0.11/yukilog-1.0.11-py3-none-any.whl", hash = "sha256:87aba342ee0b9fd51d2768eab7689bdc6e0a633d89055dcecca16168135013d8" },
|
||||||
|
]
|
Reference in New Issue
Block a user