jenkins-bot has submitted this change and it was merged.
Change subject: Split Family.obsolete into types of codes ......................................................................
Split Family.obsolete into types of codes
All family class line lengths < 80.
Bug: T72444 Change-Id: Ia71f80294a3f99aaa0bf49872e009d716023459f --- M pywikibot/families/anarchopedia_family.py M pywikibot/families/wikibooks_family.py M pywikibot/families/wikinews_family.py M pywikibot/families/wikipedia_family.py M pywikibot/families/wikiquote_family.py M pywikibot/families/wikisource_family.py M pywikibot/families/wikiversity_family.py M pywikibot/families/wikivoyage_family.py M pywikibot/families/wiktionary_family.py M pywikibot/family.py M pywikibot/tools/__init__.py M tests/family_tests.py 12 files changed, 468 insertions(+), 228 deletions(-)
Approvals: XZise: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/families/anarchopedia_family.py b/pywikibot/families/anarchopedia_family.py index e6d31fd..1cbacb9 100644 --- a/pywikibot/families/anarchopedia_family.py +++ b/pywikibot/families/anarchopedia_family.py @@ -13,6 +13,51 @@
"""Family class for Anarchopedia wiki."""
+ interwiki_replacements = { + # ISO 639-2 -> ISO 639-1 mappings + 'ara': 'ar', + 'chi': 'zh', + 'dan': 'da', + 'deu': 'de', + 'dut': 'nl', + 'ell': 'el', + 'eng': 'en', + 'epo': 'eo', + 'fas': 'fa', + 'fin': 'fi', + 'fra': 'fr', + 'ger': 'de', + 'gre': 'el', + 'heb': 'he', + 'hye': 'hy', + 'ind': 'id', + 'ita': 'it', + 'jpn': 'ja', + 'kor': 'ko', + 'lav': 'lv', + 'lit': 'lt', + 'nno': 'no', + 'nob': 'no', + 'nor': 'no', + 'pol': 'pl', + 'por': 'pt', + 'rum': 'ro', + 'rus': 'ru', + 'spa': 'es', + 'srp': 'sr', + 'sqi': 'sq', + 'swe': 'sv', + 'tur': 'tr', + 'zho': 'zh', + + # ISO 639-1 -> ISO 639-1 mappings + 'bs': 'hr', + + # Non-compliant mappings + 'bos': 'hr', + 'nsh': 'hr', + } + def __init__(self): """Constructor.""" family.Family.__init__(self) @@ -28,51 +73,6 @@ self.langs[l] = '%s.anarchopedia.org' % l
self.nocapitalize = list(self.langs.keys()) - - self.obsolete = { - # ISO 639-2 -> ISO 639-1 mappings - 'ara': 'ar', - 'chi': 'zh', - 'dan': 'da', - 'deu': 'de', - 'dut': 'nl', - 'ell': 'el', - 'eng': 'en', - 'epo': 'eo', - 'fas': 'fa', - 'fin': 'fi', - 'fra': 'fr', - 'ger': 'de', - 'gre': 'el', - 'heb': 'he', - 'hye': 'hy', - 'ind': 'id', - 'ita': 'it', - 'jpn': 'ja', - 'kor': 'ko', - 'lav': 'lv', - 'lit': 'lt', - 'nno': 'no', - 'nob': 'no', - 'nor': 'no', - 'pol': 'pl', - 'por': 'pt', - 'rum': 'ro', - 'rus': 'ru', - 'spa': 'es', - 'srp': 'sr', - 'sqi': 'sq', - 'swe': 'sv', - 'tur': 'tr', - 'zho': 'zh', - - # ISO 639-1 -> ISO 639-1 mappings - 'bs': 'hr', - - # Non-compliant mappings - 'bos': 'hr', - 'nsh': 'hr', - }
@deprecated('APISite.version()') def version(self, code): diff --git a/pywikibot/families/wikibooks_family.py b/pywikibot/families/wikibooks_family.py index 3183106..b4ed20d 100644 --- a/pywikibot/families/wikibooks_family.py +++ b/pywikibot/families/wikibooks_family.py @@ -12,6 +12,97 @@
"""Family class for Wikibooks."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... + 'aa', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ak... + 'ak', + # https://als.wikipedia.org/wiki/Wikipedia:Stammtisch/Archiv_2008-1#Afterwards... + 'als', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... + 'as', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... + 'ast', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ay... + 'ay', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... + 'ba', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... + 'bi', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... + 'bm', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ti... + 'bo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... + 'ch', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Co... + 'co', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ga... + 'ga', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Go... + 'got', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Gu... + 'gn', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Gu... + 'gu', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'kn', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'ks', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_L%... + 'lb', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Li... + 'ln', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_La... + 'lv', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... + 'mi', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mo... + 'mn', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bu... + 'my', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... + 'na', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... + 'nah', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pl... + 'nds', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pa... + 'ps', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Qu... + 'qu', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ru... + 'rm', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sa... + 'se', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si...) + 'simple', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba...) + 'su', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sw... + 'sw', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Tu... + 'tk', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Uy... + 'ug', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Vo... + 'vo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Wa... + 'wa', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Xh... + 'xh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yo... + 'yo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zh... + 'za', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zu... + 'zu', + ] + + removed_wikis = [ + 'tokipona', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -31,7 +122,8 @@ self.langs = dict([(lang, '%s.wikibooks.org' % lang) for lang in self.languages_by_size])
- # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = [ 'af', 'ang', 'ca', 'fa', 'fy', 'it', 'nl', 'ru', 'th', 'zh', ] @@ -50,58 +142,6 @@ 'hu': ['en'], 'pl': self.alphabetic, 'simple': self.alphabetic - } - - self.obsolete = { - 'aa': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... - 'ak': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ak... - 'als': None, # https://als.wikipedia.org/wiki/Special:PermaLink/603754#Closing_wt.2C_wb.2C_... - 'as': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... - 'ast': None, - 'ay': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ay... - 'ba': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... - 'bi': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... - 'bm': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... - 'bo': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ti... - 'ch': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... - 'co': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=28644 - 'dk': 'da', - 'ga': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ga... - 'got': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Go... - 'gn': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Gu... - 'gu': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Gu... - 'jp': 'ja', - 'kn': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=20325 - 'ks': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... - 'lb': None, # noqa https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_L%... - 'ln': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Li... - 'lv': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_La... - 'mi': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... - 'minnan': 'zh-min-nan', - 'mn': None, - 'my': None, - 'na': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... - 'nah': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... - 'nb': 'no', - 'nds': None, # noqa https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pl... - 'ps': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pa... - 'qu': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Qu... - 'rm': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ru... - 'se': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sa... - 'simple': None, # noqa https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si...) - 'su': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba...) - 'sw': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=25170 - 'tk': None, - 'tokipona': None, - 'ug': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Uy... - 'vo': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=37413 - 'wa': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Wa... - 'xh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Xh... - 'yo': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yo... - 'za': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=20325 - 'zh-tw': 'zh', - 'zh-cn': 'zh', - 'zu': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=25425 }
def shared_data_repository(self, code, transcluded=False): diff --git a/pywikibot/families/wikinews_family.py b/pywikibot/families/wikinews_family.py index 65aeb3b..b4e53e3 100644 --- a/pywikibot/families/wikinews_family.py +++ b/pywikibot/families/wikinews_family.py @@ -12,6 +12,17 @@
"""Family class for Wikinews."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Hu... + 'hu', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Du... + 'nl', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si... + 'sd', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Th... + 'th', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -26,7 +37,8 @@ self.langs = dict([(lang, '%s.wikinews.org' % lang) for lang in self.languages_by_size])
- # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = ['ca', 'cs', 'en', 'fa', 'ko', ]
# Which languages have a special order for putting interlanguage links, @@ -42,17 +54,6 @@ 'he': ['en'], 'hu': ['en'], 'pl': self.alphabetic, - } - - self.obsolete = { - 'hu': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=28342 - 'jp': 'ja', - 'nb': 'no', - 'nl': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=20325 - 'sd': None, - 'th': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=28341 - 'zh-tw': 'zh', - 'zh-cn': 'zh' }
def shared_data_repository(self, code, transcluded=False): diff --git a/pywikibot/families/wikipedia_family.py b/pywikibot/families/wikipedia_family.py index c37f4a6..17689a4 100644 --- a/pywikibot/families/wikipedia_family.py +++ b/pywikibot/families/wikipedia_family.py @@ -12,6 +12,40 @@
"""Family module for Wikipedia."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... + 'aa', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... + 'cho', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Hi... + 'ho', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_He... + 'hz', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yi... + 'ii', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Kw... + 'kj', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'kr', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... + 'mh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mo... + 'mo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mu... + 'mus', + ] + + removed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Nd... + 'ng', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si... + 'ru-sib', + # Klingon, locked in 2005, and moved to http://klingon.wikia.com/ + 'tlh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_To... + 'tokipona', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -48,10 +82,11 @@ 'dz', 'ik', 'tum', 'ch', ]
- langs = self.languages_by_size + ['test', 'test2'] # Sites we want to edit but not count as real languages + # Sites we want to edit but not count as real languages + self.test_codes = ['test', 'test2']
- self.langs = dict([(lang, '%s.wikipedia.org' % lang) - for lang in langs]) + self.langs = dict((lang, '%s.wikipedia.org' % lang) for lang in + self.languages_by_size + self.test_codes)
self.category_redirect_templates = { '_default': (), @@ -320,31 +355,6 @@ 'ur': ['ar', 'fa', 'en'] + self.alphabetic, 'vi': self.alphabetic_revised, 'yi': ['en', 'he', 'de'] - } - - self.obsolete = { - 'aa': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... - 'cho': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... - 'dk': 'da', - 'ho': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Hi... - 'hz': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_He... - 'ii': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yi... - 'kj': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Kw... - 'kr': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... - 'mh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... - 'minnan': 'zh-min-nan', - 'mo': 'ro', # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mo... - 'mus': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mu... - 'nan': 'zh-min-nan', - 'nl_nds': 'nl-nds', # miss-spelling - 'nb': 'no', - 'ng': None, # (not reachable) https://meta.wikimedia.org/wiki/Inactive_wikis - 'jp': 'ja', - 'ru-sib': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si... - 'tlh': None, - 'tokipona': None, - 'zh-tw': 'zh', - 'zh-cn': 'zh' }
# Languages that used to be coded in iso-8859-1 diff --git a/pywikibot/families/wikiquote_family.py b/pywikibot/families/wikiquote_family.py index e7a5d76..4b01a91 100644 --- a/pywikibot/families/wikiquote_family.py +++ b/pywikibot/families/wikiquote_family.py @@ -12,6 +12,55 @@
"""Family class for Wikiquote."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Al... + 'als', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ol... + 'ang', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... + 'ast', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... + 'bm', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Co... + 'co', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ne... + 'cr', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ga... + 'ga', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'kk', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'kr', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... + 'ks', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ke... + 'kw', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Lu... + 'lb', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... + 'na', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Lo... + 'nds', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Qu... + 'qu', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si...) + 'simple', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Tu... + 'tk', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ta... + 'tt', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Oy... + 'ug', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Vo... + 'vo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zh... + 'za', + ] + + removed_wikis = [ + 'tokipona', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -30,7 +79,8 @@ self.langs = dict([(lang, '%s.wikiquote.org' % lang) for lang in self.languages_by_size])
- # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = [ 'af', 'am', 'ar', 'az', 'be', 'bg', 'br', 'bs', 'ca', 'cs', 'da', 'el', 'eo', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'he', 'hi', @@ -55,37 +105,6 @@ 'pl': self.alphabetic, 'simple': self.alphabetic, 'pt': self.alphabetic, - } - - self.obsolete = { - 'als': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Al... - 'ang': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=29150 - 'ast': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=28964 - 'bm': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... - 'co': None, - 'cr': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ne... - 'dk': 'da', - 'ga': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ga... - 'jp': 'ja', - 'kk': None, # https://bugzilla.wikimedia.org/show_bug.cgi?id=20325 - 'kr': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... - 'ks': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ka... - 'kw': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ke... - 'lb': None, - 'minnan': 'zh-min-nan', - 'na': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Na... - 'nb': 'no', - 'nds': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Lo... - 'qu': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Qu... - 'simple': None, # noqa https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Si...) - 'tk': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Tu... - 'tokipona': None, - 'tt': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ta... - 'ug': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Oy... - 'vo': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Vo... - 'za': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zh... - 'zh-tw': 'zh', - 'zh-cn': 'zh' }
def code2encodings(self, code): diff --git a/pywikibot/families/wikisource_family.py b/pywikibot/families/wikisource_family.py index 3b8a9fa..6368fc1 100644 --- a/pywikibot/families/wikisource_family.py +++ b/pywikibot/families/wikisource_family.py @@ -12,6 +12,13 @@
"""Family class for Wikisource."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ol... + 'ang', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ha... + 'ht', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -32,7 +39,8 @@ # '-' is not a valid subdomain. self.langs['-'] = 'wikisource.org'
- # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = [ 'ca', 'el', 'fa', 'it', 'ko', 'no', 'pl', 'vi', 'zh', ] @@ -51,17 +59,6 @@ 'hu': ['en'], 'pl': self.alphabetic, 'simple': self.alphabetic - } - - self.obsolete = { - 'ang': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ol... - 'dk': 'da', - 'ht': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ha... - 'jp': 'ja', - 'minnan': 'zh-min-nan', - 'nb': 'no', - 'zh-tw': 'zh', - 'zh-cn': 'zh' }
self.authornamespaces = { diff --git a/pywikibot/families/wikiversity_family.py b/pywikibot/families/wikiversity_family.py index 3002613..6fd5f2e 100644 --- a/pywikibot/families/wikiversity_family.py +++ b/pywikibot/families/wikiversity_family.py @@ -25,5 +25,6 @@ self.langs = dict([(lang, '%s.wikiversity.org' % lang) for lang in self.languages_by_size])
- # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = ['ja', ] diff --git a/pywikibot/families/wikivoyage_family.py b/pywikibot/families/wikivoyage_family.py index 323247c..fbe638e 100644 --- a/pywikibot/families/wikivoyage_family.py +++ b/pywikibot/families/wikivoyage_family.py @@ -24,7 +24,8 @@
self.langs = dict([(lang, '%s.wikivoyage.org' % lang) for lang in self.languages_by_size]) - # Global bot allowed languages on https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... + # Global bot allowed languages on + # https://meta.wikimedia.org/wiki/Bot_policy/Implementation#Current_implementa... self.cross_allowed = ['es', 'ru', ]
def shared_data_repository(self, code, transcluded=False): diff --git a/pywikibot/families/wiktionary_family.py b/pywikibot/families/wiktionary_family.py index 4e84155..61e4c15 100644 --- a/pywikibot/families/wiktionary_family.py +++ b/pywikibot/families/wiktionary_family.py @@ -12,6 +12,69 @@
"""Family class for Wiktionary."""
+ closed_wikis = [ + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... + 'aa', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ab... + 'ab', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ak... + 'ak', + # https://als.wikipedia.org/wiki/Wikipedia:Stammtisch/Archiv_2008-1#Afterwards... + 'als', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... + 'as', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Av... + 'av', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... + 'ba', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... + 'bh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... + 'bi', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... + 'bm', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ti... + 'bo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... + 'ch', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ne... + 'cr', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Dz... + 'dz', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_In... + 'ik', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... + 'mh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mo... + 'mo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pa... + 'pi', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Rh... + 'rm', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ki... + 'rn', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sa... + 'sc', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sh... + 'sn', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_To... + 'to', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Kl... + 'tlh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Tw... + 'tw', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Xh... + 'xh', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yo... + 'yo', + # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zh... + 'za', + ] + + removed_wikis = [ + 'tokipona', + ] + def __init__(self): """Constructor.""" super(Family, self).__init__() @@ -92,44 +155,6 @@ 'pl': self.alphabetic_revised, 'sv': self.alphabetic_sv, 'simple': self.alphabetic, - } - - self.obsolete = { - 'aa': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Af... - 'ab': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ab... - 'ak': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ak... - 'als': None, # https://als.wikipedia.org/wiki/Special:PermaLink/603754#Closing_wt.2C_wb.2C_... - 'as': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_As... - 'av': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Av... - 'ba': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... - 'bh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... - 'bi': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Bi... - 'bm': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ba... - 'bo': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ti... - 'ch': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ch... - 'cr': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ne... - 'dk': 'da', - 'dz': None, - 'ik': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_In... - 'jp': 'ja', - 'mh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ma... - 'mo': 'ro', # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Mo... - 'minnan': 'zh-min-nan', - 'nb': 'no', - 'pi': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Pa... - 'rm': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Rh... - 'rn': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Ki... - 'sc': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sa... - 'sn': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Sh... - 'to': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_To... - 'tlh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Kl... - 'tw': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Tw... - 'tokipona': None, - 'xh': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Xh... - 'yo': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Yo... - 'za': None, # https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_Zh... - 'zh-tw': 'zh', - 'zh-cn': 'zh' }
self.interwiki_on_one_line = ['pl'] diff --git a/pywikibot/family.py b/pywikibot/family.py index e7f97e4..b978cc6 100644 --- a/pywikibot/family.py +++ b/pywikibot/family.py @@ -28,7 +28,10 @@ import pywikibot
from pywikibot import config2 as config -from pywikibot.tools import deprecated, deprecate_arg, issue_deprecation_warning +from pywikibot.tools import ( + deprecated, deprecate_arg, issue_deprecation_warning, + FrozenDict, +) from pywikibot.exceptions import UnknownFamily, FamilyMaintenanceWarning
logger = logging.getLogger("pywiki.wiki.family") @@ -761,9 +764,14 @@
# Which language codes no longer exist and by which language code # should they be replaced. If for example the language with code xx: - # now should get code yy:, add {'xx':'yy'} to obsolete. If all - # links to language xx: should be removed, add {'xx': None}. - self.obsolete = {} + # now should get code yy:, add {'xx':'yy'} to obsolete. + if not hasattr(self, 'interwiki_replacements'): + self.interwiki_replacements = {} + + # Codes that should be removed, usually because the site has been + # taken down. + if not hasattr(self, 'interwiki_removals'): + self.interwiki_removals = []
# Language codes of the largest wikis. They should be roughly sorted # by size. @@ -1372,10 +1380,75 @@ """ return putText
+ @property + def obsolete(self): + """ + Old codes that are not part of the family. + + Interwiki replacements override removals for the same code. + + @return: mapping of old codes to new codes (or None) + @rtype: dict + """ + data = dict((code, None) + for code in self.interwiki_removals) + data.update(self.interwiki_replacements) + return FrozenDict(data, + 'Family.obsolete not updatable; ' + 'use Family.interwiki_removals ' + 'and Family.interwiki_replacements') + + @obsolete.setter + def obsolete(self, data): + """Split obsolete dict into constituent parts.""" + self.interwiki_removals[:] = [old for (old, new) in data.items() + if new is None] + self.interwiki_replacements.clear() + self.interwiki_replacements.update((old, new) + for (old, new) in data.items() + if new is not None) +
class WikimediaFamily(Family):
- """#Class for all wikimedia families.""" + """Class for all wikimedia families.""" + + # Code mappings which are only an alias, and there is no 'old' wiki. + # For all except 'nl_nds', subdomains do exist as a redirect, but that + # should not be relied upon. + code_aliases = { + # Country aliases; see T87002 + 'dk': 'da', # Wikipedia, Wikibooks and Wiktionary only. + 'jp': 'ja', + + # Language aliases + 'nb': 'no', # T86924 + + # Incomplete language code change. T86915 + 'minnan': 'zh-min-nan', + 'nan': 'zh-min-nan', + + # These two probably only apply to Wikipedia. + # Server not found for the other projects. + 'zh-tw': 'zh', + 'zh-cn': 'zh', + + # miss-spelling + 'nl_nds': 'nl-nds', + } + + # Not open for edits; stewards can still edit. + closed_wikis = [] + # Completely removed + removed_wikis = [] + + # Mappings which should be in effect, even for + # closed/removed wikis + interwiki_replacement_overrides = { + # Moldovan projects are closed, however + # Romanian was to be the replacement. + 'mo': 'ro', + }
def __init__(self): super(WikimediaFamily, self).__init__() @@ -1389,6 +1462,16 @@ 'wikisource', 'wikiversity', 'wiktionary', ]
+ @property + def interwiki_removals(self): + return frozenset(self.removed_wikis + self.closed_wikis) + + @property + def interwiki_replacements(self): + rv = self.code_aliases.copy() + rv.update(self.interwiki_replacement_overrides) + return FrozenDict(rv) + def shared_image_repository(self, code): return ('commons', 'commons')
diff --git a/pywikibot/tools/__init__.py b/pywikibot/tools/__init__.py index 53513ac..a7177ec 100644 --- a/pywikibot/tools/__init__.py +++ b/pywikibot/tools/__init__.py @@ -170,6 +170,37 @@ return repr(self.__dict__)
+class FrozenDict(dict): + + """ + Frozen dict, preventing write after initialisation. + + Raises TypeError if write attempted. + """ + + def __init__(self, data=None, error=None): + """ + Constructor. + + @param data: mapping to freeze + @type data: mapping + @param error: error message + @type error: basestring + """ + if data: + args = [data] + else: + args = [] + super(FrozenDict, self).__init__(*args) + self._error = error or 'FrozenDict: not writable' + + def update(self, *args, **kwargs): + """Prevent updates.""" + raise TypeError(self._error) + + __setitem__ = update + + def concat_options(message, line_length, options): """Concatenate options.""" indent = len(message) + 2 diff --git a/tests/family_tests.py b/tests/family_tests.py index 19c447d..6fe8823 100644 --- a/tests/family_tests.py +++ b/tests/family_tests.py @@ -80,7 +80,7 @@ other = 'unknown' self.assertRaises(UnknownFamily, family.__eq__, other)
- def test_obsolete(self): + def test_get_obsolete_wp(self): """Test three types of obsolete codes.""" family = Family.load('wikipedia') self.assertIsInstance(family.obsolete, dict) @@ -91,6 +91,38 @@ # offline site (see site tests test_removed_site) self.assertEqual(family.obsolete['ru-sib'], None)
+ def test_get_obsolete_test(self): + """Test WikimediaFamily default obsolete.""" + family = Family.load('test') + self.assertIn('dk', family.obsolete) + self.assertIn('dk', family.interwiki_replacements) + self.assertEqual(family.obsolete, family.interwiki_replacements) + self.assertEqual(family.interwiki_removals, set()) + + def test_set_obsolete(self): + """Test obsolete can be set.""" + family = Family() + self.assertEqual(family.obsolete, {}) + self.assertEqual(family.interwiki_replacements, {}) + self.assertEqual(family.interwiki_removals, []) + + family.obsolete = {'a': 'b', 'c': None} + self.assertEqual(family.obsolete, {'a': 'b', 'c': None}) + self.assertEqual(family.interwiki_replacements, {'a': 'b'}) + self.assertEqual(family.interwiki_removals, ['c']) + + def test_obsolete_readonly(self): + """Test obsolete result not updatable.""" + family = Family.load('test') + self.assertRaises(TypeError, family.obsolete.update, {}) + self.assertRaises(TypeError, family.obsolete.__setitem__, 'a', 'b') + + def test_WikimediaFamily_obsolete_readonly(self): + """Test WikimediaFamily obsolete is readonly.""" + family = Family.load('test') + self.assertRaises(TypeError, family.__setattr__, 'obsolete', + {'a': 'b', 'c': None}) +
class TestFamilyUrlRegex(TestCase):