jenkins-bot has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/636632 )
Change subject: [cleanup] cleanup interwiki_graph.py
......................................................................
[cleanup] cleanup interwiki_graph.py
- remove Python 2 code parts
- add deprecated decorator to already deprecated properties
- replace all originPage occurrences by origin
- remove old originPage variable in Subject.__init__
- update doc in Subject.__init__
- initialize found_in attribute only once
- deprecate global variable 'pydotfound'
- remove sanity check for pydot 1.0.3 because the lowest pydot version
allowed is 1.2
detached from 70ebe6db0980c4cece96356a0b8673a78c916914
Change-Id: I19d8678ec9f9241c9beca90f1cda3af2b62ab86c
---
M pywikibot/interwiki_graph.py
1 file changed, 46 insertions(+), 52 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/interwiki_graph.py b/pywikibot/interwiki_graph.py
index 4078774..216e2f7 100644
--- a/pywikibot/interwiki_graph.py
+++ b/pywikibot/interwiki_graph.py
@@ -1,28 +1,24 @@
# -*- coding: utf-8 -*-
"""Module with the Graphviz drawing calls."""
#
-# (C) Pywikibot team, 2006-2018
+# (C) Pywikibot team, 2006-2020
#
# Distributed under the terms of the MIT license.
#
-from __future__ import absolute_import, division, unicode_literals
-
-from collections import Counter
import itertools
import threading
-from typing import Optional
-try:
- import pydot
-except ImportError as e:
- pydot = e
+from collections import Counter
+from typing import Optional
import pywikibot
from pywikibot import config2 as config
-
-# deprecated value
-pydotfound = not isinstance(pydot, ImportError)
+from pywikibot.tools import deprecated, ModuleDeprecationWrapper
+try:
+ import pydot
+except ImportError as e:
+ pydot = e
class GraphImpossible(Exception):
@@ -60,32 +56,26 @@
pywikibot.output('Graph could not be saved as %s' % filename)
-class Subject(object):
+class Subject:
"""Data about a page with translations on multiple
wikis."""
def __init__(self, origin=None):
"""Initializer.
- @param originPage: the page on the 'origin' wiki
- @type originPage: pywikibot.page.Page
+ @param origin: the page on the 'origin' wiki
+ @type origin: pywikibot.page.Page
"""
# Remember the "origin page"
self._origin = origin
- # Temporary variable to support git blame; do not use
- originPage = origin
-
- self.found_in = None
-
# foundIn is a dictionary where pages are keys and lists of
# pages are values. It stores where we found each page.
# As we haven't yet found a page that links to the origin page, we
# start with an empty list for it.
- if originPage:
- self.foundIn = {self.originPage: []}
- else:
- self.foundIn = {}
+ self.found_in = {}
+ if origin:
+ self.found_in = {origin: []}
@property
def origin(self):
@@ -97,34 +87,33 @@
self._origin = value
@property
+ @deprecated('Subject.origin', since='20150125', future_warning=True)
def originPage(self):
- """Deprecated property for the origin page.
-
- DEPRECATED. Use origin.
- """
- # TODO: deprecate this property
+ """DEPRECATED. Deprecated property for the origin
page."""
return self.origin
@originPage.setter
+ @deprecated('Subject.origin', since='20150125', future_warning=True)
def originPage(self, value):
self.origin = value
@property
+ @deprecated('Subject.found_in', since='20150125',
future_warning=True)
def foundIn(self):
"""Mapping of pages to others pages interwiki linked to it.
DEPRECATED. Use found_in.
"""
- # TODO: deprecate this property
return self.found_in
@foundIn.setter
+ @deprecated('Subject.found_in', since='20150125',
future_warning=True)
def foundIn(self, value):
- """Temporary property setter to support code
migration."""
+ """DEPRECATED. Temporary property setter to support code
migration."""
self.found_in = value
-class GraphDrawer(object):
+class GraphDrawer:
"""Graphviz (dot) code creator."""
@@ -137,21 +126,21 @@
@raises GraphImpossible: pydot is not installed
"""
if isinstance(pydot, ImportError):
- raise GraphImpossible('pydot is not installed: %s.' % pydot)
+ raise GraphImpossible('pydot is not installed: {}.'.format(pydot))
self.graph = None
self.subject = subject
def getLabel(self, page):
"""Get label for page."""
- return '"%s:%s"' % (page.site.code, page.title())
+ return '"{}:{}"'.format(page.site.code, page.title())
def _octagon_site_set(self):
"""Build a list of sites with more than one valid
page."""
page_list = self.subject.found_in.keys()
# Only track sites of normal pages
- each_site = [page.site for page in page_list
- if page.exists() and not page.isRedirectPage()]
+ each_site = (page.site for page in page_list
+ if page.exists() and not page.isRedirectPage())
return {x[0] for x in itertools.takewhile(
lambda x: x[1] > 1,
@@ -172,7 +161,7 @@
node.set_fillcolor('blue')
elif page.isDisambig():
node.set_fillcolor('orange')
- if page.namespace() != self.subject.originPage.namespace():
+ if page.namespace() != self.subject.origin.namespace():
node.set_color('green')
node.set_style('filled,bold')
if page.site in self.octagon_sites:
@@ -190,17 +179,15 @@
oppositeEdge = self.graph.get_edge(targetLabel, sourceLabel)
if oppositeEdge:
- if isinstance(oppositeEdge, list):
- # bugfix for pydot >= 1.0.3
- oppositeEdge = oppositeEdge[0]
+ oppositeEdge = oppositeEdge[0]
oppositeEdge.set_dir('both')
# workaround for
sf.net bug 401: prevent duplicate edges
# (it is unclear why duplicate edges occur)
#
https://sourceforge.net/p/pywikipediabot/bugs/401/
elif self.graph.get_edge(sourceLabel, targetLabel):
- pywikibot.output(
- 'BUG: Tried to create duplicate edge from %s to %s'
- % (refPage.title(as_link=True), page.title(as_link=True)))
+ pywikibot.error(
+ 'Tried to create duplicate edge from {} to {}'
+ .format(refPage, page))
# duplicate edges would be bad because then get_edge() would
# give a list of edges, not a single edge when we handle the
# opposite edge.
@@ -221,7 +208,7 @@
def saveGraphFile(self):
"""Write graphs to the data directory."""
- thread = GraphSavingThread(self.graph, self.subject.originPage)
+ thread = GraphSavingThread(self.graph, self.subject.origin)
thread.start()
def createGraph(self):
@@ -231,21 +218,21 @@
For more info see
U{https://meta.wikimedia.org/wiki/Interwiki_graphs}
"""
pywikibot.output('Preparing graph for %s'
- % self.subject.originPage.title())
+ % self.subject.origin.title())
# create empty graph
self.graph = pydot.Dot()
# self.graph.set('concentrate', 'true')
self.octagon_sites = self._octagon_site_set()
- for page in self.subject.foundIn.keys():
+ for page in self.subject.found_in.keys():
# a node for each found page
self.addNode(page)
# mark start node by pointing there from a black dot.
- firstLabel = self.getLabel(self.subject.originPage)
+ firstLabel = self.getLabel(self.subject.origin)
self.graph.add_node(pydot.Node('start', shape='point'))
self.graph.add_edge(pydot.Edge('start', firstLabel))
- for page, referrers in self.subject.foundIn.items():
+ for page, referrers in self.subject.found_in.items():
for refPage in referrers:
self.addDirectedEdge(page, refPage)
self.saveGraphFile()
@@ -260,9 +247,16 @@
@param extension: file extension
@return: filename of <family>-<lang>-<page>.<ext>
"""
- filename = '%s-%s-%s' % (page.site.family.name,
- page.site.code,
- page.title(as_filename=True))
+ filename = '-'.join((page.site.family.name,
+ page.site.code,
+ page.title(as_filename=True)))
if extension:
- filename += '.%s' % extension
+ filename += '.{}'.format(extension)
return filename
+
+
+wrapper = ModuleDeprecationWrapper(__name__)
+wrapper._add_deprecated_attr(
+ 'pydotfound',
+ replacement_name='"not isinstance(pydot, ImportError)"',
+ since='2015125', future_warning=True)
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/636632
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I19d8678ec9f9241c9beca90f1cda3af2b62ab86c
Gerrit-Change-Number: 636632
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-CC: Zhuyifei1999 <zhuyifei1999(a)gmail.com>
Gerrit-MessageType: merged