summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM Hickford <mirth.hickford@gmail.com>2022-01-27 21:51:03 +0000
committerPeter Hutterer <peter.hutterer@who-t.net>2022-01-27 21:51:03 +0000
commit297bb51556bf72c26acc26b411cfab8116376d6e (patch)
treee14c1e8d5f844e534c3061f3a190041921041cb9
parent175077ece6506bf3fc89f4b17b4a84bf39847a26 (diff)
downloadxkeyboard-config-297bb51556bf72c26acc26b411cfab8116376d6e.tar.gz
Test that each layout has at least one country and language associated
-rw-r--r--rules/base.extras.xml290
-rw-r--r--rules/base.xml67
-rw-r--r--tests/test_rules_xml.py91
3 files changed, 421 insertions, 27 deletions
diff --git a/rules/base.extras.xml b/rules/base.extras.xml
index 96a6d50..b202e20 100644
--- a/rules/base.extras.xml
+++ b/rules/base.extras.xml
@@ -62,6 +62,9 @@
<name>ca</name>
<shortDescription>fr</shortDescription>
<description>French (Canada)</description>
+ <countryList>
+ <iso3166Id>CA</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>fra</iso639Id>
</languageList>
@@ -94,6 +97,9 @@
<name>de</name>
<shortDescription>de</shortDescription>
<description>German</description>
+ <countryList>
+ <iso3166Id>DE</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>deu</iso639Id>
</languageList>
@@ -199,7 +205,11 @@
<layout>
<configItem popularity="exotic">
<name>eg</name>
+ <shortDescription>cop</shortDescription>
<description>Coptic</description>
+ <countryList>
+ <iso3166Id>EG</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>cop</iso639Id>
<iso639Id>egy</iso639Id>
@@ -207,9 +217,16 @@
</configItem>
</layout>
<layout>
- <configItem>
+ <configItem popularity="exotic">
<name>hu</name>
+ <shortDescription>hu</shortDescription>
<description>Hungarian</description>
+ <countryList>
+ <iso3166Id>HU</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>hun</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -226,7 +243,6 @@
<description>Old Hungarian (for ligatures)</description>
</configItem>
</variant>
-
</variantList>
</layout>
<layout>
@@ -234,6 +250,9 @@
<name>ir</name>
<shortDescription>fa</shortDescription>
<description>Persian</description>
+ <countryList>
+ <iso3166Id>IR</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>fas</iso639Id>
</languageList>
@@ -255,6 +274,9 @@
<name>lt</name>
<shortDescription>lt</shortDescription>
<description>Lithuanian</description>
+ <countryList>
+ <iso3166Id>LT</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>lit</iso639Id>
</languageList>
@@ -279,6 +301,9 @@
<name>lv</name>
<shortDescription>lv</shortDescription>
<description>Latvian</description>
+ <countryList>
+ <iso3166Id>LV</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>lav</iso639Id>
</languageList>
@@ -351,6 +376,9 @@
<name>us</name>
<shortDescription>en</shortDescription>
<description>English (US)</description>
+ <countryList>
+ <iso3166Id>US</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>eng</iso639Id>
</languageList>
@@ -532,6 +560,9 @@
<name>pl</name>
<shortDescription>pl</shortDescription>
<description>Polish</description>
+ <countryList>
+ <iso3166Id>PL</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>pol</iso639Id>
</languageList>
@@ -580,6 +611,9 @@
<name>ro</name>
<shortDescription>ro</shortDescription>
<description>Romanian</description>
+ <countryList>
+ <iso3166Id>RO</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>ron</iso639Id>
</languageList>
@@ -614,6 +648,9 @@
<name>rs</name>
<shortDescription>sr</shortDescription>
<description>Serbian</description>
+ <countryList>
+ <iso3166Id>RS</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>srp</iso639Id>
</languageList>
@@ -632,6 +669,12 @@
<name>ru</name>
<shortDescription>ru</shortDescription>
<description>Russian</description>
+ <countryList>
+ <iso3166Id>RU</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>rus</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -686,7 +729,7 @@
</configItem>
</variant>
<variant>
- <configItem>
+ <configItem popularity="exotic">
<name>gost-14289-88</name>
<description>Russian (GOST 14289-88)</description>
</configItem>
@@ -771,6 +814,9 @@
<name>am</name>
<shortDescription>hy</shortDescription>
<description>Armenian</description>
+ <countryList>
+ <iso3166Id>AL</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>hye</iso639Id>
</languageList>
@@ -789,6 +835,9 @@
<name>il</name>
<shortDescription>he</shortDescription>
<description>Hebrew</description>
+ <countryList>
+ <iso3166Id>IL</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>heb</iso639Id>
</languageList>
@@ -810,6 +859,30 @@
<name>ara</name>
<shortDescription>ar</shortDescription>
<description>Arabic</description>
+ <countryList>
+ <iso3166Id>AE</iso3166Id>
+ <iso3166Id>BH</iso3166Id>
+ <iso3166Id>DZ</iso3166Id>
+ <iso3166Id>EG</iso3166Id>
+ <iso3166Id>EH</iso3166Id>
+ <iso3166Id>JO</iso3166Id>
+ <iso3166Id>KW</iso3166Id>
+ <iso3166Id>LB</iso3166Id>
+ <iso3166Id>LY</iso3166Id>
+ <iso3166Id>MA</iso3166Id>
+ <iso3166Id>MR</iso3166Id>
+ <iso3166Id>OM</iso3166Id>
+ <iso3166Id>PS</iso3166Id>
+ <iso3166Id>QA</iso3166Id>
+ <iso3166Id>SA</iso3166Id>
+ <iso3166Id>SD</iso3166Id>
+ <iso3166Id>SY</iso3166Id>
+ <iso3166Id>TN</iso3166Id>
+ <iso3166Id>YE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ara</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -849,6 +922,14 @@
<name>be</name>
<shortDescription>be</shortDescription>
<description>Belgian</description>
+ <countryList>
+ <iso3166Id>BE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>deu</iso639Id>
+ <iso639Id>nld</iso639Id>
+ <iso639Id>fra</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -864,6 +945,12 @@
<name>br</name>
<shortDescription>pt</shortDescription>
<description>Portuguese (Brazil)</description>
+ <countryList>
+ <iso3166Id>BR</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>por</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -879,6 +966,12 @@
<name>cz</name>
<shortDescription>cs</shortDescription>
<description>Czech</description>
+ <countryList>
+ <iso3166Id>CZ</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ces</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -918,6 +1011,12 @@
<name>dk</name>
<shortDescription>da</shortDescription>
<description>Danish</description>
+ <countryList>
+ <iso3166Id>DK</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>dan</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -933,6 +1032,12 @@
<name>nl</name>
<shortDescription>nl</shortDescription>
<description>Dutch</description>
+ <countryList>
+ <iso3166Id>NL</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>nld</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -948,6 +1053,12 @@
<name>ee</name>
<shortDescription>et</shortDescription>
<description>Estonian</description>
+ <countryList>
+ <iso3166Id>EE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>est</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -963,6 +1074,12 @@
<name>fi</name>
<shortDescription>fi</shortDescription>
<description>Finnish</description>
+ <countryList>
+ <iso3166Id>FI</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>fin</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -990,6 +1107,12 @@
<name>fr</name>
<shortDescription>fr</shortDescription>
<description>French</description>
+ <countryList>
+ <iso3166Id>FR</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>fra</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1017,6 +1140,12 @@
<name>gr</name>
<shortDescription>gr</shortDescription>
<description>Greek</description>
+ <countryList>
+ <iso3166Id>GR</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ell</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1038,6 +1167,12 @@
<name>it</name>
<shortDescription>it</shortDescription>
<description>Italian</description>
+ <countryList>
+ <iso3166Id>IT</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ita</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1073,6 +1208,12 @@
<name>jp</name>
<shortDescription>ja</shortDescription>
<description>Japanese</description>
+ <countryList>
+ <iso3166Id>JP</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>jpn</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1100,6 +1241,14 @@
<name>no</name>
<shortDescription>no</shortDescription>
<description>Norwegian</description>
+ <countryList>
+ <iso3166Id>NO</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>nor</iso639Id>
+ <iso639Id>nob</iso639Id>
+ <iso639Id>nno</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1115,6 +1264,12 @@
<name>pk</name>
<shortDescription>ur</shortDescription>
<description>Urdu (Pakistan)</description>
+ <countryList>
+ <iso3166Id>PK</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>urd</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1133,6 +1288,12 @@
<name>pt</name>
<shortDescription>pt</shortDescription>
<description>Portuguese</description>
+ <countryList>
+ <iso3166Id>PT</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>por</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1154,6 +1315,12 @@
<name>sk</name>
<shortDescription>sk</shortDescription>
<description>Slovak</description>
+ <countryList>
+ <iso3166Id>SK</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>slk</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1175,6 +1342,12 @@
<name>es</name>
<shortDescription>es</shortDescription>
<description>Spanish</description>
+ <countryList>
+ <iso3166Id>ES</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>spa</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1190,6 +1363,12 @@
<name>se</name>
<shortDescription>sv</shortDescription>
<description>Swedish</description>
+ <countryList>
+ <iso3166Id>SE</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>swe</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1220,6 +1399,13 @@
<name>ch</name>
<shortDescription>de</shortDescription>
<description>German (Switzerland)</description>
+ <countryList>
+ <iso3166Id>CH</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>deu</iso639Id>
+ <iso639Id>gsw</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1241,6 +1427,12 @@
<name>tr</name>
<shortDescription>tr</shortDescription>
<description>Turkish</description>
+ <countryList>
+ <iso3166Id>TR</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>tur</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1268,6 +1460,12 @@
<name>ua</name>
<shortDescription>uk</shortDescription>
<description>Ukrainian</description>
+ <countryList>
+ <iso3166Id>UA</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>ukr</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1283,6 +1481,12 @@
<name>gb</name>
<shortDescription>en</shortDescription>
<description>English (UK)</description>
+ <countryList>
+ <iso3166Id>GB</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>eng</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1298,6 +1502,12 @@
<name>kr</name>
<shortDescription>ko</shortDescription>
<description>Korean</description>
+ <countryList>
+ <iso3166Id>KR</iso3166Id>
+ </countryList>
+ <languageList>
+ <iso639Id>kor</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1314,6 +1524,9 @@
<!-- Keyboard indicator for Vietnamese layouts -->
<shortDescription>vi</shortDescription>
<description>Vietnamese</description>
+ <countryList>
+ <iso3166Id>VN</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>vie</iso639Id>
</languageList>
@@ -1339,6 +1552,9 @@
<!-- Keyboard indicator for European layouts -->
<shortDescription>eu</shortDescription>
<description>EurKEY (US)</description>
+ <countryList>
+ <iso3166Id>US</iso3166Id>
+ </countryList>
<languageList>
<iso639Id>cat</iso639Id>
<iso639Id>dan</iso639Id>
@@ -1364,6 +1580,7 @@
<configItem popularity="exotic">
<name>trans</name>
<!-- Keyboard layouts for transcription and transliteration systems -->
+ <shortDescription>ipa</shortDescription>
<description>International Phonetic Alphabet</description>
</configItem>
<variantList>
@@ -1376,15 +1593,74 @@
</variantList>
</layout>
<layout>
- <configItem>
+ <configItem popularity="exotic">
<name>in</name>
<!-- Keyboard indicator for Indian layouts -->
<shortDescription>in</shortDescription>
<description>Indian</description>
+ <countryList>
+ <iso3166Id>IN</iso3166Id>
+ </countryList>
+ <!-- from https://github.com/unicode-org/cldr/blob/main/common/supplemental/supplementalData.xml scripts="Deva" -->
+ <languageList>
+ <iso639Id>hin</iso639Id>
+ <iso639Id>anp</iso639Id>
+ <iso639Id>awa</iso639Id>
+ <iso639Id>bap</iso639Id>
+ <iso639Id>bfy</iso639Id>
+ <iso639Id>bgc</iso639Id>
+ <iso639Id>bhb</iso639Id>
+ <iso639Id>bhi</iso639Id>
+ <iso639Id>bho</iso639Id>
+ <iso639Id>bjj</iso639Id>
+ <iso639Id>bra</iso639Id>
+ <iso639Id>brx</iso639Id>
+ <iso639Id>btv</iso639Id>
+ <iso639Id>doi</iso639Id>
+ <iso639Id>dty</iso639Id>
+ <iso639Id>gbm</iso639Id>
+ <iso639Id>gom</iso639Id>
+ <iso639Id>gvr</iso639Id>
+ <iso639Id>hne</iso639Id>
+ <iso639Id>hoc</iso639Id>
+ <iso639Id>hoj</iso639Id>
+ <iso639Id>jml</iso639Id>
+ <iso639Id>kfr</iso639Id>
+ <iso639Id>kfy</iso639Id>
+ <iso639Id>khn</iso639Id>
+ <iso639Id>kok</iso639Id>
+ <iso639Id>kru</iso639Id>
+ <iso639Id>mag</iso639Id>
+ <iso639Id>mai</iso639Id>
+ <iso639Id>mar</iso639Id>
+ <iso639Id>mgp</iso639Id>
+ <iso639Id>mrd</iso639Id>
+ <iso639Id>mtr</iso639Id>
+ <iso639Id>mwr</iso639Id>
+ <iso639Id>nep</iso639Id>
+ <iso639Id>new</iso639Id>
+ <iso639Id>noe</iso639Id>
+ <iso639Id>raj</iso639Id>
+ <iso639Id>rjs</iso639Id>
+ <iso639Id>sck</iso639Id>
+ <iso639Id>srx</iso639Id>
+ <iso639Id>swv</iso639Id>
+ <iso639Id>taj</iso639Id>
+ <iso639Id>tdg</iso639Id>
+ <iso639Id>tdh</iso639Id>
+ <iso639Id>thl</iso639Id>
+ <iso639Id>thq</iso639Id>
+ <iso639Id>thr</iso639Id>
+ <iso639Id>tkt</iso639Id>
+ <iso639Id>wbr</iso639Id>
+ <iso639Id>wtm</iso639Id>
+ <iso639Id>xnr</iso639Id>
+ <iso639Id>xsr</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
- <configItem>
+ <configItem popularity="exotic">
<name>modi-kagapa</name>
<shortDescription>mr</shortDescription>
<description>Modi (KaGaPa phonetic)</description>
@@ -1394,7 +1670,7 @@
</configItem>
</variant>
<variant>
- <configItem>
+ <configItem popularity="exotic">
<name>san-misc</name>
<shortDescription>sas</shortDescription>
<description>Sanskrit symbols</description>
@@ -1404,7 +1680,7 @@
</configItem>
</variant>
<variant>
- <configItem>
+ <configItem popularity="exotic">
<name>urd-navees</name>
<shortDescription>ur</shortDescription>
<description>Urdu (Navees)</description>
diff --git a/rules/base.xml b/rules/base.xml
index b75fe58..8bc0447 100644
--- a/rules/base.xml
+++ b/rules/base.xml
@@ -1536,6 +1536,9 @@
<countryList>
<iso3166Id>AF</iso3166Id>
</countryList>
+ <languageList>
+ <iso639Id>drs</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -1933,6 +1936,62 @@
<countryList>
<iso3166Id>IN</iso3166Id>
</countryList>
+ <!-- from https://github.com/unicode-org/cldr/blob/main/common/supplemental/supplementalData.xml scripts="Deva" -->
+ <languageList>
+ <iso639Id>hin</iso639Id>
+ <iso639Id>anp</iso639Id>
+ <iso639Id>awa</iso639Id>
+ <iso639Id>bap</iso639Id>
+ <iso639Id>bfy</iso639Id>
+ <iso639Id>bgc</iso639Id>
+ <iso639Id>bhb</iso639Id>
+ <iso639Id>bhi</iso639Id>
+ <iso639Id>bho</iso639Id>
+ <iso639Id>bjj</iso639Id>
+ <iso639Id>bra</iso639Id>
+ <iso639Id>brx</iso639Id>
+ <iso639Id>btv</iso639Id>
+ <iso639Id>doi</iso639Id>
+ <iso639Id>dty</iso639Id>
+ <iso639Id>gbm</iso639Id>
+ <iso639Id>gom</iso639Id>
+ <iso639Id>gvr</iso639Id>
+ <iso639Id>hne</iso639Id>
+ <iso639Id>hoc</iso639Id>
+ <iso639Id>hoj</iso639Id>
+ <iso639Id>jml</iso639Id>
+ <iso639Id>kfr</iso639Id>
+ <iso639Id>kfy</iso639Id>
+ <iso639Id>khn</iso639Id>
+ <iso639Id>kok</iso639Id>
+ <iso639Id>kru</iso639Id>
+ <iso639Id>mag</iso639Id>
+ <iso639Id>mai</iso639Id>
+ <iso639Id>mar</iso639Id>
+ <iso639Id>mgp</iso639Id>
+ <iso639Id>mrd</iso639Id>
+ <iso639Id>mtr</iso639Id>
+ <iso639Id>mwr</iso639Id>
+ <iso639Id>nep</iso639Id>
+ <iso639Id>new</iso639Id>
+ <iso639Id>noe</iso639Id>
+ <iso639Id>raj</iso639Id>
+ <iso639Id>rjs</iso639Id>
+ <iso639Id>sck</iso639Id>
+ <iso639Id>srx</iso639Id>
+ <iso639Id>swv</iso639Id>
+ <iso639Id>taj</iso639Id>
+ <iso639Id>tdg</iso639Id>
+ <iso639Id>tdh</iso639Id>
+ <iso639Id>thl</iso639Id>
+ <iso639Id>thq</iso639Id>
+ <iso639Id>thr</iso639Id>
+ <iso639Id>tkt</iso639Id>
+ <iso639Id>wbr</iso639Id>
+ <iso639Id>wtm</iso639Id>
+ <iso639Id>xnr</iso639Id>
+ <iso639Id>xsr</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -2497,6 +2556,10 @@
<countryList>
<iso3166Id>DZ</iso3166Id>
</countryList>
+ <languageList>
+ <iso639Id>tzm</iso639Id>
+ <iso639Id>fra</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -2560,6 +2623,9 @@
<countryList>
<iso3166Id>MA</iso3166Id>
</countryList>
+ <languageList>
+ <iso639Id>ary</iso639Id>
+ </languageList>
</configItem>
<variantList>
<variant>
@@ -3690,6 +3756,7 @@
<layout>
<configItem>
<name>gn</name>
+ <shortDescription>nqo</shortDescription>
<description>N'Ko (AZERTY)</description>
<countryList>
<iso3166Id>GN</iso3166Id>
diff --git a/tests/test_rules_xml.py b/tests/test_rules_xml.py
index 85ad717..3d36ecf 100644
--- a/tests/test_rules_xml.py
+++ b/tests/test_rules_xml.py
@@ -36,6 +36,14 @@ def iterate_layouts_variants(rules_xml):
for variant in layout.iter('variant'):
yield layout, variant
+def iterate_config_items(rules_xml):
+ '''
+ Return an iterator of configItem elements
+ '''
+ tree = ET.parse(rules_xml)
+ root = tree.getroot()
+ return root.iter('configItem')
+
def pytest_generate_tests(metafunc):
# for any test_foo function with an argument named rules_xml,
@@ -54,6 +62,17 @@ def pytest_generate_tests(metafunc):
for l, v in iterate_layouts_variants(f):
layouts.append(Layout(f, l, v))
metafunc.parametrize('layout', layouts)
+ elif 'config_item' in metafunc.fixturenames:
+ rules_xml = list(_xkb_config_root().glob('rules/*.xml'))
+ assert rules_xml
+ config_items = []
+ for f in rules_xml:
+ for item in iterate_config_items(f):
+ item = ConfigItem.from_elem(item)
+ item.rulesfile = f
+ config_items.append(item)
+ metafunc.parametrize('config_item', config_items)
+
@@ -72,23 +91,29 @@ class Layout:
else:
self.name = f"{self.layout.name}"
- def _fetch(self, name):
- parent = self.variant or self.layout
- elements = parent.findall(name)
- if elements is None:
- return None
- elif len(elements) > 1:
- return elements
- else:
- return elements[0]
-
@property
def iso3166(self):
- return (self.variant or self.layout).iso3166
+ if self.variant and self.variant.iso3166 is not None:
+ return self.variant.iso3166 or []
+ # inherit from parent
+ return self.layout.iso3166 or []
@property
def iso639(self):
- return (self.variant or self.layout).iso639
+ if self.variant and self.variant.iso639 is not None:
+ return self.variant.iso639 or []
+ # inherit from parent
+ return self.layout.iso639 or []
+
+ @property
+ def popularity(self):
+ return self.variant.popularity if self.variant else self.layout.popularity
+
+ @property
+ def shortDescription(self):
+ if self.variant and self.variant.shortDescription:
+ return self.variant.shortDescription
+ return self.layout.shortDescription
def prettyxml(element):
@@ -100,8 +125,9 @@ class ConfigItem:
self.name = name
self.shortDescription = shortDescription
self.description = description
- self.iso639 = []
- self.iso3166 = []
+ self.iso639 = None
+ self.iso3166 = None
+ self.popularity = None
@classmethod
def _fetch_subelement(cls, parent, name):
@@ -126,17 +152,14 @@ class ConfigItem:
@classmethod
def from_elem(cls, elem):
try:
- ci_element = cls._fetch_subelement(elem, 'configItem')
+ ci_element = elem if elem.tag == "configItem" else cls._fetch_subelement(elem, 'configItem')
name = cls._fetch_text(ci_element, 'name')
assert name is not None
# shortDescription and description are optional
sdesc = cls._fetch_text(ci_element, 'shortDescription')
desc = cls._fetch_text(ci_element, 'description')
ci = ConfigItem(name, sdesc, desc)
-
- langlist = cls._fetch_subelement(ci_element, 'languageList')
- if langlist:
- ci.iso639 = cls._fetch_subelement_text(langlist, 'iso639Id')
+ ci.popularity = ci_element.attrib.get('popularity')
langlist = cls._fetch_subelement(ci_element, 'languageList')
if langlist:
@@ -144,7 +167,7 @@ class ConfigItem:
countrylist = cls._fetch_subelement(ci_element, 'countryList')
if countrylist:
- ci.iso3166 = cls._fetch_subelement_text(countrylist, 'iso3166')
+ ci.iso3166 = cls._fetch_subelement_text(countrylist, 'iso3166Id')
return ci
except AssertionError as e:
@@ -180,15 +203,39 @@ def test_duplicate_models(rules_xml):
models[ci.name] = True
+def test_exotic(config_item):
+ """All items in extras should be marked exotic"""
+ if config_item.rulesfile.stem.endswith('extras'):
+ assert config_item.popularity == "exotic", f"{config_item.rulesfile}: item {config_item.name} does not have popularity exotic"
+ else:
+ assert config_item.popularity != "exotic", f"{config_item.rulesfile}: item {config_item.name} has popularity exotic"
+
+
+def test_short_description(layout):
+ assert layout.shortDescription, f'{layout.rulesfile}: layout {layout.name} missing shortDescription'
+
+
def test_iso3166(layout):
+ """Typically layouts should specify at least one country code"""
pycountry = pytest.importorskip('pycountry')
country_codes = [c.alpha_2 for c in pycountry.countries]
+ expected_without_country = [
+ "apl", # programming
+ "brai", # Braille not specific to any country
+ "custom",
+ "epo", # Esperanto not native to any country
+ "trans", # international
+ ]
+
for code in layout.iso3166:
assert code in country_codes, \
f'{layout.rulesfile}: unknown country code "{code}" in {layout.name}'
+ assert layout.iso3166 or layout.layout.name in expected_without_country, f"{layout.rulesfile}: layout {layout.name} has no countries associated"
+
def test_iso639(layout):
+ """Typically layouts should should specify at least one language code"""
pycountry = pytest.importorskip('pycountry')
# A list of languages not in pycountry, so we need to special-case them
@@ -200,6 +247,10 @@ def test_iso639(layout):
'ovd', # Elfdalian, https://iso639-3.sil.org/code/ovd
]
language_codes = [c.alpha_3 for c in pycountry.languages] + special_langs
+ expected_without_language = ["brai", "custom", "trans"]
+
for code in layout.iso639:
assert code in language_codes, \
f'{layout.rulesfile}: unknown language code "{code}" in {layout.name}'
+
+ assert layout.iso639 or layout.layout.name in expected_without_language, f"{layout.rulesfile}: layout {layout.name} has no languages associated"