From 5c0e27fa7493cec17db6a53d6debd3498cf51704 Mon Sep 17 00:00:00 2001 From: miroslavpojer Date: Mon, 8 Sep 2025 15:31:51 +0200 Subject: [PATCH] #160 - Update to latest version of PyGitHub - Updated version of PyGitHub to latest one. Required update of code and unit tests. --- .../utils/github_rate_limiter.py | 10 +++++----- requirements.txt | 2 +- tests/conftest.py | 13 +++++-------- tests/release_notes/test_record_factory.py | 12 ++++++------ tests/test_miner.py | 4 ++-- tests/test_release_notes_generator.py | 11 +++++------ tests/utils/test_github_rate_limiter.py | 7 ++++--- 7 files changed, 28 insertions(+), 31 deletions(-) diff --git a/release_notes_generator/utils/github_rate_limiter.py b/release_notes_generator/utils/github_rate_limiter.py index e99ad242..599ce7d5 100644 --- a/release_notes_generator/utils/github_rate_limiter.py +++ b/release_notes_generator/utils/github_rate_limiter.py @@ -21,7 +21,7 @@ import logging import time from datetime import datetime -from typing import Optional, Callable, Any +from typing import Optional, Callable, Any, cast from github import Github logger = logging.getLogger(__name__) @@ -33,7 +33,7 @@ class GithubRateLimiter: """ def __init__(self, github_client: Github): - self.github_client = github_client + self.github_client: Github = github_client def __call__(self, method: Callable) -> Callable: """ @@ -44,9 +44,9 @@ def __call__(self, method: Callable) -> Callable: """ def wrapped_method(*args, **kwargs) -> Optional[Any]: - # rate_limit = self.github_client.get_rate_limit().core - remaining_calls = self.github_client.get_rate_limit().core.remaining - reset_time = self.github_client.get_rate_limit().core.reset.timestamp() + rate_limit_overview = self.github_client.get_rate_limit() + remaining_calls = rate_limit_overview.rate.remaining + reset_time = rate_limit_overview.rate.reset.timestamp() if remaining_calls < 5: logger.info("Rate limit almost reached. Sleeping until reset time.") diff --git a/requirements.txt b/requirements.txt index 2dfbf356..ae435044 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ pytest==8.4.2 pytest-cov==6.3.0 pytest-mock==3.15.0 -PyGithub==1.59.0 pylint==3.3.8 requests==2.32.5 black==25.1.0 @@ -11,3 +10,4 @@ mypy==1.17.1 mypy-extensions==1.1.0 types-requests==2.32.4.20250809 types-PyYAML==6.0.12.20250822 +PyGithub==2.8.1 diff --git a/tests/conftest.py b/tests/conftest.py index 6f6a7625..28c6592e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,7 +16,7 @@ import time -from datetime import datetime +from datetime import datetime, timedelta import pytest @@ -26,7 +26,7 @@ from github.Issue import Issue from github.PullRequest import PullRequest from github.Rate import Rate -from github.RateLimit import RateLimit +from github.RateLimitOverview import RateLimitOverview from github.Repository import Repository from release_notes_generator.model.issue_record import IssueRecord @@ -112,14 +112,11 @@ def rate_limiter(mocker, request): @pytest.fixture def mock_rate_limiter(mocker): mock_rate = mocker.Mock(spec=Rate) - mock_rate.timestamp = mocker.Mock(return_value=time.time() + 3600) - - mock_core = mocker.Mock(spec=RateLimit) - mock_core.reset = mock_rate + mock_rate.reset = datetime.now() + timedelta(hours=1) mock = mocker.Mock(spec=GithubRateLimiter) - mock.core = mock_core - mock.core.remaining = 10 + mock.rate = mock_rate + mock.rate.remaining = 10 return mock diff --git a/tests/release_notes/test_record_factory.py b/tests/release_notes/test_record_factory.py index 23a55ded..565b9f6e 100644 --- a/tests/release_notes/test_record_factory.py +++ b/tests/release_notes/test_record_factory.py @@ -177,8 +177,8 @@ def test_generate_with_issues_and_pulls_and_commits(mocker, mock_repo): issue1, issue2, pr1, pr2, commit1, commit2 = setup_issues_pulls_commits(mocker) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 10 - mock_rate_limit.core.reset.timestamp.return_value = time.time() + 3600 + mock_rate_limit.rate.remaining = 10 + mock_rate_limit.rate.reset.timestamp.return_value = time.time() + 3600 mock_github_client.get_rate_limit.return_value = mock_rate_limit data = MinedData() @@ -271,8 +271,8 @@ def test_generate_with_no_commits(mocker, mock_repo): data.pull_requests = [pr1] # PR linked to a non-fetched issues (due to since condition) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 10 - mock_rate_limit.core.reset.timestamp.return_value = time.time() + 3600 + mock_rate_limit.rate.remaining = 10 + mock_rate_limit.rate.reset.timestamp.return_value = time.time() + 3600 mock_github_client.get_rate_limit.return_value = mock_rate_limit mock_repo.get_issue.return_value = issue2 @@ -306,8 +306,8 @@ def test_generate_with_no_commits_with_wrong_issue_number_in_pull_body_mention(m data.pull_requests = [pr1] # PR linked to a non-fetched issues (due to since condition) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 10 - mock_rate_limit.core.reset.timestamp.return_value = time.time() + 3600 + mock_rate_limit.rate.remaining = 10 + mock_rate_limit.rate.reset.timestamp.return_value = time.time() + 3600 mock_github_client.get_rate_limit.return_value = mock_rate_limit mock_repo.get_issue.return_value = issue2 diff --git a/tests/test_miner.py b/tests/test_miner.py index ed3aadf2..c94c988f 100644 --- a/tests/test_miner.py +++ b/tests/test_miner.py @@ -68,7 +68,7 @@ def test_get_latest_release_from_tag_name_not_defined_2_releases_type_error(mock data = MinedDataMock(mocker, mock_git_releases, mock_repo) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 1000 + mock_rate_limit.rate.remaining = 1000 github_mock.get_rate_limit.return_value = mock_rate_limit release_notes_miner = DataMiner(github_mock, mock_rate_limit) @@ -95,7 +95,7 @@ def test_get_latest_release_from_tag_name_not_defined_2_releases_value_error(moc data = MinedDataMock(mocker, mock_git_releases, mock_repo) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 1000 + mock_rate_limit.rate.remaining = 1000 github_mock.get_rate_limit.return_value = mock_rate_limit release_notes_miner = DataMiner(github_mock, mock_rate_limit) diff --git a/tests/test_release_notes_generator.py b/tests/test_release_notes_generator.py index 2d55ea27..d13ac952 100644 --- a/tests/test_release_notes_generator.py +++ b/tests/test_release_notes_generator.py @@ -33,8 +33,8 @@ def test_generate_release_notes_repository_not_found(mocker): github_mock.get_repo.return_value = None mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 10 - mock_rate_limit.core.reset.timestamp.return_value = time.time() + 3600 + mock_rate_limit.rate.remaining = 10 + mock_rate_limit.rate.reset.timestamp.return_value = time.time() + 3600 github_mock.get_rate_limit.return_value = mock_rate_limit custom_chapters = CustomChapters(print_empty_chapters=True) @@ -69,7 +69,7 @@ def test_generate_release_notes_latest_release_not_found( mocker.patch("release_notes_generator.miner.DataMiner.get_latest_release", return_value=None) mocker.patch("release_notes_generator.record.record_factory.get_issues_for_pr", return_value=[]) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 1000 + mock_rate_limit.rate.remaining = 1000 github_mock.get_rate_limit.return_value = mock_rate_limit custom_chapters = CustomChapters(print_empty_chapters=True) @@ -115,7 +115,7 @@ def test_generate_release_notes_latest_release_found_by_created_at( mocker.patch("release_notes_generator.record.record_factory.get_issues_for_pr", return_value=[]) mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 1000 + mock_rate_limit.rate.remaining = 1000 github_mock.get_rate_limit.return_value = mock_rate_limit mock_get_action_input = mocker.patch("release_notes_generator.utils.gh_action.get_action_input") @@ -166,9 +166,8 @@ def test_generate_release_notes_latest_release_found_by_published_at( mocker.patch("release_notes_generator.miner.DataMiner.get_latest_release", return_value=mock_git_release) mocker.patch("release_notes_generator.record.record_factory.get_issues_for_pr", return_value=[]) - mock_rate_limit = mocker.Mock() - mock_rate_limit.core.remaining = 1000 + mock_rate_limit.rate.remaining = 1000 github_mock.get_rate_limit.return_value = mock_rate_limit custom_chapters = CustomChapters(print_empty_chapters=True) diff --git a/tests/utils/test_github_rate_limiter.py b/tests/utils/test_github_rate_limiter.py index d55a7f90..b73417c7 100644 --- a/tests/utils/test_github_rate_limiter.py +++ b/tests/utils/test_github_rate_limiter.py @@ -15,12 +15,13 @@ # import time +from datetime import datetime, timedelta def test_rate_limiter_extended_sleep_remaining_1(mocker, rate_limiter, mock_rate_limiter): # Patch time.sleep to avoid actual delay and track call count mock_sleep = mocker.patch("time.sleep", return_value=None) - mock_rate_limiter.core.remaining = 1 + mock_rate_limiter.rate.remaining = 1 # Mock method to be wrapped method_mock = mocker.Mock() @@ -49,8 +50,8 @@ def test_rate_limiter_extended_sleep_remaining_10(mocker, rate_limiter): def test_rate_limiter_extended_sleep_remaining_1_negative_reset_time(mocker, rate_limiter, mock_rate_limiter): # Patch time.sleep to avoid actual delay and track call count mock_sleep = mocker.patch("time.sleep", return_value=None) - mock_rate_limiter.core.remaining = 1 - mock_rate_limiter.core.reset.timestamp = mocker.Mock(return_value=time.time() - 1000) + mock_rate_limiter.rate.remaining = 1 + mock_rate_limiter.rate.reset = datetime.now() + timedelta(hours=1) # Mock method to be wrapped method_mock = mocker.Mock()