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