diff options
author | alexbodn@gmail.com <alexbodn@gmail.com> | 2016-08-06 15:42:31 +0300 |
---|---|---|
committer | alexbodn@gmail.com <alexbodn@gmail.com> | 2016-08-06 15:42:31 +0300 |
commit | 26dd4baf47ed7753b2843a7e4eed46d1ea25880a (patch) | |
tree | 504c263d8e319e1c0cccb69c857d9e0d99798bdb | |
parent | 79d446a116a23aea8cda676f5dbe390ab7dc283a (diff) | |
download | pint-26dd4baf47ed7753b2843a7e4eed46d1ea25880a.tar.gz |
adjusted to cope with upstream babel tip
-rw-r--r-- | pint/babel_names.py | 11 | ||||
-rw-r--r-- | pint/compat/__init__.py | 5 | ||||
-rw-r--r-- | pint/formatting.py | 49 | ||||
-rw-r--r-- | pint/quantity.py | 6 | ||||
-rw-r--r-- | pint/systems.py | 8 | ||||
-rw-r--r-- | pint/testsuite/test_babel.py | 16 |
6 files changed, 57 insertions, 38 deletions
diff --git a/pint/babel_names.py b/pint/babel_names.py index fba83b5..45601bd 100644 --- a/pint/babel_names.py +++ b/pint/babel_names.py @@ -7,7 +7,9 @@ :license: BSD, see LICENSE for more details. """ -babel_units = dict( +from pint.compat import HAS_PROPER_BABEL + +_babel_units = dict( standard_gravity='acceleration-g-force', millibar='pressure-millibar', metric_ton='mass-metric-ton', @@ -135,11 +137,14 @@ babel_units = dict( radian='angle-radian', ) -babel_systems = dict( +if not HAS_PROPER_BABEL: + _babel_units = dict() + +_babel_systems = dict( mks='metric', imperial='uksystem', US='ussystem', ) -babel_forms = ['narrow', 'short', 'long'] +_babel_lengths = ['narrow', 'short', 'long'] diff --git a/pint/compat/__init__.py b/pint/compat/__init__.py index 433c30d..74a357e 100644 --- a/pint/compat/__init__.py +++ b/pint/compat/__init__.py @@ -129,10 +129,11 @@ except ImportError: try: from babel import Locale as Loc + from babel import units as babel_units HAS_BABEL = True - HAS_PROPER_BABEL = hasattr(Loc, 'unit_patterns') + HAS_PROPER_BABEL = hasattr(babel_units, 'format_unit') except ImportError: HAS_PROPER_BABEL = HAS_BABEL = False if not HAS_PROPER_BABEL: - Loc = None + Loc = babel_units = None diff --git a/pint/formatting.py b/pint/formatting.py index 6ff13de..11940ac 100644 --- a/pint/formatting.py +++ b/pint/formatting.py @@ -13,7 +13,8 @@ from __future__ import division, unicode_literals, print_function, absolute_impo import re -from .babel_names import babel_units, babel_forms +from .babel_names import _babel_units, _babel_lengths +from pint.compat import babel_units, Loc __JOIN_REG_EXP = re.compile("\{\d*\}") @@ -103,7 +104,7 @@ _FORMATS = { def formatter(items, as_ratio=True, single_denominator=False, product_fmt=' * ', division_fmt=' / ', power_fmt='{0} ** {1}', parentheses_fmt='({0})', exp_call=lambda x: '{0:n}'.format(x), - locale=None, form='long', plural_form='one'): + locale=None, babel_length='long', babel_plural_form='one'): """Format a list of (name, exponent) pairs. :param items: a list of (name, exponent) pairs. @@ -115,8 +116,8 @@ def formatter(items, as_ratio=True, single_denominator=False, :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. + :param babel_length: the length of the translated unit, as defined in babel cldr. + :param babel_plural_form: the plural form, calculated as defined in babel. :return: the formula as a string. """ @@ -132,24 +133,28 @@ 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 and hasattr(locale, 'unit_patterns'): - _key = babel_units.get(key) - if _key: - patterns = locale.unit_patterns - for _form in [form] + babel_forms: - pattern_key = _key + ':' + _form - if pattern_key in patterns: - plural = plural_form - if value <= 0: - plural = 'one' - pattern = patterns[pattern_key][plural] - key = pattern.replace('{0}', '').strip() - break - per_form = 'compound:per:' + form - if per_form in patterns: - division_fmt = patterns[per_form] - power_fmt = '{0}{1}' - exp_call = _pretty_fmt_exponent + if locale and babel_length and babel_plural_form and key in _babel_units: + _key = _babel_units[key] + locale = Loc.parse(locale) + unit_patterns = locale._data['unit_patterns'] + compound_unit_patterns = locale._data["compound_unit_patterns"] + plural = 'one' if abs(value) <= 0 else babel_plural_form + if babel_length not in _babel_lengths: + other_lengths = [ + _babel_length for _babel_length in reversed(_babel_lengths) \ + if babel_length != _babel_length + ] + else: + other_lengths = [] + for _babel_length in [babel_length] + other_lengths: + pat = unit_patterns.get(_key, {}).get(_babel_length, {}).get(plural) + print(plural, _babel_length, pat) + if pat is not None: + key = pat.replace('{0}', '').strip() + break + division_fmt = compound_unit_patterns.get("per", {}).get(babel_length, division_fmt) + power_fmt = '{0}{1}' + exp_call = _pretty_fmt_exponent if value == 1: pos_terms.append(key) elif value > 0: diff --git a/pint/quantity.py b/pint/quantity.py index 0d24e51..bfafe65 100644 --- a/pint/quantity.py +++ b/pint/quantity.py @@ -23,6 +23,7 @@ from .compat import string_types, ndarray, np, _to_magnitude, long_type from .util import (logger, UnitsContainer, SharedRegistryObject, to_units_container, infer_base_unit, fix_str_conversions) +from pint.compat import Loc def _eq(first, second, check_all): @@ -151,7 +152,10 @@ class _Quantity(SharedRegistryObject): else: obj = self kwspec = dict(kwspec) - kwspec['plural_form'] = kwspec['locale'].plural_form(obj.magnitude) + if 'length' in kwspec: + kwspec['babel_length'] = kwspec.pop('length') + kwspec['locale'] = Loc.parse(kwspec['locale']) + kwspec['babel_plural_form'] = kwspec['locale'].plural_form(obj.magnitude) return '{0} {1}'.format( format(obj.magnitude, remove_custom_flags(spec)), obj.units.format_babel(spec, **kwspec)).replace('\n', '') diff --git a/pint/systems.py b/pint/systems.py index 43a7ecc..95ea978 100644 --- a/pint/systems.py +++ b/pint/systems.py @@ -15,7 +15,8 @@ import re from .unit import Definition, UnitDefinition, DefinitionSyntaxError, RedefinitionError from .util import to_units_container, SharedRegistryObject, SourceIterator -from .babel_names import babel_systems +from .babel_names import _babel_systems +from pint.compat import Loc class _Group(SharedRegistryObject): @@ -337,8 +338,9 @@ class _System(SharedRegistryObject): :type locale: Locale """ - if locale and self.name in babel_systems: - name = babel_systems[self.name] + if locale and self.name in _babel_systems: + name = _babel_systems[self.name] + locale = Loc.parse(locale) return locale.measurement_systems[name] return self.name diff --git a/pint/testsuite/test_babel.py b/pint/testsuite/test_babel.py index f85e163..0194977 100644 --- a/pint/testsuite/test_babel.py +++ b/pint/testsuite/test_babel.py @@ -1,7 +1,6 @@ # -*- 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 import os @@ -13,25 +12,28 @@ class TestBabel(BaseTestCase): ureg = UnitRegistry() dirname = os.path.dirname(__file__) ureg.load_definitions(os.path.join(dirname, '../xtranslated.txt')) - locale = Loc('fr', 'FR') distance = 24.0 * ureg.meter self.assertEqual( - distance.format_babel(locale=locale, form='long'), + distance.format_babel(locale='fr_FR', length='long'), "24.0 mètres" ) time = 8.0 * ureg.second self.assertEqual( - time.format_babel(locale=locale, form='long'), + time.format_babel(locale='fr_FR', length='long'), "8.0 secondes" ) - velocity = distance / time ** 2 self.assertEqual( - velocity.format_babel(locale=locale, form='long'), + time.format_babel(locale='ro', length='short'), + "8.0 s" + ) + acceleration = distance / time ** 2 + self.assertEqual( + acceleration.format_babel(locale='fr_FR', length='long'), "0.375 mètre par seconde²" ) mks = ureg.get_system('mks') self.assertEqual( - mks.format_babel(locale=locale), + mks.format_babel(locale='fr_FR'), "métrique" ) |