Xqt has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/779948
)
Change subject: [bugfix]: fix Page.revisions() with starttime
......................................................................
[bugfix]: fix Page.revisions() with starttime
Do not ignore starttime parameter in Page.revisions() when
revisions have been already requested.
Bug: T109181
Change-Id: I5b0ff69026ae481d94fa2ca1cee718af5ff7eb59
---
M pywikibot/page/_pages.py
M tests/page_tests.py
2 files changed, 53 insertions(+), 3 deletions(-)
Approvals:
Xqt: Verified; Looks good to me, approved
diff --git a/pywikibot/page/_pages.py b/pywikibot/page/_pages.py
index dfe2945..d398b87 100644
--- a/pywikibot/page/_pages.py
+++ b/pywikibot/page/_pages.py
@@ -23,13 +23,14 @@
import re
from collections import Counter, defaultdict
from contextlib import suppress
+from itertools import islice
from textwrap import shorten, wrap
from typing import Optional, Union
from urllib.parse import quote_from_bytes
from warnings import warn
import pywikibot
-from pywikibot import config, date, i18n, textlib
+from pywikibot import Timestamp, config, date, i18n, textlib
from pywikibot.backports import Generator, Iterable, List
from pywikibot.cosmetic_changes import CANCEL, CosmeticChangesToolkit
from pywikibot.exceptions import (
@@ -1679,8 +1680,24 @@
self.site.loadrevisions(self, content=content, rvdir=reverse,
starttime=starttime, endtime=endtime,
total=total)
- return (self._revisions[rev] for rev in
- sorted(self._revisions, reverse=not reverse)[:total])
+
+ revs = self._revisions.values()
+
+ if starttime or endtime:
+ t_min, t_max = Timestamp.min, Timestamp.max
+
+ if reverse:
+ t0 = Timestamp.fromISOformat(starttime) if starttime else t_min
+ t1 = Timestamp.fromISOformat(endtime) if endtime else t_max
+ else:
+ t0 = Timestamp.fromISOformat(endtime) if endtime else t_min
+ t1 = Timestamp.fromISOformat(starttime) if starttime else t_max
+
+ revs = [rev for rev in revs if t0 <= rev.timestamp <= t1]
+
+ revs = sorted(revs, reverse=not reverse, key=lambda rev: rev.timestamp)
+
+ return islice(revs, total)
def getVersionHistoryTable(self,
reverse: bool = False,
diff --git a/tests/page_tests.py b/tests/page_tests.py
index 263e5ee..5176308 100755
--- a/tests/page_tests.py
+++ b/tests/page_tests.py
@@ -8,6 +8,7 @@
import pickle
import re
from contextlib import suppress
+from datetime import timedelta
from unittest import mock
import pywikibot
@@ -886,6 +887,38 @@
self.assertIsInstance(top_two_edit_count, int)
self.assertEqual(top_two_edit_count, sum(top_two_counts))
+ def test_revisions_time_interval_false(self):
+ """Test Page.revisions() with reverse=False."""
+ mp = self.get_mainpage()
+
+ latest_rev = mp.latest_revision
+ oldest_rev = mp.oldest_revision
+ oldest_ts = oldest_rev.timestamp
+
+ [rev] = list(mp.revisions(total=1))
+ self.assertEqual(rev.revid, latest_rev.revid)
+
+ ts = oldest_ts + timedelta(seconds=1)
+ [rev] = list(mp.revisions(total=1, starttime=ts.isoformat()))
+ self.assertEqual(rev.revid, oldest_rev.revid)
+
+ def test_revisions_time_interval_true(self):
+ """Test Page.revisions() with reverse=True."""
+ mp = self.get_mainpage()
+
+ latest_rev = mp.latest_revision
+ latest_ts = latest_rev.timestamp
+ oldest_rev = mp.oldest_revision
+
+ [rev] = list(mp.revisions(total=1, reverse=True))
+ self.assertEqual(rev.revid, oldest_rev.revid)
+
+ ts = latest_ts - timedelta(seconds=1)
+ [rev] = list(mp.revisions(total=1,
+ starttime=ts.isoformat(),
+ reverse=True))
+ self.assertEqual(rev.revid, latest_rev.revid)
+
class TestPageRedirects(TestCase):
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/779948
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I5b0ff69026ae481d94fa2ca1cee718af5ff7eb59
Gerrit-Change-Number: 779948
Gerrit-PatchSet: 4
Gerrit-Owner: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged