Skip to content

Commit be3b71d

Browse files
committed
Add ability to return package_infos with a given timestamp
1 parent d99b58e commit be3b71d

File tree

4 files changed

+72
-8
lines changed

4 files changed

+72
-8
lines changed

alws/crud/package_info.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
from collections import namedtuple
23
from typing import Optional
34

@@ -15,14 +16,15 @@ async def get_package_info(
1516
package_name: str,
1617
platform_name: str,
1718
arch: Optional[str] = None,
19+
updated_after: Optional[str] = None,
1820
):
1921
platform_id_query = select(Platform.id).where(
2022
Platform.name == platform_name
2123
)
2224
platform_id = (await bs_db.execute(platform_id_query)).scalar()
2325

2426
if not platform_id:
25-
raise PlatformNotFoundError(f'Invalid distribution: {platform_name}')
27+
raise PlatformNotFoundError(f"Invalid distribution: {platform_name}")
2628

2729
conditions = [
2830
Repository.platform_id == platform_id,
@@ -40,10 +42,18 @@ async def get_package_info(
4042

4143
repo_ids = [repo.pulp_href.split('/')[-2] for repo in repositories]
4244

43-
subq = select(CoreRepositoryContent.content_id).where(
45+
subq_conditions = [
4446
CoreRepositoryContent.repository_id.in_(repo_ids),
4547
CoreRepositoryContent.version_removed_id.is_(None),
46-
)
48+
]
49+
if updated_after:
50+
last_updated = datetime.datetime.strptime(
51+
updated_after, "%Y-%m-%d %H:%M:%S"
52+
)
53+
subq_conditions.append(
54+
CoreRepositoryContent.pulp_last_updated >= last_updated
55+
)
56+
subq = select(CoreRepositoryContent.content_id).where(*subq_conditions)
4757

4858
query = select(
4959
RpmPackage.name,
@@ -57,12 +67,12 @@ async def get_package_info(
5767
pulp_packages = (await pulp_db.execute(query)).all()
5868

5969
PackageTuple = namedtuple(
60-
'PackageTuple',
70+
"PackageTuple",
6171
[
62-
'name',
63-
'version',
64-
'release',
65-
'changelogs',
72+
"name",
73+
"version",
74+
"release",
75+
"changelogs",
6676
],
6777
)
6878
packages = []

alws/routers/package_info.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ async def get_package_info(
2525
name: str,
2626
almalinux_version: int,
2727
arch: Optional[str] = None,
28+
updated_after: Optional[str] = None,
2829
bs_db: AsyncSession = Depends(
2930
AsyncSessionDependency(key=get_async_db_key())
3031
),
@@ -41,6 +42,7 @@ async def get_package_info(
4142
name,
4243
platform_name,
4344
arch,
45+
updated_after,
4446
)
4547
return packages
4648
except (PlatformNotFoundError, RepositoriesNotFoundError) as exc:

tests/fixtures/package_info.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
from typing import List, Dict, Any
23

34
import pytest
@@ -49,4 +50,39 @@ async def mock_func(*args, **kwargs):
4950
return []
5051
monkeypatch.setattr("alws.crud.package_info.get_package_info", mock_func)
5152

53+
@pytest.fixture
54+
def mock_get_package_info_with_date_filter(monkeypatch):
55+
async def mock_func(*args, **kwargs):
56+
updated_after = args[-1]
57+
packages = [
58+
{
59+
"name": "example_package",
60+
"version": "1.0",
61+
"release": "1.el8",
62+
"changelogs": ["Initial release"],
63+
"pulp_last_updated": "2024-01-01 10:00:00",
64+
},
65+
{
66+
"name": "example_package",
67+
"version": "1.1",
68+
"release": "2.el9",
69+
"changelogs": ["Security patch"],
70+
"pulp_last_updated": "2024-06-01 12:00:00",
71+
},
72+
]
73+
74+
if updated_after:
75+
cutoff = datetime.datetime.strptime(updated_after, "%Y-%m-%d %H:%M:%S")
76+
filtered = [
77+
{
78+
k: v for k, v in pkg.items() if k != "pulp_last_updated"
79+
}
80+
for pkg in packages
81+
if datetime.datetime.strptime(pkg["pulp_last_updated"], "%Y-%m-%d %H:%M:%S") >= cutoff
82+
]
83+
else:
84+
filtered = [ {k: v for k, v in pkg.items() if k != "pulp_last_updated"} for pkg in packages ]
5285

86+
return filtered
87+
88+
monkeypatch.setattr("alws.crud.package_info.get_package_info", mock_func)

tests/test_api/test_package_info.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,19 @@ async def test_missing_required_query_params(self):
5555
)
5656

5757
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
58+
59+
async def test_get_package_info_with_updated_after(
60+
self, mock_get_package_info_with_date_filter
61+
):
62+
updated_after = "updated_after=2024-05-01 00:00:00"
63+
q_params = f"?name=example_package&almalinux_version=9&{updated_after}"
64+
response = await self.make_request(
65+
"get",
66+
f"/api/v1/package_info/{q_params}",
67+
)
68+
69+
assert response.status_code == status.HTTP_200_OK
70+
data = response.json()
71+
assert len(data) == 1
72+
assert data[0]["version"] == "1.1"
73+
assert data[0]["release"] == "2.el9"

0 commit comments

Comments
 (0)