jenkins-bot merged this change.

View Change

Approvals: Dalba: Looks good to me, approved jenkins-bot: Verified
[IMPR] Reduce code complexity of update_page

- Reduce cyclomatic complexity of update_page from E33 to C17
and improve readability by splitting code in parts.
- Raise RuntimeError instead of AssertionError when neither 'pageid' nor
'missing' attributes are given because this is more a runtime problem
than a debugging stuff.

Change-Id: Icf17030707e5a0c63e769cee2f48c3ab0be95b59
---
M pywikibot/data/api.py
1 file changed, 107 insertions(+), 70 deletions(-)

diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index 8a64bcc..214a5a6 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -3161,6 +3161,102 @@
return urlencode(query)


+def _update_pageid(page, pagedict):
+ """Update pageid."""
+ if 'pageid' in pagedict:
+ page._pageid = int(pagedict['pageid'])
+ elif 'missing' in pagedict:
+ page._pageid = 0 # Non-existent page
+ else:
+ # Something is wrong.
+ if page.site.sametitle(page.title(), pagedict['title']):
+ if 'invalid' in pagedict:
+ raise InvalidTitle('{}: {}'.format(page,
+ pagedict['invalidreason']))
+ if int(pagedict['ns']) < 0:
+ raise UnsupportedPage(page)
+ raise RuntimeError(
+ "Page {} has neither 'pageid' nor 'missing' attribute"
+ .format(pagedict['title']))
+
+
+def _update_contentmodel(page, pagedict):
+ """Update page content model."""
+ page._contentmodel = pagedict.get('contentmodel') # can be None
+
+ if (page._contentmodel
+ and page._contentmodel == 'proofread-page'
+ and 'proofread' in pagedict):
+ page._quality = pagedict['proofread']['quality']
+ page._quality_text = pagedict['proofread']['quality_text']
+
+
+def _update_protection(page, pagedict):
+ """Update page protection."""
+ if 'restrictiontypes' in pagedict:
+ page._applicable_protections = set(pagedict['restrictiontypes'])
+ else:
+ page._applicable_protections = None
+ page._protection = {item['type']: (item['level'], item['expiry'])
+ for item in pagedict['protection']}
+
+
+def _update_revisions(page, revisions):
+ """Update page revisions."""
+ # TODO: T102735: Use the page content model for <1.21
+ for rev in revisions:
+ revision = pywikibot.page.Revision(
+ revid=rev['revid'],
+ timestamp=pywikibot.Timestamp.fromISOformat(rev['timestamp']),
+ user=rev.get('user', ''),
+ anon='anon' in rev,
+ comment=rev.get('comment', ''),
+ minor='minor' in rev,
+ text=rev.get('*'),
+ rollbacktoken=rev.get('rollbacktoken'),
+ parentid=rev.get('parentid'),
+ contentmodel=rev.get('contentmodel'),
+ sha1=rev.get('sha1')
+ )
+ page._revisions[revision.revid] = revision
+
+
+def _update_templates(page, templates):
+ """Update page templates."""
+ templ_pages = [pywikibot.Page(page.site, tl['title']) for tl in templates]
+ if hasattr(page, '_templates'):
+ page._templates.extend(templ_pages)
+ else:
+ page._templates = templ_pages
+
+
+def _update_langlinks(page, langlinks):
+ """Update page langlinks."""
+ links = [pywikibot.Link.langlinkUnsafe(link['lang'], link['*'],
+ source=page.site)
+ for link in langlinks]
+
+ if hasattr(page, '_langlinks'):
+ page._langlinks.extend(links)
+ else:
+ page._langlinks = links
+
+
+def _update_coordinates(page, coordinates):
+ """Update page coordinates."""
+ coords = []
+ for co in coordinates:
+ coord = pywikibot.Coordinate(lat=co['lat'],
+ lon=co['lon'],
+ typ=co.get('type', ''),
+ name=co.get('name', ''),
+ dim=int(co.get('dim', 0)) or None,
+ globe=co['globe'], # See [[gerrit:67886]]
+ )
+ coords.append(coord)
+ page._coords = coords
+
+
def update_page(page, pagedict, props=[]):
"""Update attributes of Page object page, based on query data in pagedict.

@@ -3176,54 +3272,20 @@
@raises InvalidTitle: Page title is invalid
@raises UnsupportedPage: Page with namespace < 0 is not supported yet
"""
- if "pageid" in pagedict:
- page._pageid = int(pagedict['pageid'])
- elif "missing" in pagedict:
- page._pageid = 0 # Non-existent page
- else:
- # Something is wrong.
- if page.site.sametitle(page.title(), pagedict['title']):
- if 'invalid' in pagedict:
- raise InvalidTitle('%s: %s' % (page, pagedict['invalidreason']))
- if int(pagedict['ns']) < 0:
- raise UnsupportedPage(page)
- raise AssertionError(
- "Page %s has neither 'pageid' nor 'missing' attribute" % pagedict['title'])
- page._contentmodel = pagedict.get('contentmodel') # can be None
- if (page._contentmodel and
- page._contentmodel == 'proofread-page' and
- 'proofread' in pagedict):
- page._quality = pagedict['proofread']['quality']
- page._quality_text = pagedict['proofread']['quality_text']
+ _update_pageid(page, pagedict)
+ _update_contentmodel(page, pagedict)
+
if 'info' in props:
page._isredir = 'redirect' in pagedict
+
if 'touched' in pagedict:
page._timestamp = pagedict['touched']
+
if 'protection' in pagedict:
- if 'restrictiontypes' in pagedict:
- page._applicable_protections = set(pagedict['restrictiontypes'])
- else:
- page._applicable_protections = None
- page._protection = {}
- for item in pagedict['protection']:
- page._protection[item['type']] = item['level'], item['expiry']
+ _update_protection(page, pagedict)
+
if 'revisions' in pagedict:
- # TODO: T102735: Use the page content model for <1.21
- for rev in pagedict['revisions']:
- revision = pywikibot.page.Revision(
- revid=rev['revid'],
- timestamp=pywikibot.Timestamp.fromISOformat(rev['timestamp']),
- user=rev.get('user', u''),
- anon='anon' in rev,
- comment=rev.get('comment', u''),
- minor='minor' in rev,
- text=rev.get('*', None),
- rollbacktoken=rev.get('rollbacktoken', None),
- parentid=rev.get('parentid'),
- contentmodel=rev.get('contentmodel', None),
- sha1=rev.get('sha1', None)
- )
- page._revisions[revision.revid] = revision
+ _update_revisions(page, pagedict['revisions'])

