Xqt has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/281672

Change subject: [WIP] Improvements for pagegenerators.GeneratorFactory
......................................................................

[WIP] Improvements for pagegenerators.GeneratorFactory

- Implement a default namespace which is preferable for the pagegenerators
  option handling in checkimages. If the namespace is set with constructor
  it becomes immutable.
- suppress namespace warning if namespace is set with constructor.
- If only one namespace is set in GeneratorFactory -page option uses it
  as default namespace when instantiating a Page opject.
- Tests added

Improvements for api.QueryGenerator:
- don't show an unsupported namespace warning in set_namespace()
  if 'quiet' parameter is set. This is needed to hide a the warnign in some
  cases when pagegenerators.GeneratorFactory uses a predefined namespace.

Change-Id: Iee309646988255d3a603a9f2e1aa00e1ff7a7e51
---
M pywikibot/data/api.py
M pywikibot/pagegenerators.py
M tests/pagegenerators_tests.py
3 files changed, 39 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/72/281672/1

diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index c3f1ddf..c50964d 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -2625,7 +2625,7 @@
                            self.api_limit),
                         _logger)
 
-    def set_namespace(self, namespaces):
+    def set_namespace(self, namespaces, quiet=False):
         """Set a namespace filter on this query.
 
         @param namespaces: namespace identifiers to limit query results
@@ -2633,6 +2633,9 @@
             or a single instance of those types.  May be a '|' separated
             list of namespace identifiers. An empty iterator clears any
             namespace restriction.
+        @param quiet: Don't show a warning if module does not support
+             a namespace parameter
+        @type quiet: bool
         @raises KeyError: a namespace identifier was not resolved
         @raises TypeError: a namespace identifier has an inappropriate
             type such as NoneType or bool, or more than one namespace
@@ -2642,8 +2645,9 @@
         param = self.site._paraminfo.parameter('query+' + self.limited_module,
                                                'namespace')
         if not param:
-            pywikibot.warning(u'{0} module does not support a namespace '
-                              'parameter'.format(self.limited_module))
+            if not quiet:
+                pywikibot.warning(u'{0} module does not support a namespace '
+                                  'parameter'.format(self.limited_module))
             return
 
         if isinstance(namespaces, basestring):
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index 0c5f0a2..a74b44d 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -363,7 +363,7 @@
     # When not in intersect mode, _filter_unique could be:
     #   functools.partial(filter_unique, container=global_seen_list)
 
-    def __init__(self, site=None, positional_arg_name=None):
+    def __init__(self, site=None, positional_arg_name=None, namespaces=None):
         """
         Constructor.
 
@@ -372,9 +372,18 @@
         @param positional_arg_name: generator to use for positional args,
             which do not begin with a hyphen
         @type positional_arg_name: basestring
+        @param namespaces: list of namespace numbers
+        @type namespaces: list
         """
         self.gens = []
-        self._namespaces = []
+        self._site = site
+        if namespaces is None:
+            self._namespaces = []
+            self.default_ns_setting = False
+        else:
+            self._namespaces = namespaces
+            self.namespaces  # change the storage to immutable
+            self.default_ns_setting = True
         self.limit = None
         self.qualityfilter_list = []
         self.articlefilter_list = []
@@ -383,7 +392,6 @@
         self.catfilter_list = []
         self.intersect = False
         self.subpage_max_depth = None
-        self._site = site
         self._positional_arg_name = positional_arg_name
         self._sparql = None
 
@@ -439,7 +447,8 @@
         for i in range(len(self.gens)):
             if isinstance(self.gens[i], pywikibot.data.api.QueryGenerator):
                 if self.namespaces:
-                    self.gens[i].set_namespace(self.namespaces)
+                    self.gens[i].set_namespace(
+                        self.namespaces, quiet=self.default_ns_setting)
                 if self.limit:
                     self.gens[i].set_maximum_items(self.limit)
             else:
@@ -753,7 +762,8 @@
         elif arg == '-page':
             if not value:
                 value = pywikibot.input(u'What page do you want to use?')
-            gen = [pywikibot.Page(pywikibot.Link(value, self.site))]
+            ns = list(self.namespaces)[0] if len(self.namespaces) == 1 else 0
+            gen = [pywikibot.Page(pywikibot.Link(value, self.site, ns))]
         elif arg == '-uncatfiles':
             gen = UnCategorizedImageGenerator(site=self.site)
         elif arg == '-uncatcat':
diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index 5adb054..cb18258 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -593,6 +593,23 @@
         gf = pagegenerators.GeneratorFactory(site=self.get_site())
         self.assertRaises(UnknownExtension, gf.handleArg, '-ql:2')
 
+    def test_predefined_namespace_single(self):
+        """Test one predefined namespace."""
+        gf = pagegenerators.GeneratorFactory(site=self.get_site(), ns=[2])
+        self.assertEqual(gf.namespaces, set([2]))
+
+    def test_predefined_namespaces_multi(self):
+        """Test predefined namespaces."""
+        gf = pagegenerators.GeneratorFactory(site=self.get_site(), ns=[2, 6])
+        self.assertEqual(gf.namespaces, set([2, 6]))
+
+    def test_predefined_namespace_immutable(self):
+        """Test immutable namespace predefined by constructor."""
+        gf = pagegenerators.GeneratorFactory(site=self.get_site(), ns=[2])
+        gf.handleArg('-ns:1,6')
+        self.assertIsInstance(gf.namespaces, frozenset)
+        self.assertEqual(gf.namespaces, set([2]))
+
 
 class TestItemClaimFilterPageGenerator(WikidataTestCase):
 

-- 
To view, visit https://gerrit.wikimedia.org/r/281672
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iee309646988255d3a603a9f2e1aa00e1ff7a7e51
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Xqt <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to