jenkins-bot has submitted this change and it was merged.
Change subject: [FIX] tools: Supply count if future is missing
......................................................................
[FIX] tools: Supply count if future is missing
The original implementation of count in a0e72441 was only available if future
was installed but older than version 0.15.0. As we provide an implementation
anyway we could also support installations which are missing future.
Change-Id: Ifa9323d0e5362d120123229699213002957f96bf
---
M pywikibot/tools/__init__.py
1 file changed, 10 insertions(+), 7 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/tools/__init__.py b/pywikibot/tools/__init__.py
index eadbd08..b018fe0 100644
--- a/pywikibot/tools/__init__.py
+++ b/pywikibot/tools/__init__.py
@@ -88,6 +88,7 @@
"""Counter not found."""
pass
+ count = None
else:
Counter = future.backports.misc.Counter
OrderedDict = future.backports.misc.OrderedDict
@@ -97,15 +98,17 @@
except AttributeError:
warn('Please update the "future" package to at least version '
'0.15.0 to use its count.', RuntimeWarning, 2)
-
- def count(start=0, step=1):
- """Backported C{count} to support keyword arguments and step."""
- while True:
- yield start
- start += step
-
+ count = None
del future
+ if count is None:
+ def count(start=0, step=1):
+ """Backported C{count} to support keyword arguments and step."""
+ while True:
+ yield start
+ start += step
+
+
else:
from collections import Counter # noqa ; unused
from collections import OrderedDict
--
To view, visit https://gerrit.wikimedia.org/r/237194
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ifa9323d0e5362d120123229699213002957f96bf
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>
jenkins-bot has submitted this change and it was merged.
Change subject: Fix flake8 errors
......................................................................
Fix flake8 errors
Remove DataSite methods that return NotImplemented,
as it is unmaintainable, and prevents DataSite from
being used instead of APISite.
Add site module to mandatory flake8 rule
Change-Id: I8cf395f161a81c77a2eb723624b4170e2e3c53e1
---
M pywikibot/site.py
M tox.ini
2 files changed, 86 insertions(+), 73 deletions(-)
Approvals:
XZise: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 0cd666f..9b8e188 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -407,7 +407,7 @@
"""Return a dict of the builtin namespaces."""
return dict((i, cls(i, use_image_name=use_image_name,
case=cls.default_case(i, case)))
- for i in range(-2, 16))
+ for i in range(-2, 16))
@staticmethod
def normalize_name(name):
@@ -597,7 +597,7 @@
result = [NotImplemented if isinstance(ns, bool) else
NamespacesDict._lookup_name(ns, namespaces)
if isinstance(ns, basestring) and
- not ns.lstrip('-').isdigit() else
+ not ns.lstrip('-').isdigit() else
namespaces[int(ns)] if int(ns) in namespaces
else None
for ns in identifiers]
@@ -754,6 +754,11 @@
@property
@deprecated("APISite.siteinfo['case'] or Namespace.case == 'case-sensitive'")
def nocapitalize(self):
+ """
+ Return whether this site's default title case is case-sensitive.
+
+ DEPRECATED.
+ """
return self.siteinfo['case'] == 'case-sensitive'
@property
@@ -874,9 +879,11 @@
return SelfCallString(self.__str__())
def __repr__(self):
+ """Return internal representation."""
return 'Site("%s", "%s")' % (self.code, self.family.name)
def __hash__(self):
+ """Return hashable key."""
return hash(repr(self))
def languages(self):
@@ -1445,7 +1452,7 @@
else:
pywikibot.log(u"Unable to get siteinfo, because at least "
u"one property is unknown: '{0}'".format(
- u"', '".join(props)))
+ "', '".join(props)))
results = {}
for prop in props:
results.update(self._get_siteinfo(prop, expiry))
@@ -2412,16 +2419,21 @@
if not hasattr(self, "_magicwords"):
magicwords = self.siteinfo.get("magicwords", cache=False)
self._magicwords = dict((item["name"], item["aliases"])
- for item in magicwords)
+ for item in magicwords)
if word in self._magicwords:
return self._magicwords[word]
else:
return [word]
- @deprecated
+ @deprecated('expand_text')
def resolvemagicwords(self, wikitext):
- return NotImplementedError
+ """
+ Replace the {{ns:xx}} marks in a wikitext with the namespace names.
+
+ DEPRECATED.
+ """
+ return self.expand_text(wikitext)
@remove_last_args(('default', ))
def redirect(self):
@@ -2730,7 +2742,7 @@
page.title(withSection=False)):
pywikibot.warning(
u"{0}: Query on {1} returned data on '{2}'".format(
- method_name, page, pageitem['title']))
+ method_name, page, pageitem['title']))
continue
api.update_page(page, pageitem, query.props)
@@ -3156,8 +3168,8 @@
if 'tokens' in data and data['tokens']:
user_tokens = dict((key[:-5], val)
- for key, val in data['tokens'].items()
- if val != '+\\')
+ for key, val in data['tokens'].items()
+ if val != '+\\')
return user_tokens
@@ -3178,7 +3190,7 @@
if self.username(sysop) != 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(sysop), self.user()))
if not getalways:
raise ValueError('In pywikibot/core getToken does not support the '
'getalways parameter.')
@@ -3194,7 +3206,7 @@
if self.username(sysop) != 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(sysop), self.user()))
return self.tokens['patrol']
def getParsedString(self, string, keeptags=None):
@@ -3735,6 +3747,7 @@
self._update_page(category, ciquery, 'categoryinfo')
def categoryinfo(self, category):
+ """Retrieve data on contents of category."""
if not hasattr(category, "_catinfo"):
self.getcategoryinfo(category)
if not hasattr(category, "_catinfo"):
@@ -4744,24 +4757,28 @@
_mv_errors = {
"noapiwrite": "API editing not enabled on %(site)s wiki",
"writeapidenied":
-"User %(user)s is not authorized to edit on %(site)s wiki",
+ "User %(user)s is not authorized to edit on %(site)s wiki",
"nosuppress":
-"User %(user)s is not authorized to move pages without creating redirects",
+ 'User %(user)s is not authorized to move pages without '
+ 'creating redirects',
"cantmove-anon":
-"""Bot is not logged in, and anon users are not authorized to move pages on
-%(site)s wiki""",
+ 'Bot is not logged in, and anon users are not authorized to '
+ 'move pages on %(site)s wiki',
"cantmove":
-"User %(user)s is not authorized to move pages on %(site)s wiki",
+ "User %(user)s is not authorized to move pages on %(site)s wiki",
"immobilenamespace":
-"Pages in %(oldnamespace)s namespace cannot be moved on %(site)s wiki",
+ 'Pages in %(oldnamespace)s namespace cannot be moved on %(site)s '
+ 'wiki',
"articleexists": OnErrorExc(exception=ArticleExistsConflict, on_new_page=True),
# "protectedpage" can happen in both directions.
"protectedpage": OnErrorExc(exception=LockedPage, on_new_page=None),
"protectedtitle": OnErrorExc(exception=LockedNoPage, on_new_page=True),
"nonfilenamespace":
-"Cannot move a file to %(newnamespace)s namespace on %(site)s wiki",
+ 'Cannot move a file to %(newnamespace)s namespace on %(site)s '
+ 'wiki',
"filetypemismatch":
-"[[%(newtitle)s]] file extension does not match content of [[%(oldtitle)s]]",
+ '[[%(newtitle)s]] file extension does not match content of '
+ '[[%(oldtitle)s]]',
}
@must_be(group='user')
@@ -5612,8 +5629,7 @@
raise pywikibot.UploadWarning(warning, upload_warnings[warning]
% {'msg': message},
file_key=_file_key,
- offset=result['offset']
- if 'offset' in result else False)
+ offset=result.get('offset', False))
elif "result" not in result:
pywikibot.output(u"Upload: unrecognized response: %s" % result)
if result["result"] == "Success":
@@ -6059,8 +6075,8 @@
@need_extension('Flow')
def load_topiclist(self, page, format='wikitext', limit=100,
- sortby='newest', toconly=False, offset=None,
- offset_id=None, reverse=False, include_offset=False):
+ sortby='newest', toconly=False, offset=None,
+ offset_id=None, reverse=False, include_offset=False):
"""Retrieve the topiclist of a Flow board.
@param page: A Flow board
@@ -6318,6 +6334,7 @@
return super(APISite, self).__getattr__(attr)
def __repr__(self):
+ """Return internal representation."""
return 'DataSite("%s", "%s")' % (self.code, self.family.name)
@deprecated("pywikibot.PropertyPage")
@@ -6325,7 +6342,7 @@
"""Generic method to get the data for multiple Wikibase items."""
wbdata = self.get_item(source, props=props, **params)
assert props in wbdata, \
- "API wbgetentities response lacks %s key" % props
+ "API wbgetentities response lacks %s key" % props
return wbdata[props]
@deprecated("pywikibot.WikibasePage")
@@ -6338,12 +6355,12 @@
wbrequest = self._simple_request(**params)
wbdata = wbrequest.submit()
assert 'success' in wbdata, \
- "API wbgetentities response lacks 'success' key"
+ "API wbgetentities response lacks 'success' key"
assert wbdata['success'] == 1, "API 'success' key is not 1"
assert 'entities' in wbdata, \
- "API wbgetentities response lacks 'entities' key"
+ "API wbgetentities response lacks 'entities' key"
assert ids in wbdata['entities'], \
- "API wbgetentities response lacks %s key" % ids
+ "API wbgetentities response lacks %s key" % ids
return wbdata['entities'][ids]
else:
# not implemented yet
@@ -6438,6 +6455,18 @@
@must_be(group='user')
def editEntity(self, identification, data, bot=True, **kwargs):
+ """
+ Edit entity.
+
+ @param identification: API parameters to use for entity identification
+ @type identification: dict
+ @param data: data updates
+ @type data: dict
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
+ @return: New entity data
+ @rtype: dict
+ """
if "id" in identification and identification["id"] == "-1":
del identification["id"]
params = dict(**identification)
@@ -6459,7 +6488,16 @@
@must_be(group='user')
def addClaim(self, item, claim, bot=True, **kwargs):
+ """
+ Add a claim.
+ @param item: Entity to modify
+ @type item: WikibasePage
+ @param claim: Claim to be added
+ @type claim: Claim
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
+ """
params = dict(action='wbcreateclaim',
entity=item.getID(),
baserevid=item.latest_revision_id,
@@ -6492,6 +6530,8 @@
@type claim: Claim
@param snaktype: An optional snaktype. Default: 'value'
@type snaktype: str ('value', 'novalue' or 'somevalue')
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
"""
if claim.isReference or claim.isQualifier:
raise NotImplementedError
@@ -6553,6 +6593,8 @@
@type source: Claim
@param new: Whether to create a new one if the "source" already exists
@type new: bool
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
"""
if claim.isReference or claim.isQualifier:
raise ValueError("The claim cannot have a source.")
@@ -6605,6 +6647,8 @@
@type claim: Claim
@param qualifier: A Claim object to be used as a qualifier
@type qualifier: Claim
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
"""
if claim.isReference or claim.isQualifier:
raise ValueError("The claim cannot have a qualifier.")
@@ -6636,6 +6680,14 @@
@must_be(group='user')
def removeClaims(self, claims, bot=True, **kwargs):
+ """
+ Remove claims.
+
+ @param claims: Claims to be added
+ @type claims: list of Claim
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
+ """
params = dict(action='wbremoveclaims')
if bot:
params['bot'] = 1
@@ -6657,6 +6709,8 @@
@type claim: Claim
@param sources: A list of Claim objects that are sources
@type sources: Claim
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
"""
params = dict(action='wbremovereferences')
if bot:
@@ -6679,7 +6733,8 @@
@type page1: pywikibot.Page
@param page2: Second page to link
@type page2: pywikibot.Page
- @param bot: whether to mark edit as bot
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
@return: dict API output
"""
params = {
@@ -6744,7 +6799,8 @@
@param page: page to fetch links from
@type page: pywikibot.Page
- @param bot: whether to mark the edit as bot
+ @param bot: Whether to mark the edit as a bot edit
+ @type bot: bool
@return: pywikibot.ItemPage of newly created item
"""
sitelinks = {
@@ -6807,47 +6863,3 @@
if limit is not None:
gen.set_maximum_items(limit)
return gen
-
- # deprecated BaseSite methods
- def fam(self):
- raise NotImplementedError
-
- def urlEncode(self, *args, **kwargs):
- raise NotImplementedError
-
- def getUrl(self, *args, **kwargs):
- raise NotImplementedError
-
- def linkto(self, *args, **kwargs):
- raise NotImplementedError
-
- def loggedInAs(self, *args, **kwargs):
- raise NotImplementedError
-
- def postData(self, *args, **kwargs):
- raise NotImplementedError
-
- def postForm(self, *args, **kwargs):
- raise NotImplementedError
-
- # deprecated APISite methods
- def isBlocked(self, *args, **kwargs):
- raise NotImplementedError
-
- def checkBlocks(self, *args, **kwargs):
- raise NotImplementedError
-
- def isAllowed(self, *args, **kwargs):
- raise NotImplementedError
-
- def prefixindex(self, *args, **kwargs):
- raise NotImplementedError
-
- def categories(self, *args, **kwargs):
- raise NotImplementedError
-
- def linksearch(self, *args, **kwargs):
- raise NotImplementedError
-
- def newimages(self, *args, **kwargs):
- raise NotImplementedError
diff --git a/tox.ini b/tox.ini
index 6b7838e..537ea31 100644
--- a/tox.ini
+++ b/tox.ini
@@ -68,6 +68,7 @@
pywikibot/plural.py \
pywikibot/proofreadpage.py \
pywikibot/site_detect.py \
+ pywikibot/site.py \
pywikibot/textlib.py \
pywikibot/throttle.py \
pywikibot/titletranslate.py \
--
To view, visit https://gerrit.wikimedia.org/r/234953
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I8cf395f161a81c77a2eb723624b4170e2e3c53e1
Gerrit-PatchSet: 6
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>
jenkins-bot has submitted this change and it was merged.
Change subject: TokenTestBase.setUp super()
......................................................................
TokenTestBase.setUp super()
TokenTestBase.setUp calls the superclass setUp last.
This means that RequireUserMixin.setUp, which resets the login
is not run until after the token has been fetched and cached.
The cached token may be for the anon user, which then cant be
used when the test class uses 'user = True'.
Change-Id: Ice7ccb312ab196652db0f46969aa5a315bc8d3f9
---
M tests/site_tests.py
1 file changed, 1 insertion(+), 1 deletion(-)
Approvals:
XZise: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 525f418..576b790 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -49,6 +49,7 @@
def setUp(self):
"""Skip test if user does not have token and clear site wallet."""
+ super(TokenTestBase, self).setUp()
mysite = self.get_site()
ttype = self.token_type
try:
@@ -63,7 +64,6 @@
self.token = token
self._orig_wallet = self.site.tokens
self.site.tokens = pywikibot.site.TokenWallet(self.site)
- super(TokenTestBase, self).setUp()
def tearDown(self):
"""Restore site tokens."""
--
To view, visit https://gerrit.wikimedia.org/r/236992
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ice7ccb312ab196652db0f46969aa5a315bc8d3f9
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>
jenkins-bot has submitted this change and it was merged.
Change subject: Add deprecated Site.logpages; add tag to logevents
......................................................................
Add deprecated Site.logpages; add tag to logevents
logpages was the method name in compat for what is now logevents.
Add logevents support for parameter tag, which was functional in
compat.
Bug: T78107
Change-Id: Ia4f51add0b01ab29a61c1081f8c7efb403dd2c18
---
M pywikibot/site.py
M tests/site_tests.py
2 files changed, 95 insertions(+), 8 deletions(-)
Approvals:
XZise: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py
index 323fcf2..0cd666f 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -4075,20 +4075,35 @@
return iugen
def logevents(self, logtype=None, user=None, page=None, namespace=None,
- start=None, end=None, reverse=False, step=None, total=None):
+ start=None, end=None, reverse=False, tag=None,
+ step=None, total=None):
"""Iterate all log entries.
@param logtype: only iterate entries of this type (see wiki
documentation for available types, which will include "block",
"protect", "rights", "delete", "upload", "move", "import",
"patrol", "merge")
+ @param logtype: basestring
@param user: only iterate entries that match this user name
+ @type user: basestring
@param page: only iterate entries affecting this page
+ @type page: Page or basestring
@param namespace: namespace to retrieve logevents from
@type namespace: int or Namespace
@param start: only iterate entries from and after this Timestamp
+ @type start: Timestamp or ISO date string
@param end: only iterate entries up to and through this Timestamp
+ @type end: Timestamp or ISO date string
@param reverse: if True, iterate oldest entries first (default: newest)
+ @type reverse: bool
+ @param tag: only iterate entries tagged with this tag
+ @type tag: basestring
+ @param step: request batch size
+ @type step: int
+ @param total: maximum number of events to iterate
+ @type total: int
+ @rtype: iterable
+
@raises KeyError: the namespace identifier was not resolved
@raises TypeError: the namespace identifier has an inappropriate
type such as bool, or an iterable with more than one namespace
@@ -4103,7 +4118,7 @@
if user is not None:
legen.request["leuser"] = user
if page is not None:
- legen.request["letitle"] = page.title(withSection=False)
+ legen.request["letitle"] = page
if start is not None:
legen.request["lestart"] = start
if end is not None:
@@ -4112,14 +4127,43 @@
legen.request["ledir"] = "newer"
if namespace:
legen.request["lenamespace"] = namespace
+ if tag:
+ # Supported in version 1.16+; earlier sites will cause APIError
+ legen.request['letag'] = tag
+
return legen
@deprecated('APISite.logevents()')
- def logpages(self, number=50, mode='', title=None, user=None, repeat=False,
+ @deprecated_args(repeat=None)
+ def logpages(self, number=50, mode=None, title=None, user=None,
namespace=[], start=None, end=None, tag=None, newer=False,
dump=False, offset=None):
- # TODO: implement using logevents
- raise NotImplementedError
+ """
+ Iterate log pages. DEPRECATED.
+
+ When dump is enabled, the raw API dict is returned.
+
+ @rtype: tuple of Page, str, int, str
+ """
+ if offset:
+ assert not start
+ assert isinstance(offset, int)
+ offset = datetime.timedelta(hours=offset)
+ start = pywikibot.Timestamp.utcnow() - offset
+
+ gen = self.logevents(logtype=mode, page=title, tag=tag,
+ user=user, namespace=namespace,
+ start=start, end=end, reverse=newer,
+ total=number)
+
+ for entry in gen:
+ if dump:
+ yield entry.data
+ else:
+ yield (entry.page(),
+ entry.user(),
+ int(entry.timestamp().totimestampformat()),
+ entry.comment())
@deprecated_args(returndict=None, nobots=None, rcshow=None, rcprop=None,
rctype='changetype', revision=None, repeat=None,
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 9f304fd..525f418 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -984,7 +984,17 @@
def testLogEvents(self):
"""Test the site.logevents() method."""
mysite = self.get_site()
- mainpage = self.get_mainpage()
+ for entry in mysite.logevents(user=mysite.user(), total=3):
+ self.assertEqual(entry.user(), mysite.user())
+
+
+class TestLogEvents(DefaultSiteTestCase):
+
+ """Test logevents methods."""
+
+ def test_logevents(self):
+ """Test logevents method."""
+ mysite = self.get_site()
le = list(mysite.logevents(total=10))
self.assertLessEqual(len(le), 10)
self.assertTrue(all(isinstance(entry, pywikibot.logentries.LogEntry)
@@ -993,11 +1003,18 @@
"move", "import", "patrol", "merge"):
for entry in mysite.logevents(logtype=typ, total=3):
self.assertEqual(entry.type(), typ)
+
+ def test_logevents_mainpage(self):
+ """Test logevents method on the main page."""
+ mysite = self.get_site()
+ mainpage = self.get_mainpage()
for entry in mysite.logevents(page=mainpage, total=3):
self.assertEqual(entry.page().title(), mainpage.title())
self.assertEqual(entry.page(), mainpage)
- for entry in mysite.logevents(user=mysite.user(), total=3):
- self.assertEqual(entry.user(), mysite.user())
+
+ def test_logevents_timestamp(self):
+ """Test logevents method."""
+ mysite = self.get_site()
for entry in mysite.logevents(
start=pywikibot.Timestamp.fromISOformat('2008-09-01T00:00:01Z'), total=5):
self.assertIsInstance(entry, pywikibot.logentries.LogEntry)
@@ -1031,6 +1048,32 @@
reverse=True, total=5)
+class TestLogPages(DefaultSiteTestCase, DeprecationTestCase):
+
+ """Test logpages methods."""
+
+ def test_logpages(self):
+ """Test the deprecated site.logpages() method."""
+ le = list(self.site.logpages(number=10))
+ self.assertOneDeprecation()
+ self.assertLessEqual(len(le), 10)
+ for entry in le:
+ self.assertIsInstance(entry, tuple)
+ self.assertIsInstance(entry[0], pywikibot.Page)
+ self.assertIsInstance(entry[1], basestring)
+ self.assertIsInstance(entry[2], int)
+ self.assertIsInstance(entry[3], basestring)
+
+ def test_logpages_dump(self):
+ """Test the deprecated site.logpages() method using dump mode."""
+ le = list(self.site.logpages(number=10, dump=True))
+ self.assertOneDeprecation()
+ self.assertLessEqual(len(le), 10)
+ for entry in le:
+ self.assertIsInstance(entry, dict)
+ self.assertIn('title', entry)
+
+
class TestRecentChanges(DefaultSiteTestCase):
"""Test recentchanges method."""
--
To view, visit https://gerrit.wikimedia.org/r/236733
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ia4f51add0b01ab29a61c1081f8c7efb403dd2c18
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>