From bb54360ce20d12ef610d9ca32b3ea9016b777692 Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Tue, 14 Jan 2014 10:47:46 +0200 Subject: [PATCH] More tests for range coercion --- sqlalchemy_utils/types/range.py | 20 +++++++++++++++----- tests/types/test_int_range.py | 12 ++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/sqlalchemy_utils/types/range.py b/sqlalchemy_utils/types/range.py index 9451d7f..205624e 100644 --- a/sqlalchemy_utils/types/range.py +++ b/sqlalchemy_utils/types/range.py @@ -36,12 +36,18 @@ class RangeComparator(types.TypeEngine.Comparator): @classmethod def coerce_arg(cls, func): def operation(self, other, **kwargs): - if other is None: - return getattr(types.TypeEngine.Comparator, func)( - self, other, **kwargs - ) + coerced_types = ( + self.type.interval_class.type, + tuple, + list, + str, + unicode + ) + + if isinstance(other, coerced_types): + other = self.type.interval_class(other) return getattr(types.TypeEngine.Comparator, func)( - self, self.type.interval_class(other), **kwargs + self, other, **kwargs ) return operation @@ -144,6 +150,10 @@ class IntRangeType(RangeType): ) print total # '30-140' + + Good reading: + + http://wiki.postgresql.org/images/f/f0/Range-types.pdf """ impl = INT4RANGE diff --git a/tests/types/test_int_range.py b/tests/types/test_int_range.py index 65397e1..596a25e 100644 --- a/tests/types/test_int_range.py +++ b/tests/types/test_int_range.py @@ -98,6 +98,18 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): ) assert query.count() + def test_eq_with_query_arg(self): + self.create_building([1, 3]) + query = ( + self.session.query(self.Building) + .filter( + self.Building.persons_at_night == + self.session.query( + self.Building.persons_at_night) + ).order_by(self.Building.persons_at_night).limit(1) + ) + assert query.count() + @mark.parametrize( 'number_range', (