jenkins-bot submitted this change.

View Change


Approvals: Matěj Suchánek: Looks good to me, but someone else must approve Xqt: Looks good to me, approved jenkins-bot: Verified
[IMPR] Add WikibaseFamily and DefaultWikibaseFamily class to family.py

- Add WikibaseFamily which holds default settings for a Wikibase like
interface and entity_sources.
- Add DefaultWikibaseFamily which holds default settings for
calendarmodel, default_globe and globes
- derive commons_family.Family and wikidata_family.Family from
DefaultWikibaseFamily to prevent code duplication
- derive lingualibre_family.Family from WikibaseFamily to add the
missing entity_sources. Otherwise an
AttributeError: DataSite instance has no attribute 'entity_sources
will arrise.

See also: https://www.mediawiki.org/wiki/Topic:Xl9dhs135tuqj6w6

Change-Id: Ic7423c82f9635ef8e5e7b86fc73d49c2eae17116
---
M pywikibot/families/commons_family.py
M pywikibot/family.py
M pywikibot/families/lingualibre_family.py
M pywikibot/families/wikidata_family.py
4 files changed, 127 insertions(+), 123 deletions(-)

diff --git a/pywikibot/families/commons_family.py b/pywikibot/families/commons_family.py
index 578c715..5545937 100644
--- a/pywikibot/families/commons_family.py
+++ b/pywikibot/families/commons_family.py
@@ -7,10 +7,15 @@
from pywikibot import family


-# The Wikimedia Commons family
-class Family(family.WikimediaFamily):
+class Family(family.WikimediaFamily, family.DefaultWikibaseFamily):

- """Family class for Wikimedia Commons."""
+ """Family class for Wikimedia Commons.
+
+ .. versionchanged:: 6.5
+ :meth:`family.WikibaseFamily.interface` was changed to
+ :class:`DataSite<pywikibot.site._datasite.DataSite>` to enable
+ structured data.
+ """

name = 'commons'

@@ -39,62 +44,6 @@
'_default': (('/doc', ), ['commons']),
}

