def test_preferred(self): # Extlang subtag = Subtag('vsv', 'extlang') preferred = subtag.preferred self.assertIsNotNone(preferred) self.assertEqual(preferred.type, 'language') self.assertEqual(preferred.format, 'vsv') # Language # Moldovan -> Romanian subtag = Subtag('mo', 'language') preferred = subtag.preferred self.assertIsNotNone(preferred) self.assertEqual(preferred.type, 'language') self.assertEqual(preferred.format, 'ro') # Region # Burma -> Myanmar subtag = Subtag('BU', 'region') preferred = subtag.preferred self.assertIsNotNone(preferred) self.assertEqual(preferred.type, 'region') self.assertEqual(preferred.format, 'MM') # Variant subtag = Subtag('heploc', 'variant') preferred = subtag.preferred self.assertIsNotNone(preferred) self.assertEqual(preferred.type, 'variant') self.assertEqual(preferred.format, 'alalc97') # Should return None if no preferred value. # Latin America and the Caribbean subtag = Subtag('419', 'region') self.assertIsNone(subtag.preferred)
def test_script(self): subtag = Subtag('en', 'language') script = subtag.script self.assertIsNotNone(script) self.assertEqual(script.type, 'script') self.assertEqual(script.format, 'Latn') # Should return null if no script. # A macrolanguage like 'zh' should have no suppress-script. subtag = Subtag('zh', 'language') script = subtag.script self.assertIsNone(script)
def test_errors(self): self.assertRaises(Exception, Subtag, '123', 'region') with self.assertRaises(Exception) as context: Subtag('123', 'region') self.assertIn('Non-existent subtag 123.', context.exception.message) self.assertIn('Non-existent subtag 123.', context.exception.__str__()) self.assertRaises(Exception, Subtag, 'art-lojban', 'grandfathered') with self.assertRaises(Exception) as context: Subtag('art-lojban', 'grandfathered') self.assertIn('art-lojban is a grandfathered tag', context.exception.message) self.assertRaises(Exception, Subtag, 'nl', 'variant') with self.assertRaises(Exception) as context: Subtag('nl', 'variant') self.assertIn('Non-existent subtag nl of type variant.', context.exception.message)
def type(subtag, type): """ Get a :class:`language_tags.Subtag.Subtag` by subtag and type. Can be None if not exists. :param str subtag: subtag. :param str type: type of the subtag. :return: :class:`language_tags.Subtag.Subtag` if exists, otherwise None. """ subtag = subtag.lower() if subtag in index: types = index[subtag] if type in types: return Subtag(subtag, type) return None
def subtags(subtags): """ Get a list of existing :class:`language_tags.Subtag.Subtag` objects given the input subtag(s). :param subtags: string subtag or list of string subtags. :return: a list of existing :class:`language_tags.Subtag.Subtag` objects. The return list can be empty. """ result = [] if not isinstance(subtags, list): subtags = [subtags] for subtag in subtags: for type in tags.types(subtag): result.append(Subtag(subtag, type)) return result
def test_format(self): # Language self.assertEqual(Subtag('en', 'language').format, 'en') self.assertEqual(Subtag('EN', 'language').format, 'en') # Region self.assertEqual(Subtag('GB', 'region').format, 'GB') self.assertEqual(Subtag('gb', 'region').format, 'GB') # Script self.assertEqual(Subtag('Latn', 'script').format, 'Latn') self.assertEqual(Subtag('latn', 'script').format, 'Latn')
def search(description, all=False): """ Gets a list of :class:`language_tags.Subtag.Subtag` objects where the description matches. :param description: a string or compiled regular expression. For example: ``search(re.compile('\d{4}'))`` if the description of the returned subtag must contain four contiguous numerical digits. :type description: str or RegExp :param all: If set on True grandfathered and redundant tags will be included in the return list. :type all: bool, optional :return: list of :class:`language_tags.Subtag.Subtag` objects each including the description. The return list can be empty. """ # If the input query is all lowercase, make a case-insensitive match. if isinstance(description, str): list_to_string = lambda l: ', '.join(l).lower( ) if description.lower() == description else ', '.join(l) def test(record): return description in list_to_string(record['Description']) elif hasattr(description.search, '__call__'): def test(record): return description.search(', '.join( record['Description'])) is not None records = filter( lambda r: False if ('Subtag' not in r and not all) else test(r), registry) if six.PY3: records = list(records) # Sort by matched description string length. This is a quick way to push precise matches towards the top. results = sorted(records, key=lambda r: min([abs(len(r_description) - len(description)) for r_description in r['Description']])) \ if isinstance(description, str) else records return [ Subtag(r['Subtag'], r['Type']) if 'Subtag' in r else Tag(['Tag']) for r in results ]
def languages(macrolanguage): """ Get a list of :class:`language_tags.Subtag.Subtag` objects given the string macrolanguage. :param string macrolanguage: subtag macrolanguage. :return: a list of the macrolanguage :class:`language_tags.Subtag.Subtag` objects. :raise Exception: if the macrolanguage does not exists. """ results = [] macrolanguage = macrolanguage.lower() macrolanguage_data = data.get('macrolanguage') if macrolanguage not in macrolanguage_data: raise Exception('\'' + macrolanguage + '\' is not a macrolanguage.') for registry_item in registry: record = registry_item if 'Macrolanguage' in record: if record['Macrolanguage'] == macrolanguage: results.append(Subtag(record['Subtag'], record['Type'])) return results
def subtags(self): """ Get the :class:`language_tags.Subtag.Subtag` objects of the tag. :return: list of :class:`language_tags.Subtag.Subtag` objects that are part of the tag. The return list can be empty. """ data = self.data subtags = [] # if tag is grandfathered return no subtags if 'record' in data and self.data['record']['Type'] == 'grandfathered': return subtags codes = data['tag'].split('-') # Try and find the language tag. for i, code in enumerate(codes): # Singletons and anything after are unhandled. if len(code) == 1: #Stop the loop (stop processing after a singleton). break # Check for non-existent tag. if code not in index: continue types = index[code] # Language subtags may only appear at the beginning of the tag, otherwise the subtag type is indeterminate. if 'language' in types and i == 0: subtags.append(Subtag(code, 'language')) continue if len(code) == 2: # Should be a region if 'region' in types: subtags.append(Subtag(code, 'region')) # Error case: language subtag in the wrong place. elif 'language' in types: subtags.append(Subtag(code, 'language')) elif len(code) == 3: # Could be a numeric region code e.g. '001' for 'World'. if 'region' in types: subtags.append(Subtag(code, 'region')) elif 'extlang' in types: subtags.append(Subtag(code, 'extlang')) # Error case: language subtag in the wrong place. elif 'language' in types: subtags.append(Subtag(code, 'language')) elif len(code) == 4: # Could be a numeric variant if 'variant' in types: subtags.append(Subtag(code, 'variant')) elif 'script' in types: subtags.append(Subtag(code, 'script')) else: # Should be a variant if 'variant' in types: subtags.append(Subtag(code, 'variant')) return subtags
def test_comments(self): self.assertEqual( Subtag('YU', 'region').comments, ['see BA, HR, ME, MK, RS, or SI'])
def test_added(self): self.assertEqual(Subtag('DD', 'region').added, '2005-10-16') self.assertEqual(Subtag('DG', 'region').added, '2009-07-29')
def test_deprecated(self): self.assertEqual(Subtag('DD', 'region').deprecated, '1990-10-30') self.assertIsNone(Subtag('DE', 'region').deprecated)
def test_scope(self): self.assertEqual(Subtag('zh', 'language').scope, 'macrolanguage') self.assertEqual(Subtag('nah', 'language').scope, 'collection') self.assertIsNone(Subtag('en', 'language').scope) self.assertIsNone(Subtag('IQ', 'region').scope)
def test_type(self): self.assertEqual(Subtag('zh', 'language').type, 'language') self.assertEqual(Subtag('IQ', 'region').type, 'region')
def test_description(self): self.assertEqual(Subtag('IQ', 'region').description, ['Iraq']) self.assertEqual( Subtag('vsv', 'extlang').description, ['Valencian Sign Language', 'Llengua de signes valenciana'])
def test_repr(self): print(repr(Subtag('aae', 'language'))) self.assertIn('aae', repr(Subtag('aae', 'language'))) self.assertIn('Arbëreshë Albanian', repr(Subtag('aae', 'language')))