Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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')
Esempio n. 7
0
    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
        ]
Esempio n. 8
0
    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
Esempio n. 9
0
    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
Esempio n. 10
0
 def test_comments(self):
     self.assertEqual(
         Subtag('YU', 'region').comments, ['see BA, HR, ME, MK, RS, or SI'])
Esempio n. 11
0
 def test_added(self):
     self.assertEqual(Subtag('DD', 'region').added, '2005-10-16')
     self.assertEqual(Subtag('DG', 'region').added, '2009-07-29')
Esempio n. 12
0
 def test_deprecated(self):
     self.assertEqual(Subtag('DD', 'region').deprecated, '1990-10-30')
     self.assertIsNone(Subtag('DE', 'region').deprecated)
Esempio n. 13
0
 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)
Esempio n. 14
0
 def test_type(self):
     self.assertEqual(Subtag('zh', 'language').type, 'language')
     self.assertEqual(Subtag('IQ', 'region').type, 'region')
Esempio n. 15
0
 def test_description(self):
     self.assertEqual(Subtag('IQ', 'region').description, ['Iraq'])
     self.assertEqual(
         Subtag('vsv', 'extlang').description,
         ['Valencian Sign Language', 'Llengua de signes valenciana'])
Esempio n. 16
0
 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')))