Skip to content

Commit db6fd22

Browse files
authored
WEB: Better management of releases (#56207)
1 parent f571cce commit db6fd22

File tree

3 files changed

+105
-1
lines changed

3 files changed

+105
-1
lines changed

.github/workflows/docbuild-and-upload.yml

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ jobs:
4646
- name: Build Pandas
4747
uses: ./.github/actions/build_pandas
4848

49+
- name: Test website
50+
run: python -m pytest web/
51+
4952
- name: Build website
5053
run: python web/pandas_web.py web/pandas --target-path=web/build
5154

web/pandas_web.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import collections
2828
import datetime
2929
import importlib
30+
import itertools
3031
import json
3132
import operator
3233
import os
@@ -40,6 +41,7 @@
4041
import feedparser
4142
import jinja2
4243
import markdown
44+
from packaging import version
4345
import requests
4446
import yaml
4547

@@ -245,6 +247,7 @@ def home_add_releases(context):
245247
context["releases"].append(
246248
{
247249
"name": release["tag_name"].lstrip("v"),
250+
"parsed_version": version.parse(release["tag_name"].lstrip("v")),
248251
"tag": release["tag_name"],
249252
"published": published,
250253
"url": (
@@ -254,7 +257,17 @@ def home_add_releases(context):
254257
),
255258
}
256259
)
257-
260+
# sorting out obsolete versions
261+
grouped_releases = itertools.groupby(
262+
context["releases"],
263+
key=lambda r: (r["parsed_version"].major, r["parsed_version"].minor),
264+
)
265+
context["releases"] = [
266+
max(release_group, key=lambda r: r["parsed_version"].minor)
267+
for _, release_group in grouped_releases
268+
]
269+
# sorting releases by version number
270+
context["releases"].sort(key=lambda r: r["parsed_version"], reverse=True)
258271
return context
259272

260273
@staticmethod

web/tests/test_pandas_web.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from unittest.mock import (
2+
mock_open,
3+
patch,
4+
)
5+
6+
import pytest
7+
import requests
8+
9+
from web.pandas_web import Preprocessors
10+
11+
12+
class MockResponse:
13+
def __init__(self, status_code: int, response: dict):
14+
self.status_code = status_code
15+
self._resp = response
16+
17+
def json(self):
18+
return self._resp
19+
20+
@staticmethod
21+
def raise_for_status():
22+
return
23+
24+
25+
@pytest.fixture
26+
def context() -> dict:
27+
return {
28+
"main": {"github_repo_url": "pandas-dev/pandas"},
29+
"target_path": "test_target_path",
30+
}
31+
32+
33+
@pytest.fixture(scope="function")
34+
def mock_response(monkeypatch, request):
35+
def mocked_resp(*args, **kwargs):
36+
status_code, response = request.param
37+
return MockResponse(status_code, response)
38+
39+
monkeypatch.setattr(requests, "get", mocked_resp)
40+
41+
42+
_releases_list = [
43+
{
44+
"prerelease": False,
45+
"published_at": "2024-01-19T03:34:05Z",
46+
"tag_name": "v1.5.6",
47+
"assets": None,
48+
},
49+
{
50+
"prerelease": False,
51+
"published_at": "2023-11-10T19:07:37Z",
52+
"tag_name": "v2.1.3",
53+
"assets": None,
54+
},
55+
{
56+
"prerelease": False,
57+
"published_at": "2023-08-30T13:24:32Z",
58+
"tag_name": "v2.1.0",
59+
"assets": None,
60+
},
61+
{
62+
"prerelease": False,
63+
"published_at": "2023-04-30T13:24:32Z",
64+
"tag_name": "v2.0.0",
65+
"assets": None,
66+
},
67+
{
68+
"prerelease": True,
69+
"published_at": "2023-01-19T03:34:05Z",
70+
"tag_name": "v1.5.3xd",
71+
"assets": None,
72+
},
73+
{
74+
"prerelease": False,
75+
"published_at": "2027-01-19T03:34:05Z",
76+
"tag_name": "v10.0.1",
77+
"assets": None,
78+
},
79+
]
80+
81+
82+
@pytest.mark.parametrize("mock_response", [(200, _releases_list)], indirect=True)
83+
def test_web_preprocessor_creates_releases(mock_response, context):
84+
m = mock_open()
85+
with patch("builtins.open", m):
86+
context = Preprocessors.home_add_releases(context)
87+
release_versions = [release["name"] for release in context["releases"]]
88+
assert release_versions == ["10.0.1", "2.1.3", "2.0.0", "1.5.6"]

0 commit comments

Comments
 (0)