diff --git a/dataset/freeze/config.py b/dataset/freeze/config.py index 9a58799..a34199e 100644 --- a/dataset/freeze/config.py +++ b/dataset/freeze/config.py @@ -1,10 +1,7 @@ import json import yaml -try: - str = unicode -except NameError: - pass +from six import text_type, PY3 from dataset.util import FreezeException @@ -33,14 +30,17 @@ class Configuration(object): extension = file_name.rsplit('.', 1)[-1] loader = DECODER.get(extension, json) try: - fh = open(file_name, 'rb') + if loader == json and PY3: # pragma: no cover + fh = open(file_name, encoding='utf8') + else: + fh = open(file_name, 'rb') try: self.data = loader.load(fh) except ValueError as ve: raise FreezeException("Invalid freeze file: %s" % ve) fh.close() except IOError as ioe: - raise FreezeException(str(ioe)) + raise FreezeException(text_type(ioe)) @property def exports(self): @@ -64,7 +64,7 @@ class Export(object): def get_normalized(self, name, default=None): value = self.get(name, default=default) if value not in [None, default]: - value = str(value).lower().strip() + value = text_type(value).lower().strip() return value def get_bool(self, name, default=False): diff --git a/test/Freezefile.yaml b/test/Freezefile.yaml new file mode 100644 index 0000000..2c36861 --- /dev/null +++ b/test/Freezefile.yaml @@ -0,0 +1,32 @@ +common: + + database: "postgresql://user:password@localhost/operational_database" + prefix: my_project/dumps/ + format: json + nested: + + property: "inner" + +exports: + + - query: "SELECT id, title, date FROM events" + filename: "index.json" + number: 5 + bool: true + nested: + + property: "override" + + - query: "SELECT id, title, date, country FROM events" + filename: "countries/{{country}}.csv" + format: csv + + - query: "SELECT * FROM events" + filename: "events/{{id}}.json" + mode: item + wrap: true + + - query: "SELECT * FROM events" + filename: "all.json" + format: tabson + diff --git a/test/test_freeze_config.py b/test/test_freeze_config.py new file mode 100644 index 0000000..0ab1d8c --- /dev/null +++ b/test/test_freeze_config.py @@ -0,0 +1,35 @@ +import os +import unittest + +from dataset.util import FreezeException + + +class TestConfiguration(unittest.TestCase): + def test_init(self): + from dataset.freeze.config import Configuration + + self.assertRaises(FreezeException, Configuration, 'x.x') + self.assertRaises(FreezeException, Configuration, __file__) + cfg = Configuration(os.path.join(os.path.dirname(__file__), 'Freezefile.yaml')) + + def test_exports(self): + from dataset.freeze.config import Configuration + + cfg = Configuration(os.path.join(os.path.dirname(__file__), 'Freezefile.yaml')) + exports = list(cfg.exports) + self.assertEqual(len(exports), 4) + self.assertFalse(exports[0].skip) + self.assertTrue(exports[0].get_bool('bool')) + self.assertEqual(exports[0].get_int('nan', 'default'), 'default') + self.assertEqual(exports[0].get_int('number'), 5) + self.assert_(exports[0].name) + + def test_exports_fail(self): + from dataset.freeze.config import Configuration + + cfg = Configuration(os.path.join(os.path.dirname(__file__), 'Freezefile.yaml')) + cfg.data = None + self.assertRaises(FreezeException, list, cfg.exports) + cfg.data = {} + self.assertRaises(FreezeException, list, cfg.exports) +