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

russblau at svn.wikimedia.org russblau at svn.wikimedia.org
Sat Feb 21 20:54:04 UTC 2009


Revision: 6401
Author:   russblau
Date:     2009-02-21 20:54:03 +0000 (Sat, 21 Feb 2009)

Log Message:
-----------
Better interface for setting query parameters (especially namespace filters)

Modified Paths:
--------------
    branches/rewrite/pywikibot/data/api.py
    branches/rewrite/pywikibot/site.py

Modified: branches/rewrite/pywikibot/data/api.py
===================================================================
--- branches/rewrite/pywikibot/data/api.py	2009-02-21 20:18:12 UTC (rev 6400)
+++ branches/rewrite/pywikibot/data/api.py	2009-02-21 20:54:03 UTC (rev 6401)
@@ -318,7 +318,7 @@
             if name not in _modules:
                 self.get_module()
                 break
-        self.set_limit()
+        self.update_limit()
         if self.query_limit is not None and "generator" in kwargs:
             self.prefix = "g" + self.prefix
         self.request = Request(**kwargs)
@@ -346,7 +346,29 @@
                 raise Error("Invalid query module name '%s'." % self.module)
             _modules[paraminfo["name"]] = paraminfo
 
-    def set_limit(self):
+    def set_query_increment(self, value):
+        """Set the maximum number of items to be retrieved per API query.
+
+        If not called, the default is to ask for "max" items and let the
+        API decide how many to send.
+
+        """
+        limit = int(value)
+        # don't update if limit is greater than maximum allowed by API
+        self.update_limit()
+        if self.query_limit is None or limit < self.query_limit:
+            self.query_limit = int(limit)
+
+    def set_query_item_limit(self, value):
+        """Set the maximum number of items to be retrieved from the wiki.
+
+        If not called, most queries will continue as long as there is
+        more data to be retrieved from the API.
+
+        """
+        self.limit = int(value)
+        
+    def update_limit(self):
         """Set query_limit for self.module based on api response"""
 
         self.query_limit = None
@@ -365,6 +387,22 @@
                                      self.query_limit))
                     return
 
+    def set_namespace(self, namespaces):
+        """Set a namespace filter on this query.
+
+        @param namespaces: Either an int or a list of ints
+
+        """
+        if isinstance(namespaces, list):
+            namespaces = "|".join(str(n) for n in namespaces)
+        else:
+            namespaces = str(namespaces)
+        for mod in self.module.split('|'):
+            for param in _modules[mod].get("parameters", []):
+                if param["name"] == "namespace":
+                    self.request[self.prefix+"namespace"] = namespaces
+                    return
+
     def __iter__(self):
         """Submit request and iterate the response based on self.resultkey
 

Modified: branches/rewrite/pywikibot/site.py
===================================================================
--- branches/rewrite/pywikibot/site.py	2009-02-21 20:18:12 UTC (rev 6400)
+++ branches/rewrite/pywikibot/site.py	2009-02-21 20:54:03 UTC (rev 6401)
@@ -1073,11 +1073,8 @@
         """
         bltitle = page.title(withSection=False).encode(self.encoding())
         blgen = api.PageGenerator("backlinks", gbltitle=bltitle, site=self)
