Source code for scripts.maintenance.wikimedia_sites
#!/usr/bin/env python3
"""Script that updates the language lists in Wikimedia family files.
Usage:
python pwb.py wikimedia_sites [ {<family>} ]
"""
#
# (C) Pywikibot team, 2008-2022
#
# Distributed under the terms of the MIT license.
#
import re
from pathlib import Path
import pywikibot
from pywikibot.data import wikistats
from pywikibot.family import Family
# supported families by this script
families_list = [
'wikibooks',
'wikinews',
'wikipedia',
'wikiquote',
'wikisource',
'wikiversity',
'wikivoyage',
'wiktionary',
]
exceptions = {
'wikiversity': ['beta']
}
[docs]def update_family(families):
"""Update family files."""
ws = wikistats.WikiStats()
for family in families or families_list:
pywikibot.info(f'\nChecking family {family}:')
original = Family.load(family).languages_by_size
for code in exceptions.get(family, []):
if code in original:
original.remove(code)
obsolete = Family.load(family).obsolete
new = []
table = ws.languages_by_size(family)
for code in table:
if not (code in obsolete or code in exceptions.get(family, [])):
new.append(code)
# put the missing languages to the right place
missing = original != new and set(original) - set(new)
if missing:
pywikibot.warning("['{}'] not listed at wikistats."
.format("', '".join(missing)))
index = {}
for code in missing:
index[original.index(code)] = code
i = len(index) - 1
for key in sorted(index.keys(), reverse=True):
new.insert(key - i, index[key])
i -= 1
if original == new:
pywikibot.info('The lists match!')
continue
pywikibot.info("The lists don't match, the new list is:")
text = ' languages_by_size = [\n'
line = ' ' * 7
for code in new:
if len(line) + len(code) >= 76:
text += line + '\n'
line = ' ' * 7
line += f" '{code}',"
text += line + '\n'
text += ' ]'
pywikibot.info(text)
filepath = Path(f'pywikibot/families/{family}_family.py')
family_text = filepath.read_text(encoding='utf8')
family_text = re.sub(r'(?ms)^ {4}languages_by_size.+?\]',
text, family_text, 1)
filepath.write_text(family_text, encoding='utf8')
if __name__ == '__main__':
fam = set()
for arg in pywikibot.handle_args():
if arg in families_list:
fam.add(arg)
update_family(fam)