def _get_root_units(self, input_units, check_nonmult=True):
        if not input_units:
            return Decimal('1'), UnitsContainer()

        # The cache is only done for check_nonmult=True
        if check_nonmult and input_units in self._root_units_cache:
            return self._root_units_cache[input_units]

        accumulators = [Decimal('1'), defaultdict(Decimal)]
        self._get_root_units_recurse(input_units, Decimal('1'), accumulators)

        factor = accumulators[0]
        units = UnitsContainer(dict(
            (k, v) for k, v in accumulators[1].items() if v != Decimal('0')))

        if check_nonmult:
            for unit in units.keys():
                if not self._units[unit].converter.is_multiplicative:
                    return None, units

        if check_nonmult:
            self._root_units_cache[input_units] = factor, units

        return factor, units
Exemple #2
0
    def test_unitcontainer_arithmetic(self):
        x = UnitsContainer(meter=1)
        y = UnitsContainer(second=1)
        z = UnitsContainer(meter=1, second=-2)

        self._test_not_inplace(op.mul, x, y, UnitsContainer(meter=1, second=1))
        self._test_not_inplace(op.truediv, x, y,
                               UnitsContainer(meter=1, second=-1))
        self._test_not_inplace(op.pow, z, 2, UnitsContainer(meter=2,
                                                            second=-4))
        self._test_not_inplace(op.pow, z, -2, UnitsContainer(meter=-2,
                                                             second=4))

        self._test_inplace(op.imul, x, y, UnitsContainer(meter=1, second=1))
        self._test_inplace(op.itruediv, x, y, UnitsContainer(meter=1,
                                                             second=-1))
        self._test_inplace(op.ipow, z, 2, UnitsContainer(meter=2, second=-4))
        self._test_inplace(op.ipow, z, -2, UnitsContainer(meter=-2, second=4))
Exemple #3
0
 def test_dict_conversion(self):
     assert to_units_container(dict(m=1)) == UnitsContainer(m=1)
Exemple #4
0
    def test_quantity_conversion(self):
        from pint.registry import UnitRegistry

        ureg = UnitRegistry()
        assert to_units_container(ureg.Quantity(
            1, UnitsContainer(m=1))) == UnitsContainer(m=1)
Exemple #5
0
 def test_str_conversion(self):
     assert to_units_container("m") == UnitsContainer(m=1)
Exemple #6
0
 def test_baseunit_definition(self):
     x = Definition.from_string("meter = [length]")
     self.assertIsInstance(x, UnitDefinition)
     self.assertTrue(x.is_base)
     self.assertEqual(x.reference, UnitsContainer({"[length]": 1}))
Exemple #7
0
 def test_convert_parse_str(self):
     ureg = self.ureg
     self.assertEqual(
         ureg.convert(1, 'meter', 'inch'),
         ureg.convert(1, UnitsContainer(meter=1), UnitsContainer(inch=1)))
Exemple #8
0
 def test_unit_repr(self):
     x = self.U_(UnitsContainer(meter=1))
     self.assertEqual(str(x), 'meter')
     self.assertEqual(repr(x), "<Unit('meter')>")
Exemple #9
0
 def test_parse_single(self):
     self.assertEqual(self.ureg.parse_expression("meter"),
                      self.Q_(1, UnitsContainer(meter=1.0)))
     self.assertEqual(self.ureg.parse_expression("second"),
                      self.Q_(1, UnitsContainer(second=1.0)))
Exemple #10
0
    def test_dimensionality(self):

        x = self.U_("m")
        self.assertEqual(x.dimensionality, UnitsContainer({"[length]": 1}))
Exemple #11
0
 def test_parse_mul_div(self):
     self.assertEqual(self.ureg.parse_expression('meter*meter'), self.Q_(1, UnitsContainer(meter=2.)))
     self.assertEqual(self.ureg.parse_expression('meter**2'), self.Q_(1, UnitsContainer(meter=2.)))
     self.assertEqual(self.ureg.parse_expression('meter*second'), self.Q_(1, UnitsContainer(meter=1., second=1)))
     self.assertEqual(self.ureg.parse_expression('meter/second'), self.Q_(1, UnitsContainer(meter=1., second=-1)))
     self.assertEqual(self.ureg.parse_expression('meter/second**2'), self.Q_(1, UnitsContainer(meter=1., second=-2)))
Exemple #12
0
 def test_convert_parse_str(self):
     ureg = self.ureg
     assert ureg.convert(1, "meter", "inch") == ureg.convert(
         1, UnitsContainer(meter=1), UnitsContainer(inch=1)
     )