- def interface(self, code) -> str:
- """Return 'DataSite' to enable structured data.
-
- .. versionadded:: 6.5
- """
- return 'DataSite'
-
- def calendarmodel(self, code) -> str:
- """Default calendar model for WbTime datatype."""
- return 'http://www.wikidata.org/entity/Q1985727'
-
- def default_globe(self, code) -> str:
- """Default globe for Coordinate datatype."""
- return 'earth'
-
- def globes(self, code):
- """Supported globes for Coordinate datatype."""
- return {
- 'ariel': 'http://www.wikidata.org/entity/Q3343',
- 'bennu': 'http://www.wikidata.org/entity/Q11558',
- 'callisto': 'http://www.wikidata.org/entity/Q3134',
- 'ceres': 'http://www.wikidata.org/entity/Q596',
- 'deimos': 'http://www.wikidata.org/entity/Q7548',
- 'dione': 'http://www.wikidata.org/entity/Q15040',
- 'earth': 'http://www.wikidata.org/entity/Q2',
- 'enceladus': 'http://www.wikidata.org/entity/Q3303',
- 'eros': 'http://www.wikidata.org/entity/Q16711',
- 'europa': 'http://www.wikidata.org/entity/Q3143',
- 'ganymede': 'http://www.wikidata.org/entity/Q3169',
- 'gaspra': 'http://www.wikidata.org/entity/Q158244',
- 'hyperion': 'http://www.wikidata.org/entity/Q15037',
- 'iapetus': 'http://www.wikidata.org/entity/Q17958',
- 'io': 'http://www.wikidata.org/entity/Q3123',
- 'jupiter': 'http://www.wikidata.org/entity/Q319',
- 'lutetia': 'http://www.wikidata.org/entity/Q107556',
- 'mars': 'http://www.wikidata.org/entity/Q111',
- 'mercury': 'http://www.wikidata.org/entity/Q308',
- 'mimas': 'http://www.wikidata.org/entity/Q15034',
- 'miranda': 'http://www.wikidata.org/entity/Q3352',
- 'moon': 'http://www.wikidata.org/entity/Q405',
- 'oberon': 'http://www.wikidata.org/entity/Q3332',
- 'phobos': 'http://www.wikidata.org/entity/Q7547',
- 'phoebe': 'http://www.wikidata.org/entity/Q17975',
- 'pluto': 'http://www.wikidata.org/entity/Q339',
- 'rhea': 'http://www.wikidata.org/entity/Q15050',
- 'ryugu': 'http://www.wikidata.org/entity/Q1385178',
- 'steins': 'http://www.wikidata.org/entity/Q150249',
- 'tethys': 'http://www.wikidata.org/entity/Q15047',
- 'titan': 'http://www.wikidata.org/entity/Q2565',
- 'titania': 'http://www.wikidata.org/entity/Q3322',
- 'triton': 'http://www.wikidata.org/entity/Q3359',
- 'umbriel': 'http://www.wikidata.org/entity/Q3338',
- 'venus': 'http://www.wikidata.org/entity/Q313',
- 'vesta': 'http://www.wikidata.org/entity/Q3030',
- }
-
def entity_sources(self, code):
if code == 'commons':
return {
diff --git a/pywikibot/families/lingualibre_family.py b/pywikibot/families/lingualibre_family.py
index 81f1377..cdcc658 100644
--- a/pywikibot/families/lingualibre_family.py
+++ b/pywikibot/families/lingualibre_family.py
@@ -3,14 +3,14 @@
.. versionaddded: 6.5
"""
#
-# (C) Pywikibot team, 2021-2022
+# (C) Pywikibot team, 2021-2023
#
# Distributed under the terms of the MIT license.
#
from pywikibot import family


-class Family(family.WikimediaFamily):
+class Family(family.WikimediaFamily, family.WikibaseFamily):

"""Family class for Lingua Libre.

@@ -28,7 +28,3 @@
def scriptpath(self, code) -> str:
"""Return the script path for this family."""
return ''
-
- def interface(self, code) -> str:
- """Return 'DataSite'."""
- return 'DataSite'
diff --git a/pywikibot/families/wikidata_family.py b/pywikibot/families/wikidata_family.py
index 816e147..780c482 100644
--- a/pywikibot/families/wikidata_family.py
+++ b/pywikibot/families/wikidata_family.py
@@ -7,8 +7,7 @@
from pywikibot import config, family


-# The Wikidata family
-class Family(family.WikimediaFamily):
+class Family(family.WikimediaFamily, family.DefaultWikibaseFamily):

"""Family class for Wikidata."""

@@ -40,59 +39,3 @@
config.cosmetic_changes_disable.update({
'wikidata': ('wikidata', 'test', 'beta')
})
-
- def interface(self, code) -> str:
- """Return 'DataSite'."""
- return 'DataSite'
-
- def calendarmodel(self, code) -> str:
- """Default calendar model for WbTime datatype."""
- return 'http://www.wikidata.org/entity/Q1985727'
-
- def default_globe(self, code) -> str:
- """Default globe for Coordinate datatype."""
- return 'earth'
-
- def globes(self, code):
- """Supported globes for Coordinate datatype."""
- return {
- 'ariel': 'http://www.wikidata.org/entity/Q3343',
- 'bennu': 'http://www.wikidata.org/entity/Q11558',
- 'callisto': 'http://www.wikidata.org/entity/Q3134',
- 'ceres': 'http://www.wikidata.org/entity/Q596',
- 'deimos': 'http://www.wikidata.org/entity/Q7548',
- 'dione': 'http://www.wikidata.org/entity/Q15040',
- 'earth': 'http://www.wikidata.org/entity/Q2',
- 'enceladus': 'http://www.wikidata.org/entity/Q3303',
- 'eros': 'http://www.wikidata.org/entity/Q16711',
- 'europa': 'http://www.wikidata.org/entity/Q3143',
- 'ganymede': 'http://www.wikidata.org/entity/Q3169',
- 'gaspra': 'http://www.wikidata.org/entity/Q158244',
- 'hyperion': 'http://www.wikidata.org/entity/Q15037',
- 'iapetus': 'http://www.wikidata.org/entity/Q17958',
- 'io': 'http://www.wikidata.org/entity/Q3123',
- 'jupiter': 'http://www.wikidata.org/entity/Q319',
- 'lutetia': 'http://www.wikidata.org/entity/Q107556',
- 'mars': 'http://www.wikidata.org/entity/Q111',
- 'mercury': 'http://www.wikidata.org/entity/Q308',
- 'mimas': 'http://www.wikidata.org/entity/Q15034',
- 'miranda': 'http://www.wikidata.org/entity/Q3352',
- 'moon': 'http://www.wikidata.org/entity/Q405',
- 'oberon': 'http://www.wikidata.org/entity/Q3332',
- 'phobos': 'http://www.wikidata.org/entity/Q7547',
- 'phoebe': 'http://www.wikidata.org/entity/Q17975',
- 'pluto': 'http://www.wikidata.org/entity/Q339',
- 'rhea': 'http://www.wikidata.org/entity/Q15050',
- 'ryugu': 'http://www.wikidata.org/entity/Q1385178',
- 'steins': 'http://www.wikidata.org/entity/Q150249',
- 'tethys': 'http://www.wikidata.org/entity/Q15047',
- 'titan': 'http://www.wikidata.org/entity/Q2565',
- 'titania': 'http://www.wikidata.org/entity/Q3322',
- 'triton': 'http://www.wikidata.org/entity/Q3359',
- 'umbriel': 'http://www.wikidata.org/entity/Q3338',
- 'venus': 'http://www.wikidata.org/entity/Q313',
- 'vesta': 'http://www.wikidata.org/entity/Q3030',
- }
-
- def entity_sources(self, code):
- return {}
diff --git a/pywikibot/family.py b/pywikibot/family.py
index 0c87877..6a1e26e 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -993,6 +993,100 @@
return f'{cls.name}.wikimedia.org'


+class WikibaseFamily(Family):
+
+ """A base class for a Wikibase Family.
+
+ .. versionadded:: 8.2
+ """
+
+ def interface(self, code) -> str:
+ """Return 'DataSite' for Wikibase family."""
+ return 'DataSite'
+
+ def entity_sources(self, code: str) -> Dict[str, Tuple[str, str]]:
+ """Provide reopsitory site information for entity types.
+
+ The result must be structured as follows:
+
+ {<entity type>: (<family code>, <family name>)}
+
+ for example:
+
+ {'property': ('test', 'wikidata')}
+
+ If an empty dict is returned, all entity types are found in the
+ current ``DataSite``.
+
+ The result is used by :meth:`DataSite.get_repo_for_entity_type
+ <pywikibot.site._datasite.DataSite.get_repo_for_entity_type>`
+ """
+ return {}
+
+
+class DefaultWikibaseFamily(WikibaseFamily):
+
+ """A base class for a Wikimedia Wikibase Family.
+
+ This class holds defauls for :meth:`calendarmodel`,
+ :meth:`default_globe` and :meth:`globes` to prevent code duplication.
+
+ .. warning:: Possibly you have to adjust the repository site in
+ :meth:`WikibaseFamily.entity_sources` to get the valid entity.
+
+ .. versionadded:: 8.2
+ """
+
+ def calendarmodel(self, code) -> str:
+ """Default calendar model for WbTime datatype."""
+ return 'http://www.wikidata.org/entity/Q1985727'
+
+ def default_globe(self, code) -> str:
+ """Default globe for Coordinate datatype."""
+ return 'earth'
+
+ def globes(self, code):
+ """Supported globes for Coordinate datatype."""
+ return {
+ 'ariel': 'http://www.wikidata.org/entity/Q3343',
+ 'bennu': 'http://www.wikidata.org/entity/Q11558',
+ 'callisto': 'http://www.wikidata.org/entity/Q3134',
+ 'ceres': 'http://www.wikidata.org/entity/Q596',
+ 'deimos': 'http://www.wikidata.org/entity/Q7548',
+ 'dione': 'http://www.wikidata.org/entity/Q15040',
+ 'earth': 'http://www.wikidata.org/entity/Q2',
+ 'enceladus': 'http://www.wikidata.org/entity/Q3303',
+ 'eros': 'http://www.wikidata.org/entity/Q16711',
+ 'europa': 'http://www.wikidata.org/entity/Q3143',
+ 'ganymede': 'http://www.wikidata.org/entity/Q3169',
+ 'gaspra': 'http://www.wikidata.org/entity/Q158244',
+ 'hyperion': 'http://www.wikidata.org/entity/Q15037',
+ 'iapetus': 'http://www.wikidata.org/entity/Q17958',
+ 'io': 'http://www.wikidata.org/entity/Q3123',
+ 'jupiter': 'http://www.wikidata.org/entity/Q319',
+ 'lutetia': 'http://www.wikidata.org/entity/Q107556',
+ 'mars': 'http://www.wikidata.org/entity/Q111',
+ 'mercury': 'http://www.wikidata.org/entity/Q308',
+ 'mimas': 'http://www.wikidata.org/entity/Q15034',
+ 'miranda': 'http://www.wikidata.org/entity/Q3352',
+ 'moon': 'http://www.wikidata.org/entity/Q405',
+ 'oberon': 'http://www.wikidata.org/entity/Q3332',
+ 'phobos': 'http://www.wikidata.org/entity/Q7547',
+ 'phoebe': 'http://www.wikidata.org/entity/Q17975',
+ 'pluto': 'http://www.wikidata.org/entity/Q339',
+ 'rhea': 'http://www.wikidata.org/entity/Q15050',
+ 'ryugu': 'http://www.wikidata.org/entity/Q1385178',
+ 'steins': 'http://www.wikidata.org/entity/Q150249',
+ 'tethys': 'http://www.wikidata.org/entity/Q15047',
+ 'titan': 'http://www.wikidata.org/entity/Q2565',
+ 'titania': 'http://www.wikidata.org/entity/Q3322',
+ 'triton': 'http://www.wikidata.org/entity/Q3359',
+ 'umbriel': 'http://www.wikidata.org/entity/Q3338',
+ 'venus': 'http://www.wikidata.org/entity/Q313',
+ 'vesta': 'http://www.wikidata.org/entity/Q3030',
+ }
+
+
def AutoFamily(name: str, url: str) -> SingleSiteFamily:
"""
Family that automatically loads the site configuration.

To view, visit change 935449. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ic7423c82f9635ef8e5e7b86fc73d49c2eae17116
Gerrit-Change-Number: 935449
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97@gmail.com>
Gerrit-Reviewer: Meno25 <meno25mail@gmail.com>
Gerrit-Reviewer: Pamputt <pamputt0@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged