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

russblau at svn.wikimedia.org russblau at svn.wikimedia.org
Wed Oct 1 21:00:46 UTC 2008


Revision: 5926
Author:   russblau
Date:     2008-10-01 21:00:43 +0000 (Wed, 01 Oct 2008)

Log Message:
-----------
more site tests; add handy decorator for methods with deprecated arguments

Modified Paths:
--------------
    branches/rewrite/pywikibot/site.py
    branches/rewrite/pywikibot/tests/site_tests.py

Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py	2008-10-01 13:36:59 UTC (rev 5925)
+++ branches/rewrite/pywikibot/site.py	2008-10-01 21:00:43 UTC (rev 5926)
@@ -30,6 +30,32 @@
 logger = logging.getLogger("wiki")
 
 
+def deprecate_arg(old_arg, new_arg):
+    """Decorator to declare old_arg deprecated and replace it with new_arg"""
+    def decorator(method):
+        def wrapper(*__args, **__kw):
+            meth_name = method.__name__
+            if old_arg in __kw:
+                if new_arg:
+                    if new_arg in __kw:
+                        logger.warn(
+"%(new_arg)s argument of %(meth_name)s replaces %(old_arg)s; cannot use both."
+                            % locals())
+                    else:
+                        logger.debug(
+"%(old_arg)s argument of %(meth_name)s is deprecated; use %(new_arg)s instead."
+                            % locals())
+                        __kw[new_arg] = __kw[old_arg]
+                else:
+                    logger.debug(
+                        "%(old_arg)s argument of %(meth_name)s is deprecated."
+                        % locals())
+                del __kw[old_arg]
+            return method(*__args, **__kw)
+        return wrapper
+    return decorator
+
+
 class PageInUse(pywikibot.Error):
     """Page cannot be reserved for writing due to existing lock."""
 
@@ -527,8 +553,9 @@
         return 'blockinfo' in self._userinfo
 
     def isBlocked(self, sysop=False):
-        """Deprecated; retained for backwards-compatibility"""
-        logger.debug("Site.isBlocked() method is deprecated; use is_blocked()")
+        """Deprecated synonym for is_blocked"""
+        logger.debug(
+            "Site method 'isBlocked' should be changed to 'is_blocked'")
         return self.is_blocked(sysop)
 
     def has_right(self, right, sysop=False):
@@ -917,7 +944,8 @@
                                         namespaces=namespaces)
                )
 
-    def pagelinks(self, page, namespaces=None, follow_redirects=False):
+    def pagelinks(self, page, namespaces=None, follow_redirects=False,
+                  limit=None):
         """Iterate internal wikilinks contained (or transcluded) on page.
 
         @param namespaces: Only iterate pages in these namespaces (default: all)
@@ -927,6 +955,8 @@
 
         """
         plgen = api.PageGenerator("links", site=self)
+        if isinstance(limit, int):
+            plgen.limit = limit
         if hasattr(page, "_pageid"):
             plgen.request['pageids'] = str(page._pageid)
         else:
@@ -939,13 +969,10 @@
                                                       for ns in namespaces)
         return plgen
 
+    @deprecate_arg("withSortKey", None) # Sortkey doesn't work with generator
     def pagecategories(self, page, withSortKey=None):
         """Iterate categories to which page belongs."""
         
-        # Sortkey doesn't work with generator; deprecate
-        if withSortKey is not None:
-            logger.debug(
-                "site.pagecategories(): withSortKey option is deprecated")
         clgen = api.CategoryPageGenerator("categories", site=self)
         if hasattr(page, "_pageid"):
             clgen.request['pageids'] = str(page._pageid)
@@ -1157,12 +1184,11 @@
             for linkdata in pageitem['extlinks']:
                 yield linkdata['*']
 
-    def allpages(self, start="!", prefix="", namespace=0,
-                 filterredir=None, filterlanglinks=None,
-                 minsize=None, maxsize=None,
-                 protect_type=None, protect_level=None,
-                 limit=None, reverse=False, includeRedirects=None,
-                 throttle=None):
+    @deprecate_arg("throttle", None)
+    def allpages(self, start="!", prefix="", namespace=0, filterredir=None,
+                 filterlanglinks=None, minsize=None, maxsize=None,
+                 protect_type=None, protect_level=None, limit=None,
+                 reverse=False, includeRedirects=None):
         """Iterate pages in a single namespace.
 
         Note: parameters includeRedirects and throttle are deprecated and
@@ -1194,11 +1220,9 @@
         """
         if not isinstance(namespace, int):
             raise Error("allpages: only one namespace permitted.")
