Browse Source

yaml support for article

Fabian Peter Hammerle 8 years ago
parent
commit
ab11b27f10
2 changed files with 75 additions and 45 deletions
  1. 12 24
      dingguo/__init__.py
  2. 63 21
      tests/test_yaml.py

+ 12 - 24
dingguo/__init__.py

@@ -95,23 +95,13 @@ class Distance(ScalarFigure):
         else:
             raise Exception()
 
-class Sum(Figure):
+class Sum(ScalarFigure):
 
     yaml_tag = u'!sum'
 
     def __init__(self, value, currency):
         super(Sum, self).__init__(value, currency)
 
-    def get_value(self):
-        return super(Sum, self).get_value()
-
-    def set_value(self, value):
-        assert type(value) is float
-        super(Sum, self).set_value(value)
-
-    """ use property() instead of decorator to enable overriding """
-    value = property(get_value, set_value)
-
     @property
     def currency(self):
         return self.unit
@@ -133,15 +123,8 @@ class Sum(Figure):
     def from_yaml(cls, loader, node):
         attr = loader.construct_scalar(node).split(' ')
         return cls(
-                currency = attr[0],
-                value = float(attr[1]),
-                )
-
-    @classmethod
-    def to_yaml(cls, dumper, s):
-        return dumper.represent_scalar(
-                cls.yaml_tag,
-                '%s %s' % (s.currency, repr(s.value)),
+                value = float(attr[0]),
+                currency = attr[1],
                 )
 
 class Discount(yaml.YAMLObject):
@@ -282,7 +265,8 @@ class Item(_YamlUnicodeConstruct):
                 )
 
     def __eq__(self, other):
-        return type(self) == type(other) and self.name == other.name and self.price_brutto == other.price_brutto
+        return (type(self) == type(other)
+                and vars(self) == vars(other))
 
     def __ne__(self, other):
         return not (self == other)
@@ -291,13 +275,16 @@ yaml.SafeDumper.add_representer(Item, lambda dumper, item: dumper.represent_dict
 
 class Article(Item):
 
+    yaml_tag = u'!article'
+
     def __init__(
             self,
-            quantity = None,
             authors = [],
-            state = None,
+            delivery_date = None,
+            quantity = None,
             reseller = None,
             shipper = None,
+            state = None,
             **kwargs
             ):
         super(Article, self).__init__(**kwargs)
@@ -311,7 +298,8 @@ class Article(Item):
         self.reseller = reseller
         assert shipper is None or type(shipper) is unicode
         self.shipper = shipper
-        self.delivery_date = None
+        assert delivery_date is None or type(delivery_date) is datetime.date
+        self.delivery_date = delivery_date
 
     def dict_repr(self):
         attr = super(Article, self).dict_repr()

+ 63 - 21
tests/test_yaml.py

@@ -32,6 +32,17 @@ def get_item_b():
             price_brutto = get_sum_b(),
             )
 
