Skip to content

Commit 621efec

Browse files
committed
Implement AdapterMethodField; close #13
1 parent 115b5dc commit 621efec

4 files changed

Lines changed: 47 additions & 3 deletions

File tree

adapters/fields.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
__all__ = [
13+
'AdapterMethodField',
1314
'BooleanField',
1415
'CharField',
1516
'DateField',
@@ -22,6 +23,19 @@
2223
]
2324

2425

26+
class AdapterMethodField(BaseField):
27+
def __init__(self, method_name=None):
28+
self.method_name = method_name
29+
30+
def bind(self, field_name, adapter):
31+
self.field_name = field_name
32+
self.adapter = adapter
33+
34+
def get_attribute(self, obj):
35+
metod_name = self.method_name or 'get_' + self.field_name
36+
return getattr(self.adapter, metod_name)(obj)
37+
38+
2539
class BooleanField(BaseField):
2640
def adapt(self, data):
2741
return bool(data)

tests/fixtures.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,22 @@ class PersonDictAdapter(adapters.Adapter):
5858
class ListToDictAdapter(adapters.Adapter):
5959
first_name = adapters.VerbatimField(source='0')
6060
last_name = adapters.VerbatimField(source='2')
61+
62+
63+
class MethodicalAdapter(adapters.Adapter):
64+
min = adapters.AdapterMethodField()
65+
max = adapters.AdapterMethodField()
66+
sum = adapters.AdapterMethodField(method_name='compute_sum')
67+
avg = adapters.AdapterMethodField(method_name='compute_avg')
68+
69+
def get_min(self, data):
70+
return min(data)
71+
72+
def get_max(self, data):
73+
return max(data)
74+
75+
def compute_sum(self, data):
76+
return sum(data)
77+
78+
def compute_avg(self, data):
79+
return sum(data) / len(data)

tests/test_adapter.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# -*- coding: utf-8 -*-
22

33
from __future__ import unicode_literals
4-
from __future__ import absolute_import
54

65
import unittest
76

tests/test_fields.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
from decimal import Decimal
77
import unittest
88

9-
import adapters
10-
119
import dateutil.tz
1210

11+
import adapters
12+
import fixtures
13+
1314

1415
class FieldsTest(unittest.TestCase):
1516
def test_char_field(self):
@@ -129,3 +130,14 @@ def test_datetime_field_from_string(self):
129130
actual = adapters.DateTimeField().adapt(data)
130131
expected = datetime.datetime(1986, 7, 25, 13, 14)
131132
self.assertEqual(actual, expected)
133+
134+
def test_adapter_method_field(self):
135+
data = [1, 2, 3, 4, 5]
136+
actual = fixtures.MethodicalAdapter().adapt(data)
137+
expected = {
138+
'min': 1,
139+
'max': 5,
140+
'sum': 15,
141+
'avg': 3,
142+
}
143+
self.assertDictEqual(actual, expected)

0 commit comments

Comments
 (0)