From 9733816dcfd3cb6e804317fd20b68d59e37c4c6c Mon Sep 17 00:00:00 2001 From: bm0 Date: Thu, 7 Dec 2017 04:48:58 +0300 Subject: [PATCH 1/2] improved fields --- setup.py | 1 - sw_excel_parser/items.py | 16 +++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index 6fbebf9..045fe6a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,6 @@ from setuptools import setup from sw_excel_parser import __version__ - setup( name='sw-excel-parser', version=__version__, diff --git a/sw_excel_parser/items.py b/sw_excel_parser/items.py index e66923a..1cf0884 100644 --- a/sw_excel_parser/items.py +++ b/sw_excel_parser/items.py @@ -1,4 +1,5 @@ from typing import Any, Dict +from collections import OrderedDict from sw_excel_parser import fields from sw_excel_parser import validators @@ -7,21 +8,22 @@ class ItemMeta(type): def __init__(cls, *args, **kwargs): super().__init__(*args, **kwargs) + cls._unbound_fields = None unbound_fields = {} - for key, value in cls.__dict__.items(): - if isinstance(value, fields.UnboundField): - unbound_fields[key] = value - + for klass in cls.mro(): + for key, value in klass.__dict__.items(): + if isinstance(value, fields.UnboundField): + unbound_fields[key] = value cls._unbound_fields = unbound_fields class BaseItem: def __init__(self, fields, *args, **kwargs): - self._fields = {} + self.fields = OrderedDict() for name, unbound_field in fields.items(): bound_field = unbound_field.bind(item=self, name=name) - self._fields[name] = bound_field + self.fields[name] = bound_field setattr(self, name, bound_field) @@ -42,7 +44,7 @@ def validate(self) -> None: self.errors.clear() self.cleaned_data.clear() - for name, field in self._fields.items(): + for name, field in self.fields.items(): try: value = field.clean(self.data) field_cleaner = getattr(self, 'clean_{}'.format(name), None) From f7b5a40673c944389f8c24e589dc5774c9388b1e Mon Sep 17 00:00:00 2001 From: bm0 Date: Thu, 7 Dec 2017 08:41:34 +0300 Subject: [PATCH 2/2] fixed tests --- sw_excel_parser/__init__.py | 2 +- sw_excel_parser/fields.py | 6 +++--- sw_excel_parser/items.py | 6 ++---- sw_excel_parser/tests/test_fields.py | 4 ++-- sw_excel_parser/tests/test_items.py | 12 ++++++------ sw_excel_parser/tests/test_validators.py | 1 - 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/sw_excel_parser/__init__.py b/sw_excel_parser/__init__.py index b8023d8..d18f409 100644 --- a/sw_excel_parser/__init__.py +++ b/sw_excel_parser/__init__.py @@ -1 +1 @@ -__version__ = '0.0.1' +__version__ = '0.0.2' diff --git a/sw_excel_parser/fields.py b/sw_excel_parser/fields.py index 55c0ec8..15207aa 100644 --- a/sw_excel_parser/fields.py +++ b/sw_excel_parser/fields.py @@ -14,7 +14,7 @@ def __init__(self, field_class: Type['Field'], *args, **kwargs): self.kwargs = kwargs def bind(self, item, name: str) -> 'Field': - return self.field_class(*self.args, **dict(self.kwargs, _item=item, _name=name)) + return self.field_class(*self.args, **dict(self.kwargs, _item=item, name=name)) def __repr__(self): return '<{cls} ({field_cls} (args={args}, kwargs={kwargs}))>'.format( @@ -31,7 +31,7 @@ class Field: ] def __new__(cls, *args, **kwargs): - if '_item' and '_name' in kwargs: + if '_item' and 'name' in kwargs: instance = super().__new__(cls) else: instance = UnboundField(cls, *args, **kwargs) @@ -45,7 +45,7 @@ def __init__(self, header: str, required: bool = True, validators: List = list() self.value = None self._item = kwargs.get('_item') - self._name = kwargs.get('_name') + self.name = kwargs.get('name') def run_validators(self, value: Any) -> Any: for validator in self.validators: diff --git a/sw_excel_parser/items.py b/sw_excel_parser/items.py index 1cf0884..53d2b2e 100644 --- a/sw_excel_parser/items.py +++ b/sw_excel_parser/items.py @@ -8,14 +8,12 @@ class ItemMeta(type): def __init__(cls, *args, **kwargs): super().__init__(*args, **kwargs) - cls._unbound_fields = None - unbound_fields = {} + cls._unbound_fields = {} for klass in cls.mro(): for key, value in klass.__dict__.items(): if isinstance(value, fields.UnboundField): - unbound_fields[key] = value - cls._unbound_fields = unbound_fields + cls._unbound_fields[key] = value class BaseItem: diff --git a/sw_excel_parser/tests/test_fields.py b/sw_excel_parser/tests/test_fields.py index 4dfb94c..2287245 100644 --- a/sw_excel_parser/tests/test_fields.py +++ b/sw_excel_parser/tests/test_fields.py @@ -40,8 +40,8 @@ def test_unbound_field(self): self.assertTrue(field_kwargs['required'] == field.required) def test_field(self): - self.assertTrue(all(field._item is self.test_item) for field in self.test_item._fields.values()) - self.assertTrue(all(key == value._name for key, value in self.test_item._fields.items())) + self.assertTrue(all(field._item is self.test_item) for field in self.test_item.fields.values()) + self.assertTrue(all(key == value.name for key, value in self.test_item.fields.items())) class FieldTestCase(TestCase): diff --git a/sw_excel_parser/tests/test_items.py b/sw_excel_parser/tests/test_items.py index 046d8e0..dc49e93 100644 --- a/sw_excel_parser/tests/test_items.py +++ b/sw_excel_parser/tests/test_items.py @@ -17,8 +17,8 @@ class TestEmptyItem(items.Item): item = TestEmptyItem(row=random.randint(1, 100)) - self.assertTrue(hasattr(item, '_fields')) - self.assertEqual(item._fields, {}) + self.assertTrue(hasattr(item, 'fields')) + self.assertEqual(item.fields, {}) def test_item(self): class TestItem(items.Item): @@ -29,15 +29,15 @@ def clean_foo(self, value): return value self.assertTrue(hasattr(TestItem, '_unbound_fields')) - self.assertFalse(hasattr(TestItem, '_fields')) + self.assertFalse(hasattr(TestItem, 'fields')) self.assertEqual(len(TestItem._unbound_fields), 2) self.assertTrue(all(isinstance(field, fields.UnboundField) for field in TestItem._unbound_fields.values())) item = TestItem(row=random.randint(1, 100), data=dict(foo='foo', bar='bar')) - self.assertTrue(hasattr(item, '_fields')) - self.assertEqual(len(item._fields), 2) - self.assertTrue(all(isinstance(field, fields.Field) for field in item._fields.values())) + self.assertTrue(hasattr(item, 'fields')) + self.assertEqual(len(item.fields), 2) + self.assertTrue(all(isinstance(field, fields.Field) for field in item.fields.values())) self.assertTrue(item.is_valid()) with mock.patch.object(TestItem, 'clean_foo') as mocked_cleaner: diff --git a/sw_excel_parser/tests/test_validators.py b/sw_excel_parser/tests/test_validators.py index e4ed56f..5b1a529 100644 --- a/sw_excel_parser/tests/test_validators.py +++ b/sw_excel_parser/tests/test_validators.py @@ -10,7 +10,6 @@ def setUp(self): self.validator = validators.RequiredValidator() self.field = mock.Mock(spec=fields.Field, required=True) - def test_validator(self): value = 'testValue' self.assertEqual(self.validator(self.field, value), value)