if 'lastrevid' in pagedict:
page.latest_revision_id = pagedict['lastrevid']
@@ -3237,38 +3299,13 @@
page._catinfo = pagedict["categoryinfo"]

if "templates" in pagedict:
- templates = [pywikibot.Page(page.site, tl['title'])
- for tl in pagedict['templates']]
- if hasattr(page, "_templates"):
- page._templates.extend(templates)
- else:
- page._templates = templates
+ _update_templates(page, pagedict['templates'])

if "langlinks" in pagedict:
- links = []
- for ll in pagedict["langlinks"]:
- link = pywikibot.Link.langlinkUnsafe(ll['lang'],
- ll['*'],
- source=page.site)
- links.append(link)
-
- if hasattr(page, "_langlinks"):
- page._langlinks.extend(links)
- else:
- page._langlinks = links
+ _update_langlinks(page, pagedict['langlinks'])

if "coordinates" in pagedict:
- coords = []
- for co in pagedict['coordinates']:
- coord = pywikibot.Coordinate(lat=co['lat'],
- lon=co['lon'],
- typ=co.get('type', ''),
- name=co.get('name', ''),
- dim=int(co.get('dim', 0)) or None,
- globe=co['globe'], # See [[gerrit:67886]]
- )
- coords.append(coord)
- page._coords = coords
+ _update_coordinates(page, pagedict['coordinates'])

if 'pageimage' in pagedict:
page._pageimage = pywikibot.FilePage(page.site, pagedict['pageimage'])

To view, visit change 428054. To unsubscribe, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Icf17030707e5a0c63e769cee2f48c3ab0be95b59
Gerrit-Change-Number: 428054
Gerrit-PatchSet: 6
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: Framawiki <framawiki@tools.wmflabs.org>
Gerrit-Reviewer: John Vandenberg <jayvdb@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: Zoranzoki21 <zorandori4444@gmail.com>
Gerrit-Reviewer: jenkins-bot <>