Manage None values on fields

Convert None to empty values when possible and raise errors when not possible.
This commit is contained in:
Sergi Almacellas Abellana 2016-09-01 15:32:42 +02:00
parent 9622230b3e
commit 2595f3ceeb
3 changed files with 45 additions and 3 deletions

View file

@ -1,3 +1,5 @@
* Manage None values on fields
Version 0.21 - 2016-08-09
* Add python 3 support

View file

@ -73,6 +73,8 @@ class Char(Field):
return super(Char, self).set_from_file(value)
def set(self, value):
if value is None:
value = ''
if len(value) > self._size:
value = value[:self._size]
return super(Char, self).set(value)
@ -132,6 +134,8 @@ class Number(Char):
return super(Number, self).set_from_file(value)
def set(self, value):
if value is None:
value = ''
assert re.match('[0-9]*$', value), (
'Non-number value "%s" in field "%s"' % (value, self._name))
@ -196,6 +200,9 @@ class Numeric(Field):
def set(self, value):
try:
return Decimal(value)
except TypeError:
raise RetrofixException('Invalid value "%s" for Numeric Field "%s"'
% (value, self._name))
except ValueError:
raise RetrofixException('Invalid value "%s" for Numeric Field "%s"'
% (value, self._name))
@ -229,7 +236,8 @@ class Date(Field):
return super(Date, self).get_for_file(res)
def set(self, value):
assert value, datetime
if value is not None:
assert value, datetime
return super(Date, self).set(value)

View file

@ -25,6 +25,9 @@ from decimal import Decimal
import codecs
from retrofix.record import Record
from retrofix.fields import Char, Account, Number, Numeric, Integer, Date,\
Boolean
from retrofix.exception import RetrofixException
from retrofix import c19
from retrofix import c32
from retrofix import c34_1_la_caixa as c34
@ -43,8 +46,6 @@ def read_flat(file_name):
return codecs.open(file_path, 'r', encoding='latin1').read()
class C19TestCase(unittest.TestCase):
def setUp(self):
self.data = read_flat('c19.txt')
@ -118,6 +119,7 @@ class C34TestCase(unittest.TestCase):
data = self.ordering_header.write()
self.assert_(self.data.startswith(data))
class C43TestCase(unittest.TestCase):
def setUp(self):
self.data = read_flat('c43.txt')
@ -242,6 +244,36 @@ class C57TestCase(unittest.TestCase):
self.assertEqual(records[12], record)
class GenericTestCase(unittest.TestCase):
def test_none_fields(self):
'Test setting none values on fields'
TEST_RECORD = (
(1, 1, 'char', Char),
(2, 22, 'account', Account),
(22, 26, 'number', Number),
(26, 30, 'numeric', Numeric),
(30, 40, 'integer', Integer),
(40, 48, 'date', Date('YYYYMMDD')),
(48, 50, 'boolean', Boolean),
)
record = Record(TEST_RECORD)
record.char = None
record.account = None
record.number = None
with self.assertRaises(RetrofixException):
record.numeric = None
with self.assertRaises(RetrofixException):
record.integer = None
record.date = None
record.boolean = None
self.assertEqual(record.char, '')
self.assertEqual(record.account, '')
self.assertEqual(record.number, '')
self.assertEqual(record.date, None)
self.assertEqual(record.boolean, False)
def suite():
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(C19TestCase))