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.