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"""