Compare commits

...

89 Commits
v1.6 ... v2.1.0

Author SHA1 Message Date
f0ffdf096d Merge pull request 'Pycord support initial release' (#48) from dev into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m43s
Tests / test (3.9) (push) Successful in 1m3s
Reviewed-on: #48
2023-12-27 15:00:41 +02:00
e7555d3de1 Bump version to 2.1.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m8s
2023-12-27 13:46:10 +01:00
17f15aca5b Initial Pycord addition 2023-12-27 13:45:40 +01:00
73c3a1ff13 Update dependency black to v23.12.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m10s
Tests / test (3.11) (pull_request) Successful in 1m6s
Tests / test (3.8) (pull_request) Successful in 1m8s
Tests / test (3.9) (pull_request) Successful in 1m10s
2023-12-23 01:39:45 +02:00
bfa3d4f6e9 Update dependency mypy to v1.8.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m11s
Tests / test (3.11) (pull_request) Successful in 1m6s
Tests / test (3.8) (pull_request) Successful in 1m5s
Tests / test (3.9) (pull_request) Successful in 1m42s
2023-12-21 19:03:19 +02:00
3d10cbcb2f Update dependency isort to v5.13.2
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m15s
Tests / test (3.11) (pull_request) Successful in 1m11s
Tests / test (3.8) (pull_request) Successful in 1m5s
Tests / test (3.9) (pull_request) Successful in 1m7s
2023-12-13 23:11:44 +02:00
88f77e8494 Update dependency black to v23.12.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m3s
2023-12-12 08:44:33 +02:00
f5f62f20cc Update dependency types-ujson to v5.9.0.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m4s
2023-12-12 04:27:38 +02:00
45743bdb7e Update dependency pylint to v3.0.3
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m6s
Tests / test (3.11) (pull_request) Successful in 1m9s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m2s
2023-12-11 23:04:59 +02:00
8e1f746309 Update dependency isort to v5.13.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m9s
Tests / test (3.11) (pull_request) Successful in 1m6s
Tests / test (3.8) (pull_request) Successful in 1m7s
Tests / test (3.9) (pull_request) Successful in 1m3s
2023-12-11 22:00:00 +02:00
c4df7c6106 Update dependency ujson to ~=5.9.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m11s
Tests / test (3.11) (pull_request) Successful in 1m9s
Tests / test (3.8) (pull_request) Successful in 1m10s
Tests / test (3.9) (pull_request) Successful in 1m10s
2023-12-11 01:36:51 +02:00
5103333920 Renovate's main branch is now "dev"
All checks were successful
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m8s
Tests / test (3.8) (push) Successful in 1m6s
Tests / test (3.9) (push) Successful in 1m7s
2023-12-10 11:58:21 +01:00
df09a21aee Update dependency isort to v5.13.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m14s
Tests / test (3.11) (pull_request) Successful in 1m9s
Tests / test (3.8) (pull_request) Successful in 1m8s
Tests / test (3.9) (pull_request) Successful in 1m7s
Tests / test (3.10) (push) Successful in 1m11s
Tests / test (3.11) (push) Successful in 1m10s
Tests / test (3.8) (push) Successful in 1m5s
Tests / test (3.9) (push) Successful in 1m8s
2023-12-09 16:05:30 +02:00
1800ff4dc3 Update dependency pytest-asyncio to v0.23.2
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m6s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m7s
Tests / test (3.9) (pull_request) Successful in 1m1s
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m0s
Tests / test (3.9) (push) Successful in 1m1s
2023-12-04 10:14:13 +02:00
9557b1759b Update dependency pytest-asyncio to v0.23.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m6s
Tests / test (3.11) (pull_request) Successful in 1m16s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m51s
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m2s
2023-12-03 21:28:30 +02:00
a650039bc9 Update dependency tox to v4.11.4
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m3s
Tests / test (3.10) (push) Successful in 1m6s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m2s
2023-11-28 07:18:04 +02:00
a6a1f1cacc Update dependency mypy to v1.7.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m13s
Tests / test (3.8) (pull_request) Successful in 1m46s
Tests / test (3.9) (pull_request) Successful in 1m49s
Tests / test (3.10) (push) Successful in 3m17s
Tests / test (3.11) (push) Successful in 1m9s
Tests / test (3.8) (push) Successful in 3m4s
Tests / test (3.9) (push) Successful in 1m34s
2023-11-23 20:34:48 +02:00
c8d5a81a2c Update dependency mypy to v1.7.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m7s
Tests / test (3.11) (pull_request) Successful in 1m5s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m12s
Tests / test (3.10) (push) Successful in 1m29s
Tests / test (3.11) (push) Successful in 1m9s
Tests / test (3.8) (push) Successful in 1m18s
Tests / test (3.9) (push) Successful in 1m19s
2023-11-10 17:25:50 +02:00
c23326cd10 Update dependency black to v23.11.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m9s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m1s
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m0s
Tests / test (3.9) (push) Successful in 1m5s
2023-11-08 08:31:01 +02:00
e55916501d Update dependency pytest-asyncio to v0.22.0 (#30)
All checks were successful
Tests / test (3.10) (push) Successful in 1m2s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m2s
2023-10-31 11:06:27 +02:00
4acd61c5c9 Update dependency pytest-asyncio to v0.22.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m10s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m0s
Tests / test (3.9) (pull_request) Successful in 1m2s
2023-10-31 10:19:49 +02:00
ae28461f3b Experiment failed: caching disabled
All checks were successful
Tests / test (3.10) (push) Successful in 1m19s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 59s
2023-10-25 08:40:32 +03:00
b0a5d10d90 EOL fixed
Some checks failed
Tests / test (3.10) (push) Failing after 4m48s
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.11) (push) Has been cancelled
2023-10-25 08:35:28 +03:00
9784c10d13 Added caching for requirements/*.txt 2023-10-25 08:35:04 +03:00
b776b95047 Experiment: dependency caching
All checks were successful
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m0s
Tests / test (3.9) (push) Successful in 1m0s
2023-10-25 08:30:08 +03:00
f8936321e1 Update dependency pytest to v7.4.3
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m35s
Tests / test (3.11) (pull_request) Successful in 1m16s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m4s
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m7s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m3s
2023-10-24 23:24:10 +03:00
cb7cfd1f03 Update dependency black to v23.10.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m13s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m19s
Tests / test (3.9) (pull_request) Successful in 1m1s
Tests / test (3.10) (push) Successful in 1m14s
Tests / test (3.11) (push) Successful in 1m10s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m6s
2023-10-23 23:04:18 +03:00
563069926d Update dependency pylint to v3.0.2
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m12s
Tests / test (3.11) (pull_request) Successful in 1m8s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m7s
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m7s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m4s
2023-10-22 17:45:43 +03:00
ec95e89c5e Update dependency mypy to v1.6.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m5s
Tests / test (3.8) (pull_request) Successful in 1m3s
Tests / test (3.9) (pull_request) Successful in 1m4s
Tests / test (3.10) (push) Successful in 1m6s
Tests / test (3.11) (push) Successful in 1m9s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m6s
2023-10-18 08:51:17 +03:00
a02452c1ee Update dependency black to v23.10.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m11s
Tests / test (3.11) (pull_request) Successful in 1m4s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m5s
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m5s
2023-10-17 19:17:13 +03:00
bf3bcab8a2 Update dependency mypy to v1.6.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m11s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m6s
Tests / test (3.9) (pull_request) Successful in 1m5s
Tests / test (3.10) (push) Successful in 1m31s
Tests / test (3.11) (push) Successful in 1m3s
Tests / test (3.8) (push) Successful in 1m29s
Tests / test (3.9) (push) Successful in 1m5s
2023-10-10 20:44:54 +03:00
e8ea7accfa Update dependency pylint to v3.0.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m14s
Tests / test (3.11) (pull_request) Successful in 1m6s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m7s
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m4s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m1s
2023-10-05 23:55:07 +03:00
87c35a69d4 Update dependency pylint to v3
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m10s
Tests / test (3.11) (pull_request) Successful in 2m8s
Tests / test (3.8) (pull_request) Successful in 1m48s
Tests / test (3.9) (pull_request) Successful in 1m19s
Tests / test (3.10) (push) Successful in 1m50s
Tests / test (3.11) (push) Successful in 2m7s
Tests / test (3.8) (push) Successful in 1m26s
Tests / test (3.9) (push) Successful in 1m17s
2023-10-02 20:32:53 +03:00
083a91f20c Update dependency pylint to v2.17.7
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m2s
Tests / test (3.8) (pull_request) Successful in 1m5s
Tests / test (3.9) (pull_request) Successful in 1m5s
Tests / test (3.10) (push) Successful in 1m6s
Tests / test (3.11) (push) Successful in 1m3s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m4s
2023-10-01 01:11:50 +03:00
84fe3382ef Update dependency pylint to v2.17.6
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m9s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m28s
Tests / test (3.9) (pull_request) Successful in 1m14s
Tests / test (3.10) (push) Successful in 1m28s
Tests / test (3.11) (push) Successful in 1m4s
Tests / test (3.8) (push) Successful in 1m5s
Tests / test (3.9) (push) Successful in 1m9s
2023-09-25 15:03:19 +03:00
6baca46a9c Update dependency black to v23.9.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m2s
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m3s
2023-09-11 04:39:59 +03:00
0e3bf42c55 Update dependency black to v23.9.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m2s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m3s
Tests / test (3.10) (push) Successful in 1m5s
Tests / test (3.11) (push) Successful in 1m3s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m2s
2023-09-09 07:20:09 +03:00
0f5c3c5ed1 Update dependency tox to v4.11.3
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m4s
Tests / test (3.11) (pull_request) Successful in 1m1s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m2s
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m2s
2023-09-09 02:10:52 +03:00
f017082d16 Update dependency tox to v4.11.2
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m4s
Tests / test (3.11) (pull_request) Successful in 1m1s
Tests / test (3.8) (pull_request) Successful in 1m3s
Tests / test (3.9) (pull_request) Successful in 1m5s
Tests / test (3.10) (push) Successful in 1m6s
Tests / test (3.11) (push) Successful in 1m7s
Tests / test (3.8) (push) Successful in 1m9s
Tests / test (3.9) (push) Successful in 1m2s
2023-09-08 07:37:08 +03:00
015511f6ac Update dependency pytest to v7.4.2
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m2s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m6s
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m6s
Tests / test (3.9) (push) Successful in 1m6s
2023-09-07 22:20:37 +03:00
e35e643108 Update dependency build to v1.0.3
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m7s
Tests / test (3.11) (pull_request) Successful in 1m1s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m3s
Tests / test (3.10) (push) Successful in 1m5s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m3s
2023-09-07 03:46:59 +03:00
c02f43ff07 Update dependency pytest to v7.4.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m23s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m25s
Tests / test (3.10) (push) Successful in 1m7s
Tests / test (3.11) (push) Successful in 1m41s
Tests / test (3.8) (push) Successful in 1m7s
Tests / test (3.9) (push) Successful in 1m3s
2023-09-02 18:36:56 +03:00
5333d0be9f Update dependency build to v1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m22s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m9s
Tests / test (3.9) (pull_request) Successful in 1m4s
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m11s
Tests / test (3.8) (push) Successful in 1m7s
Tests / test (3.9) (push) Successful in 1m4s
2023-09-02 00:05:01 +03:00
29a6d7f739 Update dependency tox to v4.11.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m9s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m26s
Tests / test (3.9) (pull_request) Successful in 1m10s
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m7s
Tests / test (3.8) (push) Successful in 1m4s
Tests / test (3.9) (push) Successful in 1m3s
2023-09-01 23:02:51 +03:00
bb934e67ea Update dependency tox to v4.11.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 2m51s
Tests / test (3.11) (pull_request) Successful in 1m47s
Tests / test (3.8) (pull_request) Successful in 1m3s
Tests / test (3.9) (pull_request) Successful in 1m8s
Tests / test (3.10) (push) Successful in 1m13s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m7s
Tests / test (3.9) (push) Successful in 1m6s
2023-08-29 23:12:31 +03:00
7998d556f9 Update dependency tox to v4.10.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m8s
Tests / test (3.11) (pull_request) Successful in 1m3s
Tests / test (3.8) (pull_request) Successful in 1m0s
Tests / test (3.9) (pull_request) Successful in 1m3s
Tests / test (3.10) (push) Successful in 1m5s
Tests / test (3.11) (push) Successful in 1m0s
Tests / test (3.8) (push) Successful in 59s
Tests / test (3.9) (push) Successful in 1m2s
2023-08-21 20:47:16 +03:00
3d30ea3f46 Update dependency mypy to v1.5.1
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m2s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m3s
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m6s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m20s
2023-08-16 20:27:04 +03:00
97eaedb14a Update dependency tox to v4.9.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m5s
Tests / test (3.11) (pull_request) Successful in 1m0s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m6s
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Successful in 1m3s
Tests / test (3.9) (push) Successful in 1m2s
2023-08-16 18:23:05 +03:00
72eef216b5 Merge pull request 'Update dependency types-aiofiles to v23.2.0.0' (#6) from renovate/types-aiofiles-23.x into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m8s
Tests / test (3.8) (push) Successful in 1m8s
Tests / test (3.9) (push) Successful in 1m3s
Reviewed-on: #6
2023-08-16 16:24:12 +03:00
3c48a6b561 Update dependency types-aiofiles to v23.2.0.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m4s
Tests / test (3.11) (pull_request) Successful in 1m5s
Tests / test (3.8) (pull_request) Successful in 1m0s
Tests / test (3.9) (pull_request) Successful in 1m1s
2023-08-16 16:19:23 +03:00
b0f6d43b8b Update dependency tox to v4.8.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m11s
Tests / test (3.11) (pull_request) Successful in 1m11s
Tests / test (3.8) (pull_request) Successful in 1m2s
Tests / test (3.9) (pull_request) Successful in 1m10s
Tests / test (3.10) (push) Successful in 1m16s
Tests / test (3.11) (push) Successful in 1m5s
Tests / test (3.8) (push) Successful in 1m4s
Tests / test (3.9) (push) Successful in 1m7s
2023-08-12 22:09:00 +03:00
74db27487f Added build to dev dependencies
All checks were successful
Tests / test (3.10) (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m5s
Tests / test (3.9) (push) Successful in 1m6s
2023-08-10 21:47:21 +02:00
95b58e85a9 Changed aiofiles version
All checks were successful
Tests / test (3.10) (push) Successful in 1m25s
Tests / test (3.11) (push) Successful in 1m25s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m3s
2023-08-10 21:34:42 +02:00
83658af314 Merge pull request 'Update dependency mypy to v1.5.0' (#4) from renovate/mypy-1.x into main
All checks were successful
Tests / test (3.10) (push) Successful in 1m5s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m3s
Reviewed-on: #4
2023-08-10 17:18:04 +03:00
e9086c1582 Update dependency mypy to v1.5.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m4s
Tests / test (3.11) (pull_request) Successful in 1m0s
Tests / test (3.8) (pull_request) Successful in 1m4s
Tests / test (3.9) (pull_request) Successful in 1m2s
2023-08-10 16:40:48 +03:00
fdd534ba41 Update dependency aiofiles to ~=23.2.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m1s
Tests / test (3.11) (pull_request) Successful in 1m7s
Tests / test (3.8) (pull_request) Successful in 1m1s
Tests / test (3.9) (pull_request) Successful in 1m5s
Tests / test (3.10) (push) Successful in 1m3s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Successful in 59s
Tests / test (3.9) (push) Successful in 1m1s
2023-08-09 14:43:20 +03:00
9d97f8d4b2 Update dependency tox to v4.7.0
All checks were successful
Tests / test (3.10) (pull_request) Successful in 1m2s
Tests / test (3.11) (pull_request) Successful in 1m2s
Tests / test (3.8) (pull_request) Successful in 1m9s
Tests / test (3.9) (pull_request) Successful in 1m12s
Tests / test (3.10) (push) Successful in 1m5s
Tests / test (3.11) (push) Successful in 1m0s
Tests / test (3.8) (push) Successful in 1m0s
Tests / test (3.9) (push) Successful in 1m0s
2023-08-08 18:11:58 +03:00
0c06d2ed58 Fixed Renovate config
All checks were successful
Tests / test (3.10) (push) Successful in 1m1s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Successful in 1m6s
Tests / test (3.9) (push) Successful in 1m1s
2023-08-08 10:28:56 +02:00
245c747991 Update Renovate rules
All checks were successful
Tests / test (3.10) (push) Successful in 1m16s
Tests / test (3.11) (push) Successful in 1m4s
Tests / test (3.8) (push) Successful in 1m2s
Tests / test (3.9) (push) Successful in 1m9s
2023-08-07 12:16:56 +02:00
187187a8a2 Fixed tests workflow
All checks were successful
Tests / test (3.10) (push) Successful in 1m0s
Tests / test (3.11) (push) Successful in 1m2s
Tests / test (3.8) (push) Successful in 1m1s
Tests / test (3.9) (push) Successful in 1m30s
2023-08-07 11:40:50 +02:00
8d27f43cce Updated workflow 2023-08-07 11:24:48 +02:00
f181552fb8 Updated to 2.0.0 2023-08-07 11:21:49 +02:00
32b1acf4aa Updated to 0.2.2
All checks were successful
Tests / test (3.10) (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m13s
Tests / test (3.8) (push) Successful in 1m9s
Tests / test (3.9) (push) Successful in 1m1s
2023-08-06 22:00:14 +02:00
1c1c71d40b Fixed PyroClient.bot_locale 2023-08-06 21:59:48 +02:00
65838450ee Fixed typing of Dict
All checks were successful
Tests / test (3.10) (push) Successful in 1m9s
Tests / test (3.11) (push) Successful in 1m52s
Tests / test (3.8) (push) Successful in 1m23s
Tests / test (3.9) (push) Successful in 1m25s
2023-08-06 21:22:24 +02:00
3f39e07d04 Added coverage display 2023-08-06 21:21:55 +02:00
c5fdd60d13 Added container
Some checks failed
Tests / test (3.10) (push) Successful in 1m26s
Tests / test (3.11) (push) Successful in 1m1s
Tests / test (3.8) (push) Failing after 1m3s
Tests / test (3.9) (push) Successful in 1m11s
2023-08-06 21:11:06 +02:00
35fe69d2a8 Tried another Python versions set
Some checks reported warnings
Tests / test (3.11) (push) Has been cancelled
Tests / test (3.8) (push) Has been cancelled
Tests / test (3.9) (push) Has been cancelled
Tests / test (3.10) (push) Has been cancelled
2023-08-06 19:24:16 +02:00
3bb7ecca7e Updated python versions
Some checks failed
Tests / test (3.10.12) (push) Failing after 5s
Tests / test (3.11.3) (push) Failing after 5s
Tests / test (3.8.17) (push) Failing after 6s
Tests / test (3.9.17) (push) Failing after 4s
2023-08-06 19:14:44 +02:00
64aa2686ea Updated to 0.2.1
Some checks failed
Tests / test (3.10) (push) Failing after 55s
Tests / test (3.11) (push) Failing after 5s
Tests / test (3.8) (push) Failing after 6s
Tests / test (3.9) (push) Failing after 5s
2023-08-06 19:11:16 +02:00
461642a529 Added nested_set tests 2023-08-06 12:51:32 +02:00
e5c0f5c1d1 Added i18n tests 2023-08-06 12:51:23 +02:00
00b1058014 BotLocale now has default_locale 2023-08-06 12:51:06 +02:00
bc5be37ff1 locale is now Union[str, None] 2023-08-06 12:50:34 +02:00
7c756d7065 Switched versioning to semantic 2023-08-06 12:43:41 +02:00
3273b86b75 nested_set raises KeyError if not create_missing 2023-08-06 12:43:01 +02:00
783443e448 Changed imports 2023-08-06 12:42:37 +02:00
723cc40221 Fixed imports 2023-08-06 11:33:41 +02:00
b6537a50ae Changed path to tests/ 2023-08-06 02:08:02 +02:00
e508f37089 Added pytest to pyproject 2023-08-06 02:07:07 +02:00
d66bb9c93e Locale of _() now defaults to "en" 2023-08-06 01:44:51 +02:00
253c85985b Added some basic test 2023-08-06 01:25:32 +02:00
11d49fd476 Fixed escape_forward_slashes error 2023-08-06 01:25:08 +02:00
dc107ebdb3 Updated to 1.9 2023-07-26 14:12:13 +02:00
33c33d08e2 Allowed passing kwargs 2023-07-26 14:12:05 +02:00
295e77e403 Updated to 1.8 2023-07-03 10:57:00 +02:00
279a8e9d84 reports.chat_id can now be "owner" 2023-07-03 10:56:24 +02:00
ae374511cd Updated to 1.7 2023-06-30 10:32:16 +02:00
eb23d3e9b6 No more locations.locale in config 2023-06-30 10:31:49 +02:00
39 changed files with 806 additions and 109 deletions

View File

@@ -0,0 +1,32 @@
name: Tests
on:
push:
branches:
- main
tags-ignore:
- v*
pull_request:
jobs:
test:
runs-on: ubuntu-latest
container: catthehacker/ubuntu:act-latest
strategy:
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
env:
AGENT_TOOLSDIRECTORY: /opt/hostedtoolcache
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox tox-gh-actions
- name: Test with tox
run: tox

View File

@@ -3,6 +3,15 @@
"extends": [
"config:base"
],
"baseBranches": [
"dev"
],
"pip_requirements": {
"fileMatch": [
"requirements/.*\\.txt$"
],
"enabled": true
},
"packageRules": [
{
"matchUpdateTypes": [

View File

@@ -1,9 +0,0 @@
__name__ = "libbot"
__version__ = "1.6"
__license__ = "GPL3"
__author__ = "Profitroll"
from .__main__ import *
from . import sync
from . import i18n
from . import pyrogram

View File

@@ -1,15 +1,15 @@
[build-system]
requires = ["setuptools>=62.6,<66"]
requires = ["setuptools>=62.6", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "libbot"
version = "1.6"
dynamic = ["version", "dependencies", "optional-dependencies"]
authors = [{ name = "Profitroll" }]
description = "Universal bot library with functions needed for basic Discord/Telegram bot development."
readme = "README.md"
requires-python = ">=3.8"
license = { text = "GPL3" }
license = { file = "LICENSE" }
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
@@ -22,33 +22,46 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Utilities",
]
dependencies = ["aiofiles~=23.1.0"]
[project.optional-dependencies]
pycord = ["py-cord~=2.4.1"]
pyrogram = ["pyrogram~=2.0.106", "apscheduler~=3.10.1"]
speed = ["ujson~=5.8.0"]
[tool.setuptools.dynamic]
version = { attr = "libbot.__version__" }
dependencies = { file = "requirements/_.txt" }
[tool.setuptools.dynamic.optional-dependencies]
dev = { file = "requirements/dev.txt" }
pycord = { file = "requirements/pycord.txt" }
pyrogram = { file = "requirements/pyrogram.txt" }
speed = { file = "requirements/speed.txt" }
[project.urls]
Source = "https://git.end-play.xyz/profitroll/LibBotUniversal"
Documentation = "https://git.end-play.xyz/profitroll/LibBotUniversal/wiki"
Tracker = "https://git.end-play.xyz/profitroll/LibBotUniversal/issues"
[tool.setuptools]
packages = [
"libbot",
"libbot.sync",
"libbot.pyrogram",
"libbot.pyrogram.classes",
"libbot.i18n",
"libbot.i18n.sync",
"libbot.i18n.classes",
]
[tool.setuptools_scm]
[tool.setuptools.packages.find]
where = ["src"]
[tool.black]
target-version = ['py38', 'py39', 'py310', 'py311']
[tool.isort]
profile = "black"
[tool.pytest.ini_options]
minversion = "6.0"
python_files = ["test_*.py"]
pythonpath = "."
testpaths = ["tests"]
[tool.mypy]
namespace_packages = true
install_types = true
strict = true
show_error_codes = true
[tool.pylint.main]
extension-pkg-whitelist = ["ujson"]
py-version = 3.8
[tool.coverage.run]
source = ["libbot"]

1
requirements/_.txt Normal file
View File

@@ -0,0 +1 @@
aiofiles>=23.0.0

11
requirements/dev.txt Normal file
View File

@@ -0,0 +1,11 @@
black==23.12.1
build==1.0.3
isort==5.13.2
mypy==1.8.0
pylint==3.0.3
pytest-asyncio==0.23.2
pytest-cov==4.1.0
pytest==7.4.3
tox==4.11.4
types-aiofiles==23.2.0.0
types-ujson==5.9.0.0

2
requirements/pycord.txt Normal file
View File

@@ -0,0 +1,2 @@
apscheduler~=3.10.4
py-cord~=2.4.1

View File

@@ -0,0 +1,2 @@
apscheduler~=3.10.4
pyrogram~=2.0.106

1
requirements/speed.txt Normal file
View File

@@ -0,0 +1 @@
ujson~=5.9.0

View File

@@ -1,3 +0,0 @@
[metadata]
description_file=README.md
license_files=LICENSE

View File

@@ -1,4 +0,0 @@
from setuptools import setup
if __name__ == "__main__":
setup()

6
src/libbot/__init__.py Normal file
View File

@@ -0,0 +1,6 @@
__version__ = "2.1.0"
__license__ = "GPL3"
__author__ = "Profitroll"
from . import i18n, pycord, pyrogram, sync
from .__main__ import *

View File

@@ -35,6 +35,8 @@ async def json_write(data: Any, path: Union[str, Path]) -> None:
async with aiofiles.open(str(path), mode="w", encoding="utf-8") as f:
await f.write(
dumps(data, ensure_ascii=False, escape_forward_slashes=False, indent=4)
if hasattr(dumps, "escape_forward_slashes")
else dumps(data, ensure_ascii=False, indent=4)
)

View File

@@ -1,33 +1,37 @@
from os import listdir
from pathlib import Path
from typing import Any, Dict
from typing import Any, Dict, Union
from libbot import sync
from libbot.sync import config_get, json_read
import libbot
from libbot.i18n import sync
from libbot.i18n.classes.bot_locale import BotLocale
def _(key: str, *args: str, locale: str = sync.config_get("locale")) -> Any:
async def _(
key: str,
*args: str,
locale: Union[str, None] = "en",
locales_root: Union[str, Path] = Path("locale"),
) -> Any:
"""Get value of locale string
### Args:
* key (`str`): The last key of the locale's keys path
* *args (`list`): Path to key like: `dict[args][key]`
* locale (`str`): Locale to looked up in. Defaults to config's `"locale"` value
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locale (`Union[str, None]`): Locale to looked up in. Defaults to `"en"`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `Any`: Value of provided locale key. Is usually `str`, `dict` or `list`
"""
if locale is None:
locale = sync.config_get("locale")
locale = libbot.sync.config_get("locale") if locale is None else locale
try:
this_dict = json_read(
Path(f'{config_get("locale", "locations")}/{locale}.json')
)
this_dict = await libbot.json_read(Path(f"{locales_root}/{locale}.json"))
except FileNotFoundError:
try:
this_dict = json_read(
Path(f'{config_get("locale", "locations")}/{config_get("locale")}.json')
this_dict = await libbot.json_read(
Path(f'{locales_root}/{await libbot.config_get("locale")}.json')
)
except FileNotFoundError:
return f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"'
@@ -42,26 +46,27 @@ def _(key: str, *args: str, locale: str = sync.config_get("locale")) -> Any:
return f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"'
def in_all_locales(key: str, *args: str) -> list:
async def in_all_locales(
key: str, *args: str, locales_root: Union[str, Path] = Path("locale")
) -> list:
"""Get value of the provided key and path in all available locales
### Args:
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `list`: List of values in all locales
"""
output = []
files_locales = listdir(config_get("locale", "locations"))
files_locales = listdir(locales_root)
valid_locales = [".".join(entry.split(".")[:-1]) for entry in files_locales]
for lc in valid_locales:
try:
this_dict = json_read(
Path(f'{config_get("locale", "locations")}/{lc}.json')
)
this_dict = await libbot.json_read(Path(f"{locales_root}/{lc}.json"))
except FileNotFoundError:
continue
@@ -77,26 +82,27 @@ def in_all_locales(key: str, *args: str) -> list:
return output
def in_every_locale(key: str, *args: str) -> Dict[str, Any]:
async def in_every_locale(
key: str, *args: str, locales_root: Union[str, Path] = Path("locale")
) -> Dict[str, Any]:
"""Get value of the provided key and path in every available locale with locale tag
### Args:
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `Dict[str, Any]`: Locale is a key and it's value from locale file is a value
"""
output = {}
files_locales = listdir(config_get("locale", "locations"))
files_locales = listdir(locales_root)
valid_locales = [".".join(entry.split(".")[:-1]) for entry in files_locales]
for lc in valid_locales:
try:
this_dict = json_read(
Path(f'{config_get("locale", "locations")}/{lc}.json')
)
this_dict = await libbot.json_read(Path(f"{locales_root}/{lc}.json"))
except FileNotFoundError:
continue

View File

@@ -8,25 +8,29 @@ from libbot import sync
class BotLocale:
"""Small addon that can be used by bot clients' classes in order to minimize I/O"""
def __init__(self, locales_folder: Union[str, Path, None] = None) -> None:
if locales_folder is None:
locales_folder = Path(sync.config_get("locale", "locations"))
elif isinstance(locales_folder, str):
locales_folder = Path(locales_folder)
elif not isinstance(locales_folder, Path):
raise TypeError("'locales_folder' must be a valid path or path-like object")
def __init__(
self,
default_locale: Union[str, None] = "en",
locales_root: Union[str, Path] = Path("locale"),
) -> None:
if isinstance(locales_root, str):
locales_root = Path(locales_root)
elif not isinstance(locales_root, Path):
raise TypeError("'locales_root' must be a valid path or path-like object")
files_locales: list = listdir(locales_folder)
files_locales: list = listdir(locales_root)
valid_locales: list = [
".".join(entry.split(".")[:-1]) for entry in files_locales
]
self.default: str = sync.config_get("locale")
self.default: str = (
sync.config_get("locale") if default_locale is None else default_locale
)
self.locales: dict = {}
for lc in valid_locales:
self.locales[lc] = sync.json_read(Path(f"{locales_folder}/{lc}.json"))
self.locales[lc] = sync.json_read(Path(f"{locales_root}/{lc}.json"))
def _(self, key: str, *args: str, locale: Union[str, None] = None) -> Any:
"""Get value of locale string

View File

@@ -1,35 +1,36 @@
from os import listdir
from pathlib import Path
from typing import Any, Dict
from typing import Any, Dict, Union
from libbot import config_get, json_read, sync
from libbot.i18n.classes.bot_locale import BotLocale
import libbot
async def _(key: str, *args: str, locale: str = sync.config_get("locale")) -> Any:
def _(
key: str,
*args: str,
locale: Union[str, None] = "en",
locales_root: Union[str, Path] = Path("locale"),
) -> Any:
"""Get value of locale string
### Args:
* key (`str`): The last key of the locale's keys path
* *args (`list`): Path to key like: `dict[args][key]`
* locale (`str`): Locale to looked up in. Defaults to config's `"locale"` value
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locale (`Union[str, None]`): Locale to looked up in. Defaults to `"en"`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `Any`: Value of provided locale key. Is usually `str`, `dict` or `list`
"""
if locale is None:
locale = sync.config_get("locale")
locale = libbot.sync.config_get("locale")
try:
this_dict = await json_read(
Path(f'{await config_get("locale", "locations")}/{locale}.json')
)
this_dict = libbot.sync.json_read(Path(f"{locales_root}/{locale}.json"))
except FileNotFoundError:
try:
this_dict = await json_read(
Path(
f'{await config_get("locale", "locations")}/{await config_get("locale")}.json'
)
this_dict = libbot.sync.json_read(
Path(f'{locales_root}/{libbot.sync.config_get("locale")}.json')
)
except FileNotFoundError:
return f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"'
@@ -44,26 +45,27 @@ async def _(key: str, *args: str, locale: str = sync.config_get("locale")) -> An
return f'⚠️ Locale in config is invalid: could not get "{key}" in {args} from locale "{locale}"'
async def in_all_locales(key: str, *args: str) -> list:
def in_all_locales(
key: str, *args: str, locales_root: Union[str, Path] = Path("locale")
) -> list:
"""Get value of the provided key and path in all available locales
### Args:
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `list`: List of values in all locales
"""
output = []
files_locales = listdir(await config_get("locale", "locations"))
files_locales = listdir(locales_root)
valid_locales = [".".join(entry.split(".")[:-1]) for entry in files_locales]
for lc in valid_locales:
try:
this_dict = await json_read(
Path(f'{await config_get("locale", "locations")}/{lc}.json')
)
this_dict = libbot.sync.json_read(Path(f"{locales_root}/{lc}.json"))
except FileNotFoundError:
continue
@@ -79,26 +81,27 @@ async def in_all_locales(key: str, *args: str) -> list:
return output
async def in_every_locale(key: str, *args: str) -> Dict[str, Any]:
def in_every_locale(
key: str, *args: str, locales_root: Union[str, Path] = Path("locale")
) -> Dict[str, Any]:
"""Get value of the provided key and path in every available locale with locale tag
### Args:
* key (`str`): The last key of the locale's keys path.
* *args (`list`): Path to key like: `dict[args][key]`.
* locales_root (`Union[str, Path]`, *optional*): Folder where locales are located. Defaults to `Path("locale")`.
### Returns:
* `Dict[str, Any]`: Locale is a key and it's value from locale file is a value
"""
output = {}
files_locales = listdir(await config_get("locale", "locations"))
files_locales = listdir(locales_root)
valid_locales = [".".join(entry.split(".")[:-1]) for entry in files_locales]
for lc in valid_locales:
try:
this_dict = await json_read(
Path(f'{await config_get("locale", "locations")}/{lc}.json')
)
this_dict = libbot.sync.json_read(Path(f"{locales_root}/{lc}.json"))
except FileNotFoundError:
continue

View File

@@ -0,0 +1 @@
from .bot import PycordBot

View File

@@ -0,0 +1,57 @@
import logging
from pathlib import Path
from typing import Any, Dict, Union
try:
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.schedulers.background import BackgroundScheduler
from discord import Bot
except ImportError as exc:
raise ImportError(
"You need to install libbot[pycord] in order to use this class."
) from exc
try:
from ujson import loads
except ImportError:
from json import loads
from libbot.i18n import BotLocale
from libbot.i18n.sync import _
logger = logging.getLogger(__name__)
class PycordBot(Bot):
def __init__(
self,
config: Union[Dict[str, Any], None] = None,
config_path: Union[str, Path] = Path("config.json"),
locales_root: Union[str, Path, None] = None,
scheduler: Union[AsyncIOScheduler, BackgroundScheduler, None] = None,
**kwargs,
):
if config is None:
with open(config_path, "r", encoding="utf-8") as f:
self.config: dict = loads(f.read())
else:
self.config = config
super().__init__(
debug_guilds=self.config["bot"]["debug_guilds"],
owner_ids=self.config["bot"]["owners"],
**kwargs,
)
self.bot_locale: BotLocale = BotLocale(
default_locale=self.config["locale"],
locales_root=(Path("locale") if locales_root is None else locales_root),
)
self.default_locale: str = self.bot_locale.default
self.locales: dict = self.bot_locale.locales
self._ = self.bot_locale._
self.in_all_locales = self.bot_locale.in_all_locales
self.in_every_locale = self.bot_locale.in_every_locale
self.scheduler: Union[AsyncIOScheduler, BackgroundScheduler, None] = scheduler

View File

@@ -59,6 +59,7 @@ class PyroClient(Client):
max_concurrent_transmissions: int = 1,
commands_source: Union[Dict[str, dict], None] = None,
scheduler: Union[AsyncIOScheduler, BackgroundScheduler, None] = None,
**kwargs,
):
if config is None:
with open(config_path, "r", encoding="utf-8") as f:
@@ -90,6 +91,7 @@ class PyroClient(Client):
]
if "max_concurrent_transmissions" in self.config["bot"]
else max_concurrent_transmissions,
**kwargs,
)
self.owner: int = self.config["bot"]["owner"]
self.commands: List[PyroCommand] = []
@@ -100,11 +102,8 @@ class PyroClient(Client):
self.start_time: float = 0
self.bot_locale: BotLocale = BotLocale(
(
Path(self.config["locations"]["locale"])
if locales_root is None
else locales_root
)
default_locale=self.config["locale"],
locales_root=(Path("locale") if locales_root is None else locales_root)
)
self.default_locale: str = self.bot_locale.default
self.locales: dict = self.bot_locale.locales
@@ -117,7 +116,7 @@ class PyroClient(Client):
self.scopes_placeholders: Dict[str, int] = {"owner": self.owner}
async def start(self, register_commands: bool = True):
async def start(self, register_commands: bool = True) -> None:
await super().start()
self.start_time = time()
@@ -132,7 +131,9 @@ class PyroClient(Client):
try:
await self.send_message(
chat_id=self.config["reports"]["chat_id"],
chat_id=self.owner
if self.config["reports"]["chat_id"] == "owner"
else self.config["reports"]["chat_id"],
text=f"Bot started PID `{getpid()}`",
)
@@ -151,10 +152,12 @@ class PyroClient(Client):
except BadRequest:
logger.warning("Unable to send message to report chat.")
async def stop(self, exit_completely: bool = True):
async def stop(self, exit_completely: bool = True) -> None:
try:
await self.send_message(
chat_id=self.config["reports"]["chat_id"],
chat_id=self.owner
if self.config["reports"]["chat_id"] == "owner"
else self.config["reports"]["chat_id"],
text=f"Bot stopped with PID `{getpid()}`",
)
await asyncio.sleep(0.5)
@@ -267,7 +270,7 @@ class PyroClient(Client):
def add_command(
self,
command: str,
):
) -> None:
"""Add command to the bot's internal commands list
### Args:
@@ -286,7 +289,7 @@ class PyroClient(Client):
async def register_commands(
self, command_sets: Union[List[CommandSet], None] = None
):
) -> None:
"""Register commands stored in bot's 'commands' attribute"""
if command_sets is None:
@@ -315,7 +318,9 @@ class PyroClient(Client):
language_code=command_set.language_code,
)
async def remove_commands(self, command_sets: Union[List[CommandSet], None] = None):
async def remove_commands(
self, command_sets: Union[List[CommandSet], None] = None
) -> None:
"""Remove commands stored in bot's 'commands' attribute"""
if command_sets is None:

View File

@@ -29,7 +29,11 @@ def json_write(data: Any, path: Union[str, Path]) -> None:
* path (`Union[str, Path]`): Path-like object or path as a string of a destination
"""
with open(str(path), mode="w", encoding="utf-8") as f:
f.write(dumps(data, ensure_ascii=False, escape_forward_slashes=False, indent=4))
f.write(
dumps(data, ensure_ascii=False, escape_forward_slashes=False, indent=4)
if hasattr(dumps, "escape_forward_slashes")
else dumps(data, ensure_ascii=False, indent=4)
)
def nested_set(target: dict, value: Any, *path: str, create_missing=True) -> dict:
@@ -51,7 +55,9 @@ def nested_set(target: dict, value: Any, *path: str, create_missing=True) -> dic
elif create_missing:
d = d.setdefault(key, {})
else:
return target
raise KeyError(
f"Key '{key}' is not found under path provided ({path}) and create_missing is False"
)
if path[-1] in d or create_missing:
d[path[-1]] = value
return target

6
tests/config.json Normal file
View File

@@ -0,0 +1,6 @@
{
"locale": "en",
"bot": {
"bot_token": "sample_token"
}
}

20
tests/conftest.py Normal file
View File

@@ -0,0 +1,20 @@
from pathlib import Path
import pytest
from libbot.i18n import BotLocale
@pytest.fixture()
def location_config() -> Path:
return Path("tests/config.json")
@pytest.fixture()
def location_locale() -> Path:
return Path("tests/data/locale/")
@pytest.fixture()
def bot_locale(location_locale: Path) -> BotLocale:
return BotLocale(locales_root=location_locale)

1
tests/data/empty.json Normal file
View File

@@ -0,0 +1 @@
{}

3
tests/data/invalid.json Normal file
View File

@@ -0,0 +1,3 @@
{
"foo": 'bar'
}

11
tests/data/locale/en.json Normal file
View File

@@ -0,0 +1,11 @@
{
"foo": "bar",
"messages": {
"example": "okay"
},
"callbacks": {
"default": {
"nested": "sure"
}
}
}

11
tests/data/locale/uk.json Normal file
View File

@@ -0,0 +1,11 @@
{
"foo": "бар",
"messages": {
"example": "окей"
},
"callbacks": {
"default": {
"nested": "авжеж"
}
}
}

15
tests/data/test.json Normal file
View File

@@ -0,0 +1,15 @@
{
"foo": "bar",
"abcdefg": [
"higklmnop",
{
"lol": {
"kek": [
1.0000035,
0.2542,
1337
]
}
}
]
}

59
tests/test_bot_locale.py Normal file
View File

@@ -0,0 +1,59 @@
from pathlib import Path
from typing import Any, List, Union
import pytest
from libbot.i18n import BotLocale
@pytest.mark.parametrize(
"key, args, locale, expected",
[
("foo", [], None, "bar"),
("foo", [], "uk", "бар"),
("example", ["messages"], None, "okay"),
("example", ["messages"], "uk", "окей"),
("nested", ["callbacks", "default"], None, "sure"),
("nested", ["callbacks", "default"], "uk", "авжеж"),
],
)
def test_bot_locale_get(
key: str,
args: List[str],
locale: Union[str, None],
expected: Any,
bot_locale: BotLocale,
):
assert (
bot_locale._(key, *args, locale=locale)
if locale is not None
else bot_locale._(key, *args)
) == expected
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], ["bar", "бар"]),
("example", ["messages"], ["okay", "окей"]),
("nested", ["callbacks", "default"], ["sure", "авжеж"]),
],
)
def test_i18n_in_all_locales(
key: str, args: List[str], expected: Any, bot_locale: BotLocale
):
assert (bot_locale.in_all_locales(key, *args)) == expected
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], {"en": "bar", "uk": "бар"}),
("example", ["messages"], {"en": "okay", "uk": "окей"}),
("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}),
],
)
def test_i18n_in_every_locale(
key: str, args: List[str], expected: Any, bot_locale: BotLocale
):
assert (bot_locale.in_every_locale(key, *args)) == expected

View File

@@ -0,0 +1,48 @@
from pathlib import Path
from typing import Any, List
import pytest
from libbot import config_get, config_set
@pytest.mark.asyncio
@pytest.mark.parametrize(
"args, expected",
[
(["locale"], "en"),
(["bot_token", "bot"], "sample_token"),
],
)
async def test_config_get_valid(args: List[str], expected: str, location_config: Path):
assert await config_get(args[0], *args[1:], config_file=location_config) == expected
@pytest.mark.asyncio
@pytest.mark.parametrize(
"args, expected",
[
(["bot_stonks", "bot"], pytest.raises(KeyError)),
],
)
async def test_config_get_invalid(
args: List[str], expected: Any, location_config: Path
):
with expected:
assert (
await config_get(args[0], *args[1:], config_file=location_config)
== expected
)
@pytest.mark.asyncio
@pytest.mark.parametrize(
"key, path, value",
[
("locale", [], "en"),
("bot_token", ["bot"], "sample_token"),
],
)
async def test_config_set(key: str, path: List[str], value: Any, location_config: Path):
await config_set(key, value, *path, config_file=location_config)
assert await config_get(key, *path, config_file=location_config) == value

42
tests/test_config_sync.py Normal file
View File

@@ -0,0 +1,42 @@
from pathlib import Path
from typing import Any, List
import pytest
from libbot import sync
@pytest.mark.parametrize(
"args, expected",
[
(["locale"], "en"),
(["bot_token", "bot"], "sample_token"),
],
)
def test_config_get_valid(args: List[str], expected: str, location_config: Path):
assert sync.config_get(args[0], *args[1:], config_file=location_config) == expected
@pytest.mark.parametrize(
"args, expected",
[
(["bot_stonks", "bot"], pytest.raises(KeyError)),
],
)
def test_config_get_invalid(args: List[str], expected: Any, location_config: Path):
with expected:
assert (
sync.config_get(args[0], *args[1:], config_file=location_config) == expected
)
@pytest.mark.parametrize(
"key, path, value",
[
("locale", [], "en"),
("bot_token", ["bot"], "sample_token"),
],
)
def test_config_set(key: str, path: List[str], value: Any, location_config: Path):
sync.config_set(key, value, *path, config_file=location_config)
assert sync.config_get(key, *path, config_file=location_config) == value

66
tests/test_i18n_async.py Normal file
View File

@@ -0,0 +1,66 @@
from pathlib import Path
from typing import Any, List, Union
import pytest
from libbot import i18n
@pytest.mark.asyncio
@pytest.mark.parametrize(
"key, args, locale, expected",
[
("foo", [], None, "bar"),
("foo", [], "uk", "бар"),
("example", ["messages"], None, "okay"),
("example", ["messages"], "uk", "окей"),
("nested", ["callbacks", "default"], None, "sure"),
("nested", ["callbacks", "default"], "uk", "авжеж"),
],
)
async def test_i18n_get(
key: str,
args: List[str],
locale: Union[str, None],
expected: Any,
location_locale: Path,
):
assert (
await i18n._(key, *args, locale=locale, locales_root=location_locale)
if locale is not None
else await i18n._(key, *args, locales_root=location_locale)
) == expected
@pytest.mark.asyncio
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], ["bar", "бар"]),
("example", ["messages"], ["okay", "окей"]),
("nested", ["callbacks", "default"], ["sure", "авжеж"]),
],
)
async def test_i18n_in_all_locales(
key: str, args: List[str], expected: Any, location_locale: Path
):
assert (
await i18n.in_all_locales(key, *args, locales_root=location_locale)
) == expected
@pytest.mark.asyncio
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], {"en": "bar", "uk": "бар"}),
("example", ["messages"], {"en": "okay", "uk": "окей"}),
("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}),
],
)
async def test_i18n_in_every_locale(
key: str, args: List[str], expected: Any, location_locale: Path
):
assert (
await i18n.in_every_locale(key, *args, locales_root=location_locale)
) == expected

59
tests/test_i18n_sync.py Normal file
View File

@@ -0,0 +1,59 @@
from pathlib import Path
from typing import Any, List, Union
import pytest
from libbot.i18n import sync
@pytest.mark.parametrize(
"key, args, locale, expected",
[
("foo", [], None, "bar"),
("foo", [], "uk", "бар"),
("example", ["messages"], None, "okay"),
("example", ["messages"], "uk", "окей"),
("nested", ["callbacks", "default"], None, "sure"),
("nested", ["callbacks", "default"], "uk", "авжеж"),
],
)
def test_i18n_get(
key: str,
args: List[str],
locale: Union[str, None],
expected: Any,
location_locale: Path,
):
assert (
sync._(key, *args, locale=locale, locales_root=location_locale)
if locale is not None
else sync._(key, *args, locales_root=location_locale)
) == expected
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], ["bar", "бар"]),
("example", ["messages"], ["okay", "окей"]),
("nested", ["callbacks", "default"], ["sure", "авжеж"]),
],
)
def test_i18n_in_all_locales(
key: str, args: List[str], expected: Any, location_locale: Path
):
assert (sync.in_all_locales(key, *args, locales_root=location_locale)) == expected
@pytest.mark.parametrize(
"key, args, expected",
[
("foo", [], {"en": "bar", "uk": "бар"}),
("example", ["messages"], {"en": "okay", "uk": "окей"}),
("nested", ["callbacks", "default"], {"en": "sure", "uk": "авжеж"}),
],
)
def test_i18n_in_every_locale(
key: str, args: List[str], expected: Any, location_locale: Path
):
assert (sync.in_every_locale(key, *args, locales_root=location_locale)) == expected

64
tests/test_json_async.py Normal file
View File

@@ -0,0 +1,64 @@
try:
from ujson import JSONDecodeError, dumps
except ImportError:
from json import dumps, JSONDecodeError
from pathlib import Path
from typing import Any, Union
import pytest
from libbot import json_read, json_write
@pytest.mark.asyncio
@pytest.mark.parametrize(
"path, expected",
[
(
"tests/data/test.json",
{
"foo": "bar",
"abcdefg": ["higklmnop", {"lol": {"kek": [1.0000035, 0.2542, 1337]}}],
},
),
("tests/data/empty.json", {}),
],
)
async def test_json_read_valid(path: Union[str, Path], expected: Any):
assert await json_read(path) == expected
@pytest.mark.asyncio
@pytest.mark.parametrize(
"path, expected",
[
("tests/data/invalid.json", JSONDecodeError),
("tests/data/nonexistent.json", FileNotFoundError),
],
)
async def test_json_read_invalid(path: Union[str, Path], expected: Any):
with pytest.raises(expected):
await json_read(path)
@pytest.mark.asyncio
@pytest.mark.parametrize(
"data, path",
[
(
{
"foo": "bar",
"abcdefg": ["higklmnop", {"lol": {"kek": [1.0000035, 0.2542, 1337]}}],
},
"tests/data/test.json",
),
({}, "tests/data/empty.json"),
],
)
async def test_json_write(data: Any, path: Union[str, Path]):
await json_write(data, path)
assert Path(path).is_file()
with open(path, "r", encoding="utf-8") as f:
assert f.read() == dumps(data, ensure_ascii=False, indent=4)

61
tests/test_json_sync.py Normal file
View File

@@ -0,0 +1,61 @@
try:
from ujson import JSONDecodeError, dumps
except ImportError:
from json import dumps, JSONDecodeError
from pathlib import Path
from typing import Any, Union
import pytest
from libbot import sync
@pytest.mark.parametrize(
"path, expected",
[
(
"tests/data/test.json",
{
"foo": "bar",
"abcdefg": ["higklmnop", {"lol": {"kek": [1.0000035, 0.2542, 1337]}}],
},
),
("tests/data/empty.json", {}),
],
)
def test_json_read_valid(path: Union[str, Path], expected: Any):
assert sync.json_read(path) == expected
@pytest.mark.parametrize(
"path, expected",
[
("tests/data/invalid.json", JSONDecodeError),
("tests/data/nonexistent.json", FileNotFoundError),
],
)
def test_json_read_invalid(path: Union[str, Path], expected: Any):
with pytest.raises(expected):
assert sync.json_read(path) == expected
@pytest.mark.parametrize(
"data, path",
[
(
{
"foo": "bar",
"abcdefg": ["higklmnop", {"lol": {"kek": [1.0000035, 0.2542, 1337]}}],
},
"tests/data/test.json",
),
({}, "tests/data/empty.json"),
],
)
def test_json_write(data: Any, path: Union[str, Path]):
sync.json_write(data, path)
assert Path(path).is_file()
with open(path, "r", encoding="utf-8") as f:
assert f.read() == dumps(data, ensure_ascii=False, indent=4)

63
tests/test_nested_set.py Normal file
View File

@@ -0,0 +1,63 @@
from typing import Any, Dict, List
import pytest
from libbot import sync
@pytest.mark.parametrize(
"target, value, path, create_missing, expected",
[
({"foo": "bar"}, "rab", ["foo"], True, {"foo": "rab"}),
({"foo": "bar"}, {"123": 456}, ["foo"], True, {"foo": {"123": 456}}),
(
{"foo": {"bar": {}}},
True,
["foo", "bar", "test"],
True,
{"foo": {"bar": {"test": True}}},
),
(
{"foo": {"bar": {}}},
True,
["foo", "bar", "test"],
False,
{"foo": {"bar": {}}},
),
],
)
def test_nested_set_valid(
target: Dict[str, Any],
value: Any,
path: List[str],
create_missing: bool,
expected: Any,
):
assert (
sync.nested_set(target, value, *path, create_missing=create_missing)
) == expected
@pytest.mark.parametrize(
"target, value, path, create_missing, expected",
[
(
{"foo": {"bar": {}}},
True,
["foo", "bar", "test1", "test2"],
False,
KeyError,
),
],
)
def test_nested_set_invalid(
target: Dict[str, Any],
value: Any,
path: List[str],
create_missing: bool,
expected: Any,
):
with pytest.raises(expected):
assert (
sync.nested_set(target, value, *path, create_missing=create_missing)
) == expected

23
tox.ini Normal file
View File

@@ -0,0 +1,23 @@
[tox]
minversion = 3.8.0
envlist = py38, py39, py310, py311
isolated_build = true
[gh-actions]
python =
3.8: py38
3.9: py39
3.10: py310
3.11: py311
[testenv]
setenv =
PYTHONPATH = {toxinidir}
deps =
-r{toxinidir}/requirements/_.txt
-r{toxinidir}/requirements/dev.txt
-r{toxinidir}/requirements/pycord.txt
-r{toxinidir}/requirements/pyrogram.txt
-r{toxinidir}/requirements/speed.txt
commands =
pytest --basetemp={envtmpdir} --cov=libbot