From d52cc4106f36b60f36997d254333b5581910a17e Mon Sep 17 00:00:00 2001
From: Lukas Juhrich <lukasjuhrich@wh2.tu-dresden.de>
Date: Sun, 24 Jul 2016 06:00:27 +0200
Subject: [PATCH] Refactor out initial version determination
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

For determining the version, I created a staticmethod (because this does
not really depend on the state of the instance) which makes things more
readable – `self.version = self.version_tuple_from_generator()` is
self-explaining and shortens the amount of code to comprehend in the
`site_init` method.
---
 mwclient/client.py | 60 +++++++++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 22 deletions(-)

diff --git a/mwclient/client.py b/mwclient/client.py
index 6979074..6932b78 100644
--- a/mwclient/client.py
+++ b/mwclient/client.py
@@ -148,28 +148,7 @@ class Site(object):
         }
         self.writeapi = 'writeapi' in self.site
 
-        # Determine version
-        if self.site['generator'].startswith('MediaWiki '):
-            version = self.site['generator'][10:].split('.')
-
-            def split_num(s):
-                i = 0
-                while i < len(s):
-                    if s[i] < '0' or s[i] > '9':
-                        break
-                    i += 1
-                if s[i:]:
-                    return (int(s[:i]), s[i:], )
-                else:
-                    return (int(s[:i]), )
-            self.version = sum((split_num(s) for s in version), ())
-
-            if len(self.version) < 2:
-                raise errors.MediaWikiVersionError('Unknown MediaWiki {}'
-                                                   .format('.'.join(version)))
-        else:
-            raise errors.MediaWikiVersionError('Unknown generator {}'
-                                               .format(self.site['generator']))
+        self.version = self.version_tuple_from_generator(self.site['generator'])
 
         # Require MediaWiki version >= 1.16
         self.require(1, 16)
@@ -181,6 +160,43 @@ class Site(object):
         self.rights = userinfo.get('rights', [])
         self.initialized = True
 
+    @staticmethod
+    def version_tuple_from_generator(string, prefix='MediaWiki '):
+        """Return a version tuple from a MediaWiki Generator string
+
+        Example: "MediaWiki 1.5.1" → (1, 5, 1)
+
+        :param prefix: the expected prefix of the string
+        """
+        if not string.startswith(prefix):
+            raise errors.MediaWikiVersionError('Unknown generator {}'.format(string))
+
+        version = string[len(prefix):].split('.')
+
+        def split_num(s):
+            """Split the string on the first non-digit character.
+
+            :return: a tuple of the digit part as int and, if
+            available, the rest of the string.
+            """
+            i = 0
+            while i < len(s):
+                if s[i] < '0' or s[i] > '9':
+                    break
+                i += 1
+            if s[i:]:
+                return (int(s[:i]), s[i:], )
+            else:
+                return (int(s[:i]), )
+
+        version_tuple = sum((split_num(s) for s in version), ())
+
+        if len(version_tuple) < 2:
+            raise errors.MediaWikiVersionError('Unknown MediaWiki {}'
+                                               .format('.'.join(version)))
+
+        return version_tuple
+
     default_namespaces = {
         0: u'', 1: u'Talk', 2: u'User', 3: u'User talk', 4: u'Project',
         5: u'Project talk', 6: u'Image', 7: u'Image talk', 8: u'MediaWiki',
-- 
GitLab