summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorJon Snyder <snyder.jon@gmail.com>2018-01-17 16:37:59 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2018-02-07 21:22:27 -0500
commita54b3bb0a8a3a33c4c68349484ef4f3dc915416e (patch)
tree6f34531039642ee92932c0b565269cb43ea7f11f /test/sql
parentba957f84d333918ca34d562b407cc6d65bccbccb (diff)
downloadsqlalchemy-a54b3bb0a8a3a33c4c68349484ef4f3dc915416e.tar.gz
Add values_callable feature to Enum
Added support for :class:`.Enum` to persist the values of the enumeration, rather than the keys, when using a Python pep-435 style enumerated object. The user supplies a callable function that will return the string values to be persisted. This allows enumerations against non-string values to be value-persistable as well. Pull request courtesy Jon Snyder. Pull-request: https://github.com/zzzeek/sqlalchemy/pull/410 Fixes: #3906 Change-Id: Id385465d215d1e5baaad68368b168afdd846b82c
Diffstat (limited to 'test/sql')
-rw-r--r--test/sql/test_types.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/test/sql/test_types.py b/test/sql/test_types.py
index fa917c466..002094f7b 100644
--- a/test/sql/test_types.py
+++ b/test/sql/test_types.py
@@ -1170,9 +1170,24 @@ class EnumTest(AssertsCompiledSQL, fixtures.TablesTest):
self.__members__[alias] = self
setattr(self.__class__, alias, self)
+ class SomeOtherEnum(SomeEnum):
+ __members__ = OrderedDict()
+
one = SomeEnum('one', 1)
two = SomeEnum('two', 2)
three = SomeEnum('three', 3, 'four')
+ a_member = SomeEnum('AMember', 'a')
+ b_member = SomeEnum('BMember', 'b')
+
+ other_one = SomeOtherEnum('one', 1)
+ other_two = SomeOtherEnum('two', 2)
+ other_three = SomeOtherEnum('three', 3)
+ other_a_member = SomeOtherEnum('AMember', 'a')
+ other_b_member = SomeOtherEnum('BMember', 'b')
+
+ @staticmethod
+ def get_enum_string_values(some_enum):
+ return [str(v.value) for v in some_enum.__members__.values()]
@classmethod
def define_tables(cls, metadata):
@@ -1197,6 +1212,14 @@ class EnumTest(AssertsCompiledSQL, fixtures.TablesTest):
Column('someenum', Enum(cls.SomeEnum))
)
+ Table(
+ 'stdlib_enum_table2', metadata,
+ Column("id", Integer, primary_key=True),
+ Column('someotherenum',
+ Enum(cls.SomeOtherEnum,
+ values_callable=EnumTest.get_enum_string_values))
+ )
+
def test_python_type(self):
eq_(types.Enum(self.SomeEnum).python_type, self.SomeEnum)
@@ -1521,6 +1544,27 @@ class EnumTest(AssertsCompiledSQL, fixtures.TablesTest):
]
)
+ def test_pep435_enum_values_callable_round_trip(self):
+ stdlib_enum_table_custom_values =\
+ self.tables['stdlib_enum_table2']
+
+ stdlib_enum_table_custom_values.insert().execute([
+ {'id': 1, 'someotherenum': self.SomeOtherEnum.AMember},
+ {'id': 2, 'someotherenum': self.SomeOtherEnum.BMember},
+ {'id': 3, 'someotherenum': self.SomeOtherEnum.AMember}
+ ])
+
+ eq_(
+ stdlib_enum_table_custom_values.select().
+ order_by(stdlib_enum_table_custom_values.c.id).execute().
+ fetchall(),
+ [
+ (1, self.SomeOtherEnum.AMember),
+ (2, self.SomeOtherEnum.BMember),
+ (3, self.SomeOtherEnum.AMember)
+ ]
+ )
+
def test_adapt(self):
from sqlalchemy.dialects.postgresql import ENUM
e1 = Enum('one', 'two', 'three', native_enum=False)
@@ -1544,7 +1588,13 @@ class EnumTest(AssertsCompiledSQL, fixtures.TablesTest):
is_(e1.adapt(Enum).metadata, e1.metadata)
e1 = Enum(self.SomeEnum)
eq_(e1.adapt(ENUM).name, 'someenum')
- eq_(e1.adapt(ENUM).enums, ['one', 'two', 'three', 'four'])
+ eq_(e1.adapt(ENUM).enums,
+ ['one', 'two', 'three', 'four', 'AMember', 'BMember'])
+
+ e1_vc = Enum(self.SomeOtherEnum,
+ values_callable=EnumTest.get_enum_string_values)
+ eq_(e1_vc.adapt(ENUM).name, 'someotherenum')
+ eq_(e1_vc.adapt(ENUM).enums, ['1', '2', '3', 'a', 'b'])
@testing.provide_metadata
def test_create_metadata_bound_no_crash(self):