From 995bfe225acf36e9d5703a27c4441227b99ae6bd Mon Sep 17 00:00:00 2001 From: Dmitry Dandykin Date: Mon, 27 Nov 2023 17:34:20 +0000 Subject: [PATCH 1/3] Add sorting of release versions for web sorting on version number + sorting out obsolete versions --- web/pandas_web.py | 15 ++++++- web/tests/test_pandas_web.py | 82 ++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 web/tests/test_pandas_web.py diff --git a/web/pandas_web.py b/web/pandas_web.py index 1cd3be456bfe0..b6d72010879e9 100755 --- a/web/pandas_web.py +++ b/web/pandas_web.py @@ -27,6 +27,7 @@ import collections import datetime import importlib +import itertools import json import operator import os @@ -40,6 +41,7 @@ import feedparser import jinja2 import markdown +from packaging import version import requests import yaml @@ -239,7 +241,7 @@ def home_add_releases(context): ) context["releases"].append( { - "name": release["tag_name"].lstrip("v"), + "name": version.parse(release["tag_name"].lstrip("v")), "tag": release["tag_name"], "published": published, "url": ( @@ -249,7 +251,16 @@ def home_add_releases(context): ), } ) - + # sorting out obsolete versions + grouped_releases = itertools.groupby( + context["releases"], key=lambda r: (r["name"].major, r["name"].minor) + ) + context["releases"] = [ + max(release_group, key=lambda r: r["name"].minor) + for _, release_group in grouped_releases + ] + # sorting releases by version number + context["releases"].sort(key=lambda r: r["name"], reverse=True) return context @staticmethod diff --git a/web/tests/test_pandas_web.py b/web/tests/test_pandas_web.py new file mode 100644 index 0000000000000..c57ad9a46f45f --- /dev/null +++ b/web/tests/test_pandas_web.py @@ -0,0 +1,82 @@ +from unittest.mock import ( + mock_open, + patch, +) + +import pytest +import requests + +from web.pandas_web import Preprocessors + + +class MockResponse: + def __init__(self, status_code: int, response: dict): + self.status_code = status_code + self._resp = response + + def json(self): + return self._resp + + @staticmethod + def raise_for_status(): + return + + +@pytest.fixture +def context() -> dict: + return { + "main": {"github_repo_url": "pandas-dev/pandas"}, + "target_path": "test_target_path", + } + + +@pytest.fixture(scope="function") +def mock_response(monkeypatch, request): + def mocked_resp(*args, **kwargs): + status_code, response = request.param + return MockResponse(status_code, response) + + monkeypatch.setattr(requests, "get", mocked_resp) + + +_releases_list = [ + { + "prerelease": False, + "published_at": "2024-01-19T03:34:05Z", + "tag_name": "v1.5.6", + "assets": None, + }, + { + "prerelease": False, + "published_at": "2023-11-10T19:07:37Z", + "tag_name": "v2.1.3", + "assets": None, + }, + { + "prerelease": False, + "published_at": "2023-08-30T13:24:32Z", + "tag_name": "v2.1.0", + "assets": None, + }, + { + "prerelease": False, + "published_at": "2023-04-30T13:24:32Z", + "tag_name": "v2.0.0", + "assets": None, + }, + { + "prerelease": True, + "published_at": "2023-01-19T03:34:05Z", + "tag_name": "v1.5.3xd", + "assets": None, + }, +] + + +@pytest.mark.parametrize("mock_response", [(200, _releases_list)], indirect=True) +def test_web_preprocessor_creates_releases(mock_response, context): + m = mock_open() + with patch("builtins.open", m): + context = Preprocessors.home_add_releases(context) + release_versions = [str(release["name"]) for release in context["releases"]] + assert release_versions == ["2.1.3", "2.0.0", "1.5.6"] From 9d46a75fd642a963e6574e4138a7375ec2cb6721 Mon Sep 17 00:00:00 2001 From: Dmitry Dandykin Date: Mon, 27 Nov 2023 18:30:34 +0000 Subject: [PATCH 2/3] Added test case and new key for parsed verison in releases --- web/pandas_web.py | 10 ++++++---- web/tests/test_pandas_web.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/web/pandas_web.py b/web/pandas_web.py index b6d72010879e9..58b5c287791c1 100755 --- a/web/pandas_web.py +++ b/web/pandas_web.py @@ -241,7 +241,8 @@ def home_add_releases(context): ) context["releases"].append( { - "name": version.parse(release["tag_name"].lstrip("v")), + "name": release["tag_name"].lstrip("v"), + "parsed_version": version.parse(release["tag_name"].lstrip("v")), "tag": release["tag_name"], "published": published, "url": ( @@ -253,14 +254,15 @@ def home_add_releases(context): ) # sorting out obsolete versions grouped_releases = itertools.groupby( - context["releases"], key=lambda r: (r["name"].major, r["name"].minor) + context["releases"], + key=lambda r: (r["parsed_version"].major, r["parsed_version"].minor), ) context["releases"] = [ - max(release_group, key=lambda r: r["name"].minor) + max(release_group, key=lambda r: r["parsed_version"].minor) for _, release_group in grouped_releases ] # sorting releases by version number - context["releases"].sort(key=lambda r: r["name"], reverse=True) + context["releases"].sort(key=lambda r: r["parsed_version"], reverse=True) return context @staticmethod diff --git a/web/tests/test_pandas_web.py b/web/tests/test_pandas_web.py index c57ad9a46f45f..827c1d4dbea40 100644 --- a/web/tests/test_pandas_web.py +++ b/web/tests/test_pandas_web.py @@ -70,6 +70,12 @@ def mocked_resp(*args, **kwargs): "tag_name": "v1.5.3xd", "assets": None, }, + { + "prerelease": False, + "published_at": "2027-01-19T03:34:05Z", + "tag_name": "v10.0.1", + "assets": None, + }, ] @@ -78,5 +84,5 @@ def test_web_preprocessor_creates_releases(mock_response, context): m = mock_open() with patch("builtins.open", m): context = Preprocessors.home_add_releases(context) - release_versions = [str(release["name"]) for release in context["releases"]] - assert release_versions == ["2.1.3", "2.0.0", "1.5.6"] + release_versions = [release["name"] for release in context["releases"]] + assert release_versions == ["10.0.1", "2.1.3", "2.0.0", "1.5.6"] From d4ea2dcc6db6f330796c9c179fdcbd489e2160f3 Mon Sep 17 00:00:00 2001 From: Dmitry Dandykin Date: Mon, 27 Nov 2023 21:43:22 +0000 Subject: [PATCH 3/3] Update docbuild ci, add tests for website generation --- .github/workflows/docbuild-and-upload.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docbuild-and-upload.yml b/.github/workflows/docbuild-and-upload.yml index af452363666b5..4e88bfff69327 100644 --- a/.github/workflows/docbuild-and-upload.yml +++ b/.github/workflows/docbuild-and-upload.yml @@ -46,6 +46,9 @@ jobs: - name: Build Pandas uses: ./.github/actions/build_pandas + - name: Test website + run: python -m pytest web/ + - name: Build website run: python web/pandas_web.py web/pandas --target-path=web/build