def decorator(fn): def callee(self, *args, **kwargs): if not self.has_extension(extension): raise UnknownExtension( 'Method "{}" is not implemented without the extension {}'. format(fn.__name__, extension)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee
def decorator(fn): def callee(self, *args, **kwargs): if MediaWikiVersion(self.version()) < MediaWikiVersion(version): raise NotImplementedError( 'Method or function "%s"\n' "isn't implemented in MediaWiki version < %s" % (fn.__name__, version)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee
def decorator(fn): def callee(self, *args, **kwargs): if self.obsolete: if not self.has_group('steward'): raise UserRightsError( 'Site {} has been closed. Only steward ' 'can perform requested action.'.format(self.sitename)) elif right is not None and not self.has_right(right): raise UserRightsError('User "{}" does not have required ' 'user right "{}"'.format( self.user(), right)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee
def decorator(fn): def callee(self, *args, **kwargs): grp = kwargs.pop('as_group', group) if self.obsolete: if not self.has_group('steward'): raise UserRightsError( 'Site {} has been closed. Only steward ' 'can perform requested action.'.format(self.sitename)) elif not self.has_group(grp): raise UserRightsError('User "{}" is not part of the required ' 'user group "{}"'.format( self.user(), grp)) return fn(self, *args, **kwargs) if not __debug__: return fn manage_wrapping(callee, fn) return callee
def allow_asynchronous(func): """ Decorator to make it possible to run a BasePage method asynchronously. This is done when the method is called with kwarg asynchronous=True. Optionally, you can also provide kwarg callback, which, if provided, is a callable that gets the page as the first and a possible exception that occurred during saving in the second thread or None as the second argument. """ def handle(func, self, *args, **kwargs): do_async = kwargs.pop('asynchronous', False) callback = kwargs.pop('callback', None) err = None try: func(self, *args, **kwargs) # TODO: other "expected" error types to catch? except Error as edit_err: err = edit_err # edit_err will be deleted in the end of the scope link = self.title(as_link=True) if do_async: pywikibot.error('page {} not saved due to {}\n'.format( link, err)) pywikibot.log('Error saving page {} ({})\n'.format(link, err), exc_info=True) if not callback and not do_async: if isinstance(err, PageSaveRelatedError): raise err raise OtherPageSaveError(self, err) if callback: callback(self, err) def wrapper(self, *args, **kwargs): if kwargs.get('asynchronous'): pywikibot.async_request(handle, func, self, *args, **kwargs) else: handle(func, self, *args, **kwargs) manage_wrapping(wrapper, func) return wrapper