Exemple #13
0
 def test_unit_repr(self):
     x = self.U_(UnitsContainer(meter=1))
     assert str(x) == "meter"
     assert repr(x) == "<Unit('meter')>"
Exemple #14
0
 def test_parse_prefix(self):
     assert self.ureg.parse_expression("kilometer") == self.Q_(
         1, UnitsContainer(kilometer=1.0)
     )
Exemple #15
0
 def test_parse_plural(self):
     assert self.ureg.parse_expression("meters") == self.Q_(
         1, UnitsContainer(meter=1.0)
     )
Exemple #16
0
 def test_parse_complex(self):
     self.assertEqual(self.ureg.parse_expression('kilometre'),
                      self.Q_(1, UnitsContainer(kilometer=1.)))
     self.assertEqual(self.ureg.parse_expression('kilometres'),
                      self.Q_(1, UnitsContainer(kilometer=1.)))
Exemple #17
0
 def test_parse_alias(self):
     self.assertEqual(self.ureg.parse_expression("metre"),
                      self.Q_(1, UnitsContainer(meter=1.0)))
Exemple #18
0
 def test_parse_factor(self):
     self.assertEqual(self.ureg.parse_expression('42*meter'),
                      self.Q_(42, UnitsContainer(meter=1.)))
     self.assertEqual(self.ureg.parse_expression('meter*42'),
                      self.Q_(42, UnitsContainer(meter=1.)))
Exemple #19
0
 def test_convert_parse_str(self):
     ureg = self.ureg
     self.assertEqual(
         ureg.convert(1, "meter", "inch"),
         ureg.convert(1, UnitsContainer(meter=1), UnitsContainer(inch=1)),
     )
Exemple #20
0
 def test_baseunit_definition(self):
     x = Definition.from_string("meter = [length]")
     assert isinstance(x, UnitDefinition)
     assert x.is_base
     assert x.reference == UnitsContainer({"[length]": 1})
Exemple #21
0
    def test_dimensionality(self):

        x = self.U_('m')
        self.assertEqual(x.dimensionality, UnitsContainer({'[length]': 1}))
Exemple #22
0
 def test_invalid(self):
     with pytest.raises(TypeError):
         UnitsContainer({1: 2})
     with pytest.raises(TypeError):
         UnitsContainer({"1": "2"})
     d = UnitsContainer()
     with pytest.raises(TypeError):
         d.__mul__(list())
     with pytest.raises(TypeError):
         d.__pow__(list())
     with pytest.raises(TypeError):
         d.__truediv__(list())
     with pytest.raises(TypeError):
         d.__rtruediv__(list())
Exemple #23
0
 def test_creation(self):
     for arg in ('meter', UnitsContainer(meter=1), self.U_('m')):
         self.assertEqual(self.U_(arg)._units, UnitsContainer(meter=1))
     self.assertRaises(TypeError, self.U_, 1)
Exemple #24
0
 def test_uc_conversion(self):
     a = UnitsContainer(m=1)
     assert to_units_container(a) is a
Exemple #25
0
 def test_deepcopy(self):
     x = self.U_(UnitsContainer(meter=1))
     self.assertEqual(x, copy.deepcopy(x))
Exemple #26
0
    def test_unit_conversion(self):
        from pint import Unit

        assert to_units_container(Unit(
            UnitsContainer(m=1))) == UnitsContainer(m=1)
Exemple #27
0
 def test_parse_single(self):
     self.assertEqual(self.ureg.parse_expression('meter'),
                      self.Q_(1, UnitsContainer(meter=1.)))
     self.assertEqual(self.ureg.parse_expression('second'),
                      self.Q_(1, UnitsContainer(second=1.)))
Exemple #28
0
 def test_unitcontainer_bool(self):
     assert UnitsContainer(meter=1, second=2)
     assert not UnitsContainer()
Exemple #29
0
 def test_parse_plural(self):
     self.assertEqual(self.ureg.parse_expression('meters'),
                      self.Q_(1, UnitsContainer(meter=1.)))
Exemple #30
0
 def test_parse_prefix(self):
     self.assertEqual(self.ureg.parse_expression('kilometer'),
                      self.Q_(1, UnitsContainer(kilometer=1.)))
Exemple #31
0
 def test_parse_alias(self):
     assert self.ureg.parse_expression("metre") == self.Q_(
         1, UnitsContainer(meter=1.0)
     )