diff options
| author | Jon Snyder <snyder.jon@gmail.com> | 2018-01-17 16:37:59 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-02-07 21:22:27 -0500 |
| commit | a54b3bb0a8a3a33c4c68349484ef4f3dc915416e (patch) | |
| tree | 6f34531039642ee92932c0b565269cb43ea7f11f /test/sql | |
| parent | ba957f84d333918ca34d562b407cc6d65bccbccb (diff) | |
| download | sqlalchemy-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.py | 52 |
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): |
