Added load/dump methods which work similarly to those found in
simplejson. Tests seem to work so far. Still need to figure out how to get data into the records in some easy way.
This commit is contained in:
parent
a32feb79ed
commit
068f1bbae4
4 changed files with 118 additions and 34 deletions
47
fields.py
47
fields.py
|
@ -1,3 +1,4 @@
|
|||
import decimal
|
||||
|
||||
class ValidationError(Exception):
|
||||
pass
|
||||
|
@ -15,10 +16,10 @@ class Field(object):
|
|||
Field.creation_counter += 1
|
||||
|
||||
def validate(self):
|
||||
raise NotImplemented()
|
||||
raise NotImplemented
|
||||
|
||||
def get_data(self):
|
||||
raise NotImplemented()
|
||||
raise NotImplemented
|
||||
|
||||
def __setvalue(self, value):
|
||||
self._value = value
|
||||
|
@ -28,8 +29,16 @@ class Field(object):
|
|||
|
||||
value = property(__getvalue, __setvalue)
|
||||
|
||||
def __repr__(self):
|
||||
return self.name
|
||||
def read(self, fp):
|
||||
if fp.tell() + self.max_length <= fp.len:
|
||||
data = fp.read(self.max_length)
|
||||
print self, self.max_length, data
|
||||
return self.parse(data)
|
||||
return None
|
||||
|
||||
def parse(self, s):
|
||||
self.value = s.strip()
|
||||
|
||||
|
||||
class TextField(Field):
|
||||
def validate(self):
|
||||
|
@ -44,14 +53,17 @@ class TextField(Field):
|
|||
value = value.upper()
|
||||
return value.ljust(self.max_length).encode('ascii')
|
||||
|
||||
|
||||
class StateField(TextField):
|
||||
def __init__(self, name=None, required=True):
|
||||
return super(StateField, self).__init__(name=name, max_length=2, required=required)
|
||||
|
||||
|
||||
class EmailField(TextField):
|
||||
def __init__(self, name=None, required=True, max_length=None):
|
||||
return super(EmailField, self).__init__(name=name, max_length=max_length,
|
||||
required=required, uppercase=False)
|
||||
|
||||
class NumericField(TextField):
|
||||
def validate(self):
|
||||
super(NumericField, self).validate()
|
||||
|
@ -59,24 +71,46 @@ class NumericField(TextField):
|
|||
int(self.value)
|
||||
except ValueError:
|
||||
raise ValidationError("field contains non-numeric characters")
|
||||
|
||||
|
||||
def get_data(self):
|
||||
value = self.value or ""
|
||||
return value.zfill(self.max_length)
|
||||
|
||||
def parse(self, s):
|
||||
self.value = int(s)
|
||||
|
||||
|
||||
class StaticField(TextField):
|
||||
def __init__(self, name=None, required=True, value=None):
|
||||
super(StaticField, self).__init__(name=name, required=required,
|
||||
max_length=len(value))
|
||||
self._value = value
|
||||
|
||||
def parse(self, s):
|
||||
print 'STATIC', self.max_length, s, len(s)
|
||||
pass
|
||||
|
||||
class BlankField(TextField):
|
||||
def get_data(self):
|
||||
return " " * self.max_length
|
||||
|
||||
def parse(self, s):
|
||||
pass
|
||||
|
||||
class BooleanField(Field):
|
||||
def __init__(self, name=None, required=True, value=None):
|
||||
super(BooleanField, self).__init__(name=name, required=required, max_length=1)
|
||||
self._value = value
|
||||
|
||||
def validate(self):
|
||||
pass
|
||||
|
||||
def get_data(self):
|
||||
return '1' if self._value else '0'
|
||||
|
||||
def parse(self, s):
|
||||
self.value = (s == '1')
|
||||
|
||||
class MoneyField(Field):
|
||||
def validate(self):
|
||||
if self.value == None and self.required:
|
||||
|
@ -87,3 +121,6 @@ class MoneyField(Field):
|
|||
def get_data(self):
|
||||
return str(int((self.value or 0)*100)).encode('ascii').zfill(self.max_length)
|
||||
|
||||
def parse(self, s):
|
||||
self.value = decimal.Decimal(s) * decimal.Decimal('0.01')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue