jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/935449 )
Change subject: [IMPR] Add WikibaseFamily and DefaultWikibaseFamily class to family.py ......................................................................
[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(-)
Approvals: Matěj Suchánek: Looks good to me, but someone else must approve Xqt: Looks good to me, approved jenkins-bot: Verified
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.