Browse Source

calcex figure: ignoring implicit yaml tag of subclasses fixed

Fabian Peter Hammerle 8 years ago
parent
commit
c8e215ba69
3 changed files with 64 additions and 3 deletions
  1. 4 2
      ioex/calcex.py
  2. 1 1
      setup.py
  3. 59 0
      tests/calcex/test_figure_yaml.py

+ 4 - 2
ioex/calcex.py

@@ -75,7 +75,8 @@ class Figure(object):
         )
 
     @classmethod
-    def to_yaml(cls, dumper, figure, tag=yaml_tag):
+    def to_yaml(cls, dumper, figure, tag=None):
+        tag = tag or cls.yaml_tag
         if figure.value is None or type(figure.value) in [int, float]:
             if figure.value is None:
                 value_text = u'?'
@@ -93,7 +94,8 @@ class Figure(object):
             )
 
     @classmethod
-    def register_yaml_representer(cls, dumper, tag=yaml_tag):
+    def register_yaml_representer(cls, dumper, tag=None):
+        tag = tag or cls.yaml_tag
         dumper.add_representer(cls, lambda d, f: cls.to_yaml(d, f, tag=tag))
 
     def __eq__(self, other):

+ 1 - 1
setup.py

@@ -5,7 +5,7 @@ import glob
 setup(
     name = 'ioex',
     packages = ['ioex'],
-    version = '0.10',
+    version = '0.10.1',
     description = 'extension for python\'s build-in input / output interface',
     author = 'Fabian Peter Hammerle',
     author_email = 'fabian.hammerle@gmail.com',

+ 59 - 0
tests/calcex/test_figure_yaml.py

@@ -103,3 +103,62 @@ def test_register_yaml_representer(figure, yaml_dumper):
     figure.register_yaml_constructor(TestLoader, tag='!test-fig')
     loaded_figure = yaml.load(generated_yaml, Loader=TestLoader)
     assert figure == loaded_figure
+
+
+@pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
+def test_from_yaml_subclass_explicit_tag(yaml_loader):
+    class SubFigure(Figure):
+        pass
+
+    class TestLoader(yaml_loader):
+        pass
+    Figure.register_yaml_constructor(TestLoader, tag='!fig')
+    SubFigure.register_yaml_constructor(TestLoader, tag='!sfig')
+    subfig = yaml.load("!sfig 12.34 EUR", Loader=TestLoader)
+    assert SubFigure == type(subfig)
+    assert Figure != type(subfig)
+    assert SubFigure(12.34, 'EUR') == subfig
+
+
+@pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
+def test_from_yaml_subclass_implicit_tag(yaml_loader):
+    class SubFigure(Figure):
+        yaml_tag = "!sfig"
+
+    class TestLoader(yaml_loader):
+        pass
+    SubFigure.register_yaml_constructor(TestLoader)
+    subfig = yaml.load("!sfig 12.34 EUR", Loader=TestLoader)
+    assert SubFigure == type(subfig)
+    assert Figure != type(subfig)
+    assert SubFigure(12.34, 'EUR') == subfig
+
+
+@pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
+def test_to_yaml_subclass_explicit_tag(yaml_dumper):
+    class SubFigure(Figure):
+        pass
+
+    class TestDumper(yaml_dumper):
+        pass
+    Figure.register_yaml_representer(TestDumper, tag='!fig')
+    SubFigure.register_yaml_representer(TestDumper, tag='!sfig')
+    subfig_yaml = yaml.dump(
+        SubFigure(12.34, 'EUR'),
+        Dumper=TestDumper,
+    )
+    assert "!sfig '12.34 EUR'\n" == subfig_yaml
+
+
+@pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
+def test_to_yaml_subclass_implicit_tag(yaml_dumper):
+    class SubFigure(Figure):
+        yaml_tag = "!subfig"
+    class TestDumper(yaml_dumper):
+        pass
+    SubFigure.register_yaml_representer(TestDumper)
+    subfig_yaml = yaml.dump(
+        SubFigure(12.34, 'EUR'),
+        Dumper=TestDumper,
+    )
+    assert "!subfig '12.34 EUR'\n" == subfig_yaml