def site_init(self): meta = self.api('query', meta='siteinfo|userinfo', siprop='general|namespaces', uiprop='groups|rights', retry_on_error=False) # Extract site info self.site = meta['query']['general'] self.namespaces = dict( ((i['id'], i.get('*', '')) for i in six.itervalues(meta['query']['namespaces']))) 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 %s' % '.'.join(version)) else: raise errors.MediaWikiVersionError('Unknown generator %s' % self.site['generator']) # Require MediaWiki version >= 1.16 self.require(1, 16) # User info userinfo = meta['query']['userinfo'] self.username = userinfo['name'] self.groups = userinfo.get('groups', []) self.rights = userinfo.get('rights', []) self.initialized = True
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) Args: prefix (str): 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. Returns: 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
def require(self, major, minor, revision=None, raise_error=True): if self.version is None: if raise_error is None: return raise RuntimeError('Site %s has not yet been initialized' % repr(self)) if revision is None: if self.version[:2] >= (major, minor): return True elif raise_error: raise errors.MediaWikiVersionError('Requires version %s.%s, current version is %s.%s' % ((major, minor) + self.version[:2])) else: return False else: raise NotImplementedError
def require(self, major, minor, revision=None, raise_error=True): if self.version is None: if raise_error is None: return raise RuntimeError('Site %s has not yet been initialized' % repr(self)) if revision is None: if self.version[:2] >= (major, minor): return True elif raise_error: raise errors.MediaWikiVersionError( 'Requires version {required[0]}.{required[1]}, ' 'current version is {current[0]}.{current[1]}'.format( required=(major, minor), current=(self.version[:2]))) else: return False else: raise NotImplementedError