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 <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to