You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			160 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			160 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
import datetime
 | 
						|
import os
 | 
						|
import shutil
 | 
						|
import tempfile
 | 
						|
import unittest
 | 
						|
 | 
						|
import tornado.locale
 | 
						|
from tornado.escape import utf8, to_unicode
 | 
						|
from tornado.util import unicode_type
 | 
						|
 | 
						|
 | 
						|
class TranslationLoaderTest(unittest.TestCase):
 | 
						|
    # TODO: less hacky way to get isolated tests
 | 
						|
    SAVE_VARS = ["_translations", "_supported_locales", "_use_gettext"]
 | 
						|
 | 
						|
    def clear_locale_cache(self):
 | 
						|
        tornado.locale.Locale._cache = {}
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        self.saved = {}  # type: dict
 | 
						|
        for var in TranslationLoaderTest.SAVE_VARS:
 | 
						|
            self.saved[var] = getattr(tornado.locale, var)
 | 
						|
        self.clear_locale_cache()
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        for k, v in self.saved.items():
 | 
						|
            setattr(tornado.locale, k, v)
 | 
						|
        self.clear_locale_cache()
 | 
						|
 | 
						|
    def test_csv(self):
 | 
						|
        tornado.locale.load_translations(
 | 
						|
            os.path.join(os.path.dirname(__file__), "csv_translations")
 | 
						|
        )
 | 
						|
        locale = tornado.locale.get("fr_FR")
 | 
						|
        self.assertTrue(isinstance(locale, tornado.locale.CSVLocale))
 | 
						|
        self.assertEqual(locale.translate("school"), "\u00e9cole")
 | 
						|
 | 
						|
    def test_csv_bom(self):
 | 
						|
        with open(
 | 
						|
            os.path.join(os.path.dirname(__file__), "csv_translations", "fr_FR.csv"),
 | 
						|
            "rb",
 | 
						|
        ) as f:
 | 
						|
            char_data = to_unicode(f.read())
 | 
						|
        # Re-encode our input data (which is utf-8 without BOM) in
 | 
						|
        # encodings that use the BOM and ensure that we can still load
 | 
						|
        # it. Note that utf-16-le and utf-16-be do not write a BOM,
 | 
						|
        # so we only test whichver variant is native to our platform.
 | 
						|
        for encoding in ["utf-8-sig", "utf-16"]:
 | 
						|
            tmpdir = tempfile.mkdtemp()
 | 
						|
            try:
 | 
						|
                with open(os.path.join(tmpdir, "fr_FR.csv"), "wb") as f:
 | 
						|
                    f.write(char_data.encode(encoding))
 | 
						|
                tornado.locale.load_translations(tmpdir)
 | 
						|
                locale = tornado.locale.get("fr_FR")
 | 
						|
                self.assertIsInstance(locale, tornado.locale.CSVLocale)
 | 
						|
                self.assertEqual(locale.translate("school"), "\u00e9cole")
 | 
						|
            finally:
 | 
						|
                shutil.rmtree(tmpdir)
 | 
						|
 | 
						|
    def test_gettext(self):
 | 
						|
        tornado.locale.load_gettext_translations(
 | 
						|
            os.path.join(os.path.dirname(__file__), "gettext_translations"),
 | 
						|
            "tornado_test",
 | 
						|
        )
 | 
						|
        locale = tornado.locale.get("fr_FR")
 | 
						|
        self.assertTrue(isinstance(locale, tornado.locale.GettextLocale))
 | 
						|
        self.assertEqual(locale.translate("school"), "\u00e9cole")
 | 
						|
        self.assertEqual(locale.pgettext("law", "right"), "le droit")
 | 
						|
        self.assertEqual(locale.pgettext("good", "right"), "le bien")
 | 
						|
        self.assertEqual(locale.pgettext("organization", "club", "clubs", 1), "le club")
 | 
						|
        self.assertEqual(
 | 
						|
            locale.pgettext("organization", "club", "clubs", 2), "les clubs"
 | 
						|
        )
 | 
						|
        self.assertEqual(locale.pgettext("stick", "club", "clubs", 1), "le b\xe2ton")
 | 
						|
        self.assertEqual(locale.pgettext("stick", "club", "clubs", 2), "les b\xe2tons")
 | 
						|
 | 
						|
 | 
						|
class LocaleDataTest(unittest.TestCase):
 | 
						|
    def test_non_ascii_name(self):
 | 
						|
        name = tornado.locale.LOCALE_NAMES["es_LA"]["name"]
 | 
						|
        self.assertTrue(isinstance(name, unicode_type))
 | 
						|
        self.assertEqual(name, "Espa\u00f1ol")
 | 
						|
        self.assertEqual(utf8(name), b"Espa\xc3\xb1ol")
 | 
						|
 | 
						|
 | 
						|
class EnglishTest(unittest.TestCase):
 | 
						|
    def test_format_date(self):
 | 
						|
        locale = tornado.locale.get("en_US")
 | 
						|
        date = datetime.datetime(2013, 4, 28, 18, 35)
 | 
						|
        self.assertEqual(
 | 
						|
            locale.format_date(date, full_format=True), "April 28, 2013 at 6:35 pm"
 | 
						|
        )
 | 
						|
 | 
						|
        aware_dt = datetime.datetime.now(datetime.timezone.utc)
 | 
						|
        naive_dt = aware_dt.replace(tzinfo=None)
 | 
						|
        for name, now in {"aware": aware_dt, "naive": naive_dt}.items():
 | 
						|
            with self.subTest(dt=name):
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(
 | 
						|
                        now - datetime.timedelta(seconds=2), full_format=False
 | 
						|
                    ),
 | 
						|
                    "2 seconds ago",
 | 
						|
                )
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(
 | 
						|
                        now - datetime.timedelta(minutes=2), full_format=False
 | 
						|
                    ),
 | 
						|
                    "2 minutes ago",
 | 
						|
                )
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(
 | 
						|
                        now - datetime.timedelta(hours=2), full_format=False
 | 
						|
                    ),
 | 
						|
                    "2 hours ago",
 | 
						|
                )
 | 
						|
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(
 | 
						|
                        now - datetime.timedelta(days=1),
 | 
						|
                        full_format=False,
 | 
						|
                        shorter=True,
 | 
						|
                    ),
 | 
						|
                    "yesterday",
 | 
						|
                )
 | 
						|
 | 
						|
                date = now - datetime.timedelta(days=2)
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(date, full_format=False, shorter=True),
 | 
						|
                    locale._weekdays[date.weekday()],
 | 
						|
                )
 | 
						|
 | 
						|
                date = now - datetime.timedelta(days=300)
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(date, full_format=False, shorter=True),
 | 
						|
                    "%s %d" % (locale._months[date.month - 1], date.day),
 | 
						|
                )
 | 
						|
 | 
						|
                date = now - datetime.timedelta(days=500)
 | 
						|
                self.assertEqual(
 | 
						|
                    locale.format_date(date, full_format=False, shorter=True),
 | 
						|
                    "%s %d, %d" % (locale._months[date.month - 1], date.day, date.year),
 | 
						|
                )
 | 
						|
 | 
						|
    def test_friendly_number(self):
 | 
						|
        locale = tornado.locale.get("en_US")
 | 
						|
        self.assertEqual(locale.friendly_number(1000000), "1,000,000")
 | 
						|
 | 
						|
    def test_list(self):
 | 
						|
        locale = tornado.locale.get("en_US")
 | 
						|
        self.assertEqual(locale.list([]), "")
 | 
						|
        self.assertEqual(locale.list(["A"]), "A")
 | 
						|
        self.assertEqual(locale.list(["A", "B"]), "A and B")
 | 
						|
        self.assertEqual(locale.list(["A", "B", "C"]), "A, B and C")
 | 
						|
 | 
						|
    def test_format_day(self):
 | 
						|
        locale = tornado.locale.get("en_US")
 | 
						|
        date = datetime.datetime(2013, 4, 28, 18, 35)
 | 
						|
        self.assertEqual(locale.format_day(date=date, dow=True), "Sunday, April 28")
 | 
						|
        self.assertEqual(locale.format_day(date=date, dow=False), "April 28")
 |