-        if throttle is not None:
-            logger.debug("allpages: the 'throttle' parameter is deprecated.")
         if includeRedirects is not None:
             logger.debug(
-                "allpages: the 'includeRedirects' parameter is deprecated.")
+"allpages: 'includeRedirects' argument is deprecated; use 'filterredirs'.")
             if includeRedirects:
                 if includeRedirects == "only":
                     filterredirs = True
@@ -1261,7 +1285,7 @@
         @param limit: maximum number of pages to iterate (default: iterate
             all pages in namespace)
         @param fromids: if True, include the pageid of the page containing
-            each link (default: False) as the 'fromid' attribute of the Page;
+            each link (default: False) as the '_fromid' attribute of the Page;
             cannot be combined with unique
 
         """
@@ -1282,7 +1306,7 @@
         for link in algen:
             p = pywikibot.Page(self, link['title'], link['ns'])
             if fromids:
-                p.fromid = link['fromid']
+                p._fromid = link['fromid']
             yield p
 
     def allcategories(self, start="!", prefix="", limit=None,
@@ -1585,7 +1609,8 @@
             rcgen.request["rcshow"] = "|".join(rcshow)
         return rcgen
 
-    def search(self, searchstring, number=None, namespaces=[0], where="text",
+    @deprecate_arg("number", "limit")
+    def search(self, searchstring, namespaces=[0], where="text",
                getredirects=False, limit=None):
         """Iterate Pages that contain the searchstring.
 
