Skip to content

Commit 4b9089a

Browse files
committed
Issue #22: Reviewer's suggestions.
1 parent ab3f2e3 commit 4b9089a

File tree

3 files changed

+51
-43
lines changed

3 files changed

+51
-43
lines changed

domain_models/fields.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,82 +37,90 @@ def bind_model_cls(self, model_cls):
3737
'could not be rebound to "{2}"'.format(
3838
self, self.model_cls, model_cls))
3939
self.model_cls = model_cls
40-
return self.name, self
40+
return self
4141

4242
def init_model(self, model, value):
4343
"""Init model with field."""
4444
if value is None and self.default is not None:
4545
value = self.default() if callable(self.default) else self.default
46-
value = self.converter(value)
46+
value = self._converter(value)
4747

4848
if value is None and self.required:
4949
raise AttributeError("This field is required.")
5050

5151
setattr(model, self.storage_name, value)
5252

53-
def get_value(self, model):
54-
"""Return field's value."""
55-
return getattr(model, self.storage_name)
53+
def get_value(self, model, default=None):
54+
"""Return field's value.
55+
56+
:param DomainModel model:
57+
:param mixed default:
58+
"""
59+
if default is not None:
60+
default = self._converter(default)
61+
62+
value = getattr(model, self.storage_name)
63+
return value if value is not None else default
5664

5765
def set_value(self, model, value):
5866
"""Set field's value."""
5967
if value is None and self.required:
6068
raise AttributeError("This field is required.")
6169

6270
if value is not None:
63-
value = self.converter(value)
71+
value = self._converter(value)
6472

6573
setattr(model, self.storage_name, value)
6674

67-
def converter(self, value):
75+
def _converter(self, value):
6876
"""Convert raw input value of the field."""
6977
return value
7078

7179

7280
class Bool(Field):
7381
"""Bool field."""
7482

75-
def converter(self, value):
83+
def _converter(self, value):
7684
"""Convert raw input value of the field."""
7785
return bool(value)
7886

7987

8088
class Int(Field):
8189
"""Int field."""
8290

83-
def converter(self, value):
91+
def _converter(self, value):
8492
"""Convert raw input value of the field."""
8593
return int(value)
8694

8795

8896
class Float(Field):
8997
"""Float field."""
9098

91-
def converter(self, value):
99+
def _converter(self, value):
92100
"""Convert raw input value of the field."""
93101
return float(value)
94102

95103

96104
class String(Field):
97105
"""String field."""
98106

99-
def converter(self, value):
107+
def _converter(self, value):
100108
"""Convert raw input value of the field."""
101109
return str(value)
102110

103111

104112
class Binary(Field):
105113
"""Binary field."""
106114

107-
def converter(self, value):
115+
def _converter(self, value):
108116
"""Convert raw input value of the field."""
109117
return six.binary_type(value)
110118

111119

112120
class Date(Field):
113121
"""Date field."""
114122

115-
def converter(self, value):
123+
def _converter(self, value):
116124
"""Convert raw input value of the field."""
117125
if not isinstance(value, datetime.date):
118126
raise TypeError('{0} is not valid date'.format(value))
@@ -122,7 +130,7 @@ def converter(self, value):
122130
class DateTime(Field):
123131
"""Date and time field."""
124132

125-
def converter(self, value):
133+
def _converter(self, value):
126134
"""Convert raw input value of the field."""
127135
if not isinstance(value, datetime.datetime):
128136
raise TypeError('{0} is not valid date and time')
@@ -138,7 +146,7 @@ def __init__(self, related_model_cls, default=None, required=False):
138146

139147
self.related_model_cls = related_model_cls
140148

