فهرست منبع

calcex.Figure: set_unit() & set_value() persistent

Fabian Peter Hammerle 8 سال پیش
والد
کامیت
b603e5ce0c
3فایلهای تغییر یافته به همراه51 افزوده شده و 11 حذف شده
  1. 7 7
      ioex/calcex.py
  2. 33 0
      tests/calcex/test_figure.py
  3. 11 4
      tests/calcex/test_figure_yaml.py

+ 7 - 7
ioex/calcex.py

@@ -14,14 +14,14 @@ class Figure(object):
     yaml_tag = u"!figure"
 
     def __init__(self, value=None, unit=None):
-        self._value = value
-        self._unit = unit
+        self.value = value
+        self.unit = unit
 
     def get_value(self):
         return self._value
 
     def set_value(self, value):
-        self._value = value
+        self._value = copy.deepcopy(value)
 
     """ use property() instead of decorator to enable overriding """
     value = property(get_value, set_value)
@@ -30,7 +30,7 @@ class Figure(object):
         return self._unit
 
     def set_unit(self, unit):
-        self._unit = unit
+        self._unit = copy.deepcopy(unit)
 
     """ use property() instead of decorator to enable overriding """
     unit = property(get_unit, set_unit)
@@ -50,7 +50,7 @@ class Figure(object):
 
     @classmethod
     def from_yaml(cls, loader, node):
-        return cls(**loader.construct_mapping(node))
+        return cls(**loader.construct_mapping(node, deep=True))
 
     @classmethod
     def register_yaml_constructor(cls, loader, tag=yaml_tag):
@@ -80,7 +80,7 @@ class Figure(object):
         if self.unit != other.unit:
             raise UnitMismatchError('{} + {}'.format(self, other))
         else:
-            return type(self)(value=self.value + other.value, unit=copy.deepcopy(self.unit))
+            return type(self)(value=self.value + other.value, unit=self.unit)
 
     def __sub__(self, other):
         assert isinstance(self, type(other))
@@ -89,4 +89,4 @@ class Figure(object):
         if self.unit != other.unit:
             raise UnitMismatchError('{} - {}'.format(self, other))
         else:
-            return type(self)(value=self.value - other.value, unit=copy.deepcopy(self.unit))
+            return type(self)(value=self.value - other.value, unit=self.unit)

+ 33 - 0
tests/calcex/test_figure.py

@@ -47,6 +47,23 @@ def test_set_value(value):
     assert value == f.value
 
 
+def test_set_value_persistent():
+    v = [1, 2]
+    f = Figure(value=v)
+    assert Figure([1, 2]) == f
+    v[0] = 3
+    v.append(4)
+    assert Figure([1, 2]) == f
+
+
+def test_set_value_persistent_deep():
+    v = [{'x': 1}, {'x': 2}]
+    f = Figure(value=v)
+    assert Figure([{'x': 1}, {'x': 2}]) == f
+    v[0]['x'] = 3
+    assert Figure([{'x': 1}, {'x': 2}]) == f
+
+
 @pytest.mark.parametrize(('unit'), [
     'μg/l',
     '米/s²',
@@ -62,6 +79,22 @@ def test_set_unit(unit):
     assert unit == f.unit
 
 
+def test_set_unit_persistent():
+    u = [1, 2]
+    f = Figure(0, u)
+    assert Figure(0, [1, 2]) == f
+    u.append(3)
+    assert Figure(0, [1, 2]) == f
+
+
+def test_set_unit_persistent_deep():
+    u = (['N', 'm'], ['l'])
+    f = Figure(0, u)
+    assert Figure(0, (['N', 'm'], ['l'])) == f
+    u[0].append('g')
+    assert Figure(0, (['N', 'm'], ['l'])) == f
+
+
 @pytest.mark.parametrize(('figure', 'expected_string'), [
     [Figure(), '?'],
     [Figure(value=123.4), '123.4'],

+ 11 - 4
tests/calcex/test_figure_yaml.py

@@ -4,17 +4,22 @@ import pytest
 from ioex.calcex import Figure, UnitMismatchError
 yaml = pytest.importorskip('yaml')
 
+
 @pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
 @pytest.mark.parametrize(('figure_yaml', 'expected_figure'), [
     ['!fig {value: null, unit: null}', Figure()],
     ['!fig {value: 123.4, unit: null}', Figure(123.4)],
     ['!fig {value: [1, 2], unit: null}', Figure([1, 2])],
+    ['!fig {value: null, unit: kg}', Figure(unit='kg')],
+    ['!fig {value: 123.4, unit: km/h}', Figure(123.4, 'km/h')],
+    ['!fig {value: [1, 2], unit: km/h}', Figure([1, 2], 'km/h')],
 ])
 def test_register_yaml_constructor(figure_yaml, expected_figure, yaml_loader):
     class TestLoader(yaml_loader):
         pass
-    Figure.register_yaml_constructor(TestLoader, tag = '!fig')
-    assert expected_figure == yaml.load(figure_yaml, Loader = TestLoader)
+    Figure.register_yaml_constructor(TestLoader, tag='!fig')
+    assert expected_figure == yaml.load(figure_yaml, Loader=TestLoader)
+
 
 @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
 @pytest.mark.parametrize(('figure'), [
@@ -32,12 +37,13 @@ def test_to_yaml(figure, yaml_dumper):
         type(figure),
         lambda d, f: figure.to_yaml(d, f, '!test-figure'))
     figure_yaml = yaml.dump(figure, Dumper=TestDumper)
+
     class TestLoader(yaml.SafeLoader):
         pass
     TestLoader.add_constructor(
         '!test-figure',
         lambda loader, node: loader.construct_mapping(node),
-        )
+    )
     figure_attr = yaml.load(figure_yaml, Loader=TestLoader)
     assert set(['value', 'unit']) == set(figure_attr.keys())
     assert figure.value == figure_attr['value']
@@ -53,12 +59,13 @@ def test_register_yaml_representer(figure, yaml_dumper):
         pass
     figure.register_yaml_representer(TestDumper)
     figure_yaml = yaml.dump(figure, Dumper=TestDumper)
+
     class TestLoader(yaml.SafeLoader):
         pass
     TestLoader.add_constructor(
         '!figure',
         lambda loader, node: loader.construct_mapping(node),
-        )
+    )
     figure_attr = yaml.load(figure_yaml, Loader=TestLoader)
     assert set(['value', 'unit']) == set(figure_attr.keys())
     assert figure.value == figure_attr['value']