Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from setuptools import setup
from sw_excel_parser import __version__


setup(
name='sw-excel-parser',
version=__version__,
Expand Down
2 changes: 1 addition & 1 deletion sw_excel_parser/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '0.0.1'
__version__ = '0.0.2'
6 changes: 3 additions & 3 deletions sw_excel_parser/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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)
Expand All @@ -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:
Expand Down
18 changes: 9 additions & 9 deletions sw_excel_parser/items.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -8,20 +9,19 @@ class ItemMeta(type):
def __init__(cls, *args, **kwargs):
super().__init__(*args, **kwargs)

unbound_fields = {}
for key, value in cls.__dict__.items():
if isinstance(value, fields.UnboundField):
unbound_fields[key] = value

cls._unbound_fields = unbound_fields
cls._unbound_fields = {}
for klass in cls.mro():
for key, value in klass.__dict__.items():
if isinstance(value, fields.UnboundField):
cls._unbound_fields[key] = value


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)


Expand All @@ -42,7 +42,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)
Expand Down
4 changes: 2 additions & 2 deletions sw_excel_parser/tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
12 changes: 6 additions & 6 deletions sw_excel_parser/tests/test_items.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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:
Expand Down
1 change: 0 additions & 1 deletion sw_excel_parser/tests/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down