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
500f1bc4
Verified
Commit
500f1bc4
authored
Mar 10, 2026
by
Kirill Unitsaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
parser: reuse session for attachments, deduplicate news methods, remove unnecessary async
parent
0d2af83a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
30 additions
and
40 deletions
+30
-40
methods.py
src/altrepo/parser/methods.py
+19
-19
bugs.py
src/altrepo/parser/news/bugs.py
+2
-2
packages.py
src/altrepo/parser/news/packages.py
+7
-17
ftbfs.py
src/altrepo/parser/packages/ftbfs.py
+1
-1
watch.py
src/altrepo/parser/packages/watch.py
+1
-1
No files found.
src/altrepo/parser/methods.py
View file @
500f1bc4
...
@@ -17,6 +17,11 @@ class BaseParser:
...
@@ -17,6 +17,11 @@ class BaseParser:
resp
.
raise_for_status
()
resp
.
raise_for_status
()
return
await
resp
.
text
(
encoding
=
encoding
)
return
await
resp
.
text
(
encoding
=
encoding
)
async
def
get_bytes
(
self
,
url
:
str
)
->
bytes
:
async
with
self
.
session
.
get
(
url
)
as
resp
:
resp
.
raise_for_status
()
return
await
resp
.
read
()
class
NewsInfo
:
class
NewsInfo
:
def
__init__
(
self
,
client
:
BaseParser
):
def
__init__
(
self
,
client
:
BaseParser
):
...
@@ -25,33 +30,28 @@ class NewsInfo:
...
@@ -25,33 +30,28 @@ class NewsInfo:
async
def
news_urls
(
self
)
->
models
.
NewsURL
:
async
def
news_urls
(
self
)
->
models
.
NewsURL
:
return
await
urls_parser
(
self
.
client
)
return
await
urls_parser
(
self
.
client
)
async
def
bugs
(
self
)
->
models
.
BugsModel
:
async
def
_get_packages
(
self
,
branch
:
str
)
->
models
.
PackagesModel
|
None
:
url
=
(
await
self
.
news_urls
())
.
bugs
url
=
getattr
(
await
self
.
news_urls
(),
branch
,
None
)
if
not
url
:
if
not
url
:
return
None
return
None
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
return
await
bugs_parser
(
html
,
url
)
return
await
packages_parser
(
html
,
url
,
self
.
client
)
async
def
sisyphus
(
self
)
->
models
.
Package
sModel
|
None
:
async
def
bugs
(
self
)
->
models
.
Bug
sModel
|
None
:
url
=
(
await
self
.
news_urls
())
.
sisyphu
s
url
=
(
await
self
.
news_urls
())
.
bug
s
if
not
url
:
if
not
url
:
return
None
return
None
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
return
await
packages_parser
(
html
,
url
)
return
await
bugs_parser
(
html
,
url
)
async
def
sisyphus
(
self
)
->
models
.
PackagesModel
|
None
:
return
await
self
.
_get_packages
(
"sisyphus"
)
async
def
p11
(
self
)
->
models
.
PackagesModel
|
None
:
async
def
p11
(
self
)
->
models
.
PackagesModel
|
None
:
url
=
(
await
self
.
news_urls
())
.
p11
return
await
self
.
_get_packages
(
"p11"
)
if
not
url
:
return
None
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
return
await
packages_parser
(
html
,
url
)
async
def
p10
(
self
)
->
models
.
PackagesModel
|
None
:
async
def
p10
(
self
)
->
models
.
PackagesModel
|
None
:
url
=
(
await
self
.
news_urls
())
.
p10
return
await
self
.
_get_packages
(
"p10"
)
if
not
url
:
return
None
html
=
await
self
.
client
.
get
(
url
,
"koi8-r"
)
return
await
packages_parser
(
html
,
url
)
class
PackagesInfo
:
class
PackagesInfo
:
...
@@ -61,7 +61,7 @@ class PackagesInfo:
...
@@ -61,7 +61,7 @@ class PackagesInfo:
async
def
ftbfs
(
self
)
->
List
[
models
.
FTBFSModel
]:
async
def
ftbfs
(
self
)
->
List
[
models
.
FTBFSModel
]:
url
=
"https://git.altlinux.org/beehive/stats/Sisyphus-x86_64/ftbfs-joined"
url
=
"https://git.altlinux.org/beehive/stats/Sisyphus-x86_64/ftbfs-joined"
text
=
await
self
.
client
.
get
(
url
)
text
=
await
self
.
client
.
get
(
url
)
return
await
ftbfs_parser
(
text
)
return
ftbfs_parser
(
text
)
async
def
watch_by_maintainer
(
async
def
watch_by_maintainer
(
self
,
self
,
...
@@ -71,7 +71,7 @@ class PackagesInfo:
...
@@ -71,7 +71,7 @@ class PackagesInfo:
url
=
f
"https://watch.altlinux.org/pub/watch/{by_acl}/{maintainer_nickname}.txt"
url
=
f
"https://watch.altlinux.org/pub/watch/{by_acl}/{maintainer_nickname}.txt"
try
:
try
:
text
=
await
self
.
client
.
get
(
url
)
text
=
await
self
.
client
.
get
(
url
)
return
await
watch_parser
(
text
)
return
watch_parser
(
text
)
except
:
except
:
return
[]
return
[]
...
...
src/altrepo/parser/news/bugs.py
View file @
500f1bc4
...
@@ -28,7 +28,7 @@ async def bugs_parser(html: str, url: str):
...
@@ -28,7 +28,7 @@ async def bugs_parser(html: str, url: str):
current_bug
=
None
current_bug
=
None
description_buffer
=
""
description_buffer
=
""
section_name
=
await
_get_bug_section_name
(
line
)
section_name
=
_get_bug_section_name
(
line
)
continue
continue
bug_match
=
bug_pattern
.
match
(
line
)
bug_match
=
bug_pattern
.
match
(
line
)
...
@@ -64,7 +64,7 @@ async def bugs_parser(html: str, url: str):
...
@@ -64,7 +64,7 @@ async def bugs_parser(html: str, url: str):
return
models
.
BugsModel
(
**
data
)
return
models
.
BugsModel
(
**
data
)
async
def
_get_bug_section_name
(
line
:
str
)
->
str
:
def
_get_bug_section_name
(
line
:
str
)
->
str
:
line
=
line
.
lower
()
line
=
line
.
lower
()
if
"new"
in
line
and
"resolved"
in
line
:
if
"new"
in
line
and
"resolved"
in
line
:
return
"quickly_resolved"
return
"quickly_resolved"
...
...
src/altrepo/parser/news/packages.py
View file @
500f1bc4
import
aiohttp
from
bs4
import
BeautifulSoup
from
bs4
import
BeautifulSoup
import
re
import
re
import
io
import
io
...
@@ -6,7 +5,7 @@ import gzip
...
@@ -6,7 +5,7 @@ import gzip
from
..
import
models
from
..
import
models
async
def
packages_parser
(
html
:
str
,
url
:
str
):
async
def
packages_parser
(
html
:
str
,
url
:
str
,
client
=
None
):
soup
=
BeautifulSoup
(
html
,
"html.parser"
)
soup
=
BeautifulSoup
(
html
,
"html.parser"
)
pre_tag
=
soup
.
find
(
"pre"
)
pre_tag
=
soup
.
find
(
"pre"
)
if
not
pre_tag
:
if
not
pre_tag
:
...
@@ -15,9 +14,11 @@ async def packages_parser(html: str, url: str):
...
@@ -15,9 +14,11 @@ async def packages_parser(html: str, url: str):
pre_text
=
pre_tag
.
get_text
(
strip
=
True
)
pre_text
=
pre_tag
.
get_text
(
strip
=
True
)
if
"Было удалено вложение"
in
pre_text
and
"attachment"
in
pre_text
:
if
"Было удалено вложение"
in
pre_text
and
"attachment"
in
pre_text
:
attachment_link
=
pre_tag
.
find
(
"a"
,
href
=
True
)
attachment_link
=
pre_tag
.
find
(
"a"
,
href
=
True
)
if
attachment_link
:
if
attachment_link
and
client
:
attachment_url
=
attachment_link
[
"href"
]
attachment_url
=
attachment_link
[
"href"
]
text
=
await
_fetch
(
attachment_url
)
compressed_data
=
await
client
.
get_bytes
(
attachment_url
)
with
gzip
.
GzipFile
(
fileobj
=
io
.
BytesIO
(
compressed_data
))
as
gz
:
text
=
gz
.
read
()
.
decode
(
'utf-8'
)
else
:
else
:
return
models
.
PackagesModel
(
**
{
"added"
:
[],
"removed"
:
[],
"updated"
:
[],
"url"
:
"none"
})
return
models
.
PackagesModel
(
**
{
"added"
:
[],
"removed"
:
[],
"updated"
:
[],
"url"
:
"none"
})
else
:
else
:
...
@@ -71,7 +72,7 @@ async def packages_parser(html: str, url: str):
...
@@ -71,7 +72,7 @@ async def packages_parser(html: str, url: str):
current_package
=
{
current_package
=
{
"name"
:
match
.
group
(
1
),
"name"
:
match
.
group
(
1
),
"description"
:
await
_clean_description
(
match
.
group
(
2
)),
"description"
:
_clean_description
(
match
.
group
(
2
)),
}
}
seen_changelog
=
False
seen_changelog
=
False
continue
continue
...
@@ -100,19 +101,8 @@ async def packages_parser(html: str, url: str):
...
@@ -100,19 +101,8 @@ async def packages_parser(html: str, url: str):
return
models
.
PackagesModel
(
**
sections
)
return
models
.
PackagesModel
(
**
sections
)
async
def
_clean_description
(
desc
:
str
):
def
_clean_description
(
desc
:
str
):
desc
=
desc
.
strip
()
desc
=
desc
.
strip
()
desc
=
re
.
sub
(
r'\s+'
,
' '
,
desc
)
desc
=
re
.
sub
(
r'\s+'
,
' '
,
desc
)
desc
=
re
.
sub
(
r'\[\d+[KMG]?\]'
,
''
,
desc
)
.
strip
()
desc
=
re
.
sub
(
r'\[\d+[KMG]?\]'
,
''
,
desc
)
.
strip
()
return
desc
return
desc
async
def
_fetch
(
url
:
str
)
->
str
:
async
with
aiohttp
.
ClientSession
()
as
session
:
async
with
session
.
get
(
url
)
as
response
:
response
.
raise_for_status
()
compressed_data
=
await
response
.
read
()
with
gzip
.
GzipFile
(
fileobj
=
io
.
BytesIO
(
compressed_data
))
as
gz
:
text
=
gz
.
read
()
.
decode
(
'utf-8'
)
return
text
src/altrepo/parser/packages/ftbfs.py
View file @
500f1bc4
from
..
import
models
from
..
import
models
async
def
ftbfs_parser
(
text
:
str
):
def
ftbfs_parser
(
text
:
str
):
packages
=
[]
packages
=
[]
for
line
in
text
.
strip
()
.
splitlines
():
for
line
in
text
.
strip
()
.
splitlines
():
parts
=
line
.
split
(
'
\t
'
)
parts
=
line
.
split
(
'
\t
'
)
...
...
src/altrepo/parser/packages/watch.py
View file @
500f1bc4
from
..
import
models
from
..
import
models
async
def
watch_parser
(
text
:
str
):
def
watch_parser
(
text
:
str
):
return
[
return
[
models
.
WatchByMaintainerModel
(
models
.
WatchByMaintainerModel
(
pkg_name
=
parts
[
0
],
pkg_name
=
parts
[
0
],
...
...
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