jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/563984 )
Change subject: [cleanup] deprecate sysop parameter in site methods and Site function
......................................................................
[cleanup] deprecate sysop parameter in site methods and Site function
config.sysopnames is deprecated since 6f0cafd
- deprecate sysop parameter in several site methods
- remove relogin in several methods because sysop flag
isn't applicable anymore
- remove sysop usage in pywikibot.Site function
- update dry_site_tests.py
- update utils.py
- site._username becomes a string or None
- replace all occurences of site._username property with site.username method
Change-Id: Ibd01b2c5f59d5643189c883dff17921bdd436462
---
M pywikibot/__init__.py
M pywikibot/site.py
M scripts/maintenance/cache.py
M tests/api_tests.py
M tests/aspects.py
M tests/cache_tests.py
M tests/dry_api_tests.py
M tests/dry_site_tests.py
M tests/utils.py
9 files changed, 101 insertions(+), 139 deletions(-)
Approvals:
Mpaa: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/__init__.py b/pywikibot/__init__.py
index 7214aa2..5e33a21 100644
--- a/pywikibot/__init__.py
+++ b/pywikibot/__init__.py
@@ -1194,6 +1194,7 @@
return _url_cache[url]
+@_deprecate_arg('sysop', None)
def Site(code=None, fam=None, user=None, sysop=None, interface=None, url=None):
"""A factory method to obtain a Site object.
@@ -1208,8 +1209,6 @@
@type fam: str or pywikibot.family.Family
@param user: bot user name to use on this site (override config.usernames)
@type user: str
- @param sysop: sysop user to use on this site (override config.sysopnames)
- @type sysop: str
@param interface: site class or name of class in pywikibot.site
(override config.site_interface)
@type interface: subclass of L{pywikibot.site.BaseSite} or string
@@ -1247,10 +1246,6 @@
code_to_user.update(config.usernames[family_name])
user = user or code_to_user.get(code) or code_to_user.get('*')
- code_to_sysop = config.sysopnames['*'].copy()
- code_to_sysop.update(config.sysopnames[family_name])
- sysop = sysop or code_to_sysop.get(code) or code_to_sysop.get('*')
-
if not isinstance(interface, type):
# If it isn't a class, assume it is a string
if PY2: # Must not be unicode in Python 2
@@ -1268,7 +1263,7 @@
user = normalize_username(user)
key = '%s:%s:%s:%s' % (interface.__name__, fam, code, user)
if key not in _sites or not isinstance(_sites[key], interface):
- _sites[key] = interface(code=code, fam=fam, user=user, sysop=sysop)
+ _sites[key] = interface(code=code, fam=fam, user=user, sysop=None)
debug("Instantiated %s object '%s'"
% (interface.__name__, _sites[key]), _logger)
diff --git a/pywikibot/site.py b/pywikibot/site.py
index a3e72bb..68d291b 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -719,7 +719,8 @@
"""Site methods that are independent of the communication interface."""
- def __init__(self, code, fam=None, user=None, sysop=None):
+ @remove_last_args(['sysop'])
+ def __init__(self, code, fam=None, user=None):
"""
Initializer.
@@ -729,8 +730,6 @@
@type fam: str or pywikibot.family.Family
@param user: bot user name (optional)
@type user: str
- @param sysop: sysop account user name (optional)
- @type sysop: str
"""
if code.lower() != code:
# Note the Site function in __init__ also emits a UserWarning
@@ -774,7 +773,7 @@
raise UnknownSite("Language '%s' does not exist in family %s"
% (self.__code, self.__family.name))
- self._username = [normalize_username(user), normalize_username(sysop)]
+ self._username = normalize_username(user)
self.use_hard_category_redirects = (
self.code in self.family.use_hard_category_redirects)
@@ -884,14 +883,15 @@
def user(self):
"""Return the currently-logged in bot username, or None."""
- if self.logged_in(True):
- return self._username[True]
- elif self.logged_in(False):
- return self._username[False]
+ if self.logged_in():
+ return self.username()
+ else:
+ return None
- def username(self, sysop=False):
- """Return the username/sysopname used for the site."""
- return self._username[sysop]
+ @remove_last_args(['sysop'])
+ def username(self):
+ """Return the username used for the site."""
+ return self._username
def __getattr__(self, attr):
"""Delegate undefined methods calls to the Family object."""
@@ -1255,17 +1255,14 @@
@deprecated('pywikibot.data.api.Request or pywikibot.comms.http.request',
since='20141225')
@deprecated_args(compress=None, no_hostname=None, cookies_only=None,
- refer=None, back_response=None)
- def getUrl(self, path, retry=None, sysop=None, data=None):
+ refer=None, back_response=None, retry=None, sysop=None)
+ def getUrl(self, path, data=None):
"""DEPRECATED.
Retained for compatibility only. All arguments except path and data
are ignored.
"""
- if retry is not None or sysop is not None:
- warn('APISite.getUrl parameters retry and sysop are not supported',
- UserWarning)
from pywikibot.comms import http
if data:
if not isinstance(data, UnicodeType):
@@ -1813,9 +1810,10 @@
"""Site removed from a family."""
- def __init__(self, code, fam, user=None, sysop=None):
+ @remove_last_args(['sysop'])
+ def __init__(self, code, fam, user=None):
"""Initializer."""
- super(RemovedSite, self).__init__(code, fam, user, sysop)
+ super(RemovedSite, self).__init__(code, fam, user)
class APISite(BaseSite):
@@ -1826,9 +1824,10 @@
Do not instantiate directly; use pywikibot.Site function.
"""
- def __init__(self, code, fam=None, user=None, sysop=None):
+ @remove_last_args(['sysop'])
+ def __init__(self, code, fam=None, user=None):
"""Initializer."""
- BaseSite.__init__(self, code, fam, user, sysop)
+ BaseSite.__init__(self, code, fam, user)
self._msgcache = {}
self._loginstatus = LoginStatus.NOT_ATTEMPTED
self._siteinfo = Siteinfo(self)
@@ -1956,34 +1955,29 @@
return self._request_class({'parameters': kwargs}).create_simple(
site=self, **kwargs)
- def logged_in(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def logged_in(self):
"""Verify the bot is logged into the site as the expected user.
The expected usernames are those provided as either the user or sysop
parameter at instantiation.
- @param sysop: if True, test if user is logged in as the sysop user
- instead of the normal user.
- @type sysop: bool
-
@rtype: bool
"""
if not hasattr(self, '_userinfo'):
return False
- if sysop and 'sysop' not in self.userinfo['groups']:
- return False
-
if 'name' not in self.userinfo or not self.userinfo['name']:
return False
- if self.userinfo['name'] != self._username[sysop]:
+ if self.userinfo['name'] != self.username():
return False
return True
@deprecated('Site.user()', since='20090307')
- def loggedInAs(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def loggedInAs(self):
"""Return the current username if logged in, otherwise return None.
DEPRECATED (use .user() method instead)
@@ -1994,7 +1988,7 @@
@rtype: bool
"""
- return self.logged_in(sysop) and self.user()
+ return self.logged_in() and self.user()
def is_oauth_token_available(self):
"""
@@ -2005,13 +1999,11 @@
auth_token = get_authentication(self.base_url(''))
return auth_token is not None and len(auth_token) == 4
- def login(self, sysop=False, autocreate=False):
+ @deprecated_args(sysop=None)
+ def login(self, sysop=None, autocreate=False):
"""
Log the user in if not already logged in.
- @param sysop: if true, log in with the sysop account.
- @type sysop: bool
-
@param autocreate: if true, allow auto-creation of the account
using unified login
@type autocreate: bool
@@ -2029,24 +2021,21 @@
# of issues are resolved.
if self._loginstatus == LoginStatus.IN_PROGRESS:
pywikibot.log(
- '%r.login(%r) called when a previous login was in progress.'
- % (self, sysop)
- )
+ '{!r}.login() called when a previous login was in progress.'
+ .format(self))
# There are several ways that the site may already be
# logged in, and we do not need to hit the server again.
# logged_in() is False if _userinfo exists, which means this
# will have no effect for the invocation from api.py
- if self.logged_in(sysop):
- self._loginstatus = (LoginStatus.AS_SYSOP
- if sysop else LoginStatus.AS_USER)
+ if self.logged_in():
+ self._loginstatus = LoginStatus.AS_USER
return
# check whether a login cookie already exists for this user
# or check user identity when OAuth enabled
self._loginstatus = LoginStatus.IN_PROGRESS
try:
self.getuserinfo(force=True)
- if self.userinfo['name'] == self._username[sysop] and \
- self.logged_in(sysop):
+ if self.userinfo['name'] == self.user():
return
# May occur if you are not logged in (no API read permissions).
except api.APIError:
@@ -2056,10 +2045,8 @@
raise e
if self.is_oauth_token_available():
- if sysop:
- raise NoUsername('No sysop is permitted with OAuth')
- elif self.userinfo['name'] != self._username[sysop]:
- if self._username == [None, None]:
+ if self.userinfo['name'] != self.username():
+ if self.username() is None:
raise NoUsername('No username has been defined in your '
'user-config.py: you have to add in this '
'file the following line:\n'
@@ -2073,15 +2060,14 @@
'{wrong}, but expect as {right}'
.format(site=self,
wrong=self.userinfo['name'],
- right=self._username[sysop]))
+ right=self.username()))
else:
raise NoUsername('Logging in on %s via OAuth failed' % self)
- login_manager = api.LoginManager(site=self, user=self._username[sysop])
+ login_manager = api.LoginManager(site=self, user=self.username())
if login_manager.login(retry=True, autocreate=autocreate):
- self._username[sysop] = login_manager.username
+ self._username = login_manager.username
self.getuserinfo(force=True)
- self._loginstatus = (LoginStatus.AS_SYSOP
- if sysop else LoginStatus.AS_USER)
+ self._loginstatus = LoginStatus.AS_USER
else:
self._loginstatus = LoginStatus.NOT_LOGGED_IN # failure
@@ -2186,7 +2172,8 @@
globaluserinfo = property(fget=getglobaluserinfo, doc=getuserinfo.__doc__)
- def is_blocked(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def is_blocked(self):
"""
Return True when logged in user is blocked.
@@ -2194,26 +2181,20 @@
the method has_right should be used.
U{https://www.mediawiki.org/wiki/API:Userinfo}
- @param sysop: If true, log in to sysop account (if available)
- @type sysop: bool
@rtype: bool
"""
- if not self.logged_in(sysop):
- self.login(sysop)
return 'blockinfo' in self._userinfo
@deprecated('has_right() or is_blocked()', since='20141218')
- def checkBlocks(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def checkBlocks(self):
"""
Raise an exception when the user is blocked. DEPRECATED.
- @param sysop: If true, log in to sysop account (if available)
- @type sysop: bool
- @raises pywikibot.exceptions.UserBlocked: The logged in user/sysop
- account is blocked.
+ @raises pywikibot.exceptions.UserBlocked: The logged in user account
+ is blocked.
"""
- if self.is_blocked(sysop):
- # User blocked
+ if self.is_blocked():
raise UserBlocked('User is blocked in site %s' % self)
def get_searched_namespaces(self, force=False):
@@ -2286,7 +2267,8 @@
start=start, end=end,
reverse=reverse, is_ts=is_ts))
- def has_right(self, right, sysop=False):
+ @remove_last_args(['sysop'])
+ def has_right(self, right):
"""Return true if and only if the user has a specific right.
Possible values of 'right' may vary depending on wiki settings,
@@ -2297,26 +2279,21 @@
U{https://www.mediawiki.org/wiki/API:Userinfo}
"""
- if not self.logged_in(sysop):
- self.login(sysop)
return right.lower() in self._userinfo['rights']
- def has_group(self, group, sysop=False):
+ @remove_last_args(['sysop'])
+ def has_group(self, group):
"""Return true if and only if the user is a member of specified group.
Possible values of 'group' may vary depending on wiki settings,
but will usually include bot.
U{https://www.mediawiki.org/wiki/API:Userinfo}
-
"""
- if not self.logged_in(sysop):
- self.login(sysop)
return group.lower() in self._userinfo['groups']
- def messages(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def messages(self):
"""Return true if the user has new messages, and false otherwise."""
- if not self.logged_in(sysop):
- self.login(sysop)
return 'messages' in self._userinfo
@need_extension('Echo')
@@ -3591,12 +3568,13 @@
return self.tokens[tokentype]
@deprecated("the 'tokens' property", since='20150218')
- def getToken(self, getalways=True, getagain=False, sysop=False):
+ @remove_last_args(['sysop'])
+ def getToken(self, getalways=True, getagain=False):
"""DEPRECATED: Get edit token."""
- if self.username(sysop) != self.user():
+ if self.username() != self.user():
raise ValueError('The token for {0} was requested but only the '
'token for {1} can be retrieved.'.format(
- self.username(sysop), self.user()))
+ self.username(), self.user()))
if not getalways:
raise ValueError('In pywikibot/core getToken does not support the '
'getalways parameter.')
@@ -3607,12 +3585,13 @@
return self.tokens[token]
@deprecated("the 'tokens' property", since='20150218')
- def getPatrolToken(self, sysop=False):
+ @remove_last_args(['sysop'])
+ def getPatrolToken(self):
"""DEPRECATED: Get patrol token."""
- if self.username(sysop) != self.user():
+ if self.username() != self.user():
raise ValueError('The token for {0} was requested but only the '
'token for {1} can be retrieved.'.format(
- self.username(sysop), self.user()))
+ self.username(), self.user()))
return self.tokens['patrol']
# following group of methods map more-or-less directly to API queries
@@ -4016,12 +3995,11 @@
return self._generator(api.PageGenerator, namespaces=namespaces,
total=total, g_content=content, **cmargs)
- @deprecated_args(getText='content')
+ @deprecated_args(getText='content', sysop=None)
def loadrevisions(self, page, content=False, revids=None,
startid=None, endid=None, starttime=None,
endtime=None, rvdir=None, user=None, excludeuser=None,
- section=None, sysop=False, step=None, total=None,
- rollback=False):
+ section=None, step=None, total=None, rollback=False):
"""Retrieve revision information and store it in page object.
By default, retrieves the last (current) revision of the page,
@@ -4056,8 +4034,6 @@
if true, retrieve earliest first
@param user: retrieve only revisions authored by this user
@param excludeuser: retrieve all revisions not authored by this user
- @param sysop: if True, switch to sysop account (if available) to
- retrieve this page
@raises ValueError: invalid startid/endid or starttime/endtime values
@raises pywikibot.Error: revids belonging to a different page
"""
@@ -4104,7 +4080,6 @@
if section is not None:
rvargs['rvsection'] = UnicodeType(section)
if rollback:
- self.login(sysop=sysop)
rvargs['rvtoken'] = 'rollback'
if revids is None:
rvtitle = page.title(with_section=False).encode(self.encoding())
@@ -4132,7 +4107,6 @@
rvargs['rvuser'] = user
elif excludeuser:
rvargs['rvexcludeuser'] = excludeuser
- # TODO if sysop: something
# assemble API request
rvgen = self._generator(api.PropertyGenerator, total=total, **rvargs)
@@ -7539,15 +7513,13 @@
"""
return self.moderate_post(post, 'restore', reason)
- @deprecated_args(step=None)
- def watched_pages(self, sysop=False, force=False, total=None):
+ @deprecated_args(step=None, sysop=None)
+ def watched_pages(self, force=False, total=None):
"""
Return watchlist.
@see: U{https://www.mediawiki.org/wiki/API:Watchlistraw}
- @param sysop: Returns watchlist of sysop user if true
- @type sysop: bool
@param force_reload: Reload watchlist
@type force_reload: bool
@param total: if not None, limit the generator to yielding this many
@@ -7556,7 +7528,6 @@
@return: list of pages in watchlist
@rtype: list of pywikibot.Page objects
"""
- self.login(sysop=sysop)
expiry = None if force else pywikibot.config.API_config_expiry
gen = api.PageGenerator(site=self, generator='watchlistraw',
expiry=expiry)
@@ -7590,9 +7561,10 @@
class ClosedSite(APISite):
"""Site closed to read-only mode."""
- def __init__(self, code, fam, user=None, sysop=None):
+ @remove_last_args(['sysop'])
+ def __init__(self, code, fam, user=None):
"""Initializer."""
- super(ClosedSite, self).__init__(code, fam, user, sysop)
+ super(ClosedSite, self).__init__(code, fam, user)
def _closed_error(self, notice=''):
"""An error instead of pointless API call."""
diff --git a/scripts/maintenance/cache.py b/scripts/maintenance/cache.py
index 7e5ea68..e771756 100755
--- a/scripts/maintenance/cache.py
+++ b/scripts/maintenance/cache.py
@@ -65,7 +65,7 @@
uniquedesc(entry)
"""
#
-# (C) Pywikibot team, 2014-2019
+# (C) Pywikibot team, 2014-2020
#
# Distributed under the terms of the MIT license.
#
@@ -206,7 +206,7 @@
if login_status:
self.site._loginstatus = eval(login_status)
if username:
- self.site._username = [username, username]
+ self.site._username = username
if not params:
raise ParseError('No request params')
self._params = {}
diff --git a/tests/api_tests.py b/tests/api_tests.py
index c25e790..07e6360 100644
--- a/tests/api_tests.py
+++ b/tests/api_tests.py
@@ -1018,7 +1018,7 @@
self, error, warning, exception, output
):
"""Test the query with a username which does not exist."""
- self.site._username = ['Not registered username', None]
+ self.site._username = 'Not registered username'
req = api.Request(site=self.site, parameters={'action': 'query'})
self.assertRaises(pywikibot.NoUsername, req.submit)
# FIXME: T100965
@@ -1047,7 +1047,7 @@
@patch.object(pywikibot.config, 'usernames', defaultdict(dict))
def test_access_denied_no_username(self, exception, warning):
"""Test the query without a username."""
- self.site._username = [None, None]
+ self.site._username = None
req = api.Request(site=self.site, parameters={'action': 'query'})
self.assertRaises(pywikibot.NoUsername, req.submit)
# FIXME: T100965
diff --git a/tests/aspects.py b/tests/aspects.py
index a9ac065..0aaffab 100644
--- a/tests/aspects.py
+++ b/tests/aspects.py
@@ -428,7 +428,7 @@
"""Site interface to prevent sites being loaded."""
- def __init__(self, code, fam=None, user=None, sysop=None):
+ def __init__(self, code, fam=None, user=None):
"""Initializer."""
raise pywikibot.SiteDefinitionError(
'Loading site {}:{} during dry test not permitted'
@@ -639,7 +639,7 @@
@classmethod
def require_site_user(cls, family, code, sysop=False):
"""Check the user config has a valid login to the site."""
- if not cls.has_site_user(family, code, sysop=sysop):
+ if not cls.has_site_user(family, code):
raise unittest.SkipTest(
'{}: No {}username for {}:{}'
.format(cls.__name__,
@@ -673,14 +673,14 @@
site, site.siteinfo.get('readonlyreason', '')))
try:
- site.login(sysop)
+ site.login()
except NoUsername:
pass
if not site.user():
raise unittest.SkipTest(
- '{}: Not able to login to {} as {}'
- .format(cls.__name__, 'sysop' if sysop else 'bot', site))
+ '{}: Not able to login to {}'
+ .format(cls.__name__, site))
def setUp(self):
"""
@@ -698,8 +698,6 @@
def _reset_login(self):
"""Login to all sites."""
- sysop = hasattr(self, 'sysop') and self.sysop
-
# There may be many sites, and setUp doesn't know
# which site is to be tested; ensure they are all
# logged in.
@@ -709,8 +707,8 @@
if hasattr(self, 'oauth') and self.oauth:
continue
- if not site.logged_in(sysop):
- site.login(sysop)
+ if not site.logged_in():
+ site.login()
assert(site.user())
def get_userpage(self, site=None):
@@ -1036,7 +1034,7 @@
return cls.sites[name]['site']
@classmethod
- def has_site_user(cls, family, code, sysop=False):
+ def has_site_user(cls, family, code):
"""Check the user config has a user for the site."""
if not family:
raise Exception('no family defined for {}'.format(cls.__name__))
@@ -1044,7 +1042,7 @@
raise Exception('no site code defined for {}'
.format(cls.__name__))
- usernames = config.sysopnames if sysop else config.usernames
+ usernames = config.usernames
return (code in usernames[family] or '*' in usernames[family]
or code in usernames['*'] or '*' in usernames['*'])
diff --git a/tests/cache_tests.py b/tests/cache_tests.py
index 526347c..b2c8cae 100644
--- a/tests/cache_tests.py
+++ b/tests/cache_tests.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""API Request cache tests."""
#
-# (C) Pywikibot team, 2012-2018
+# (C) Pywikibot team, 2012-2020
#
# Distributed under the terms of the MIT license.
#
@@ -25,9 +25,9 @@
"""Assert validity of the cache entry."""
self.assertIsInstance(entry.site, BaseSite)
self.assertIsInstance(entry.site._loginstatus, int)
- self.assertIsInstance(entry.site._username, list)
+ self.assertNotIsInstance(entry.site._username, list)
if entry.site._loginstatus >= 1:
- self.assertIsNotNone(entry.site._username[0])
+ self.assertIsNotNone(entry.site._username)
self.assertIsInstance(entry._params, dict)
self.assertIsNotNone(entry._params)
# TODO: more tests on entry._params, and possibly fixes needed
diff --git a/tests/dry_api_tests.py b/tests/dry_api_tests.py
index 268d6cf..348a887 100644
--- a/tests/dry_api_tests.py
+++ b/tests/dry_api_tests.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""API tests which do not interact with a site."""
#
-# (C) Pywikibot team, 2012-2019
+# (C) Pywikibot team, 2012-2020
#
# Distributed under the terms of the MIT license.
#
@@ -260,7 +260,7 @@
"""Test Request object when username is not correct."""
site = self.get_site()
site._userinfo = {'name': 'other_username', 'groups': []}
- site._username[0] = 'myusername'
+ site._username = 'myusername'
# Ignore warning: API write action by unexpected username commenced.
with patch('pywikibot.warning'):
Request(site=site, parameters={'action': 'edit'})
@@ -269,7 +269,7 @@
"""Test Request object when username is correct."""
site = self.get_site()
site._userinfo = {'name': 'myusername', 'groups': []}
- site._username[0] = 'myusername'
+ site._username = 'myusername'
Request(site=site, parameters={'action': 'edit'})
@@ -310,7 +310,7 @@
"""Test Request object prepared to upload."""
# fake write test needs the config username
site = self.get_site()
- site._username[0] = 'myusername'
+ site._username = 'myusername'
site._userinfo = {'name': 'myusername', 'groups': []}
parameters = {'action': 'upload', 'file': 'MP_sounds.png',
'filename': join_images_path('MP_sounds.png')}
diff --git a/tests/dry_site_tests.py b/tests/dry_site_tests.py
index 95d0ffc..a37454f 100644
--- a/tests/dry_site_tests.py
+++ b/tests/dry_site_tests.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Tests against a fake Site object."""
#
-# (C) Pywikibot team, 2012-2019
+# (C) Pywikibot team, 2012-2020
#
# Distributed under the terms of the MIT license.
#
@@ -32,26 +32,23 @@
x = self.get_site()
x._userinfo = {'name': None, 'groups': []}
- x._username = ['normal_user', 'sysop_user']
+ x._username = 'user'
- self.assertFalse(x.logged_in(True))
- self.assertFalse(x.logged_in(False))
+ self.assertFalse(x.logged_in())
- x._userinfo['name'] = 'normal_user'
- self.assertFalse(x.logged_in(True))
- self.assertTrue(x.logged_in(False))
+ x._userinfo['name'] = 'user'
+ self.assertTrue(x.logged_in())
- x._userinfo['name'] = 'sysop_user'
+ x._userinfo['name'] = 'user'
x._userinfo['groups'] = ['sysop']
- self.assertTrue(x.logged_in(True))
- self.assertFalse(x.logged_in(False))
+ self.assertTrue(x.logged_in())
def test_user_agent(self):
"""Test different variants of user agents."""
x = self.get_site()
x._userinfo = {'name': 'foo'}
- x._username = ('foo', None)
+ x._username = 'foo'
self.assertEqual('Pywikibot/' + pywikibot.__version__,
user_agent(x, format_string='{pwb}'))
@@ -67,12 +64,12 @@
user_agent(x, format_string='{username}'))
x._userinfo = {'name': '!'}
- x._username = ('!', None)
+ x._username = '!'
self.assertEqual('!', user_agent(x, format_string='{username}'))
x._userinfo = {'name': 'foo bar'}
- x._username = ('foo bar', None)
+ x._username = 'foo bar'
self.assertEqual('foo_bar', user_agent(x, format_string='{username}'))
@@ -86,13 +83,13 @@
user_agent(x, format_string=old_config))
x._userinfo = {'name': '⁂'}
- x._username = ('⁂', None)
+ x._username = '⁂'
self.assertEqual('%E2%81%82',
user_agent(x, format_string='{username}'))
x._userinfo = {'name': '127.0.0.1'}
- x._username = (None, None)
+ x._username = None
self.assertEqual('Foo', user_agent(x, format_string='Foo {username}'))
self.assertEqual('Foo (' + x.family.name + ':' + x.code + ')',
diff --git a/tests/utils.py b/tests/utils.py
index 1d917cb..0154dcb 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -421,7 +421,7 @@
def __init__(self, code, fam, user, sysop):
"""Initializer."""
- super(DrySite, self).__init__(code, fam, user, sysop)
+ super(DrySite, self).__init__(code, fam, user)
self._userinfo = pywikibot.tools.EMPTY_DEFAULT
self._paraminfo = DryParamInfo()
self._siteinfo = DummySiteinfo({})
--
To view, visit https://gerrit.wikimedia.org/r/563984
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ibd01b2c5f59d5643189c883dff17921bdd436462
Gerrit-Change-Number: 563984
Gerrit-PatchSet: 11
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97(a)gmail.com>
Gerrit-Reviewer: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/565528 )
Change subject: [tests] inspect.getargspec is still available with Python 3.9.0a2
......................................................................
[tests] inspect.getargspec is still available with Python 3.9.0a2
- remove skipping TestPythonArgSpec for Python 3.6+
because it is still available
- test DeprecationWarning for all Python 3 versions because
tests runs on Python 3.5+ only
Change-Id: I01a77c394657808e8c2c833c4dc6cd2b098dd754
---
M tests/tools_tests.py
1 file changed, 1 insertion(+), 2 deletions(-)
Approvals:
Legoktm: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/tools_tests.py b/tests/tools_tests.py
index b507f9e..1cb70d9 100644
--- a/tests/tools_tests.py
+++ b/tests/tools_tests.py
@@ -749,7 +749,6 @@
return tools.getargspec(method)
-(a)unittest.skipIf(tools.PYTHON_VERSION >= (3, 6), 'removed in Python 3.6')
class TestPythonArgSpec(TestArgSpec):
"""Test the same tests using Python's implementation."""
@@ -759,7 +758,7 @@
def getargspec(self, method):
"""Call inspect's getargspec function."""
with warnings.catch_warnings():
- if tools.PYTHON_VERSION >= (3, 5):
+ if not tools.PY2:
warnings.simplefilter('ignore', DeprecationWarning)
return inspect.getargspec(method)
--
To view, visit https://gerrit.wikimedia.org/r/565528
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I01a77c394657808e8c2c833c4dc6cd2b098dd754
Gerrit-Change-Number: 565528
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Legoktm <legoktm(a)member.fsf.org>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/566472 )
Change subject: [tests] Remove allowed_failure decorator from utils.py
......................................................................
[tests] Remove allowed_failure decorator from utils.py
With 85b908fa7f8 allowed_failure isn't used anymore.
That decorator does not support subTest and should be
replaced by expectedFailure or skipTest if necessary.
Bug: T223030
Change-Id: I55f7c2013aa4fd9e78eda701e266c3f93f664357
---
M tests/utils.py
1 file changed, 0 insertions(+), 54 deletions(-)
Approvals:
Legoktm: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/utils.py b/tests/utils.py
index f1acc10..cc7db4d 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -7,14 +7,11 @@
#
from __future__ import absolute_import, division, unicode_literals
-from functools import wraps
import inspect
import json
import os
-import re
from subprocess import PIPE, Popen
import sys
-import traceback
import warnings
try:
@@ -72,57 +69,6 @@
return lambda orig: orig
-def allowed_failure(func):
- """
- Unit test decorator to allow failure.
-
- This decorator runs the test and, if it is an Assertion failure,
- reports the result and considers it a skipped test. This is a
- similar behaviour like expectedFailure in Python 2. Passing a test
- will not count as failure (unexpected success) which Python 3 does.
-
- This decorator should be used if a test passes or fails due to
- random test parameters. If tests fails deterministic expectedFailure
- decorator should be used instead.
-
- @note: This decorator does not support subTest content manager.
- """
- @wraps(func)
- def wrapper(*args, **kwargs):
- try:
- func(*args, **kwargs)
- except AssertionError:
- pywikibot.exception(tb=False)
- tb = traceback.extract_tb(sys.exc_info()[2])
- for depth, line in enumerate(tb):
- if re.match('assert[A-Z]', line[2]):
- break
- tb = traceback.format_list(tb[:depth])
- pywikibot.error('\n' + ''.join(tb)[:-1]) # remove \n at the end
- raise unittest.SkipTest('Test is allowed to fail.')
-
- if PY2:
- return unittest.expectedFailure(func)
- else:
- return wrapper
-
-
-def allowed_failure_if(expect):
- """
- Unit test decorator to allow failure under conditions.
-
- See allowed_failure method for more details.
-
- @note: This decorator does not support subTest content manager.
- @param expect: Flag to check if failure is allowed
- @type expect: bool
- """
- if expect:
- return allowed_failure
- else:
- return lambda orig: orig
-
-
def add_metaclass(cls):
"""Call six's add_metaclass with the site's __metaclass__ in Python 3."""
if not PY2:
--
To view, visit https://gerrit.wikimedia.org/r/566472
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I55f7c2013aa4fd9e78eda701e266c3f93f664357
Gerrit-Change-Number: 566472
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Legoktm <legoktm(a)member.fsf.org>
Gerrit-Reviewer: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/566133 )
Change subject: [bugfix] fix keyword argument for suggest_help function
......................................................................
[bugfix] fix keyword argument for suggest_help function
Bug: T243260
Change-Id: Id0a26e8b31c55eb38e2be8728508e3cc0ac2b432
---
M scripts/flickrripper.py
1 file changed, 2 insertions(+), 2 deletions(-)
Approvals:
Dvorapa: Looks good to me, approved
jenkins-bot: Verified
diff --git a/scripts/flickrripper.py b/scripts/flickrripper.py
index 248050e..e216931 100755
--- a/scripts/flickrripper.py
+++ b/scripts/flickrripper.py
@@ -511,11 +511,11 @@
pywikibot.bot.suggest_help(missing_dependencies=('flickrapi',))
elif not config.flickr['api_key']:
- additional_message = (
+ additional_text = (
'Flickr api key not found! Get yourself an api key\n'
'Any flickr user can get a key at\n'
'https://www.flickr.com/services/api/keys/apply/')
- pywikibot.bot.suggest_help(additional_message=additional_message)
+ pywikibot.bot.suggest_help(additional_text=additional_text)
elif user_id or group_id or photoset_id:
if 'api_secret' in config.flickr and config.flickr['api_secret']:
--
To view, visit https://gerrit.wikimedia.org/r/566133
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Id0a26e8b31c55eb38e2be8728508e3cc0ac2b432
Gerrit-Change-Number: 566133
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: D3r1ck01 <xsavitar.wiki(a)aol.com>
Gerrit-Reviewer: Dvorapa <dvorapa(a)seznam.cz>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/566112 )
Change subject: [tests] Make last scripts test work
......................................................................
[tests] Make last scripts test work
The package name is python-stdnum but module identifier is stdnum only.
Bug: T243169
Change-Id: I47c7923a009d87af2e0a6e17723149c6772ebc8e
---
M tests/script_tests.py
1 file changed, 1 insertion(+), 1 deletion(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/script_tests.py b/tests/script_tests.py
index 8f5db09..e7cff05 100644
--- a/tests/script_tests.py
+++ b/tests/script_tests.py
@@ -24,7 +24,7 @@
script_deps = {
'flickrripper': ['flickrapi', 'PIL'],
'imageharvest': ['bs4'],
- 'isbn': ['python-stdnum'],
+ 'isbn': ['stdnum'],
'match_images': ['PIL.Image'],
'states_redirect': ['pycountry'],
'patrol': ['mwparserfromhell'],
--
To view, visit https://gerrit.wikimedia.org/r/566112
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I47c7923a009d87af2e0a6e17723149c6772ebc8e
Gerrit-Change-Number: 566112
Gerrit-PatchSet: 5
Gerrit-Owner: Dvorapa <dvorapa(a)seznam.cz>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)