Skip to content

Commit fc1b892

Browse files
authored
Merge pull request #31 from TTWShell/refactor
Refactor
2 parents f7c936c + 5c5e5e4 commit fc1b892

File tree

6 files changed

+122
-12
lines changed

6 files changed

+122
-12
lines changed

docs/api.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,19 @@ db
2323
.. automodule:: hobbit_core.flask_hobbit.db
2424
:members:
2525
:undoc-members:
26-
:exclude-members: SurrogatePK
26+
:exclude-members: SurrogatePK, EnumExt
2727

2828
.. autoclass:: SurrogatePK
2929
:members: __repr__
3030

31+
.. autoclass:: EnumExt
32+
:members:
33+
34+
.. automethod:: strict_dump
35+
.. automethod:: dump
36+
.. automethod:: load
37+
.. automethod:: to_opts
38+
3139
pagination
3240
^^^^^^^^^^
3341

hobbit_core/flask_hobbit/db.py

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- encoding: utf-8 -*-
22
import enum
3+
import six
34

45
from sqlalchemy import Integer, Column, ForeignKey, func, DateTime
56

@@ -61,29 +62,90 @@ def reference_col(tablename, nullable=False, pk_name='id', **kwargs):
6162

6263

6364
class EnumExt(enum.Enum):
64-
""" serialize/deserialize sqlalchemy enum field
65+
""" Extension for serialize/deserialize sqlalchemy enum field.
66+
67+
Be sure ``type(key)`` is ``int`` and ``type(value)`` is ``str``
68+
(``label = (key, value)``).
69+
70+
Examples::
71+
72+
class TaskState(EnumExt):
73+
# label = (key, value)
74+
CREATED = (0, '新建')
75+
PENDING = (1, '等待')
76+
STARTING = (2, '开始')
77+
RUNNING = (3, '运行中')
78+
FINISHED = (4, '已完成')
79+
FAILED = (5, '失败')
6580
"""
81+
6682
@classmethod
67-
def strict_dump(cls, key, verbose=False):
68-
pos = 1 if verbose else 0
69-
return cls[key].value[pos]
83+
def strict_dump(cls, label, verbose=False):
84+
"""Get key or value by label.
85+
86+
Examples::
87+
88+
TaskState.strict_dump('CREATED') # 0
89+
TaskState.strict_dump('CREATED', verbose=True) # '新建'
90+
91+
Returns:
92+
int|str: Key or value, If label not exist, raise ``KeyError``.
93+
"""
94+
95+
return cls[label].value[1 if verbose else 0]
7096

7197
@classmethod
72-
def dump(cls, key, verbose=False):
73-
ret = {'key': cls[key].value[0], 'value': cls[key].value[1]}
98+
def dump(cls, label, verbose=False):
99+
"""Dump one label to option.
100+
101+
Examples::
102+
103+
TaskState.dump('CREATED') # {'key': 0, 'value': '新建'}
104+
105+
Returns:
106+
107+
dict: Dict of label's key and value. If label not exist,
108+
raise ``KeyError``.
109+
"""
110+
111+
ret = {'key': cls[label].value[0], 'value': cls[label].value[1]}
74112
if verbose:
75-
ret.update({'label': key})
113+
ret.update({'label': label})
76114
return ret
77115

78116
@classmethod
79117
def load(cls, val):
80-
pos = 1 if isinstance(val, str) else 0
118+
"""Get label by key or value.
119+
120+
Examples::
121+
122+
TaskState.load(4) # 'FINISHED'
123+
TaskState.load('新建') # 'CREATED'
124+
125+
Returns:
126+
str|None: Label.
127+
"""
128+
129+
pos = 1 if isinstance(val, six.string_types) else 0
81130
for elem in cls:
82131
if elem.value[pos] == val:
83132
return elem.name
84133

85134
@classmethod
86135
def to_opts(cls, verbose=False):
136+
"""Enum to options.
137+
138+
Examples::
139+
140+
opts = TaskState.to_opts(verbose=True)
141+
print(opts)
142+
143+
[{'key': 0, 'label': 'CREATED', 'value': u'新建'}, ...]
144+
145+
Returns:
146+
list: List of dict which key is `key`, `value`, label.
147+
"""
148+
87149
opts = []
88150
for elem in cls:
89151
opt = {'key': elem.value[0], 'value': elem.value[1]}

hobbit_core/hobbit/static/bootstrap/shire/pytest.ini.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
env =
33
LASK_APP=app/run.py
44
FLASK_ENV=testing
5-
addopts = --cov . --cov-report term-missing -s -x -v -p no:warnings
5+
addopts = --cov . --cov-report term-missing -s -x -vv -p no:warnings

pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
[pytest]
2-
addopts = --cov hobbit_core --cov=tests --cov-report term-missing -s -x -v -p no:warnings
2+
addopts = --cov hobbit_core --cov=tests --cov-report term-missing -s -x -vv -p no:warnings

tests/test_db.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# -*- encoding: utf-8 -*-
2+
import pytest
3+
4+
from hobbit_core.flask_hobbit import db
5+
6+
from . import BaseTest
7+
8+
9+
class TestEnumExt(BaseTest):
10+
11+
@pytest.fixture
12+
def TaskState(self):
13+
class _TaskState(db.EnumExt):
14+
CREATED = (0, u'新建')
15+
FINISHED = (1, u'已完成')
16+
return _TaskState
17+
18+
def test_strict_dump(self, TaskState):
19+
assert 0 == TaskState.strict_dump('CREATED')
20+
assert u'新建' == TaskState.strict_dump('CREATED', True)
21+
22+
def test_dump(self, TaskState):
23+
assert {'key': 0, 'value': u'新建'} == TaskState.dump('CREATED')
24+
25+
def test_load(self, TaskState):
26+
assert 'FINISHED' == TaskState.load(1)
27+
assert 'CREATED' == TaskState.load(u'新建')
28+
assert TaskState.load(100) is None
29+
30+
def test_to_opts(self, TaskState):
31+
opts = TaskState.to_opts()
32+
assert opts == [
33+
{'key': 0, 'value': u'新建'},
34+
{'key': 1, 'value': u'已完成'},
35+
]
36+
opts = TaskState.to_opts(verbose=True)
37+
assert opts == [
38+
{'key': 0, 'label': 'CREATED', 'value': u'新建'},
39+
{'key': 1, 'label': 'FINISHED', 'value': u'已完成'},
40+
]

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ deps =
99
py27: ipython==5.8.0
1010
commands =
1111
flake8 .
12-
py.test --cov=hobbit_core --cov=tests --cov-report term-missing -s
12+
py.test

0 commit comments

Comments
 (0)