irongit

A parser inspired by the django orm.

null and default work

huncholanehuncholaneauthored
parent a961a06commit dac1deacd4c4a2492f90295db7ed756e8572f4b5Browse files

4 files changed, +43 -10

+9-1parsers/fields.py
@@ -1,4 +1,5 @@
11 from . import translators
2+import datetime as dt
23
34
45 def default_function(cls, x):
@@ -7,21 +8,26 @@ def default_function(cls, x):
78
89 class Field:
910 translator = default_function
11+ type = str
1012
11- def __init__(self, translator=None, unique=False):
13+ def __init__(self, translator=None, unique=False, default=None, null=False):
1214 if translator:
1315 self.translator = translator
1416 self.unique = unique
17+ self.default = default
18+ self.null = null
1519
1620 def convert(self, val):
1721 return self.translator(val)
1822
1923
2024 class HourMinuteDeltaField(Field):
25+ type = dt.timedelta
2126 translator = translators.hour_minute_to_delta
2227
2328
2429 class HourMinuteIntField(Field):
30+ type = int
2531 translator = translators.hour_minute_to_int
2632
2733
@@ -34,10 +40,12 @@ class StrField(Field):
3440
3541
3642 class IntField(Field):
43+ type = int
3744 translator = int
3845
3946
4047 class FloatField(Field):
48+ type = float
4149 translator = float
4250
4351
+17-3parsers/parser.py
@@ -11,8 +11,18 @@ class Parser:
1111 unique_together = []
1212
1313 def __init__(self, **kwargs):
14- self.unique_fields = [key for key,
15- val in self.field_items() if val.unique]
14+ self.unique_fields = []
15+ for key, val in self.field_items():
16+ if val.unique:
17+ self.unique_fields.append(key)
18+ if val.null:
19+ kwargs[key] = kwargs.get(key)
20+ if val.default:
21+ if type(val.default) != val.type:
22+ raise TypeError(
23+ f'{key} default should be of type {val.type}')
24+ if not kwargs.get(key):
25+ kwargs[key] = val.default
1626 self.objects.set_cls(type(self))
1727 missing_fields = set(self.fields())-set(kwargs)
1828 if 'id' not in missing_fields:
@@ -25,7 +35,11 @@ class Parser:
2535 raise ExtraFieldsParseError(self, extra_fields)
2636 kwargs['id'] = self.objects.count()
2737 for name, field in self.field_items():
28- setattr(self, name, field.convert(kwargs[name]))
38+ val = kwargs[name]
39+ if type(val) == str:
40+ setattr(self, name, field.convert(val))
41+ else:
42+ setattr(self, name, val)
2943
3044 def save(self):
3145 self.objects.raise_unique_constraints(self)
+0-0tests/__init__.py

No content changes (mode or rename only).

+17-6tests/test_create.py
@@ -2,15 +2,26 @@ import parsers
22 import unittest
33
44
5-class Test(parsers.Parser):
6- a = parsers.Field()
7-
8-
95 class TestCreate(unittest.TestCase):
106
117 def test_create(self):
12- t = Test('a')
8+ class Test(parsers.Parser):
9+ a = parsers.Field()
10+ t = Test(a='a')
1311 self.assertEqual(t.a, 'a')
1412
1513 def test_nullable(self):
16- pass
14+ class Test(parsers.Parser):
15+ a = parsers.Field(null=True)
16+ b = parsers.Field()
17+ t = Test(b='32')
18+ self.assertEqual(t.a, None)
19+ self.assertEqual(t.b, '32')
20+
21+ def test_default(self):
22+ class Test(parsers.Parser):
23+ a = parsers.Field(default='sdff')
24+ b = parsers.Field()
25+ t = Test(b='f')
26+ self.assertEqual(t.a, 'sdff')
27+ self.assertEqual(t.b, 'f')