Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
altlinux-packages-bot
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kirill Unitsaev
altlinux-packages-bot
Commits
73d33c09
Verified
Commit
73d33c09
authored
Aug 08, 2025
by
Kirill Unitsaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
altrepo: add appstream module
parent
78aa0c97
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
264 additions
and
13 deletions
+264
-13
.gitignore
.gitignore
+2
-0
poetry.lock
poetry.lock
+111
-1
pyproject.toml
pyproject.toml
+2
-1
__init__.py
src/altrepo/__init__.py
+7
-2
__init__.py
src/altrepo/appstream/__init__.py
+1
-0
methods.py
src/altrepo/appstream/methods.py
+92
-0
help.py
src/handlers/help.py
+4
-0
main.py
src/main.py
+23
-9
update_appstream_data.py
src/services/appstream/update_appstream_data.py
+22
-0
No files found.
.gitignore
View file @
73d33c09
...
@@ -2,5 +2,6 @@
...
@@ -2,5 +2,6 @@
.venv
.venv
*.db
*.db
/appstream/
__pycache__/
__pycache__/
\ No newline at end of file
poetry.lock
View file @
73d33c09
...
@@ -501,6 +501,116 @@ files = [
...
@@ -501,6 +501,116 @@ files = [
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
[[package]]
[[package]]
name = "lxml"
version = "6.0.0"
description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "lxml-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:35bc626eec405f745199200ccb5c6b36f202675d204aa29bb52e27ba2b71dea8"},
{file = "lxml-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:246b40f8a4aec341cbbf52617cad8ab7c888d944bfe12a6abd2b1f6cfb6f6082"},
{file = "lxml-6.0.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2793a627e95d119e9f1e19720730472f5543a6d84c50ea33313ce328d870f2dd"},
{file = "lxml-6.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:46b9ed911f36bfeb6338e0b482e7fe7c27d362c52fde29f221fddbc9ee2227e7"},
{file = "lxml-6.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b4790b558bee331a933e08883c423f65bbcd07e278f91b2272489e31ab1e2b4"},
{file = "lxml-6.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2030956cf4886b10be9a0285c6802e078ec2391e1dd7ff3eb509c2c95a69b76"},
{file = "lxml-6.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d23854ecf381ab1facc8f353dcd9adeddef3652268ee75297c1164c987c11dc"},
{file = "lxml-6.0.0-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:43fe5af2d590bf4691531b1d9a2495d7aab2090547eaacd224a3afec95706d76"},
{file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74e748012f8c19b47f7d6321ac929a9a94ee92ef12bc4298c47e8b7219b26541"},
{file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:43cfbb7db02b30ad3926e8fceaef260ba2fb7df787e38fa2df890c1ca7966c3b"},
{file = "lxml-6.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34190a1ec4f1e84af256495436b2d196529c3f2094f0af80202947567fdbf2e7"},
{file = "lxml-6.0.0-cp310-cp310-win32.whl", hash = "sha256:5967fe415b1920a3877a4195e9a2b779249630ee49ece22021c690320ff07452"},
{file = "lxml-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3389924581d9a770c6caa4df4e74b606180869043b9073e2cec324bad6e306e"},
{file = "lxml-6.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:522fe7abb41309e9543b0d9b8b434f2b630c5fdaf6482bee642b34c8c70079c8"},
{file = "lxml-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ee56288d0df919e4aac43b539dd0e34bb55d6a12a6562038e8d6f3ed07f9e36"},
{file = "lxml-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8dd6dd0e9c1992613ccda2bcb74fc9d49159dbe0f0ca4753f37527749885c25"},
{file = "lxml-6.0.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d7ae472f74afcc47320238b5dbfd363aba111a525943c8a34a1b657c6be934c3"},
{file = "lxml-6.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5592401cdf3dc682194727c1ddaa8aa0f3ddc57ca64fd03226a430b955eab6f6"},
{file = "lxml-6.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58ffd35bd5425c3c3b9692d078bf7ab851441434531a7e517c4984d5634cd65b"},
{file = "lxml-6.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f720a14aa102a38907c6d5030e3d66b3b680c3e6f6bc95473931ea3c00c59967"},
{file = "lxml-6.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2a5e8d207311a0170aca0eb6b160af91adc29ec121832e4ac151a57743a1e1e"},
{file = "lxml-6.0.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:2dd1cc3ea7e60bfb31ff32cafe07e24839df573a5e7c2d33304082a5019bcd58"},
{file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cfcf84f1defed7e5798ef4f88aa25fcc52d279be731ce904789aa7ccfb7e8d2"},
{file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a52a4704811e2623b0324a18d41ad4b9fabf43ce5ff99b14e40a520e2190c851"},
{file = "lxml-6.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c16304bba98f48a28ae10e32a8e75c349dd742c45156f297e16eeb1ba9287a1f"},
{file = "lxml-6.0.0-cp311-cp311-win32.whl", hash = "sha256:f8d19565ae3eb956d84da3ef367aa7def14a2735d05bd275cd54c0301f0d0d6c"},
{file = "lxml-6.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b2d71cdefda9424adff9a3607ba5bbfc60ee972d73c21c7e3c19e71037574816"},
{file = "lxml-6.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:8a2e76efbf8772add72d002d67a4c3d0958638696f541734304c7f28217a9cab"},
{file = "lxml-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78718d8454a6e928470d511bf8ac93f469283a45c354995f7d19e77292f26108"},
{file = "lxml-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:84ef591495ffd3f9dcabffd6391db7bb70d7230b5c35ef5148354a134f56f2be"},
{file = "lxml-6.0.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2930aa001a3776c3e2601cb8e0a15d21b8270528d89cc308be4843ade546b9ab"},
{file = "lxml-6.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:219e0431ea8006e15005767f0351e3f7f9143e793e58519dc97fe9e07fae5563"},
{file = "lxml-6.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bd5913b4972681ffc9718bc2d4c53cde39ef81415e1671ff93e9aa30b46595e7"},
{file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:390240baeb9f415a82eefc2e13285016f9c8b5ad71ec80574ae8fa9605093cd7"},
{file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d6e200909a119626744dd81bae409fc44134389e03fbf1d68ed2a55a2fb10991"},
{file = "lxml-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca50bd612438258a91b5b3788c6621c1f05c8c478e7951899f492be42defc0da"},
{file = "lxml-6.0.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:c24b8efd9c0f62bad0439283c2c795ef916c5a6b75f03c17799775c7ae3c0c9e"},
{file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:afd27d8629ae94c5d863e32ab0e1d5590371d296b87dae0a751fb22bf3685741"},
{file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:54c4855eabd9fc29707d30141be99e5cd1102e7d2258d2892314cf4c110726c3"},
{file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c907516d49f77f6cd8ead1322198bdfd902003c3c330c77a1c5f3cc32a0e4d16"},
{file = "lxml-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36531f81c8214e293097cd2b7873f178997dae33d3667caaae8bdfb9666b76c0"},
{file = "lxml-6.0.0-cp312-cp312-win32.whl", hash = "sha256:690b20e3388a7ec98e899fd54c924e50ba6693874aa65ef9cb53de7f7de9d64a"},
{file = "lxml-6.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:310b719b695b3dd442cdfbbe64936b2f2e231bb91d998e99e6f0daf991a3eba3"},
{file = "lxml-6.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:8cb26f51c82d77483cdcd2b4a53cda55bbee29b3c2f3ddeb47182a2a9064e4eb"},
{file = "lxml-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6da7cd4f405fd7db56e51e96bff0865b9853ae70df0e6720624049da76bde2da"},
{file = "lxml-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b34339898bb556a2351a1830f88f751679f343eabf9cf05841c95b165152c9e7"},
{file = "lxml-6.0.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:51a5e4c61a4541bd1cd3ba74766d0c9b6c12d6a1a4964ef60026832aac8e79b3"},
{file = "lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81"},
{file = "lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1"},
{file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24"},
{file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a78d6c9168f5bcb20971bf3329c2b83078611fbe1f807baadc64afc70523b3a"},
{file = "lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29"},
{file = "lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4"},
{file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca"},
{file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf"},
{file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4d6036c3a296707357efb375cfc24bb64cd955b9ec731abf11ebb1e40063949f"},
{file = "lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef"},
{file = "lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181"},
{file = "lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e"},
{file = "lxml-6.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:21db1ec5525780fd07251636eb5f7acb84003e9382c72c18c542a87c416ade03"},
{file = "lxml-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4eb114a0754fd00075c12648d991ec7a4357f9cb873042cc9a77bf3a7e30c9db"},
{file = "lxml-6.0.0-cp38-cp38-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:7da298e1659e45d151b4028ad5c7974917e108afb48731f4ed785d02b6818994"},
{file = "lxml-6.0.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bf61bc4345c1895221357af8f3e89f8c103d93156ef326532d35c707e2fb19d"},
{file = "lxml-6.0.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63b634facdfbad421d4b61c90735688465d4ab3a8853ac22c76ccac2baf98d97"},
{file = "lxml-6.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e380e85b93f148ad28ac15f8117e2fd8e5437aa7732d65e260134f83ce67911b"},
{file = "lxml-6.0.0-cp38-cp38-win32.whl", hash = "sha256:185efc2fed89cdd97552585c624d3c908f0464090f4b91f7d92f8ed2f3b18f54"},
{file = "lxml-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:f97487996a39cb18278ca33f7be98198f278d0bc3c5d0fd4d7b3d63646ca3c8a"},
{file = "lxml-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85b14a4689d5cff426c12eefe750738648706ea2753b20c2f973b2a000d3d261"},
{file = "lxml-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f64ccf593916e93b8d36ed55401bb7fe9c7d5de3180ce2e10b08f82a8f397316"},
{file = "lxml-6.0.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:b372d10d17a701b0945f67be58fae4664fd056b85e0ff0fbc1e6c951cdbc0512"},
{file = "lxml-6.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a674c0948789e9136d69065cc28009c1b1874c6ea340253db58be7622ce6398f"},
{file = "lxml-6.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:edf6e4c8fe14dfe316939711e3ece3f9a20760aabf686051b537a7562f4da91a"},
{file = "lxml-6.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:048a930eb4572829604982e39a0c7289ab5dc8abc7fc9f5aabd6fbc08c154e93"},
{file = "lxml-6.0.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0b5fa5eda84057a4f1bbb4bb77a8c28ff20ae7ce211588d698ae453e13c6281"},
{file = "lxml-6.0.0-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:c352fc8f36f7e9727db17adbf93f82499457b3d7e5511368569b4c5bd155a922"},
{file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8db5dc617cb937ae17ff3403c3a70a7de9df4852a046f93e71edaec678f721d0"},
{file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:2181e4b1d07dde53986023482673c0f1fba5178ef800f9ab95ad791e8bdded6a"},
{file = "lxml-6.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b3c98d5b24c6095e89e03d65d5c574705be3d49c0d8ca10c17a8a4b5201b72f5"},
{file = "lxml-6.0.0-cp39-cp39-win32.whl", hash = "sha256:04d67ceee6db4bcb92987ccb16e53bef6b42ced872509f333c04fb58a3315256"},
{file = "lxml-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:e0b1520ef900e9ef62e392dd3d7ae4f5fa224d1dd62897a792cf353eb20b6cae"},
{file = "lxml-6.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:e35e8aaaf3981489f42884b59726693de32dabfc438ac10ef4eb3409961fd402"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:dbdd7679a6f4f08152818043dbb39491d1af3332128b3752c3ec5cebc0011a72"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40442e2a4456e9910875ac12951476d36c0870dcb38a68719f8c4686609897c4"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db0efd6bae1c4730b9c863fc4f5f3c0fa3e8f05cae2c44ae141cb9dfc7d091dc"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ab542c91f5a47aaa58abdd8ea84b498e8e49fe4b883d67800017757a3eb78e8"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:013090383863b72c62a702d07678b658fa2567aa58d373d963cca245b017e065"},
{file = "lxml-6.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c86df1c9af35d903d2b52d22ea3e66db8058d21dc0f59842ca5deb0595921141"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4337e4aec93b7c011f7ee2e357b0d30562edd1955620fdd4aeab6aacd90d43c5"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ae74f7c762270196d2dda56f8dd7309411f08a4084ff2dfcc0b095a218df2e06"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:059c4cbf3973a621b62ea3132934ae737da2c132a788e6cfb9b08d63a0ef73f9"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f090a9bc0ce8da51a5632092f98a7e7f84bca26f33d161a98b57f7fb0004ca"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9da022c14baeec36edfcc8daf0e281e2f55b950249a455776f0d1adeeada4734"},
{file = "lxml-6.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a55da151d0b0c6ab176b4e761670ac0e2667817a1e0dadd04a01d0561a219349"},
{file = "lxml-6.0.0.tar.gz", hash = "sha256:032e65120339d44cdc3efc326c9f660f5f7205f3a535c1fdbf898b29ea01fb72"},
]
[package.extras]
cssselect = ["cssselect (>=0.7)"]
html-clean = ["lxml_html_clean"]
html5 = ["html5lib"]
htmlsoup = ["BeautifulSoup4"]
[[package]]
name = "msgspec"
name = "msgspec"
version = "0.19.0"
version = "0.19.0"
description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML."
description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML."
...
@@ -1278,4 +1388,4 @@ propcache = ">=0.2.1"
...
@@ -1278,4 +1388,4 @@ propcache = ">=0.2.1"
[metadata]
[metadata]
lock-version = "2.1"
lock-version = "2.1"
python-versions = ">=3.12,<4.0"
python-versions = ">=3.12,<4.0"
content-hash = "
a931f25d5878e10204c31cdf053d05a4587b3b5c55056e719c2f1489525c1084
"
content-hash = "
c7b24e6d1d4d94badff2a8b624692df36529a3352bfc1b0abc818c7cd1844eac
"
pyproject.toml
View file @
73d33c09
...
@@ -13,7 +13,8 @@ dependencies = [
...
@@ -13,7 +13,8 @@ dependencies = [
"pydantic (>=2.11.7,<3.0.0)"
,
"pydantic (>=2.11.7,<3.0.0)"
,
"pydantic-settings (>=2.10.1,<3.0.0)"
,
"pydantic-settings (>=2.10.1,<3.0.0)"
,
"peewee (>=3.18.2,<4.0.0)"
,
"peewee (>=3.18.2,<4.0.0)"
,
"bs4 (>=0.0.2,<0.0.3)"
"bs4 (>=0.0.2,<0.0.3)"
,
"lxml (>=6.0.0,<7.0.0)"
]
]
[project.urls]
[project.urls]
...
...
src/altrepo/__init__.py
View file @
73d33c09
import
aiohttp
import
aiohttp
from
.api
import
ALTRepoAPI
from
.api
import
ALTRepoAPI
from
.appstream
import
ALTRepoAppStream
from
.parser
import
ALTRepoParser
from
.parser
import
ALTRepoParser
class
ALTRepo
:
class
ALTRepo
:
...
@@ -8,17 +9,21 @@ class ALTRepo:
...
@@ -8,17 +9,21 @@ class ALTRepo:
def
__init__
(
self
):
def
__init__
(
self
):
self
.
_session
:
aiohttp
.
ClientSession
|
None
=
None
self
.
_session
:
aiohttp
.
ClientSession
|
None
=
None
self
.
api
:
ALTRepoAPI
|
None
=
None
self
.
api
:
ALTRepoAPI
|
None
=
None
self
.
appstream
:
ALTRepoAppStream
|
None
=
None
self
.
parser
:
ALTRepoParser
|
None
=
None
self
.
parser
:
ALTRepoParser
|
None
=
None
async
def
init
(
self
):
async
def
init
(
self
,
appstream_dir
:
str
=
"appstream"
):
if
self
.
_session
is
None
:
if
self
.
_session
is
None
:
self
.
_session
=
aiohttp
.
ClientSession
()
self
.
_session
=
aiohttp
.
ClientSession
()
self
.
api
=
ALTRepoAPI
(
self
.
_session
)
self
.
api
=
ALTRepoAPI
(
self
.
_session
)
self
.
appstream
=
ALTRepoAppStream
(
self
.
_session
,
appstream_dir
)
self
.
parser
=
ALTRepoParser
(
self
.
_session
)
self
.
parser
=
ALTRepoParser
(
self
.
_session
)
async
def
close
(
self
):
async
def
close
(
self
):
await
self
.
_session
.
close
()
await
self
.
_session
.
close
()
altrepo
=
ALTRepo
()
altrepo
=
ALTRepo
()
...
...
src/altrepo/appstream/__init__.py
0 → 100644
View file @
73d33c09
from
.methods
import
ALTRepoAppStream
src/altrepo/appstream/methods.py
0 → 100644
View file @
73d33c09
import
os
import
aiohttp
from
lxml
import
etree
class
AppStreamClient
:
BASE_URL
=
(
"https://git.altlinux.org/gears/a/appstream-data-desktop.git?"
"a=blob_plain;f=xmls/altlinux.xml;hb=refs/heads/{}"
)
def
__init__
(
self
,
session
:
aiohttp
.
ClientSession
):
self
.
session
=
session
async
def
_handle_response
(
self
,
resp
:
aiohttp
.
ClientResponse
):
match
resp
.
status
:
case
200
|
201
:
return
await
resp
.
text
(
encoding
=
"utf-8"
)
case
_
:
return
None
async
def
get
(
self
,
branch
:
str
)
->
str
|
None
:
url
=
self
.
BASE_URL
.
format
(
branch
)
async
with
self
.
session
.
get
(
url
)
as
resp
:
return
await
self
.
_handle_response
(
resp
)
class
DataInfo
:
def
__init__
(
self
,
client
:
AppStreamClient
,
appstream_dir
:
str
):
self
.
client
=
client
self
.
dir
=
appstream_dir
os
.
makedirs
(
self
.
dir
,
exist_ok
=
True
)
async
def
load_by_branch
(
self
,
branch
:
str
,
version
:
str
):
text
=
await
self
.
client
.
get
(
branch
)
if
not
text
:
return
old_file
=
self
.
get_file_path
(
branch
)
if
old_file
:
os
.
remove
(
old_file
)
filename
=
f
"{branch}-{version}.xml"
filepath
=
os
.
path
.
join
(
self
.
dir
,
filename
)
with
open
(
filepath
,
"w"
,
encoding
=
"utf-8"
)
as
f
:
f
.
write
(
text
)
def
get_file_path
(
self
,
branch
:
str
)
->
str
|
None
:
for
fname
in
os
.
listdir
(
self
.
dir
):
if
fname
.
startswith
(
f
"{branch}-"
)
and
fname
.
endswith
(
".xml"
):
return
os
.
path
.
join
(
self
.
dir
,
fname
)
return
None
def
get_current_version
(
self
,
branch
:
str
)
->
str
|
None
:
path
=
self
.
get_file_path
(
branch
)
if
path
:
fname
=
os
.
path
.
basename
(
path
)
return
fname
[
len
(
branch
)
+
1
:
-
4
]
return
None
def
has_file
(
self
,
branch
:
str
)
->
bool
:
return
self
.
get_file_path
(
branch
)
is
not
None
class
PackageInfo
:
def
__init__
(
self
,
client
:
AppStreamClient
,
data
:
DataInfo
):
self
.
client
=
client
self
.
_data
=
data
def
id_by_pkgname
(
self
,
pkgname
:
str
,
branch
:
str
)
->
str
|
None
:
path
=
self
.
_data
.
get_file_path
(
branch
)
if
not
path
:
return
None
context
=
etree
.
iterparse
(
path
,
events
=
(
"end"
,),
recover
=
True
)
for
_
,
elem
in
context
:
if
elem
.
tag
==
"component"
:
if
elem
.
findtext
(
"pkgname"
)
==
pkgname
:
return
elem
.
findtext
(
"id"
)
elem
.
clear
()
while
elem
.
getprevious
()
is
not
None
:
del
elem
.
getparent
()[
0
]
return
None
class
ALTRepoAppStream
:
def
__init__
(
self
,
session
:
aiohttp
.
ClientSession
,
appstream_dir
:
str
):
self
.
_client
=
AppStreamClient
(
session
)
self
.
data
=
DataInfo
(
self
.
_client
,
appstream_dir
)
self
.
package
=
PackageInfo
(
self
.
_client
,
self
.
data
)
src/handlers/help.py
View file @
73d33c09
...
@@ -32,6 +32,10 @@ async def info_handler(m: Message) -> None:
...
@@ -32,6 +32,10 @@ async def info_handler(m: Message) -> None:
f
" Сопровождающих в базе: {DB.maintainer.count()}
\n
"
f
" Сопровождающих в базе: {DB.maintainer.count()}
\n
"
f
" Пакетов переведено: {DB.package.count()}
\n\n
"
f
" Пакетов переведено: {DB.package.count()}
\n\n
"
f
"{_bold("
ALTRepo
Bot
AppStream
Data
:
")}
\n
"
f
" Sisyphus: {altrepo.appstream.data.get_current_version("
sisyphus
")}
\n
"
f
" P11: {altrepo.appstream.data.get_current_version("
p11
")}
\n\n
"
f
"{_bold("
Исходный
код
:
")}
\n
"
f
"{_bold("
Исходный
код
:
")}
\n
"
f
"{repos_formatted}
\n\n
"
f
"{repos_formatted}
\n\n
"
...
...
src/main.py
View file @
73d33c09
...
@@ -11,12 +11,14 @@ from middlewares import UserMiddleware
...
@@ -11,12 +11,14 @@ from middlewares import UserMiddleware
from
services.test_api_version
import
test_api_version
from
services.test_api_version
import
test_api_version
from
services.update_maintainers
import
update_maintainers
from
services.update_maintainers
import
update_maintainers
from
services.appstream.update_appstream_data
import
update_appstream_data
bot
=
Telegrinder
(
tg_api
)
bot
=
Telegrinder
(
tg_api
)
bot
.
dispatch
.
load_from_dir
(
"src/handlers"
)
bot
.
dispatch
.
load_from_dir
(
"src/handlers"
)
bot
.
on
.
message
.
register_middleware
(
UserMiddleware
)
bot
.
on
.
message
.
register_middleware
(
UserMiddleware
)
@bot.loop_wrapper.lifespan.on_startup
@bot.loop_wrapper.lifespan.on_startup
async
def
startup
():
async
def
startup
():
db
.
create_tables
([
Maintainer
,
User
,
Package
])
db
.
create_tables
([
Maintainer
,
User
,
Package
])
...
@@ -24,31 +26,43 @@ async def startup():
...
@@ -24,31 +26,43 @@ async def startup():
await
altrepo
.
init
()
await
altrepo
.
init
()
await
test_api_version
()
await
test_api_version
()
await
update_maintainers
()
await
update_maintainers
()
await
bot
.
api
.
set_my_commands
(
commands
=
[
await
update_appstream_data
()
BotCommand
(
"watch"
,
"Отслеживание по пакетам"
),
await
bot
.
api
.
set_my_commands
(
BotCommand
(
"bugs"
,
"Отслеживание по ошибкам"
),
commands
=
[
BotCommand
(
"ftbfs"
,
"Ошибки пересборки"
),
BotCommand
(
"watch"
,
"Отслеживание по пакетам"
),
BotCommand
(
"statistics"
,
"Статистика репозитория"
),
BotCommand
(
"bugs"
,
"Отслеживание по ошибкам"
),
BotCommand
(
"altrepo_info"
,
"Информация о боте"
),
BotCommand
(
"ftbfs"
,
"Ошибки пересборки"
),
BotCommand
(
"help"
,
"Справка"
)
BotCommand
(
"statistics"
,
"Статистика репозитория"
),
])
BotCommand
(
"altrepo_info"
,
"Информация о боте"
),
BotCommand
(
"help"
,
"Справка"
),
]
)
@bot.loop_wrapper.lifespan.on_shutdown
@bot.loop_wrapper.lifespan.on_shutdown
async
def
shutdown
():
async
def
shutdown
():
logger
.
info
(
"stopping ALTRepo"
)
logger
.
info
(
"stopping ALTRepo"
)
await
altrepo
.
close
()
await
altrepo
.
close
()
@bot.loop_wrapper.interval
(
days
=
1
)
@bot.loop_wrapper.interval
(
days
=
1
)
async
def
api_test
():
async
def
api_test
():
await
test_api_version
()
await
test_api_version
()
@bot.loop_wrapper.interval
(
days
=
1
)
@bot.loop_wrapper.interval
(
days
=
1
)
async
def
update_maintainers_db
():
async
def
update_maintainers_db
():
await
update_maintainers
()
await
update_maintainers
()
@bot.loop_wrapper.interval
(
days
=
1
)
async
def
update_appstream
():
await
update_appstream_data
()
@bot.on.error
()
@bot.on.error
()
async
def
error_handler
(
err
:
Error
[
TooManyRequests
],
m
:
Message
):
async
def
error_handler
(
err
:
Error
[
TooManyRequests
],
m
:
Message
):
await
m
.
answer
(
f
"Слишком много запросов!"
)
await
m
.
answer
(
f
"Слишком много запросов!"
)
bot
.
run_forever
(
skip_updates
=
True
)
bot
.
run_forever
(
skip_updates
=
True
)
src/services/appstream/update_appstream_data.py
0 → 100644
View file @
73d33c09
from
telegrinder.modules
import
logger
from
altrepo
import
altrepo
async
def
update_appstream_data
():
for
branch
in
[
"sisyphus"
,
"p11"
]:
package
=
(
await
altrepo
.
api
.
package
.
package_info
(
"appstream-data-desktop"
,
branch
=
branch
,
source
=
True
)
)
.
packages
[
0
]
current_version
=
altrepo
.
appstream
.
data
.
get_current_version
(
branch
)
package_version
=
f
"{package.version}-{package.release}"
if
(
not
altrepo
.
appstream
.
data
.
has_file
(
branch
)
or
package_version
!=
current_version
):
await
altrepo
.
appstream
.
data
.
load_by_branch
(
branch
,
package_version
)
logger
.
info
(
f
"Update AppStream data for {branch}"
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment