From 87a92a2e9e544db551f2814730e6903283b39ae9 Mon Sep 17 00:00:00 2001 From: alex bodnaru Date: Mon, 22 Feb 2016 21:43:28 +0200 Subject: [PATCH] properly added new files to git and added test --- pint/babel_units.py | 139 +++++++++++++++++++++++++++++++++++ pint/compat/__init__.py | 9 +++ pint/formatting.py | 5 +- pint/testsuite/helpers.py | 6 +- pint/testsuite/test_babel.py | 30 ++++++++ pint/xtranslated.txt | 26 +++++++ 6 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 pint/babel_units.py create mode 100644 pint/testsuite/test_babel.py create mode 100644 pint/xtranslated.txt diff --git a/pint/babel_units.py b/pint/babel_units.py new file mode 100644 index 0000000..71fe8dc --- /dev/null +++ b/pint/babel_units.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +""" + pint.babel + ~~~~~~~~~~ + + :copyright: 2016 by Pint Authors, see AUTHORS for more details. + :license: BSD, see LICENSE for more details. +""" + +babel_units = dict( + standard_gravity='acceleration-g-force', + millibar='pressure-millibar', + metric_ton='mass-metric-ton', + megawatt='power-megawatt', + degF='temperature-fahrenheit', + dietary_calorie='energy-foodcalorie', + millisecond='duration-millisecond', + mph='speed-mile-per-hour', + acre_foot='volume-acre-foot', + mebibit='digital-megabit', + gibibit='digital-gigabit', + tebibit='digital-terabit', + mebibyte='digital-megabyte', + kibibyte='digital-kilobyte', + mm_Hg='pressure-millimeter-of-mercury', + month='duration-month', + kilocalorie='energy-kilocalorie', + cubic_mile='volume-cubic-mile', + arcsecond='angle-arc-second', + byte='digital-byte', + metric_cup='volume-cup-metric', + kilojoule='energy-kilojoule', + meter_per_second_squared='acceleration-meter-per-second-squared', + pint='volume-pint', + square_centimeter='area-square-centimeter', + in_Hg='pressure-inch-hg', + milliampere='electric-milliampere', + arcminute='angle-arc-minute', + MPG='consumption-mile-per-gallon', + hertz='frequency-hertz', + day='duration-day', + mps='speed-meter-per-second', + kilometer='length-kilometer', + square_yard='area-square-yard', + kelvin='temperature-kelvin', + kilogram='mass-kilogram', + kilohertz='frequency-kilohertz', + megahertz='frequency-megahertz', + meter='length-meter', + cubic_inch='volume-cubic-inch', + kilowatt_hour='energy-kilowatt-hour', + second='duration-second', + yard='length-yard', + light_year='length-light-year', + millimeter='length-millimeter', + metric_horsepower='power-horsepower', + gibibyte='digital-gigabyte', + ## 'temperature-generic', + liter='volume-liter', + turn='angle-revolution', + microsecond='duration-microsecond', + pound='mass-pound', + ounce='mass-ounce', + calorie='energy-calorie', + centimeter='length-centimeter', + inch='length-inch', + centiliter='volume-centiliter', + troy_ounce='mass-ounce-troy', + gream='mass-gram', + kilowatt='power-kilowatt', + knot='speed-knot', + lux='light-lux', + hectoliter='volume-hectoliter', + microgram='mass-microgram', + degC='temperature-celsius', + tablespoon='volume-tablespoon', + cubic_yard='volume-cubic-yard', + square_foot='area-square-foot', + tebibyte='digital-terabyte', + square_inch='area-square-inch', + carat='mass-carat', + hectopascal='pressure-hectopascal', + gigawatt='power-gigawatt', + watt='power-watt', + micrometer='length-micrometer', + volt='electric-volt', + bit='digital-bit', + gigahertz='frequency-gigahertz', + teaspoon='volume-teaspoon', + ohm='electric-ohm', + joule='energy-joule', + cup='volume-cup', + square_mile='area-square-mile', + nautical_mile='length-nautical-mile', + square_meter='area-square-meter', + mile='length-mile', + acre='area-acre', + nanometer='length-nanometer', + hour='duration-hour', + astronomical_unit='length-astronomical-unit', + liter_per_100kilometers ='consumption-liter-per-100kilometers', + megaliter='volume-megaliter', + ton='mass-ton', + hectare='area-hectare', + square_kilometer='area-square-kilometer', + kibibit='digital-kilobit', + mile_scandinavian='length-mile-scandinavian', + liter_per_kilometer='consumption-liter-per-kilometer', + century='duration-century', + cubic_foot='volume-cubic-foot', + deciliter='volume-deciliter', + ##pint='volume-pint-metric', + cubic_meter='volume-cubic-meter', + cubic_kilometer='volume-cubic-kilometer', + quart='volume-quart', + cc='volume-cubic-centimeter', + pound_force_per_square_inch='pressure-pound-per-square-inch', + milligram='mass-milligram', + kph='speed-kilometer-per-hour', + minute='duration-minute', + parsec='length-parsec', + picometer='length-picometer', + degree='angle-degree', + milliwatt='power-milliwatt', + week='duration-week', + ampere='electric-ampere', + milliliter='volume-milliliter', + decimeter='length-decimeter', + fluid_ounce='volume-fluid-ounce', + nanosecond='duration-nanosecond', + foot='length-foot', + karat='proportion-karat', + year='duration-year', + gallon='volume-gallon', + radian='angle-radian', +) + +babel_forms = ['narrow', 'short', 'long'] + diff --git a/pint/compat/__init__.py b/pint/compat/__init__.py index 7442967..433c30d 100644 --- a/pint/compat/__init__.py +++ b/pint/compat/__init__.py @@ -127,3 +127,12 @@ except ImportError: ufloat = None HAS_UNCERTAINTIES = False +try: + from babel import Locale as Loc + HAS_BABEL = True + HAS_PROPER_BABEL = hasattr(Loc, 'unit_patterns') +except ImportError: + HAS_PROPER_BABEL = HAS_BABEL = False + +if not HAS_PROPER_BABEL: + Loc = None diff --git a/pint/formatting.py b/pint/formatting.py index 03e5acc..9e58ec8 100644 --- a/pint/formatting.py +++ b/pint/formatting.py @@ -114,6 +114,9 @@ def formatter(items, as_ratio=True, single_denominator=False, :param division_fmt: the format used for division. :param power_fmt: the format used for exponentiation. :param parentheses_fmt: the format used for parenthesis. + :param locale: the locale object as defined in babel. + :param form: the length of the translated unit, as defined in babel cldr. + :param plural_form: the plural form, calculated as defined in babel. :return: the formula as a string. """ @@ -129,7 +132,7 @@ def formatter(items, as_ratio=True, single_denominator=False, pos_terms, neg_terms = [], [] for key, value in sorted(items): - if locale and form and plural_form: + if locale and form and plural_form and hasattr(locale, 'unit_patterns'): _key = babel_units.get(key) if _key: patterns = locale.unit_patterns diff --git a/pint/testsuite/helpers.py b/pint/testsuite/helpers.py index 6b63d8f..a3455a5 100644 --- a/pint/testsuite/helpers.py +++ b/pint/testsuite/helpers.py @@ -7,7 +7,7 @@ import doctest from distutils.version import StrictVersion import re -from pint.compat import unittest, HAS_NUMPY, HAS_UNCERTAINTIES, NUMPY_VER, PYTHON3 +from pint.compat import unittest, HAS_NUMPY, HAS_PROPER_BABEL, HAS_UNCERTAINTIES, NUMPY_VER, PYTHON3 def requires_numpy18(): @@ -30,6 +30,10 @@ def requires_not_numpy(): return unittest.skipIf(HAS_NUMPY, 'Requires NumPy is not installed.') +def requires_proper_babel(): + return unittest.skipUnless(HAS_PROPER_BABEL, 'Requires Babel with units support') + + def requires_uncertainties(): return unittest.skipUnless(HAS_UNCERTAINTIES, 'Requires Uncertainties') diff --git a/pint/testsuite/test_babel.py b/pint/testsuite/test_babel.py new file mode 100644 index 0000000..ad10b0b --- /dev/null +++ b/pint/testsuite/test_babel.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import division, unicode_literals, print_function, absolute_import + +from pint.compat import Loc +from pint.testsuite import helpers, BaseTestCase +from pint import UnitRegistry + +class TestBabel(BaseTestCase): + + @helpers.requires_proper_babel() + def test_babel(self): + ureg = UnitRegistry() + ureg.load_definitions('../xtranslated.txt') + locale = Loc('fr', 'FR') + + distance = 24.0 * ureg.meter + self.assertEqual( + distance.format_babel(locale=locale, form='long'), + u'24.0 mètres' + ) + time = 8.0 * ureg.second + self.assertEqual( + time.format_babel(locale=locale, form='long'), + u'8.0 secondes' + ) + velocity = distance / time ** 2 + self.assertEqual( + velocity.format_babel(locale=locale, form='long'), + u'0.375 mètre par seconde²' + ) diff --git a/pint/xtranslated.txt b/pint/xtranslated.txt new file mode 100644 index 0000000..3ccfd9d --- /dev/null +++ b/pint/xtranslated.txt @@ -0,0 +1,26 @@ + +# a few unit definitions added to use the translations by unicode cldr + +dietary_calorie = 1000 * calorie = Calorie +metric_cup = liter / 4 +mps = meter / second +square_inch = inch ** 2 = sq_in +square_mile = mile ** 2 = sq_mile +square_meter = kilometer ** 2 = sq_m +square_kilometer = kilometer ** 2 = sq_km +mile_scandinavian = 10000 * meter +century = 100 * year +cubic_mile = 1 * mile ** 3 = cu_mile = cubic_miles +cubic_yard = 1 * yard ** 3 = cu_yd = cubic_yards +cubic_foot = 1 * foot ** 3 = cu_ft = cubic_feet +cubic_inch = 1 * inch ** 3 = cu_in = cubic_inches +cubic_meter = 1 * meter ** 3 = cu_m +cubic_kilometer = 1 * kilometer ** 3 = cu_km +karat = [purity] = Karat + +[consumption] = [volume] / [length] +liter_per_kilometer = liter / kilometer +liter_per_100kilometers = liter / (100 * kilometers) + +[US_consumption] = [length] / [volume] +MPG = mile / gallon