@@ -1603,9 +1628,6 @@
         @param number: deprecated, synonym for 'limit'
 
         """
-        if number is not None:
-            logger.debug("search: number parameter is deprecated; use limit")
-            limit = number
         if not searchstring:
             raise Error("search: searchstring cannot be empty")
         if where not in ("text", "titles"):

Modified: branches/rewrite/pywikibot/tests/site_tests.py
===================================================================
--- branches/rewrite/pywikibot/tests/site_tests.py	2008-10-01 13:36:59 UTC (rev 5925)
+++ branches/rewrite/pywikibot/tests/site_tests.py	2008-10-01 21:00:43 UTC (rev 5926)
@@ -165,7 +165,7 @@
         """Test that preloading works"""
 
         count = 0
-        for page in mysite.preloadpages(mysite.pagelinks(mainpage)):
+        for page in mysite.preloadpages(mysite.pagelinks(mainpage, limit=10)):
             self.assertType(page, pywikibot.Page)
             self.assertType(page.exists(), bool)
             if page.exists():
@@ -219,7 +219,8 @@
         self.assertTrue(links.issuperset(
                     set(mysite.pagelinks(mainpage, namespaces=[0, 1]))))
         for target in mysite.preloadpages(
-                            mysite.pagelinks(mainpage, follow_redirects=True)):
+                            mysite.pagelinks(mainpage, follow_redirects=True,
+                                             limit=10)):
             self.assertType(target, pywikibot.Page)
             self.assertFalse(target.isRedirectPage())
         # test pagecategories
@@ -254,71 +255,95 @@
     def testAllPages(self):
         """Test the site.allpages() method"""
 
-        global ap, ap6, ap7
-        ap = list(mysite.allpages(limit=10))
-        self.assertTrue(len(ap) <= 10)
-        for page in ap:
+        fwd = list(mysite.allpages(limit=10))
+        self.assertTrue(len(fwd) <= 10)
+        for page in fwd:
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
-        # TODO: test various optional arguments to allpages
-        ap1 = mysite.allpages(start="Py", limit=10)
-        for page in ap1:
+        rev = list(mysite.allpages(reverse=True, start="Aa", limit=12))
+        self.assertTrue(len(rev) <= 12)
+        for page in rev:
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
+            self.assertTrue(page.title() <= "Aa")
+        for page in mysite.allpages(start="Py", limit=10):
+            self.assertType(page, pywikibot.Page)
+            self.assertTrue(mysite.page_exists(page))
+            self.assertEqual(page.namespace(), 0)
             self.assertTrue(page.title() >= "Py")
-        ap2 = mysite.allpages(prefix="Pre", limit=10)
-        for page in ap2:
+        for page in mysite.allpages(prefix="Pre", limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
             self.assertTrue(page.title().startswith("Pre"))
-        ap3 = mysite.allpages(namespace=1, limit=10)
-        for page in ap3:
+        for page in mysite.allpages(namespace=1, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 1)
-        ap4= mysite.allpages(filterredir=True, limit=10)
-        for page in ap4:
+        for page in mysite.allpages(filterredir=True, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
             self.assertTrue(page.isRedirectPage())
-        ap5= mysite.allpages(filterredir=False, limit=10)
-        for page in ap5:
+        for page in mysite.allpages(filterredir=False, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
             self.assertFalse(page.isRedirectPage())
-        ap6= list(mysite.allpages(filterlanglinks=True, limit=10))
-        for page in ap6:
+        for page in mysite.allpages(filterlanglinks=True, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
-        ap7= list(mysite.allpages(filterlanglinks=False, limit=10))
-        for page in ap7:
+        for page in mysite.allpages(filterlanglinks=False, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertEqual(page.namespace(), 0)
-        ap8 = mysite.allpages(minsize=100, limit=10)
-        for page in ap8:
+        for page in mysite.allpages(minsize=100, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertTrue(len(page.text) >= 100)
-        ap9 = mysite.allpages(maxsize=200, limit=10)
-        for page in ap9:
+        for page in mysite.allpages(maxsize=200, limit=10):
             self.assertType(page, pywikibot.Page)
             self.assertTrue(mysite.page_exists(page))
             self.assertTrue(len(page.text) <= 200)
+        for page in mysite.allpages(protect_type="edit", limit=5):
+            self.assertType(page, pywikibot.Page)
+            self.assertTrue(mysite.page_exists(page))
+            self.assertTrue("edit" in page._protection)
+        for page in mysite.allpages(protect_type="edit",
+                                    protect_level="sysop", limit=5):
+            self.assertType(page, pywikibot.Page)
+            self.assertTrue(mysite.page_exists(page))
+            self.assertTrue("edit" in page._protection)
+            self.assertTrue("sysop" in page._protection["edit"])
 
     def testAllLinks(self):
         """Test the site.alllinks() method"""
         
-        al = list(mysite.alllinks(limit=10))
-        self.assertTrue(len(al) <= 10)
-        self.assertTrue(all(isinstance(link, pywikibot.Page) for link in al))
+        fwd = list(mysite.alllinks(limit=10))
+        self.assertTrue(len(fwd) <= 10)
+        self.assertTrue(all(isinstance(link, pywikibot.Page) for link in fwd))
+        uniq = list(mysite.alllinks(limit=10, unique=True))
+        self.assertTrue(all(link in uniq for link in fwd))
         # TODO: test various optional arguments to alllinks
+        for page in mysite.alllinks(start="Link", limit=10):
+            self.assertType(page, pywikibot.Page)
+            self.assertEqual(page.namespace(), 0)
+            self.assertTrue(page.title() >= "Link")
+        for page in mysite.alllinks(prefix="Fix", limit=10):
+            self.assertType(page, pywikibot.Page)
+            self.assertEqual(page.namespace(), 0)
+            self.assertTrue(page.title().startswith("Fix"))
+        for page in mysite.alllinks(namespace=1, limit=10):
+            self.assertType(page, pywikibot.Page)
+            self.assertEqual(page.namespace(), 1)
+        for page in mysite.alllinks(start="From", namespace=4, fromids=True,
+                                    limit=10):
+            self.assertType(page, pywikibot.Page)
+            self.assertTrue(page.title(withNamespace=False) >= "From")
+            self.assertTrue(hasattr(page, "_fromid"))
 
     def testAllCategories(self):
         """Test the site.allcategories() method"""





More information about the Pywikipedia-l mailing list