def test_populate_defaults(self): class Foo(dict): field = Field(default="foo") foo = Foo() populate_defaults(foo) self.assertEqual("foo", foo.field) self.assertEqual("foo", foo["field"])
def test_serialize_none_value(self): class Model(dict): field = Field(serialize=lambda x, y: str(y), default=None) model = Model() populate_defaults(model) self.assertEqual(None, model["field"]) self.assertEqual(None, model.field) # but falsy values should still be serialized... model.field = 0 self.assertEqual('0', model["field"])
def __new__(cls, *args, **kwargs): # caching fields and required fields on the model # so we don't have to discover every time. if not hasattr(cls, "_fields"): fields = [] required_fields = [] for field_name, field in get_all_fields(cls): fields.append(field_name) if field.required: required_fields.append(field_name) cls._fields = set(fields) cls._required_fields = set(required_fields) instance = super(Model, cls).__new__(cls) instance._data = {} populate_defaults(instance) return instance