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

Reply via email to