+def get_article():
+    return dingguo.Article(
+            authors = ['a', 'b'],
+            name = u'article name',
+            price_brutto = get_sum_a(),
+            quantity = 1,
+            reseller = u'seller',
+            shipper = u'shipper',
+            state = u'goood',
+            )
+
 def get_discount_a():
     return dingguo.Discount(
             name = u'discount a',
@@ -57,6 +68,9 @@ def get_order_a():
     order.discounts.append(get_discount_b())
     return order
 
+def get_distance():
+    return dingguo.Distance(2.4142, u'km')
+
 def to_yaml(data):
     return yaml.dump(data, default_flow_style = False, allow_unicode = True).decode('utf-8')
 
@@ -91,66 +105,66 @@ value: 12300
 """)
 
 def test_sum_to_yaml_a():
-    assert to_yaml(get_sum_a()) == u"!sum 'EUR 1.23'\n"
+    assert to_yaml(get_sum_a()) == u"!sum '1.23 EUR'\n"
 
 def test_sum_to_yaml_b():
-    assert to_yaml(get_sum_b()) == u"!sum 'EUR 20.45'\n"
+    assert to_yaml(get_sum_b()) == u"!sum '20.45 EUR'\n"
 
 def test_sum_from_yaml_a():
-    assert get_sum_a() == yaml.load(u"!sum EUR 1.23")
+    assert get_sum_a() == yaml.load(u"!sum 1.23 EUR")
 
 def test_sum_from_yaml_a_sign():
-    assert get_sum_a() == yaml.load(u"!sum 1.23")
+    assert get_sum_a() == yaml.load(u"!sum 1.23")
 
 def test_sum_from_yaml_a_quotes():
-    assert get_sum_a() == yaml.load(u"!sum 'EUR 1.23'")
+    assert get_sum_a() == yaml.load(u"!sum '1.23 EUR'")
 
 def test_item_to_yaml_a():
     assert to_yaml(get_item_a()) == u"""!item
 name: item a
-price_brutto: !sum 'EUR 1.23'
+price_brutto: !sum '1.23 EUR'
 """
 
 def test_item_to_yaml_b():
     assert to_yaml(get_item_b()) == u"""!item
 name: item β
-price_brutto: !sum 'EUR 20.45'
+price_brutto: !sum '20.45 EUR'
 """
 
 def test_item_from_yaml_a():
     assert get_item_a() == yaml.load(u"""!item
 name: item a
-price_brutto: !sum 'EUR 1.23'
+price_brutto: !sum '1.23 EUR'
 """)
 
 def test_item_from_yaml_b():
     assert get_item_b() == yaml.load(u"""!item
 name: item β
-price_brutto: !sum 'EUR 20.45'
+price_brutto: !sum '20.45 EUR'
 """)
 
 def test_discount_to_yaml_a():
     assert to_yaml(get_discount_a()) == u"""!discount
-amount: !sum 'EUR 1.23'
+amount: !sum '1.23 EUR'
 name: discount a
 """
 
 def test_discount_to_yaml_b():
     assert to_yaml(get_discount_b()) == u"""!discount
-amount: !sum 'EUR 20.45'
+amount: !sum '20.45 EUR'
 name: discount β
 """
 
 def test_discount_from_yaml_a():
     assert get_discount_a() == yaml.load(u"""!discount
 name: discount a
-amount: !sum 'EUR 1.23'
+amount: !sum '1.23 EUR'
 """)
 
 def test_discount_from_yaml_b():
     assert get_discount_b() == yaml.load(u"""!discount
 name: discount β
-amount: !sum 'EUR 20.45'
+amount: !sum '20.45 EUR'
 """)
 
 def test_order_to_yaml():
@@ -158,18 +172,18 @@ def test_order_to_yaml():
 customer_id: customer
 discounts:
 - !discount
-  amount: !sum 'EUR 1.23'
+  amount: !sum '1.23 EUR'
   name: discount a
 - !discount
-  amount: !sum 'EUR 20.45'
+  amount: !sum '20.45 EUR'
   name: discount β
 items:
 - !item
   name: item a
-  price_brutto: !sum 'EUR 1.23'
+  price_brutto: !sum '1.23 EUR'
 - !item
   name: item β
-  price_brutto: !sum 'EUR 20.45'
+  price_brutto: !sum '20.45 EUR'
 order_date: 2016-05-08
 order_id: id
 platform: platformπ
@@ -180,18 +194,18 @@ def test_order_from_yaml():
 customer_id: customer
 discounts:
 - !discount
-  amount: !sum 'EUR 1.23'
+  amount: !sum '1.23 EUR'
   name: discount a
 - !discount
-  amount: !sum 'EUR 20.45'
+  amount: !sum '20.45 EUR'
   name: discount β
 items:
 - !item
   name: item a
-  price_brutto: !sum 'EUR 1.23'
+  price_brutto: !sum '1.23 EUR'
 - !item
   name: item β
-  price_brutto: !sum 'EUR 20.45'
+  price_brutto: !sum '20.45 EUR'
 order_date: 2016-05-08
 order_id: id
 platform: platformπ
@@ -210,3 +224,31 @@ def test_distance_to_yaml():
 
 def test_distance_from_yaml():
     assert dingguo.Distance(1.34, u'km') == yaml.load(u"!distance '1.34 km'\n")
+
+def test_article_to_yaml_a():
+    assert to_yaml(get_article()) == u"""!article
+authors:
+- a
+- b
+delivery_date: null
+name: article name
+price_brutto: !sum '1.23 EUR'
+quantity: 1
+reseller: seller
+shipper: shipper
+state: goood
+"""
+
+def test_article_to_yaml_a():
+    assert get_article() == yaml.load(u"""!article
+authors:
+- a
+- b
+delivery_date: null
+name: article name
+price_brutto: !sum '1.23 EUR'
+quantity: 1
+reseller: seller
+shipper: shipper
+state: goood
+""")