Bumped version to 0.0.5

Fixed problem where fields contained shared values by
performing a shallow copy on all fields during Record instantiation.
That way, each record has its own copy of the field instances, rather
than the shared class-wide instance provided by the definition.
This commit is contained in:
Binh 2011-10-29 14:03:03 -05:00
parent 4023d46b4a
commit 7cb8bed61e
4 changed files with 28 additions and 23 deletions

View file

@ -1,6 +1,6 @@
from record import * from record import *
VERSION = (0, 0, 3) VERSION = (0, 0, 5)
RECORD_TYPES = [ RECORD_TYPES = [
'SubmitterRecord', 'SubmitterRecord',
@ -146,3 +146,16 @@ def verify_records(records):
verify_required_records(records) verify_required_records(records)
verify_record_order(records) verify_record_order(records)
def test_unique_fields():
r1 = EmployeeWageRecord()
r1.employee_first_name.value = "John Johnson"
r2 = EmployeeWageRecord()
print 'r1:', r1.employee_first_name.value, r1.employee_first_name, r1.employee_first_name.creation_counter
print 'r2:', r2.employee_first_name.value, r2.employee_first_name, r2.employee_first_name.creation_counter
if r1.employee_first_name.value == r2.employee_first_name.value:
raise ValidationError("Horrible problem involving shared values across records")

View file

@ -50,12 +50,6 @@ class Field(object):
self.value = s.strip() self.value = s.strip()
class FieldInterface(object):
def __init__(self, value_dict, field):
self.value_dict = value_dict
self.field = field
class TextField(Field): class TextField(Field):
def validate(self): def validate(self):
if self.value == None and self.required: if self.value == None and self.required:

View file

@ -1,33 +1,31 @@
from fields import Field, FieldWrapper from fields import Field
import copy
import pdb
class Model(object): class Model(object):
record_identifier = ' ' record_identifier = ' '
required = False required = False
def __init__(self): def __init__(self):
self.value_dict = {}
for (key, value) in self.__class__.__dict__.items(): for (key, value) in self.__class__.__dict__.items():
if isinstance(value, Field): if isinstance(value, Field):
field = getattr(self, key) # GRAB THE FIELD INSTANCE FROM THE CLASS DEFINITION
if not field.name: # AND MAKE A LOCAL COPY FOR THIS RECORD'S INSTANCE,
setattr(field, 'name', key) # OTHERWISE WE'LL END UP WITH VALUES BEING SHARED
setattr(field, 'parent_name', self.__class__.__name__) # ACROSS RECORDS.
src_field = self.__class__.__dict__[key]
if not src_field.name:
setattr(src_field, 'name', key)
setattr(src_field, 'parent_name', self.__class__.__name__)
self.__dict__[key] = copy.copy(src_field)
def __setattr__(self, key, value): def __setattr__(self, key, value):
print "Model.__setattr__", self, key, value
if hasattr(self, key) and isinstance(getattr(self, key), Field): if hasattr(self, key) and isinstance(getattr(self, key), Field):
getattr(self, key).value = value getattr(self, key).value = value
else: else:
# MAYBE THIS SHOULD RAISE A PROPERTY ERROR?
self.__dict__[key] = value self.__dict__[key] = value
def __getattribute__(self, key):
result = object.__getattribute__(self, key)
if isinstance(result, Field):
return FieldWrapper(self.value_dict, result)
return result
def get_fields(self): def get_fields(self):
fields = [] fields = []
for key in self.__class__.__dict__.keys(): for key in self.__class__.__dict__.keys():

View file

@ -1,6 +1,6 @@
from distutils.core import setup from distutils.core import setup
setup(name='pyaccuwage', setup(name='pyaccuwage',
version='0.0.4', version='0.0.5',
packages=['pyaccuwage'], packages=['pyaccuwage'],
zip_safe=True, zip_safe=True,
) )