Browse Source

datetimeex.period: manually register yaml constructor and representer now via register_yaml_constructor/representer()

Fabian Peter Hammerle 9 năm trước cách đây
mục cha
commit
3335f101a6

+ 6 - 8
ioex/datetimeex.py

@@ -27,7 +27,7 @@ def construct_yaml_timestamp(loader, node):
                 loaded_dt = loaded_dt.astimezone(timezone)
     return loaded_dt
 
-def add_yaml_timestamp_constructor(loader, tag = u'tag:yaml.org,2002:timestamp'):
+def register_yaml_timestamp_constructor(loader, tag = u'tag:yaml.org,2002:timestamp'):
     loader.add_constructor(tag, construct_yaml_timestamp)
 
 class Period(object):
@@ -117,12 +117,10 @@ class Period(object):
             ]))
 
     @classmethod
-    def add_yaml_constructor(cls, loader, tag = yaml_tag):
-        add_yaml_timestamp_constructor(loader)
+    def register_yaml_constructor(cls, loader, tag = yaml_tag):
+        register_yaml_timestamp_constructor(loader)
         loader.add_constructor(tag, cls.from_yaml)
 
-if yaml:
-    yaml.add_representer(Period, Period.to_yaml)
-    yaml.SafeDumper.add_representer(Period, Period.to_yaml)
-    Period.add_yaml_constructor(yaml.Loader)
-    Period.add_yaml_constructor(yaml.SafeLoader)
+    @classmethod
+    def register_yaml_representer(cls, dumper):
+        dumper.add_representer(cls, cls.to_yaml)

+ 2 - 2
setup.py

@@ -5,12 +5,12 @@ import glob
 setup(
     name = 'ioex',
     packages = ['ioex'],
-    version = '0.4',
+    version = '0.5',
     description = 'extension for python\'s build-in input / output interface',
     author = 'Fabian Peter Hammerle',
     author_email = 'fabian.hammerle@gmail.com',
     url = 'https://github.com/fphammerle/ioex',
-    download_url = 'https://github.com/fphammerle/ioex/tarball/0.4',
+    download_url = 'https://github.com/fphammerle/ioex/tarball/0.5',
     keywords = [],
     classifiers = [],
     scripts = glob.glob('scripts/*'),

+ 6 - 3
tests/datetimeex/test_period_yaml.py

@@ -47,11 +47,13 @@ yaml = pytest.importorskip('yaml')
     ])
 def test_from_yaml(expected_period, yaml_string, loader):
     loader_copy = copy.deepcopy(loader)
+    ioex.datetimeex.Period.register_yaml_constructor(loader_copy)
     loaded_period = yaml.load(yaml_string, Loader = loader_copy)
     assert expected_period == loaded_period
     assert expected_period.start.utcoffset() == loaded_period.start.utcoffset()
     assert expected_period.end.utcoffset() == loaded_period.end.utcoffset()
 
+@pytest.mark.parametrize(('dumper'), [yaml.Dumper, yaml.SafeDumper])
 @pytest.mark.parametrize(('period', 'yaml_string'), [
     [
         ioex.datetimeex.Period(
@@ -75,6 +77,7 @@ def test_from_yaml(expected_period, yaml_string, loader):
         '!period\nend: 2016-07-24 12:21:00.000013+00:00\nstart: 2016-07-24 12:20:00+01:00\n',
         ],
     ])
-def test_to_yaml(period, yaml_string):
-    assert yaml.dump(period) == yaml_string
-    assert yaml.safe_dump(period) == yaml_string
+def test_to_yaml(period, yaml_string, dumper):
+    dumper_copy = copy.deepcopy(dumper)
+    ioex.datetimeex.Period.register_yaml_representer(dumper_copy)
+    assert yaml.dump(period, Dumper = dumper_copy) == yaml_string

+ 4 - 4
tests/datetimeex/test_yaml_timestamp_constructor.py

@@ -20,7 +20,7 @@ import pytz
     ])
 def test_from_yaml(yaml_string, expected_timestamp, loader):
     loader_copy = copy.deepcopy(loader)
-    ioex.datetimeex.add_yaml_timestamp_constructor(loader_copy)
+    ioex.datetimeex.register_yaml_timestamp_constructor(loader_copy)
     loaded_timestamp = yaml.load(yaml_string, Loader = loader_copy)
     assert loaded_timestamp == expected_timestamp
     assert loaded_timestamp.utcoffset() == expected_timestamp.utcoffset()
@@ -31,7 +31,7 @@ def test_from_yaml(yaml_string, expected_timestamp, loader):
     ])
 def test_from_yaml_tag(yaml_string, tag, expected_timestamp):
     loader = copy.deepcopy(yaml.SafeLoader)
-    ioex.datetimeex.add_yaml_timestamp_constructor(loader, tag = tag)
+    ioex.datetimeex.register_yaml_timestamp_constructor(loader, tag = tag)
     assert yaml.load(yaml_string, Loader = loader) == expected_timestamp
 
 @pytest.mark.parametrize(('yaml_string', 'expected_timestamp'), [
@@ -40,7 +40,7 @@ def test_from_yaml_tag(yaml_string, tag, expected_timestamp):
     ])
 def test_from_yaml_repeat(yaml_string, expected_timestamp):
     loader = copy.deepcopy(yaml.SafeLoader)
-    ioex.datetimeex.add_yaml_timestamp_constructor(loader)
+    ioex.datetimeex.register_yaml_timestamp_constructor(loader)
     assert yaml.load(yaml_string, Loader = loader) == expected_timestamp
-    ioex.datetimeex.add_yaml_timestamp_constructor(loader)
+    ioex.datetimeex.register_yaml_timestamp_constructor(loader)
     assert yaml.load(yaml_string, Loader = loader) == expected_timestamp