make dataset.freeze.config compatible with python3

This commit is contained in:
xrotwang 2014-11-06 11:08:07 +01:00
parent 4bf19159c6
commit 5b7908893d
3 changed files with 74 additions and 7 deletions

View File

@ -1,10 +1,7 @@
import json import json
import yaml import yaml
try: from six import text_type, PY3
str = unicode
except NameError:
pass
from dataset.util import FreezeException from dataset.util import FreezeException
@ -33,14 +30,17 @@ class Configuration(object):
extension = file_name.rsplit('.', 1)[-1] extension = file_name.rsplit('.', 1)[-1]
loader = DECODER.get(extension, json) loader = DECODER.get(extension, json)
try: 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: try:
self.data = loader.load(fh) self.data = loader.load(fh)
except ValueError as ve: except ValueError as ve:
raise FreezeException("Invalid freeze file: %s" % ve) raise FreezeException("Invalid freeze file: %s" % ve)
fh.close() fh.close()
except IOError as ioe: except IOError as ioe:
raise FreezeException(str(ioe)) raise FreezeException(text_type(ioe))
@property @property
def exports(self): def exports(self):
@ -64,7 +64,7 @@ class Export(object):
def get_normalized(self, name, default=None): def get_normalized(self, name, default=None):
value = self.get(name, default=default) value = self.get(name, default=default)
if value not in [None, default]: if value not in [None, default]:
value = str(value).lower().strip() value = text_type(value).lower().strip()
return value return value
def get_bool(self, name, default=False): def get_bool(self, name, default=False):

32
test/Freezefile.yaml Normal file
View File

@ -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

View File

@ -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)