diff options
author | M Hickford <mirth.hickford@gmail.com> | 2022-01-27 21:51:03 +0000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2022-01-27 21:51:03 +0000 |
commit | 297bb51556bf72c26acc26b411cfab8116376d6e (patch) | |
tree | e14c1e8d5f844e534c3061f3a190041921041cb9 | |
parent | 175077ece6506bf3fc89f4b17b4a84bf39847a26 (diff) | |
download | xkeyboard-config-297bb51556bf72c26acc26b411cfab8116376d6e.tar.gz |
Test that each layout has at least one country and language associated
-rw-r--r-- | rules/base.extras.xml | 290 | ||||
-rw-r--r-- | rules/base.xml | 67 | ||||
-rw-r--r-- | tests/test_rules_xml.py | 91 |
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" |