Skip to content

Commit cb57ca0

Browse files
authored
Merge pull request #37 from TTWShell/enhance/enum-check
add EnumExtMeta for check Enum define
2 parents cda386b + 0b2867b commit cb57ca0

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

hobbit_core/flask_hobbit/db.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- encoding: utf-8 -*-
2-
import enum
2+
from enum import Enum, EnumMeta
33
import six
44

55
from sqlalchemy import Integer, Column, ForeignKey, func, DateTime
@@ -61,7 +61,28 @@ def reference_col(tablename, nullable=False, pk_name='id', **kwargs):
6161
nullable=nullable, **kwargs)
6262

6363

64-
class EnumExt(enum.Enum):
64+
class EnumExtMeta(EnumMeta):
65+
66+
def __new__(cls, name, bases, attrs):
67+
obj = super(EnumExtMeta, cls).__new__(cls, name, bases, attrs)
68+
69+
keys, values = set(), set()
70+
for name, member in obj.__members__.items():
71+
member = member.value
72+
if not isinstance(member, tuple) or len(member) != 2:
73+
raise TypeError(
74+
'EnumExt member must be tuple type and length equal 2.')
75+
key, value = member
76+
if key in keys or value in values:
77+
raise ValueError('duplicate values found: `{}`, please check '
78+
'key or value.'.format(member))
79+
keys.add(key)
80+
values.add(key)
81+
82+
return obj
83+
84+
85+
class EnumExt(six.with_metaclass(EnumExtMeta, Enum)):
6586
""" Extension for serialize/deserialize sqlalchemy enum field.
6687
6788
Be sure ``type(key)`` is ``int`` and ``type(value)`` is ``str``

tests/test_db.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@
88

99
class TestEnumExt(BaseTest):
1010

11+
def test_key_index(self):
12+
msg = "EnumExt member must be tuple type and length equal 2."
13+
with pytest.raises(TypeError, message=msg):
14+
class ErrTypeEnum(db.EnumExt):
15+
CREATED = (0, u'新建', 'dda')
16+
17+
msg = "ValueError: duplicate values found: `(0, '已完成')`, " + \
18+
"please check key or value."
19+
with pytest.raises(ValueError, message=msg):
20+
class ErrEnum(db.EnumExt):
21+
CREATED = (0, u'新建')
22+
FINISHED = (0, u'已完成')
23+
1124
@pytest.fixture
1225
def TaskState(self):
1326
class _TaskState(db.EnumExt):

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ envlist = py27,py36,py37
55
deps =
66
pytest
77
pytest-cov
8+
pytest-env
89
flake8
910
py27: ipython==5.8.0
1011
commands =

0 commit comments

Comments
 (0)