From 05ca6753dade2748a27e609ffcb54a03bae7ec2e Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Sat, 5 Mar 2016 10:31:56 +0200 Subject: [PATCH] Fix interval string handling --- setup.py | 2 +- sqlalchemy_utils/types/range.py | 8 ++++++-- tests/types/test_int_range.py | 16 ++-------------- tests/types/test_numeric_range.py | 7 +------ 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/setup.py b/setup.py index 18a424f..83b9f81 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ extras_require = { 'anyjson': ['anyjson>=0.3.3'], 'babel': ['Babel>=1.3'], 'arrow': ['arrow>=0.3.4'], - 'intervals': ['intervals>=0.2.4'], + 'intervals': ['intervals>=0.7.1'], 'phone': ['phonenumbers>=5.9.2'], 'password': ['passlib >= 1.6, < 2.0'], 'color': ['colour>=0.0.4'], diff --git a/sqlalchemy_utils/types/range.py b/sqlalchemy_utils/types/range.py index dc40653..f4ee55b 100644 --- a/sqlalchemy_utils/types/range.py +++ b/sqlalchemy_utils/types/range.py @@ -286,13 +286,17 @@ class RangeType(types.TypeDecorator, ScalarCoercible): return value def process_result_value(self, value, dialect): + if isinstance(value, six.string_types): + factory_func = self.interval_class.from_string + else: + factory_func = self.interval_class if value is not None: if self.interval_class.step is not None: return self.canonicalize_result_value( - self.interval_class(value, step=self.step) + factory_func(value, step=self.step) ) else: - return self.interval_class(value, step=self.step) + return factory_func(value, step=self.step) return value def canonicalize_result_value(self, value): diff --git a/tests/types/test_int_range.py b/tests/types/test_int_range.py index 165aac0..ba927c2 100644 --- a/tests/types/test_int_range.py +++ b/tests/types/test_int_range.py @@ -50,7 +50,7 @@ class NumberRangeTestCase(object): assert building.persons_at_night is None def test_update_with_none(self, session, create_building): - interval = intervals.IntInterval('(,)') + interval = intervals.IntInterval([None, None]) building = create_building(interval) building.persons_at_night = None assert building.persons_at_night is None @@ -61,7 +61,7 @@ class NumberRangeTestCase(object): 'number_range', ( [1, 3], - '1 - 3', + (0, 4), ) ) def test_save_number_range(self, create_building, number_range): @@ -94,10 +94,6 @@ class NumberRangeTestCase(object): building = session.query(Building).first() assert building.persons_at_night is None - def test_string_coercion(self, Building): - building = Building(persons_at_night='[12, 18]') - assert isinstance(building.persons_at_night, intervals.IntInterval) - def test_integer_coercion(self, Building): building = Building(persons_at_night=15) assert building.persons_at_night.lower == 15 @@ -110,7 +106,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 3], - '1 - 3', (0, 4) ) ) @@ -158,7 +153,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [[1, 3]], - ['1 - 3'], [(0, 4)], ) ) @@ -180,7 +174,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 3], - '1 - 3', (0, 4), ) ) @@ -202,7 +195,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 3], - '1 - 3', (0, 4), ) ) @@ -224,7 +216,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 3], - '1 - 3', (1, 3), 2 ) @@ -247,7 +238,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 3], - '1 - 3', (0, 8), (-inf, inf) ) @@ -270,7 +260,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [2, 5], - '0 - 2', 0 ) ) @@ -303,7 +292,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): 'number_range', ( [1, 2], - '1 - 3', (0, 4), [0, 3], 0, diff --git a/tests/types/test_numeric_range.py b/tests/types/test_numeric_range.py index d665c84..efebbc4 100644 --- a/tests/types/test_numeric_range.py +++ b/tests/types/test_numeric_range.py @@ -51,7 +51,7 @@ class NumericRangeTestCase(object): 'number_range', ( [1, 3], - '1 - 3', + (1, 3) ) ) def test_save_number_range(self, create_car, number_range): @@ -84,10 +84,6 @@ class NumericRangeTestCase(object): car = session.query(Car).first() assert car.price_range is None - def test_string_coercion(self, Car): - car = Car(price_range='[12, 18]') - assert isinstance(car.price_range, intervals.DecimalInterval) - def test_integer_coercion(self, Car): car = Car(price_range=15) assert car.price_range.lower == 15 @@ -124,7 +120,6 @@ class TestNumericRangeOnPostgres(NumericRangeTestCase): @pytest.mark.skipif('intervals is None') class TestNumericRangeWithStep(object): - @pytest.fixture def Car(self, Base): class Car(Base):