diff --git a/pyaccuwage/fields.py b/pyaccuwage/fields.py index 27c10dc..2a78fd5 100644 --- a/pyaccuwage/fields.py +++ b/pyaccuwage/fields.py @@ -21,6 +21,7 @@ class ValidationError(Exception): class Field(object): creation_counter = 0 is_read_only = False + _value = None def __init__(self, name=None, max_length=0, required=True, uppercase=True, creation_counter=None): self.name = name @@ -122,7 +123,7 @@ class TextField(Field): raise ValidationError("value is too long", field=self) def get_data(self): - value = str(self.value).encode('ascii') or b'' + value = str(self.value or '').encode('ascii') or b'' if self.uppercase: value = value.upper() return value.ljust(self.max_length)[:self.max_length] @@ -195,13 +196,13 @@ class IntegerField(TextField): class StaticField(TextField): - def __init__(self, name=None, required=True, value=None): - super(StaticField, self).__init__(name=name, required=required, - max_length=len(value)) + def __init__(self, name=None, required=True, value=None, uppercase=False): + super(StaticField, self).__init__(name=name, + required=required, + max_length=len(value), + uppercase=uppercase) self._static_value = value - - def get_data(self): - return str(self._static_value).encode('ascii')[:self.max_length] + self._value = value def parse(self, s): pass diff --git a/pyaccuwage/model.py b/pyaccuwage/model.py index 94c7d4a..1d7e4ed 100644 --- a/pyaccuwage/model.py +++ b/pyaccuwage/model.py @@ -25,7 +25,7 @@ class Model(object): setattr(src_field, 'parent_name', self.__class__.__name__) new_field_instance = copy.copy(src_field) new_field_instance._orig_value = None - new_field_instance._value = None + new_field_instance._value = new_field_instance.value self.__dict__[key] = new_field_instance def __setattr__(self, key, value): diff --git a/tests/test_fields.py b/tests/test_fields.py index 2d32755..050285e 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -33,6 +33,11 @@ class TestTextField(unittest.TestCase): self.assertEqual(len(data), field.max_length) self.assertEqual(data, b'HELLO,') + def testStringUnsetOptional(self): + field = TextField(max_length=6, required=False) + field.validate() + self.assertEqual(field.get_data(), b' ' * 6) + class TestStaticField(unittest.TestCase): def test_static_field(self): field = StaticField(value='TEST') diff --git a/tests/test_records.py b/tests/test_records.py index a6485ac..dfa25fa 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -7,6 +7,7 @@ from pyaccuwage.fields import MoneyField from pyaccuwage.fields import StateField from pyaccuwage.fields import TextField from pyaccuwage.fields import ZeroField +from pyaccuwage.fields import StaticField from pyaccuwage.model import Model class TestModelOutput(unittest.TestCase): @@ -20,7 +21,8 @@ class TestModelOutput(unittest.TestCase): money = MoneyField(max_length=32) state_txt = StateField() state_num = StateField(use_numeric=True) - blank2 = BlankField(max_length=24) + blank2 = BlankField(max_length=12) + static1 = StaticField(value='hey mister!!') def setUp(self): self.model = TestModelOutput.TestModel() @@ -42,7 +44,8 @@ class TestModelOutput(unittest.TestCase): b'313377'.zfill(32), b'IA', b'19', - b' ' * 24, + b' ' * 12, + b'hey mister!!', ]) output = model.output() @@ -64,6 +67,7 @@ field2: 12345 money: 3133.77 state_txt: IA state_num: IA +static1: hey mister!! ''')