Xqt has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/135745

Change subject: [WIP] version history code cleanup
......................................................................

[WIP] version history code cleanup

- New Page.revisions() generator to retrieve Revision objects.
  This is derived from site.loadrevisions and will solve some
  bugs like 64188 and 55261
- getVersionHistory() and fullVersionHistory() will
  become deprecated state and it is recommended to use
  revisions() instead.
- __getitem__() if Revision class enables indexed read access to
  its values. This may be used for format strings, a sample is made
  in getVersionHistoryTable()
- deprecate arg "forceReload" is removed on some methods

... to be continued

Change-Id: I35fe88849655b7dda3763ac7fa37802d8149e636
---
M pywikibot/page.py
1 file changed, 46 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/45/135745/1

diff --git a/pywikibot/page.py b/pywikibot/page.py
index b40ec42..a824d10 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -1221,9 +1221,22 @@
         """
         return self.site.getredirtarget(self)
 
+    def revisions(self, getText=False, reverseOrder=False, step=None,
+                  total=None):
+        """Generator which load the version history page and yield history
+        information as Revision class
+
+        """
+        self.site.loadrevisions(self, getText=getText, rvdir=reverseOrder,
+                                step=step, total=total)
+        return (self._revisions[rev] for i, rev in
+                enumerate(sorted(self._revisions, reverse=not reverseOrder), 1)
+                if i <= total or total is None)
+
     # BREAKING CHANGE: in old framework, default value for getVersionHistory
     #                  returned no more than 500 revisions; now, it iterates
     #                  all revisions unless 'total' argument is used
+    @deprecated("Page.revisions()")
     @deprecate_arg("forceReload", None)
     @deprecate_arg("revCount", "total")
     @deprecate_arg("getAll", None)
@@ -1240,32 +1253,30 @@
         @param total: iterate no more than this number of revisions in total
 
         """
-        self.site.loadrevisions(self, getText=False, rvdir=reverseOrder,
-                                step=step, total=total)
-        return [(self._revisions[rev].revid,
-                 self._revisions[rev].timestamp,
-                 self._revisions[rev].user,
-                 self._revisions[rev].comment
-                 ) for rev in sorted(self._revisions,
-                                     reverse=not reverseOrder)
+        return [(rev.revid,
+                 rev.timestamp,
+                 rev.user,
+                 rev.comment
+                 ) for rev in self.revisions(reverseOrder=reverseOrder,
+                                             step=step, total=total)
                 ]
 
-    def getVersionHistoryTable(self, forceReload=False, reverseOrder=False,
-                               step=None, total=None):
+    @deprecate_arg("forceReload", None)
+    def getVersionHistoryTable(self, reverseOrder=False, step=None,
+                               total=None):
         """Return the version history as a wiki table."""
 
         result = '{| class="wikitable"\n'
         result += '! oldid || date/time || username || edit summary\n'
-        for oldid, time, username, summary \
-                in self.getVersionHistory(forceReload=forceReload,
-                                          reverseOrder=reverseOrder,
-                                          step=step, total=total):
+        for rev in self.revisions(reverseOrder=reverseOrder,
+                                  step=step, total=total):
             result += '|----\n'
-            result += '| %s || %s || %s || <nowiki>%s</nowiki>\n'\
-                      % (oldid, time, username, summary)
+            result += '| %(revid)s || %(timestamp)s || %(user)s || 
<nowiki>%(comment)s</nowiki>\n'\
+                      % rev
         result += '|}\n'
         return result
 
+    @deprecated("Page.revisions(getText=True)")
     def fullVersionHistory(self, reverseOrder=False, step=None,
                            total=None):
         """Iterate previous versions including wikitext.
@@ -1276,15 +1287,13 @@
             edit date/time, user name and content
 
         """
-        self.site.loadrevisions(self, getText=True,
-                                rvdir=reverseOrder,
-                                step=step, total=total)
-        return [(self._revisions[rev].revid,
-                 self._revisions[rev].timestamp,
-                 self._revisions[rev].user,
-                 self._revisions[rev].text
-                 ) for rev in sorted(self._revisions,
-                                     reverse=not reverseOrder)
+        return [(rev.revid,
+                 rev.timestamp,
+                 rev.user,
+                 rev.text,
+                 ) for rev in self.revisions(getText=True,
+                                             reverseOrder=reverseOrder,
+                                             step=step, total=total)
                 ]
 
     def contributingUsers(self, step=None, total=None):
@@ -1294,9 +1303,7 @@
         @param total: iterate no more than this number of revisions in total
 
         """
-        edits = self.getVersionHistory(step=step, total=total)
-        users = set([edit[2] for edit in edits])
-        return users
+        return set(rev.user for rev in self.revisions(step=step, total=total))
 
     @deprecate_arg("throttle", None)
     def move(self, newtitle, reason=None, movetalkpage=True, sysop=False,
@@ -3064,6 +3071,7 @@
 
 class Revision(object):
     """A structure holding information about a single revision of a Page."""
+
     def __init__(self, revid, timestamp, user, anon=False, comment=u"",
                  text=None, minor=False):
         """All parameters correspond to object attributes (e.g., revid
@@ -3093,6 +3101,16 @@
         self.comment = comment
         self.minor = minor
 
+    def __getitem__(self, key):
+        """Revision class may also give access to its values by keys
+
+        e.g. revid parameter may be assigned by revision['revid']
+        as well as revision.revid. This makes formatting strings easyer,
+        see getVersionHistoryTable() as a sample
+
+        """
+        return getattr(self, key)
+
 
 class Link(ComparableMixin):
     """A Mediawiki link (local or interwiki)

-- 
To view, visit https://gerrit.wikimedia.org/r/135745
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I35fe88849655b7dda3763ac7fa37802d8149e636
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Xqt <i...@gno.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to