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.