Xqt has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/358236 )
Change subject: [IMPR] Add exception for -namepace option ...................................................................... [IMPR] Add exception for -namepace option - -namespace option can be used to exclude namespaces by a preleading "not:" Example: -ns:not:2,3 uses all namespaces of a given site except User and User talk namespaces. You may use ns:not: multiple times: -ns:not:File -ns:not:7 This excludes both File and File talk You may mix normal namespace filter with not-filter -ns:1,2,3,4,5,6 -ns:not:File enables namespaces 1-5 only - tests added Bug: T167580 Change-Id: Ibe434d0e9f70b6e7bd97516cd64e1de0f6a98ab5 --- M pywikibot/pagegenerators.py M tests/pagegenerators_tests.py 2 files changed, 73 insertions(+), 1 deletion(-) git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core refs/changes/36/358236/1 diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py index c4be421..6690176 100644 --- a/pywikibot/pagegenerators.py +++ b/pywikibot/pagegenerators.py @@ -149,6 +149,11 @@ -ns:0,2,4 -ns:Help,MediaWiki + You may use a preleading "not" to exclude the namespace. + Examples: + -ns:not:2,3 + -ns:not:Help,File + If used with -newpages/-random/-randomredirect, -namespace/ns must be provided before -newpages/-random/-randomredirect. @@ -767,7 +772,19 @@ if not value: value = pywikibot.input( u'What namespace are you filtering on?') - self._namespaces += value.split(",") + NOT_KEY = 'not:' + if value.startswith(NOT_KEY): + value = value[len(NOT_KEY):] + resolve = self.site.namespaces.resolve + not_ns = set(resolve(value.split(','))) + if not self._namespaces: + self._namespaces = list( + set(self.site.namespaces.values()) - not_ns) + else: + self._namespaces = list( + set(resolve(self._namespaces)) - not_ns) + else: + self._namespaces += value.split(",") return True elif arg == '-limit': if not value: diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py index 6eaca83..f271a31 100755 --- a/tests/pagegenerators_tests.py +++ b/tests/pagegenerators_tests.py @@ -658,6 +658,61 @@ gf = pagegenerators.GeneratorFactory(site=self.get_site()) self.assertRaises(UnknownExtension, gf.handleArg, '-ql:2') + def test_one_excluded_namespaces(self): + """Test one excluded namespaces.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:not:2') + ns = set(range(16)) + ns.remove(2) + self.assertTrue(ns.issubset(gf.namespaces)) + + def test_two_excluded_namespaces(self): + """Test two excluded namespaces.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:not:2') + gf.handleArg('-ns:not:Talk') + ns = set(range(16)) + ns.remove(2) + ns.remove(1) + self.assertTrue(ns.issubset(gf.namespaces)) + + def test_two_excluded_named_namespaces(self): + """Test two excluded named namespaces.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:not:Talk,File') + ns = set(range(16)) + ns.remove(1) + ns.remove(6) + self.assertTrue(ns.issubset(gf.namespaces)) + + def test_two_excluded_numeric_namespaces(self): + """Test two excluded namespaces delimited by colon.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:not:1,6') + ns = set(range(16)) + ns.remove(1) + ns.remove(6) + self.assertTrue(ns.issubset(gf.namespaces)) + + def test_mixed_namespaces_with_exclusion(self): + """Test mixed namespaces with exclusion.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:not:2,File') + gf.handleArg('-ns:not:3,4,5') + gf.handleArg('-ns:6,7') + ns = set(range(16)) + for i in range(2, 6): + ns.remove(i) + self.assertTrue(ns.issubset(gf.namespaces)) + + def test_given_namespaces_with_exclusion(self): + """Test mixed namespaces with exclusion.""" + gf = pagegenerators.GeneratorFactory(site=self.get_site()) + gf.handleArg('-ns:1,2,3,4,5') + gf.handleArg('-ns:not:User') + ns = set(range(1,6)) + ns.remove(2) + self.assertTrue(ns.issubset(gf.namespaces)) class TestItemClaimFilterPageGenerator(WikidataTestCase): -- To view, visit https://gerrit.wikimedia.org/r/358236 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibe434d0e9f70b6e7bd97516cd64e1de0f6a98ab5 Gerrit-PatchSet: 1 Gerrit-Project: pywikibot/core Gerrit-Branch: master Gerrit-Owner: Xqt <i...@gno.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits