jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/571764 )
Change subject: [IMPR] retrieve month names from mediawiki_messages when required ......................................................................
[IMPR] retrieve month names from mediawiki_messages when required
- test for any site code
Change-Id: Ica5bc6847de985d916f590d30f5122e0e4b27057 --- M pywikibot/date.py M tests/date_tests.py 2 files changed, 148 insertions(+), 417 deletions(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/date.py b/pywikibot/date.py index 7b9d641..541dcbc 100644 --- a/pywikibot/date.py +++ b/pywikibot/date.py @@ -9,6 +9,7 @@ import datetime import re
+from collections.abc import Mapping, MutableMapping from collections import defaultdict from contextlib import suppress from functools import singledispatch @@ -510,339 +511,155 @@ # This is useful when trying to decide if a certain article is a localized date # or not, or generating dates. # See dh() for additional information. -formats = { - 'MonthName': { - 'af': lambda v: slh(v, ['Januarie', 'Februarie', 'Maart', 'April', - 'Mei', 'Junie', 'Julie', 'Augustus', - 'September', 'Oktober', 'November', - 'Desember']), - 'an': lambda v: slh(v, ['chinero', 'frebero', 'marzo', 'abril', - 'mayo', 'chunio', 'chulio', 'agosto', - 'setiembre', 'otubre', 'nobiembre', - 'abiento']), - 'ang': lambda v: slh(v, ['Æfterra Gēola', 'Solmōnaþ', 'Hrēþmōnaþ', - 'Ēastermōnaþ', 'Þrimilcemōnaþ', 'Sēremōnaþ', - 'Mǣdmōnaþ', 'Wēodmōnaþ', 'Hāligmōnaþ', - 'Winterfylleþ', 'Blōtmōnaþ', 'Gēolmōnaþ']), - 'ar': lambda v: slh(v, ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', - 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', - 'أكتوبر', 'نوفمبر', 'ديسمبر']), - 'arz': lambda v: slh(v, ['يناير', 'فبراير', 'مارس', 'ابريل', 'مايو', - 'يونيه', 'يوليه', 'اغسطس', 'سبتمبر', - 'اكتوبر', 'نوفمبر', 'ديسمبر']), - 'ast': lambda v: slh(v, ['xineru', 'febreru', 'marzu', 'abril', - 'mayu', 'xunu', 'xunetu', 'agostu', - 'setiembre', 'ochobre', 'payares', - 'avientu']), - 'be': lambda v: slh(v, ['студзень', 'люты', 'сакавік', 'красавік', - 'травень', 'чэрвень', 'ліпень', 'жнівень', - 'верасень', 'кастрычнік', 'лістапад', - 'сьнежань']), - 'bg': lambda v: slh(v, ['януари', 'февруари', 'март', 'април', - 'май', 'юни', 'юли', 'август', 'септември', - 'октомври', 'ноември', 'декември']), - 'bn': lambda v: slh(v, ['জানুয়ারি', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', - 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', - 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর']), +class MonthNames(Mapping): + + """A Mapping with reads month names from mediawiki messages.""" + + # Predefined month names which are needed at import time + months = { 'br': lambda v: slh(v, ['Genver', "C'hwevrer", 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu']), - 'bs': lambda v: slh(v, ['januar', 'februar', 'mart', 'april', - 'maj', 'juni', 'juli', 'august', 'septembar', - 'oktobar', 'novembar', 'decembar']), - 'ca': lambda v: slh(v, ['gener', 'febrer', 'març', 'abril', 'maig', - 'juny', 'juliol', 'agost', 'setembre', - 'octubre', 'novembre', 'desembre']), - 'ceb': lambda v: slh(v, ['Enero', 'Pebrero', 'Marso', 'Abril', - 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', - 'Septiyembre', 'Oktubre', 'Nobiyembre', - 'Disyembre']), - 'co': lambda v: slh(v, ['ghjennaghju', 'frivaghju', 'marzu', - 'aprile', 'maghju', 'ghjugnu', 'lugliu', - 'aostu', 'settembre', 'uttrovi', 'nuvembri', - 'decembre']), - 'cs': lambda v: slh(v, ['leden', 'únor', 'březen', 'duben', - 'květen', 'červen', 'červenec', 'srpen', - 'září', 'říjen', 'listopad', 'prosinec']), - 'csb': lambda v: slh(v, ['stëcznik', 'gromicznik', 'strumiannik', - 'łżëkwiôt', 'môj', 'czerwińc', 'lëpinc', - 'zélnik', 'séwnik', 'rujan', 'lëstopadnik', - 'gòdnik']), - 'cv': lambda v: slh(v, ['кăрлач', 'нарăс', 'Пуш', 'Ака', 'çу', - 'çĕртме', 'утă', 'çурла', 'авăн', 'юпа', 'чӳк', - 'раштав']), - 'cy': lambda v: slh(v, ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', - 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', - 'Hydref', 'Tachwedd', 'Rhagfyr']), - 'da': lambda v: slh(v, ['januar', 'februar', 'marts', 'april', 'maj', - 'juni', 'juli', 'august', 'september', - 'oktober', 'november', 'december']), - 'de': lambda v: slh(v, ['Januar', 'Februar', 'März', 'April', - 'Mai', 'Juni', 'Juli', 'August', - 'September', 'Oktober', 'November', - 'Dezember']), - 'el': lambda v: slh(v, ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', - 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', - 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', - 'Νοέμβριος', 'Δεκέμβριος']), 'en': lambda v: slh(v, enMonthNames), - 'eo': lambda v: slh(v, ['Januaro', 'Februaro', 'Marto', 'Aprilo', - 'Majo', 'Junio', 'Julio', 'Aŭgusto', - 'Septembro', 'Oktobro', 'Novembro', - 'Decembro']), - 'es': lambda v: slh(v, ['enero', 'febrero', 'marzo', 'abril', 'mayo', - 'junio', 'julio', 'agosto', 'septiembre', - 'octubre', 'noviembre', 'diciembre']), - 'et': lambda v: slh(v, ['jaanuar', 'veebruar', 'märts', 'aprill', - 'mai', 'juuni', 'juuli', 'august', 'september', - 'oktoober', 'november', 'detsember']), - 'eu': lambda v: slh(v, ['urtarrila', 'otsaila', 'martxoa', 'apirila', - 'maiatza', 'ekaina', 'uztaila', 'abuztua', - 'iraila', 'urria', 'azaroa', 'abendua']), - 'fa': lambda v: slh(v, ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', - 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', - 'نوامبر', 'دسامبر']), - 'fi': lambda v: slh(v, ['tammikuu', 'helmikuu', 'maaliskuu', - 'huhtikuu', 'toukokuu', 'kesäkuu', - 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', - 'marraskuu', 'joulukuu']), - 'fo': lambda v: slh(v, ['januar', 'februar', 'mars', 'apríl', 'mai', - 'juni', 'juli', 'august', 'september', - 'oktober', 'november', 'desember']), - 'fr': lambda v: slh(v, ['janvier', 'février', 'mars (mois)', - 'avril', 'mai', 'juin', 'juillet', 'août', - 'septembre', 'octobre', 'novembre', - 'décembre']), - 'fur': lambda v: slh(v, ['Zenâr', 'Fevrâr', 'Març', 'Avrîl', 'Mai', - 'Jugn', 'Lui', 'Avost', 'Setembar', 'Otubar', - 'Novembar', 'Dicembar']), - 'fy': lambda v: slh(v, ['jannewaris', 'febrewaris', 'maart', 'april', - 'maaie', 'juny', 'july', 'augustus', - 'septimber', 'oktober', 'novimber', - 'desimber']), - 'ga': lambda v: slh(v, ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', - 'Bealtaine', 'Meitheamh', 'Iúil', 'Lúnasa', - 'Meán Fómhair', 'Deireadh Fómhair', 'Samhain', - 'Nollaig']), - 'gl': lambda v: slh(v, ['xaneiro', 'febreiro', 'marzo', 'abril', - 'maio', 'xuño', 'xullo', 'agosto', 'setembro', - 'outubro', 'novembro', 'decembro']), - 'gsw': lambda v: slh(v, ['Januar', 'Februar', 'März', 'April', 'Mai', - 'Juni', 'Juli', 'August', 'September', - 'Oktober', 'November', 'Dezember']), - 'he': lambda v: slh(v, ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', - 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', - 'נובמבר', 'דצמבר']), - 'hi': lambda v: slh(v, ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', - 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', - 'नवम्बर', 'दिसम्बर']), - 'hr': lambda v: slh(v, ['siječanj', 'veljača', 'ožujak', 'travanj', - 'svibanj', 'lipanj', 'srpanj', 'kolovoz', - 'rujan', 'listopad', 'studeni', 'prosinac']), - 'hu': lambda v: slh(v, ['január', 'február', 'március', 'április', - 'május', 'június', 'július', 'augusztus', - 'szeptember', 'október', 'november', - 'december']), - 'ia': lambda v: slh(v, ['januario', 'februario', 'martio', 'april', - 'maio', 'junio', 'julio', 'augusto', - 'septembre', 'octobre', 'novembre', - 'decembre']), - 'id': lambda v: slh(v, ['Januari', 'Februari', 'Maret', 'April', - 'Mei', 'Juni', 'Juli', 'Agustus', 'September', - 'Oktober', 'November', 'Desember']), - 'ie': lambda v: slh(v, ['januar', 'februar', 'marte', 'april', - 'may', 'junio', 'juli', 'august', 'septembre', - 'octobre', 'novembre', 'decembre']), - 'io': lambda v: slh(v, ['januaro', 'februaro', 'Marto', 'aprilo', - 'mayo', 'junio', 'julio', 'agosto', - 'septembro', 'oktobro', 'novembro', - 'decembro']), - 'is': lambda v: slh(v, ['janúar', 'febrúar', 'mars (mánuður)', - 'apríl', 'maí', 'júní', 'júlí', 'ágúst', - 'september', 'október', 'nóvember', - 'desember']), - 'it': lambda v: slh(v, ['gennaio', 'febbraio', 'marzo', 'aprile', - 'maggio', 'giugno', 'luglio', 'agosto', - 'settembre', 'ottobre', 'novembre', - 'dicembre']), 'ja': lambda v: slh(v, makeMonthList('%d月')), - 'jv': lambda v: slh(v, ['Januari', 'Februari', 'Maret', 'April', 'Mei', - 'Juni', 'Juli', 'Agustus', 'September', - 'Oktober', 'November', 'Desember']), - 'ka': lambda v: slh(v, ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', - 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', - 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', - 'დეკემბერი']), - 'kn': lambda v: slh(v, ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚಿ', 'ಎಪ್ರಿಲ್', - 'ಮೇ', 'ಜೂನ', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', - 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್']), 'ko': lambda v: slh(v, makeMonthList('%d월')), - 'ksh': lambda v: slh(v, ['Jannowaa', 'Febrowaa', 'Mä', 'Apprill', - 'Meij', 'Juuni', 'Juuli', 'Aujuß', - 'Sepptäber', 'Oktoober', 'Novemmber', - 'Dezemmber']), - 'ku': lambda v: slh(v, ['rêbendan', 'reşemî', 'adar', 'avrêl', 'gulan', - 'pûşper', 'tîrmeh', 'gelawêj (meh)', 'rezber', - 'kewçêr', 'sermawez', 'berfanbar']), - 'kw': lambda v: slh(v, ['Mys Genver', 'Mys Whevrer', 'Mys Merth', - 'Mys Ebrel', 'Mys Me', 'Mys Metheven', - 'Mys Gortheren', 'Mys Est', 'Mys Gwyngala', - 'Mys Hedra', 'Mys Du', 'Mys Kevardhu']), - 'la': lambda v: slh(v, ['Ianuarius', 'Februarius', 'Martius', - 'Aprilis', 'Maius', 'Iunius', 'Iulius', - 'Augustus (mensis)', 'September', 'October', - 'November', 'December']), - 'lb': lambda v: slh(v, ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', - 'Juni', 'Juli', 'August', 'September', - 'Oktober', 'November', 'Dezember']), - 'li': lambda v: slh(v, ['jannewarie', 'fibberwarie', 'miert', 'april', - 'mei', 'juni', 'juli', 'augustus (maond)', - 'september', 'oktober', 'november', - 'december']), - 'lt': lambda v: slh(v, ['Sausis', 'Vasaris', 'Kovas', 'Balandis', - 'Gegužė', 'Birželis', 'Liepa', 'Rugpjūtis', - 'Rugsėjis', 'Spalis', 'Lapkritis', 'Gruodis']), - 'lv': lambda v: slh(v, ['Janvāris', 'Februāris', 'Marts', 'Aprīlis', - 'Maijs', 'Jūnijs', 'Jūlijs', 'Augusts', - 'Septembris', 'Oktobris', 'Novembris', - 'Decembris']), - 'mhr': lambda v: slh(v, ['шорыкйол', 'пургыж', 'ӱярня', 'вӱдшор', - 'ага', 'пеледыш', 'сӱрем', 'сорла', 'идым', - 'шыжа', 'кылме', 'декабрь']), - 'mi': lambda v: slh(v, ['Kohi-tātea', 'Hui-tanguru', 'Poutū-te-rangi', - 'Paenga-whāwhā', 'Haratua', 'Pipiri', - 'Hōngongoi', 'Here-turi-kōkā', 'Mahuru', - 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', - 'Hakihea']), - 'ml': lambda v: slh(v, ['ജനുവരി', 'ഫെബ്രുവരി', 'മാര്ച്', 'ഏപ്രില്', - 'മേയ്', 'ജൂണ്', 'ജൂലൈ', 'ആഗസ്റ്റ്', - 'സപ്തന്പര്', 'ഒക്ടോബര്', 'നവന്പര്', - 'ഡിസന്പര്']), - 'mr': lambda v: slh(v, ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', - 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', - 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर']), - 'ms': lambda v: slh(v, ['Januari', 'Februari', 'Mac', 'April', 'Mei', - 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', - 'November', 'Disember']), - 'nan': lambda v: slh(v, ['It-goe̍h', 'Jī-goe̍h', 'Saⁿ-goe̍h', - 'Sì-goe̍h', 'Gō·-goe̍h', 'La̍k-goe̍h', - 'Chhit-goe̍h', 'Peh-goe̍h', 'Káu-goe̍h', - 'Cha̍p-goe̍h', 'Cha̍p-it-goe̍h', - 'Cha̍p-jī-goe̍h']), - 'nap': lambda v: slh(v, ['Jennaro', 'Frevaro', 'Màrzo', 'Abbrile', - 'Maggio', 'Giùgno', 'Luglio', 'Aùsto', - 'Settembre', 'Ottovre', 'Nuvembre', - 'Dicembre']), - 'nds': lambda v: slh(v, ['Januar', 'Februar', 'März', 'April', 'Mai', - 'Juni', 'Juli', 'August', 'September', - 'Oktober', 'November', 'Dezember']), - 'nl': lambda v: slh(v, ['januari', 'februari', 'maart', 'april', 'mei', - 'juni', 'juli', 'augustus (maand)', - 'september', 'oktober', 'november', - 'december']), - 'nn': lambda v: slh(v, ['januar', 'februar', 'månaden mars', 'april', - 'mai', 'juni', 'juli', 'august', 'september', - 'oktober', 'november', 'desember']), - 'nb': lambda v: slh(v, ['januar', 'februar', 'mars', 'april', 'mai', - 'juni', 'juli', 'august', 'september', - 'oktober', 'november', 'desember']), - 'oc': lambda v: slh(v, ['genièr', 'febrièr', 'març', 'abril', - 'mai', 'junh', 'julhet', 'agost', 'setembre', - 'octobre', 'novembre', 'decembre']), - 'os': lambda v: slh(v, ['январь', 'февраль', 'мартъи', 'апрель', 'май', - 'июнь', 'июль', 'август', 'сентябрь', - 'октябрь', 'ноябрь', 'декабрь']), - 'pdc': lambda v: slh(v, ['Yenner', 'Hanning', 'Matz', 'Abril', 'Moi', - 'Yuni', 'Yuli', 'Aagscht', 'September', - 'Oktower', 'Nowember', 'Disember']), - 'pl': lambda v: slh(v, ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', - 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', - 'październik', 'listopad', 'grudzień']), - 'pt': lambda v: slh(v, ['Janeiro', 'Fevereiro', 'Março', 'Abril', - 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', - 'Outubro', 'Novembro', 'Dezembro']), - 'ro': lambda v: slh(v, ['ianuarie', 'februarie', 'martie', 'aprilie', - 'mai', 'iunie', 'iulie', 'august', - 'septembrie', 'octombrie', 'noiembrie', - 'decembrie']), - 'ru': lambda v: slh(v, ['январь', 'февраль', 'март', 'апрель', 'май', - 'июнь', 'июль', 'август', 'сентябрь', - 'октябрь', 'ноябрь', 'декабрь']), - 'sc': lambda v: slh(v, ['Ghennarzu', 'Frearzu', 'Martzu', - 'Abrile', 'Maju', 'Làmpadas', 'Triulas', - 'Aùstu', 'Cabudanni', 'Santugaìne', - 'Santadria', 'Nadale']), - 'scn': lambda v: slh(v, ['jinnaru', 'frivaru', 'marzu', 'aprili', - 'maiu', 'giugnu', 'giugnettu', 'austu', - 'sittèmmiru', 'uttùviru', 'nuvèmmiru', - 'dicèmmiru']), - 'sco': lambda v: slh(v, ['Januar', 'Februar', 'Mairch', 'Aprile', - 'Mey', 'Juin', 'Julie', 'August', 'September', - 'October', 'November', 'December']), - 'se': lambda v: slh(v, ['ođđajagimánnu', 'guovvamánnu', 'njukčamánnu', - 'cuoŋománnu', 'miessemánnu', 'geassemánnu', - 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', - 'golggotmánnu', 'skábmamánnu', 'juovlamánnu']), - 'sk': lambda v: slh(v, ['január', 'február', 'marec', 'apríl', - 'máj', 'jún', 'júl', 'august', 'september', - 'október', 'november', 'december']), - 'sl': lambda v: slh(v, ['januar', 'februar', 'marec', 'april', 'maj', - 'junij', 'julij', 'avgust', 'september', - 'oktober', 'november', 'december']), - 'sq': lambda v: slh(v, ['Janari', 'Shkurti', 'Marsi (muaj)', 'Prilli', - 'Maji', 'Qershori', 'Korriku', 'Gushti', - 'Shtatori', 'Tetori', 'Nëntori', 'Dhjetori']), - 'sr': lambda v: slh(v, ['јануар', 'фебруар', 'март', 'април', 'мај', - 'јун', 'јул', 'август', 'септембар', 'октобар', - 'новембар', 'децембар']), - 'su': lambda v: slh(v, ['Januari', 'Pébruari', 'Maret', 'April', 'Méi', - 'Juni', 'Juli', 'Agustus', 'Séptémber', - 'Oktober', 'Nopémber', 'Désémber']), - 'sv': lambda v: slh(v, ['januari', 'februari', 'mars', 'april', 'maj', - 'juni', 'juli', 'augusti', 'september', - 'oktober', 'november', 'december']), - 'ta': lambda v: slh(v, ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', - 'ஜூன்', 'ஜூலை', 'ஆகஸ்டு', 'செப்டம்பர்', - 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்']), - 'te': lambda v: slh(v, ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', - 'మే', 'జూన్', 'జూలై', 'ఆగష్టు', 'సెప్టెంబర్', - 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్']), - 'th': lambda v: slh(v, ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', - 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', - 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม']), - 'tl': lambda v: slh(v, ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', - 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', - 'Oktubre', 'Nobyembre', 'Disyembre']), - 'tpi': lambda v: slh(v, ['Janueri', 'Februeri', 'Mas', 'Epril', 'Me', - 'Jun', 'Julai', 'Ogas', 'Septemba', 'Oktoba', - 'Novemba', 'Disemba']), - 'tr': lambda v: slh(v, ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', - 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', - 'Ekim', 'Kasım', 'Aralık']), - 'tt': lambda v: slh(v, ['Ğínwar', 'Febräl', 'Mart', 'Äpril', 'May', - 'Yün', 'Yül', 'August', 'Sentäber', 'Öktäber', - 'Nöyäber', 'Dekäber']), - 'uk': lambda v: slh(v, ['січень', 'лютий', 'березень', 'квітень', - 'травень', 'червень', 'липень', 'серпень', - 'вересень', 'жовтень', 'листопад', 'грудень']), - 'ur': lambda v: slh(v, ['جنوری', 'فروری', 'مارچ', - 'اپريل', 'مئی', 'جون', 'جولائی', 'اگست', - 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر']), - 'vec': lambda v: slh(v, ['genaro', 'febraro', 'marzso', 'apriłe', - 'majo', 'giugno', 'lujo', 'agosto', - 'setenbre', 'otobre', 'novenbre', - 'diçenbre']), - 'vi': lambda v: slh(v, ['tháng một', 'tháng hai', 'tháng ba', - 'tháng tư', 'tháng năm', 'tháng sáu', - 'tháng bảy', 'tháng tám', 'tháng chín', - 'tháng mười', 'tháng mười một', 'tháng 12']), - 'vo': lambda v: slh(v, ['Yanul', 'Febul', 'Mäzul', 'Prilul', 'Mayul', - 'Yunul', 'Yulul', 'Gustul', 'Setul', 'Tobul', - 'Novul', 'Dekul']), 'wa': lambda v: slh(v, waMonthNames), 'zh': lambda v: slh(v, makeMonthList('%d月')), - }, + }
+ def __getitem__(self, lang): + if lang not in self.months: + site = Site() + months = list(site.mediawiki_messages(enMonthNames, + lang=lang).values()) + self.months[lang] = lambda v: slh(v, months) + + return self.months[lang] + + def __iter__(self): + return iter(self.months) + + def __len__(self): + """Length of preloaded languages with all month names.""" + return len(self.months) + + +class MonthFormat(MutableMapping): + + """A Mapping which creates months formats.""" + + day_formats = { + 'af': ('%d {}', True), + 'ang': ('%d {}', True), + 'bg': ('%d {}', False), + 'bn': ('{} %%B', None), + 'ceb': ('{} %d', True), + 'csb': ('%d {}a', False), + 'cv': ('{}, %d', True), + 'cy': ('%d {}', True), + 'de': ('%d. {}', True), + 'en': ('{} %d', True), + 'eo': ('%d-a de {}', False), + 'es': ('%d de {}', False), + 'eu': ('{}aren %d', True), + 'fi': ('%d. {}ta', False), + 'fur': ('%d di {}', True), + 'fy': ('%d {}', False), + 'gl': ('%d de {}', False), + 'gsw': ('%d. {}', True), + 'he': ('%d ב{}', None), + 'hu': ('{} %d.', True), + 'ia': ('%d de {}', False), + 'id': ('%d {}', True), + 'ie': ('%d {}', False), + 'io': ('%d di {}', False), + 'it': ('%d {}', False), + 'jv': ('%d {}', True), + 'ka': ('%d {}', None), + 'lb': ('%d. {}', True), + 'mhr': ('%d {}', False), + 'ml': ('{} %d', None), + 'ms': ('%d {}', True), + 'nap': ("%d 'e {}", False), + 'nds': ('%d. {}', True), + 'pt': ('%d de {}', True), + 'ro': ('%d {}', False), + 'sco': ('%d {}', True), + 'scn': ('%d di {}', False), + 'su': ('%d {}', True), + 'sv': ('%d {}', False), + 'ta': ('{} %d', None), + 'te': ('{} %d', None), + 'th': ('%d {}', None), # %%T + 'tl': ('{} %d', None), + 'tr': ('%d {}', True), + 'tt': ('%d. {}', True), + 'vec': ('%d de {}', False), + 'vo': ('{} %d', False), + } + + year_formats = { + 'ar': ('{} %d', None), + 'cs': ('{} %d', None), + 'eo': ('{} de %d', None), + 'es': ('{} de %d', True), + 'it': ('Attualità/Anno %d - {}', True), + 'ka': ('{}, %d', None), + 'sk': ('{} %d', None), + 'th': ('{} พ.ศ. %%T', None), + 'tl': ('{} %d', None), + } + + def __init__(self, index, format_key): + """Initializer of MonthFormat mapping. + + @param index: month number + @type index: int + @param format_key: formats key like Day_January or Year_December + @type format_key: str + """ + self.index = index + self.variant, _, self.month = format_key.partition('_') + self.data = {} + + def __getitem__(self, key): + if key not in self.data: + if self.variant == 'Day': + pattern, ucase = self.day_formats.get(key, ('%d. {}', False)) + func = 'dh_dayOfMnth' + elif self.variant == 'Year': + pattern, ucase = self.year_formats.get(key, ('{} %d', True)) + func = 'dh_mnthOfYear' + else: + raise KeyError("Wrong variant '{}'".format(self.variant)) + + if ucase: + f = first_upper + elif ucase is False: + f = first_lower + else: + f = str + + month_pattern = pattern.format(f(monthName(key, self.index))) + expression = "lambda v: {}(v, '{}')".format(func, month_pattern) + self.data[key] = eval(expression) + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __delitem__(self, key): + raise NotImplementedError("Deleting of key '{}' is not implemented" + .format(key)) + + def __iter__(self): + return iter(self.data) + + def __len__(self): + return len(self.data) + + +formats = { 'Number': { 'ar': lambda v: dh_number(v, '%d (عدد)'), 'be': lambda v: dh_number(v, '%d (лік)'), @@ -1805,13 +1622,14 @@ }, }
+formats['MonthName'] = MonthNames() # # Add auto-generated empty dictionaries for DayOfMonth and MonthOfYear articles # -for dayOfMonth in dayMnthFmts: - formats[dayOfMonth] = {} -for monthOfYear in yrMnthFmts: - formats[monthOfYear] = {} +for index, day_of_month in enumerate(dayMnthFmts, 1): + formats[day_of_month] = MonthFormat(index, day_of_month) +for index, month_of_year in enumerate(yrMnthFmts, 1): + formats[month_of_year] = MonthFormat(index, month_of_year)
def addFmt1(lang: str, isMnthOfYear, patterns): @@ -1835,12 +1653,6 @@ 'lambda v: dh_dayOfMnth(v, "{}")'.format(patterns[i]))
-def addFmt2(lang, isMnthOfYear, pattern, makeUpperCase=None): - """Update yrMnthFmts and dayMnthFmts using addFmt1.""" - addFmt1(lang, isMnthOfYear, - makeMonthNamedList(lang, pattern, makeUpperCase)) - - def makeMonthList(pattern): """Return a list of 12 elements based on the number of the month.""" return [pattern % m for m in range(1, 13)] @@ -1865,12 +1677,10 @@
# Add day of the month formats to the formatting table: "en:May 15" -addFmt2('af', False, '%%d %s', True) addFmt1('an', False, ['%d de chinero', '%d de frebero', '%d de marzo', "%d d'abril", '%d de mayo', '%d de chunio', '%d de chulio', "%d d'agosto", '%d de setiembre', "%d d'otubre", '%d de nobiembre', "%d d'abiento"]) -addFmt2('ang', False, '%%d %s', True) addFmt1('ar', False, ['%d يناير', '%d فبراير', '%d مارس', '%d أبريل', '%d مايو', '%d يونيو', '%d يوليو', '%d أغسطس', '%d سبتمبر', '%d أكتوبر', '%d نوفمبر', '%d ديسمبر']) @@ -1885,68 +1695,38 @@ '%d красавіка', '%d траўня', '%d чэрвеня', '%d ліпеня', '%d жніўня', '%d верасьня', '%d кастрычніка', '%d лістапада', '%d сьнежня']) -addFmt2('bg', False, '%%d %s', False) -addFmt2('bn', False, '%s %%B') -addFmt2('bs', False, '%%d. %s', False) addFmt1('ca', False, ['%d de gener', '%d de febrer', '%d de març', "%d d'abril", '%d de maig', '%d de juny', '%d de juliol', "%d d'agost", '%d de setembre', "%d d'octubre", '%d de novembre', '%d de desembre']) -addFmt2('ceb', False, '%s %%d', True) addFmt1('co', False, ['%d di ghjennaghju', '%d di frivaghju', '%d di marzu', "%d d'aprile", '%d di maghju', '%d di ghjugnu', '%d di lugliu', "%d d'aost", '%d di settembre', "%d d'uttrovi", '%d di nuvembri', '%d di decembre']) -addFmt2('cs', False, '%%d. %s', False) -addFmt2('csb', False, '%%d %sa', False) -addFmt2('cv', False, '%s, %%d', True) -addFmt2('cy', False, '%%d %s', True) -addFmt2('da', False, '%%d. %s', False) -addFmt2('de', False, '%%d. %s', True) addFmt1('el', False, ['%d Ιανουαρίου', '%d Φεβρουαρίου', '%d Μαρτίου', '%d Απριλίου', '%d Μαΐου', '%d Ιουνίου', '%d Ιουλίου', '%d Αυγούστου', '%d Σεπτεμβρίου', '%d Οκτωβρίου', '%d Νοεμβρίου', '%d Δεκεμβρίου']) -addFmt2('en', False, '%s %%d', True) -addFmt2('eo', False, '%%d-a de %s', False) -addFmt2('es', False, '%%d de %s', False) -addFmt2('et', False, '%%d. %s', False) -addFmt2('eu', False, '%saren %%d', True) addFmt1('fa', False, ['%d ژانویه', '%d فوریه', '%d مارس', '%d آوریل', '%d مه', '%d ژوئن', '%d ژوئیه', '%d اوت', '%d سپتامبر', '%d اکتبر', '%d نوامبر', '%d دسامبر']) -addFmt2('fi', False, '%%d. %sta', False) -addFmt2('fo', False, '%%d. %s', False) addFmt1('fr', False, ['%d janvier', '%d février', '%d mars', '%d avril', '%d mai', '%d juin', '%d juillet', '%d août', '%d septembre', '%d octobre', '%d novembre', '%d décembre']) -addFmt2('fur', False, '%%d di %s', True) -addFmt2('fy', False, '%%d %s', False) addFmt1('ga', False, ['%d Eanáir', '%d Feabhra', '%d Márta', '%d Aibreán', '%d Bealtaine', '%d Meitheamh', '%d Iúil', '%d Lúnasa', '%d Meán Fómhair', '%d Deireadh Fómhair', '%d Samhain', '%d Mí na Nollag']) -addFmt2('gl', False, '%%d de %s', False) -addFmt2('gsw', False, '%%d. %s', True) -addFmt2('he', False, '%%d ב%s') addFmt1('hr', False, ['%d. siječnja', '%d. veljače', '%d. ožujka', '%d. travnja', '%d. svibnja', '%d. lipnja', '%d. srpnja', '%d. kolovoza', '%d. rujna', '%d. listopada', '%d. studenog', '%d. prosinca']) -addFmt2('hu', False, '%s %%d.', True) -addFmt2('ia', False, '%%d de %s', False) -addFmt2('id', False, '%%d %s', True) -addFmt2('ie', False, '%%d %s', False) -addFmt2('io', False, '%%d di %s', False) addFmt1('is', False, ['%d. janúar', '%d. febrúar', '%d. mars', '%d. apríl', '%d. maí', '%d. júní', '%d. júlí', '%d. ágúst', '%d. september', '%d. október', '%d. nóvember', '%d. desember']) -addFmt2('it', False, '%%d %s', False) addFmt1('ja', False, makeMonthList('%d月%%d日')) -addFmt2('jv', False, '%%d %s', True) -addFmt2('ka', False, '%%d %s') addFmt1('ko', False, makeMonthList('%d월 %%d일')) addFmt1('ku', False, ["%d'ê rêbendanê", "%d'ê reşemiyê", "%d'ê adarê", "%d'ê avrêlê", "%d'ê gulanê", "%d'ê pûşperê", @@ -1956,7 +1736,6 @@ '%d Maii', '%d Iunii', '%d Iulii', '%d Augusti', '%d Septembris', '%d Octobris', '%d Novembris', '%d Decembris']) -addFmt2('lb', False, '%%d. %s', True) addFmt1('li', False, ['%d januari', '%d februari', '%d miert', '%d april', '%d mei', '%d juni', '%d juli', '%d augustus', '%d september', '%d oktober', '%d november', @@ -1965,16 +1744,10 @@ 'Gegužės %d', 'Birželio %d', 'Liepos %d', 'Rugpjūčio %d', 'Rugsėjo %d', 'Spalio %d', 'Lapkričio %d', 'Gruodžio %d']) -addFmt2('lv', False, '%%d. %s', False) -addFmt2('mhr', False, '%%d %s', False) addFmt1('mk', False, ['%d јануари', '%d февруари', '%d март', '%d април', '%d мај', '%d јуни', '%d јули', '%d август', '%d септември', '%d октомври', '%d ноември', '%d декември']) -addFmt2('ml', False, '%s %%d') -addFmt2('ms', False, '%%d %s', True) -addFmt2('nap', False, "%%d 'e %s", False) -addFmt2('nds', False, '%%d. %s', True) addFmt1('nl', False, ['%%d %s' % v for v in ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', @@ -1983,7 +1756,6 @@ for v in ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']]) -addFmt2('nb', False, '%%d. %s', False) addFmt1('oc', False, ['%d de genièr', '%d de febrièr', '%d de març', "%d d'abril", '%d de mai', '%d de junh', '%d de julhet', "%d d'agost", '%d de setembre', "%d d'octobre", @@ -1995,32 +1767,17 @@ '%d maja', '%d czerwca', '%d lipca', '%d sierpnia', '%d września', '%d października', '%d listopada', '%d grudnia']) -addFmt2('pt', False, '%%d de %s', True) -addFmt2('ro', False, '%%d %s', False) addFmt1('ru', False, ['%d января', '%d февраля', '%d марта', '%d апреля', '%d мая', '%d июня', '%d июля', '%d августа', '%d сентября', '%d октября', '%d ноября', '%d декабря']) -addFmt2('sco', False, '%%d %s', True) -addFmt2('scn', False, '%%d di %s', False) addFmt1('se', False, ['ođđajagimánu %d.', 'guovvamánu %d.', 'njukčamánu %d.', 'cuoŋománu %d.', 'miessemánu %d.', 'geassemánu %d.', 'suoidnemánu %d.', 'borgemánu %d.', 'čakčamánu %d.', 'golggotmánu %d.', 'skábmamánu %d.', 'juovlamánu %d.']) addFmt1('sh', False, makeMonthList('%%d.%d.')) -addFmt2('sk', False, '%%d. %s', False) -addFmt2('sl', False, '%%d. %s', False) addFmt1('sq', False, ['%d Janar', '%d Shkurt', '%d Mars', '%d Prill', '%d Maj', '%d Qershor', '%d Korrik', '%d Gusht', '%d Shtator', '%d Tetor', '%d Nëntor', '%d Dhjetor']) -addFmt2('sr', False, '%%d. %s', False) -addFmt2('su', False, '%%d %s', True) -addFmt2('sv', False, '%%d %s', False) -addFmt2('ta', False, '%s %%d') -addFmt2('te', False, '%s %%d') -addFmt2('th', False, '%%d %s') # %%T -addFmt2('tl', False, '%s %%d') -addFmt2('tr', False, '%%d %s', True) -addFmt2('tt', False, '%%d. %s', True) addFmt1('uk', False, ['%d січня', '%d лютого', '%d березня', '%d квітня', '%d травня', '%d червня', '%d липня', '%d серпня', '%d вересня', '%d жовтня', '%d листопада', '%d грудня']) @@ -2028,9 +1785,7 @@ '%d اپریل', '%d مئی', '%d جون', '%d جولائی', '%d اگست', '%d ستمبر', '%d اکتوبر', '%d نومبر', '%d دسمبر']) -addFmt2('vec', False, '%%d de %s', False) addFmt1('vi', False, makeMonthList('%%d tháng %d')) -addFmt2('vo', False, '%s %%d', False) addFmt1('zh', False, makeMonthList('%d月%%d日'))
# Walloon names depend on the day number, thus we must generate various @@ -2067,28 +1822,15 @@ # # Month of the Year: "en:May 1976" # -addFmt2('af', True, '%s %%d', True) -addFmt2('ar', True, '%s %%d') -addFmt2('ang', True, '%s %%d', True) -addFmt2('cs', True, '%s %%d') -addFmt2('de', True, '%s %%d', True) addFmt1('el', True, ['Ιανουάριος %d', 'Φεβρουάριος %d', 'Μάρτιος %d', 'Απρίλιος %d', 'Μάιος %d', 'Ιούνιος %d', 'Ιούλιος %d', 'Άυγουστος %d', 'Σεπτέμβριος %d', 'Οκτώβριος %d', 'Νοέμβριος %d', 'Δεκέμβριος %d']) -addFmt2('en', True, '%s %%d', True) -addFmt2('eo', True, '%s de %%d') -addFmt2('es', True, '%s de %%d', True) -addFmt2('et', True, '%s %%d', True) -addFmt2('fi', True, '%s %%d', True) addFmt1('fr', True, ['Janvier %d', 'Février %d', 'Mars %d', 'Avril %d', 'Mai %d', 'Juin %d', 'Juillet %d', 'Août %d', 'Septembre %d', 'Octobre %d', 'Novembre %d', 'Décembre %d']) -addFmt2('he', True, '%s %%d', True) -addFmt2('it', True, 'Attualità/Anno %%d - %s', True) addFmt1('ja', True, ['「最近の出来事」%%d年%d月' % mm for mm in range(1, 13)]) -addFmt2('ka', True, '%s, %%d') addFmt1('ko', True, ['%d년 1월', '%d년 2월', '%d년 3월', '%d년 4월', '%d년 5월', '%d년 6월', '%d년 7월', '%d년 8월', '%d년 9월', '%d년 10월', '%d년 11월', '%d년 12월']) @@ -2101,16 +1843,8 @@ 'Mei %d', 'Juni %d', 'Juli %d', 'Augustus %d', 'September %d', 'Oktober %d', 'November %d', 'December %d']) -addFmt2('pl', True, '%s %%d', True) addFmt1('scn', True, [None, None, 'Marzu %d', None, None, None, None, None, None, None, None, None]) -addFmt2('sk', True, '%s %%d') -addFmt2('sv', True, '%s %%d', True) -addFmt2('th', True, '%s พ.ศ. %%T') -addFmt2('tl', True, '%s %%d') -addFmt2('tt', True, '%s, %%d', True) -addFmt2('uk', True, '%s %%d', True) -addFmt2('ur', True, '%s %%d', True) addFmt1('vi', True, makeMonthList('Tháng %d năm %%d')) addFmt1('zh', True, makeMonthList('%%d年%d月'))
diff --git a/tests/date_tests.py b/tests/date_tests.py index 2683b4d..6180e4a 100644 --- a/tests/date_tests.py +++ b/tests/date_tests.py @@ -67,13 +67,10 @@ net = True
def test_month_name_formats(self): - """Test MonthName format.""" + """Test MonthName format for codes retrieved via mediawiki message.""" formatname = 'MonthName' for code in date.formats['Cat_BirthsAD']: - try: - convert = date.formats[formatname][code] - except KeyError: # Not all month names are available yet - continue + convert = date.formats[formatname][code] predicate, start, stop = date.formatLimits[formatname] for value in range(start, stop): with self.subTest(code=code, month=value):