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