summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralexbodn@gmail.com <alexbodn@gmail.com>2016-08-06 15:42:31 +0300
committeralexbodn@gmail.com <alexbodn@gmail.com>2016-08-06 15:42:31 +0300
commit26dd4baf47ed7753b2843a7e4eed46d1ea25880a (patch)
tree504c263d8e319e1c0cccb69c857d9e0d99798bdb
parent79d446a116a23aea8cda676f5dbe390ab7dc283a (diff)
downloadpint-26dd4baf47ed7753b2843a7e4eed46d1ea25880a.tar.gz
adjusted to cope with upstream babel tip
-rw-r--r--pint/babel_names.py11
-rw-r--r--pint/compat/__init__.py5
-rw-r--r--pint/formatting.py49
-rw-r--r--pint/quantity.py6
-rw-r--r--pint/systems.py8
-rw-r--r--pint/testsuite/test_babel.py16
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"
)