Browse Source

yaml support for distance

Fabian Peter Hammerle 8 years ago
parent
commit
0a15fb9999
3 changed files with 44 additions and 121 deletions
  1. 30 3
      dingguo/__init__.py
  2. 2 118
      tests/test_.py
  3. 12 0
      tests/test_yaml.py

+ 30 - 3
dingguo/__init__.py

@@ -55,11 +55,38 @@ class Figure(_YamlUnicodeConstruct):
                 {'unit': figure.get_unit(), 'value': figure.get_value()},
                 )
 
-class Distance(Figure):
+class ScalarFigure(Figure):
 
-    def __init__(self, value, unit):
+    yaml_tag = u'!scalar'
+
+    def get_value(self):
+        return super(ScalarFigure, self).get_value()
+
+    def set_value(self, value):
         assert type(value) is float
-        super(Distance, self).__init__(value, unit)
+        super(ScalarFigure, self).set_value(value)
+
+    """ use property() instead of decorator to enable overriding """
+    value = property(get_value, set_value)
+
+    @classmethod
+    def from_yaml(cls, loader, node):
+        attr = loader.construct_scalar(node).split(' ')
+        return cls(
+                value = float(attr[0]),
+                unit = attr[1],
+                )
+
+    @classmethod
+    def to_yaml(cls, dumper, s):
+        return dumper.represent_scalar(
+                cls.yaml_tag,
+                '%s %s' % (repr(s.value), s.unit),
+                )
+
+class Distance(ScalarFigure):
+
+    yaml_tag = u'!distance'
 
     @property
     def metres(self):

+ 2 - 118
tests/test_.py

@@ -10,121 +10,5 @@ import os
 def test_sum_init():
     assert dingguo.Sum(1.23, u'EUR') == dingguo.Sum(1.23, u'€')
 
-def test_order_dict_repr():
-
-    order = dingguo.Order(
-            platform = u'platform',
-            order_id = u'id',
-            order_date = datetime.datetime(2016, 5, 8, 0, 18, 17),
-            customer_id = u'customer',
-            )
-
-    item_0 = dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR'))
-    order.items.append(item_0)
-    item_1 = dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR'))
-    order.items.append(item_1)
-
-    discount_0 = dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR'))
-    order.discounts.append(discount_0)
-    discount_1 = dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR'))
-    order.discounts.append(discount_1)
-
-    assert order.dict_repr() == {
-            'articles': [item_0, item_1],
-            'customer_id': u'customer',
-            'discounts': [discount_0, discount_1],
-            'order_date': u'2016-05-08',
-            'order_id': u'id',
-            'platform': u'platform',
-            }
-
-def test_order_from_dict_flat():
-
-    item_0 = dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR'))
-    item_1 = dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR'))
-    discount_0 = dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR'))
-    discount_1 = dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR'))
-
-    order = dingguo.Order.from_dict({
-            'articles': [item_0, item_1],
-            'customer_id': u'customer',
-            'discounts': [discount_0, discount_1],
-            'order_date': u'2016-05-08',
-            'order_id': u'id',
-            'platform': u'platform',
-            })
-
-    assert order.items == [item_0, item_1]
-    assert order.customer_id == u'customer'
-    assert order.discounts == [discount_0, discount_1]
-    assert order.order_date == datetime.date(2016, 5, 8)
-    assert order.order_id == u'id'
-    assert order.platform == u'platform'
-
-def test_order_from_dict_tree():
-
-    order = dingguo.Order.from_dict({
-            'articles': [
-                {
-                    'name': u'item 0',
-                    'price_brutto': 1.0,
-                    'price_brutto_currency': u'EUR',
-                    },
-                {
-                    'name': u'item 1',
-                    'price_brutto': 2.0,
-                    'price_brutto_currency': u'EUR',
-                    },
-                ],
-            'customer_id': u'customer',
-            'discounts': [
-                {
-                    'name': u'discount 0',
-                    'value': 3.0,
-                    'value_currency': u'EUR',
-                    },
-                {
-                    'name': u'discount 1',
-                    'value': 4.0,
-                    'value_currency': u'EUR',
-                    },
-                ],
-            'order_date': u'2016-05-08',
-            'order_id': u'id',
-            'platform': u'platform',
-            })
-
-    assert order.items == [
-            dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR')),
-            dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR')),
-            ]
-    assert order.customer_id == u'customer'
-    assert order.discounts == [
-            dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR')),
-            dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR')),
-            ]
-    assert order.order_date == datetime.date(2016, 5, 8)
-    assert order.order_id == u'id'
-    assert order.platform == u'platform'
-
-def test_item_from_dict():
-
-    item = dingguo.Item.from_dict({
-            'name': u'item',
-            'price_brutto': 1.0,
-            'price_brutto_currency': u'EUR',
-            })
-
-    assert item.name == u'item'
-    assert item.price_brutto == dingguo.Sum(1.0, u'EUR')
-
-def test_discount_from_dict():
-
-    discount = dingguo.Discount.from_dict({
-            'name': u'discount',
-            'value': 1.0,
-            'value_currency': u'EUR',
-            })
-
-    assert discount.name == u'discount'
-    assert discount.amount == dingguo.Sum(1.0, u'EUR')
+def test_distance_metres():
+    assert int(dingguo.Distance(1.23, u'km').metres) == 1230

+ 12 - 0
tests/test_yaml.py

@@ -198,3 +198,15 @@ platform: platformπ
 """)
     order_expected = get_order_a()
     assert order_expected == order_loaded, yaml_diff(order_expected, order_loaded)
+
+def test_scalar_figure_to_yaml():
+    assert to_yaml(dingguo.ScalarFigure(1.34, u'μm')) == u"!scalar '1.34 μm'\n"
+
+def test_scalar_figure_from_yaml():
+    assert dingguo.ScalarFigure(1.34, u'μm') == yaml.load(u"!scalar '1.34 μm'")
+
+def test_distance_to_yaml():
+    assert to_yaml(dingguo.Distance(1.34, u'km')) == u"!distance '1.34 km'\n"
+
+def test_distance_from_yaml():
+    assert dingguo.Distance(1.34, u'km') == yaml.load(u"!distance '1.34 km'\n")