-        if isinstance(namespaces, list):
-            blgen.request["gblnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            blgen.request["gblnamespace"] = str(namespaces)
+        if namespaces is not None:
+            blgen.set_namespace(namespaces)
         if filterRedirects is not None:
             blgen.request["gblfilterredir"] = filterRedirects and "redirects"\
                                                               or "nonredirects"
@@ -1114,11 +1111,8 @@
         """
         eititle = page.title(withSection=False).encode(self.encoding())
         eigen = api.PageGenerator("embeddedin", geititle=eititle, site=self)
-        if isinstance(namespaces, list):
-            eigen.request["geinamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            eigen.request["geinamespace"] = str(namespaces)
+        if namespaces is not None:
+            eigen.set_namespace(namespaces)
         if filterRedirects is not None:
             eigen.request["geifilterredir"] = filterRedirects and "redirects"\
                                                               or "nonredirects"
@@ -1162,11 +1156,8 @@
             plgen.request['titles'] = pltitle
         if follow_redirects:
             plgen.request['redirects'] = ''
-        if isinstance(namespaces, list):
-            plgen.request["gplnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            plgen.request["gplnamespace"] = str(namespaces)
+        if namespaces is not None:
+            plgen.set_namespace(namespaces)
         return plgen
 
     @deprecate_arg("withSortKey", None) # Sortkey doesn't work with generator
@@ -1193,11 +1184,8 @@
 
         tltitle = page.title(withSection=False).encode(self.encoding())
         tlgen = api.PageGenerator("templates", titles=tltitle, site=self)
-        if isinstance(namespaces, list):
-            tlgen.request["gtlnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            tlgen.request["gtlnamespace"] = str(namespaces)
+        if namespaces is not None:
+            tlgen.set_namespace(namespaces)
         return tlgen
 
     def categorymembers(self, category, namespaces=None, limit=None):
@@ -1221,11 +1209,8 @@
         cmtitle = category.title(withSection=False).encode(self.encoding())
         cmgen = api.PageGenerator("categorymembers", gcmtitle=cmtitle,
                                   gcmprop="ids|title|sortkey", site=self)
-        if isinstance(namespaces, list):
-            cmgen.request["gcmnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            cmgen.request["gcmnamespace"] = str(namespaces)
+        if namespaces is not None:
+            cmgen.set_namespace(namespaces)
         if isinstance(limit, int):
             cmgen.limit = limit
         return cmgen
@@ -1676,11 +1661,8 @@
         """
         eugen = api.PageGenerator("exturlusage", geuquery=url,
                                   geuprotocol=protocol, site=self)
-        if isinstance(namespaces, list):
-            eugen.request["geunamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            eugen.request["geunamespace"] = str(namespaces)
+        if namespaces is not None:
+            eugen.set_namespace(namespaces)
         if isinstance(limit, int):
             eugen.limit = limit
         return eugen
@@ -1700,11 +1682,8 @@
         """
         iugen = api.PageGenerator("imageusage", site=self,
                                   giutitle=image.title(withSection=False))
-        if isinstance(namespaces, list):
-            iugen.request["giunamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            iugen.request["giunamespace"] = str(namespaces)
+        if namespaces is not None:
+            iugen.set_namespace(namespaces)
         if isinstance(limit, int):
             iugen.limit = limit
         if filterredir is not None:
@@ -1803,11 +1782,8 @@
             rcgen.request["rcdir"] = "newer"
         if isinstance(limit, int):
             rcgen.limit = limit
-        if isinstance(namespaces, list):
-            rcgen.request["rcnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            rcgen.request["rcnamespace"] = str(namespaces)
+        if namespaces is not None:
+            rcgen.set_namespace(namespaces)
         if pagelist:
             if self.versionnumber() > 14:
                 pywikibot.output(
@@ -1859,11 +1835,8 @@
             pywikibot.output(u"search: namespaces cannot be empty; using [0].",
                              level=pywikibot.WARNING)
             namespaces = [0]
-        if isinstance(namespaces, list):
-            srgen.request["gsrnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        else:
-            srgen.request["gsrnamespace"] = str(namespaces)
+        if namespaces is not None:
+            srgen.set_namespace(namespaces)
         if getredirects:
             srgen.request["gsrredirects"] = ""
         if isinstance(limit, int):
@@ -1916,11 +1889,8 @@
             ucgen.request["ucdir"] = "newer"
         if isinstance(limit, int):
             ucgen.limit = limit
-        if isinstance(namespaces, list):
-            ucgen.request["ucnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            ucgen.request["ucnamespace"] = str(namespaces)
+        if namespaces is not None:
+            ucgen.set_namespace(namespaces)
         if showMinor is not None:
             ucgen.request["ucshow"] = showMinor and "minor" or "!minor"
         return ucgen
@@ -1967,11 +1937,8 @@
             wlgen.request["wldir"] = "newer"
         if isinstance(limit, int):
             wlgen.limit = limit
-        if isinstance(namespaces, list):
-            wlgen.request["wlnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            wlgen.request["wlnamespace"] = str(namespaces)
+        if namespaces is not None:
+            wlgen.set_namespace(namespaces)
         filters = {'minor': showMinor,
                    'bot': showBot,
                    'anon': showAnon}
@@ -2075,11 +2042,8 @@
         """
         rngen = api.PageGenerator("random", site=self)
         rngen.limit = limit
-        if isinstance(namespaces, list):
-            rngen.request["grnnamespace"] = u"|".join(unicode(ns)
-                                                      for ns in namespaces)
-        elif namespaces is not None:
-            rngen.request["grnnamespace"] = str(namespaces)
+        if namespaces is not None:
+            rngen.set_namespace(namespaces)
         if redirects:
             rngen.request["grnredirect"] = ""
         return rngen





More information about the Pywikipedia-l mailing list