[Pywikipedia-l] SVN: [6449] branches/rewrite/pywikibot

russblau at svn.wikimedia.org russblau at svn.wikimedia.org
Fri Feb 27 16:55:46 UTC 2009


Revision: 6449
Author:   russblau
Date:     2009-02-27 16:55:46 +0000 (Fri, 27 Feb 2009)

Log Message:
-----------
add Category.members() method to generate both subcategories and articles;
fix problems with templatesWithParams() methods;
default to groups of 50 when preloading;
fix output formatting problems and other minor bugs

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

Modified: branches/rewrite/pywikibot/__init__.py
===================================================================
--- branches/rewrite/pywikibot/__init__.py	2009-02-27 16:53:22 UTC (rev 6448)
+++ branches/rewrite/pywikibot/__init__.py	2009-02-27 16:55:46 UTC (rev 6449)
@@ -33,10 +33,12 @@
     classname = f.f_locals['self'].__class__.__name__ 
     funcname = f.f_code.co_name
     if instead:
-        logging.warning("%s.%s is DEPRECATED, use %s instead" % \
-            (classname, funcname, instead))
+        output(u"%s.%s is DEPRECATED, use %s instead."
+                % (classname, funcname, instead),
+               level=WARNING)
     else:
-        logging.warning("%s.%s is DEPRECATED." % (classname, funcname))
+        output(u"%s.%s is DEPRECATED." % (classname, funcname),
+               level=WARNING)
 
 def deprecate_arg(old_arg, new_arg):
     """Decorator to declare old_arg deprecated and replace it with new_arg"""

Modified: branches/rewrite/pywikibot/page.py
===================================================================
--- branches/rewrite/pywikibot/page.py	2009-02-27 16:53:22 UTC (rev 6448)
+++ branches/rewrite/pywikibot/page.py	2009-02-27 16:55:46 UTC (rev 6449)
@@ -808,11 +808,22 @@
         parameters as the second entry.
 
         """
+        # WARNING: may not return all templates used in particularly
+        # intricate cases such as template substitution
+        titles = list(t.title() for t in self.templates())
         templates = pywikibot.extract_templates_and_params(self.text)
         # backwards-compatibility: convert the dict returned as the second
         # element into a list in the format used by old scripts
         result = []
         for template in templates:
+            link = pywikibot.Link(template[0], self.site(),
+                                      defaultNamespace=10)
+            try:
+                if link.canonical_title() not in titles:
+                    continue
+            except pywikibot.Error:
+                # this is a parser function or magic word, not template name
+                continue
             args = template[1]
             positional = []
             named = {}
@@ -825,10 +836,7 @@
                     positional.append(args[key])
             for name in named:
                 positional.append("%s=%s" % (name, named[name]))
-            result.append((pywikibot.Page(
-                             pywikibot.Link(template[0], self.site(),
-                                            defaultNamespace=10)),
-                           positional))
+            result.append((pywikibot.Page(link, self.site()), positional))
         return result
 
     @deprecate_arg("nofollow_redirects", None)
@@ -1425,6 +1433,17 @@
                 for article in subcat.articles(recurse):
                     yield article
 
+    def members(self, recurse=False):
+        """Yield all category contents (subcats, pages, and files)."""
+        for member in self.site().categorymembers(self):
+            yield member
+        if recurse:
+            if not isinstance(recurse, bool) and recurse:
+                recurse = recurse - 1
+            for subcat in self.subcategories():
+                for article in subcat.members(recurse):
+                    yield article
+        
     def isEmptyCategory(self):
         """Return True if category has no members (including subcategories)."""
         for member in self.site().categorymembers(self, limit=1):
@@ -1802,7 +1821,8 @@
         # "empty" local links can only be self-links
         # with a fragment identifier.
         if not t and self._site == self._source and self._namespace != 0:
-            raise ValueError("Invalid link (no page title): '%s'" % self._text)
+            raise pywikibot.Error("Invalid link (no page title): '%s'"
+                                  % self._text)
 
         self._title = t
 

Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py	2009-02-27 16:53:22 UTC (rev 6448)
+++ branches/rewrite/pywikibot/site.py	2009-02-27 16:55:46 UTC (rev 6449)
@@ -1,4 +1,4 @@
- # -*- coding: utf-8  -*-
+# -*- coding: utf-8  -*-
 """
 Objects representing MediaWiki sites (wikis) and families (groups of wikis
 on the same topic in different languages).
@@ -994,7 +994,7 @@
             api.update_page(target, pagedata)
             page._redir = target
 
-    def preloadpages(self, pagelist, groupsize=60):
+    def preloadpages(self, pagelist, groupsize=50):
         """Return a generator to a list of preloaded pages.
 
         Note that [at least in current implementation] pages may be iterated
@@ -1401,10 +1401,12 @@
     def categoryinfo(self, category):
         if not hasattr(category, "_catinfo"):
             self.getcategoryinfo(category)
+        if not hasattr(category, "_catinfo"):
+            # a category that exists but has no contents returns no API result
+            return {'size':0, 'pages':0, 'files':0, 'subcats':0}
         return category._catinfo
 
     @deprecate_arg("throttle", None)
-    @deprecate_arg("includeredirects", "filterredir")
     def allpages(self, start="!", prefix="", namespace=0, filterredir=None,
                  filterlanglinks=None, minsize=None, maxsize=None,
                  protect_type=None, protect_level=None, limit=None,





More information about the Pywikipedia-l mailing list