Revision: 6462
Author:   nicdumz
Date:     2009-03-02 08:20:02 +0000 (Mon, 02 Mar 2009)

Log Message:
-----------
* Splitting Page._redir into Page._isredir and Page._redirtarget:
** Filling ._isredir with a (boolean) value can be done easily in update_page
** But getting the redirect target requires an additional API request
** And mixing both usages is not necessary! Knowing that we have a redirect 
page without knowing its target is sometimes enough.

* Avoiding code duplication in Page.isRedirect, Page.getRediretTarget, 
Site.getredirtarget, and Site.page_isredirect

* Implementing a clean Page.get():
** adding error handling
** adding a naive Page._getInternals to simplify code

Modified Paths:
--------------
    branches/rewrite/pywikibot/data/api.py
    branches/rewrite/pywikibot/page.py
    branches/rewrite/pywikibot/site.py

Modified: branches/rewrite/pywikibot/data/api.py
===================================================================
--- branches/rewrite/pywikibot/data/api.py      2009-03-02 07:00:46 UTC (rev 
6461)
+++ branches/rewrite/pywikibot/data/api.py      2009-03-02 08:20:02 UTC (rev 
6462)
@@ -648,7 +648,7 @@
         raise AssertionError(
             "Page %s has neither 'pageid' nor 'missing' attribute"
              % pagedict['title'])
-    page._redir = 'redirect' in pagedict
+    page._isredir = 'redirect' in pagedict
     if 'touched' in pagedict:
         page._timestamp = pagedict['touched']
     if 'protection' in pagedict:

Modified: branches/rewrite/pywikibot/page.py
===================================================================
--- branches/rewrite/pywikibot/page.py  2009-03-02 07:00:46 UTC (rev 6461)
+++ branches/rewrite/pywikibot/page.py  2009-03-02 08:20:02 UTC (rev 6462)
@@ -295,24 +295,45 @@
 
         """
         if force:
-            # When forcing, we retry the page no matter what. Old exceptions
-            # do not apply any more.
-            for attr in ['_redirarg', '_getexception']:
+            # When forcing, we retry the page no matter what:
+            # * Old exceptions do not apply any more
+            # * Deleting _revid to force reload
+            # * Deleting _redirtarget, that info is now obsolete.
+            for attr in ['_redirtarget', '_getexception', '_revid']:
                 if hasattr(self, attr):
                     delattr(self,attr)
-        else:
-            # Make sure we re-raise an exception we got on an earlier attempt
-            if hasattr(self, '_redirarg') and not get_redirect:
-                raise pywikibot.IsRedirectPage(self)
-            elif hasattr(self, '_getexception'):
-                raise self._getexception
-        if force or not hasattr(self, "_revid") \
+        try:
+            self._getInternals(sysop)
+        except pywikibot.IsRedirectPage:
+            if not get_redirect:
+                raise
+
+        return self._revisions[self._revid].text
+
+    def _getInternals(self, sysop):
+        """Helper function for get(). 
+        Stores latest revision in self if it doesn't contain it, doesn't think.
+        * Raises exceptions from previous runs.
+        * Stores new exceptions in _getexception and raises them"""
+
+        # Raise exceptions from previous runs
+        if hasattr(self, '_getexception'):
+            raise self._getexception
+
+        # If not already stored, fetch revision
+        if not hasattr(self, "_revid") \
                  or not self._revid in self._revisions \
                  or self._revisions[self._revid].text is None:
-            self.site().loadrevisions(self, getText=True, sysop=sysop)
-            # TODO: Exception handling for no-page, redirects, etc.
+            try:
+                self.site().loadrevisions(self, getText=True, sysop=sysop)
+            except (pywikibot.NoPage, pywikibot.SectionError), e:
+                self._getexception = e
+                raise
 
-        return self._revisions[self._revid].text
+        # self._isredir is set by loadrevisions
+        if self._isredir:
+            self._getexception = pywikibot.IsRedirectPage(self)
+            raise self._getexception
 
     @deprecate_arg("throttle", None)
     @deprecate_arg("nofollow_redirects", None)
@@ -864,11 +885,7 @@
         exception. This method also can raise a NoPage exception.
 
         """
-        if not self.isRedirectPage():
-            raise pywikibot.IsNotRedirectPage(self.title())
-        if not isinstance(self._redir, Page):
-            self.site().getredirtarget(self)
-        return self._redir
+        return self.site().getredirtarget(self)
 
     @deprecate_arg("forceReload", None)
     def getVersionHistory(self, reverseOrder=False, getAll=False,

Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py  2009-03-02 07:00:46 UTC (rev 6461)
+++ branches/rewrite/pywikibot/site.py  2009-03-02 08:20:02 UTC (rev 6462)
@@ -961,16 +961,16 @@
 
     def page_isredirect(self, page):
         """Return True if and only if page is a redirect."""
-        if not hasattr(page, "_redir"):
+        if not hasattr(page, "_isredir"):
             self.loadpageinfo(page)
-        return bool(page._redir)
+        return page._isredir
 
     def getredirtarget(self, page):
         """Return Page object for the redirect target of page."""
-        if not hasattr(page, "_redir"):
-            self.loadpageinfo(page)
-        if not page._redir:
+        if not self.page_isredirect(page):
             raise pywikibot.IsNotRedirectPage(page)
+        if hasattr(page, '_redirtarget'):
+            return page._redirtarget
         title = page.title(withSection=False)
         query = api.Request(site=self, action="query", property="info",
                             inprop="protection|talkid|subjectid",
@@ -998,7 +998,8 @@
                     % pagedata['title'])
             target = pywikibot.Page(self, pagedata['title'], pagedata['ns'])
             api.update_page(target, pagedata)
-            page._redir = target
+            page._redirtarget = target
+        return page._redirtarget
 
     def preloadpages(self, pagelist, groupsize=50):
         """Return a generator to a list of preloaded pages.



_______________________________________________
Pywikipedia-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l

Reply via email to