141-
def converter(self, value):
149+
def _converter(self, value):
142150
"""Convert raw input value of the field."""
143151
if not isinstance(value, self.related_model_cls):
144152
raise TypeError('{0} is not valid model instance, instance of '
@@ -155,7 +163,7 @@ def __init__(self, related_model_cls, default=None, required=False):
155163
super(Collection, self).__init__(default=default, required=required)
156164
self.related_model_cls = related_model_cls
157165

158-
def converter(self, value):
166+
def _converter(self, value):
159167
"""Convert raw input value of the field."""
160168
if type(value) is not self.related_model_cls.Collection:
161169
value = self.related_model_cls.Collection(value)

domain_models/models.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ def prepare_fields_attribute(attribute_name, attributes, class_name):
6363
@staticmethod
6464
def bind_fields_to_model_cls(cls, model_fields):
6565
"""Bind fields to model class."""
66-
return dict(field.bind_model_cls(cls) for field in model_fields)
66+
return dict(
67+
(field.name, field.bind_model_cls(cls)) for field in model_fields)
6768

6869
@staticmethod
6970
def bind_collection_to_model_cls(cls):
@@ -91,9 +92,9 @@ class DomainModel(object):
9192
9293
.. py:attribute:: __fields__
9394
94-
Tuple of all model fields.
95+
Dictionary of all model fields.
9596
96-
:type: tuple[fields.Field]
97+
:type: dict[str, fields.Field]
9798
9899
.. py:attribute:: __unique_key__
99100
@@ -194,24 +195,17 @@ def get(self, field_name, default=None):
194195
one of the existent fields, the result is the value of that field.
195196
For example, `model.get('foobar')` is equivalent to `model.foobar`.
196197
If the filed does not have a value, `default` is returned if provided.
197-
It will raise `AttributeError` if `default` can not be converted to
198-
right type value.
198+
It will raise `TypeError` or `ValueError` if `default` can not be
199+
converted to right type value.
199200
If the field does not exist, `AttributeError` is raised as well.
200201
201202
:param string field_name:
202203
:param mixed default:
203204
"""
204-
if not hasattr(self, field_name):
205+
try:
206+
field = self.__class__.__fields__[field_name]
207+
except KeyError:
205208
raise AttributeError(
206-
"Model doesn't have a field '{name}'".format(name=field_name))
207-
208-
if default is not None:
209-
try:
210-
field = self.__class__.__fields__[field_name]
211-
default = field.converter(default)
212-
except (TypeError, ValueError):
213-
raise AttributeError(
214-
"default can not be converted to right type value")
215-
216-
value = getattr(self, field_name)
217-
return value if value is not None else default
209+
"Field {0} does not exist.".format(field_name))
210+
else:
211+
return field.get_value(self, default)

tests/test_models.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,12 @@ class Model(models.DomainModel):
198198
self.assertEqual(model.get('field', default=value), int(value))
199199

200200
for value in ['', u'baz']:
201-
with self.assertRaises(AttributeError):
201+
with self.assertRaises(ValueError):
202202
model.get('field', value)
203-
self.fail("Failed with {value}".format(value=str(value)))
203+
self.fail("Failed with {0}".format(value))
204+
205+
with self.assertRaises(TypeError):
206+
model.get('field', object())
204207

205208
def test_get_method_on_string(self):
206209
"""Test method get on String of Model."""
@@ -257,10 +260,13 @@ class Model(models.DomainModel):
257260
for value in valid_defaults:
258261
self.assertEqual(model.get('field', default=value), float(value))
259262

260-
for value in ['', 'baz', u'baz', datetime]:
261-
with self.assertRaises(AttributeError):
263+
for value in ['', 'baz', u'baz']:
264+
with self.assertRaises(ValueError):
262265
model.get('field', value)
263-
self.fail("Failed with {value}".format(value=str(value)))
266+
self.fail("Failed with {0}".format(value))
267+
268+
with self.assertRaises(TypeError):
269+
model.get('field', object())
264270

265271
def test_get_method_on_date(self):
266272
"""Test method get on Date of Model."""
@@ -280,9 +286,9 @@ class Model(models.DomainModel):
280286
self.assertEqual(model.get('field', once), once)
281287

282288
for value in ['', 'baz', u'baz', 0, 3, 0.7, '.5', False, True]:
283-
with self.assertRaises(AttributeError):
289+
with self.assertRaises(TypeError):
284290
model.get('field', value)
285-
self.fail("Failed with {value}".format(value=str(value)))
291+
self.fail("Failed with {0}".format(value))
286292

287293
def test_get_method_on_datetime(self):
288294
"""Test method get on Date of Model."""
@@ -302,9 +308,9 @@ class Model(models.DomainModel):
302308
self.assertEqual(model.get('field', once), once)
303309

304310
for value in ['', 'baz', u'baz', 0, 3, 0.7, '.5', False, True]:
305-
with self.assertRaises(AttributeError):
311+
with self.assertRaises(TypeError):
306312
model.get('field', value)
307-
self.fail("Failed with {value}".format(value=str(value)))
313+
self.fail("Failed with {0}".format(value))
308314

309315
def test_get_method_on_binary(self):
310316
"""Test method get on Binary of Model."""

0 commit comments

Comments
 (0)