Fix interval string handling

This commit is contained in:
Konsta Vesterinen
2016-03-05 10:31:56 +02:00
parent 7ad870d78b
commit 05ca6753da
4 changed files with 10 additions and 23 deletions

View File

@@ -39,7 +39,7 @@ extras_require = {
'anyjson': ['anyjson>=0.3.3'], 'anyjson': ['anyjson>=0.3.3'],
'babel': ['Babel>=1.3'], 'babel': ['Babel>=1.3'],
'arrow': ['arrow>=0.3.4'], 'arrow': ['arrow>=0.3.4'],
'intervals': ['intervals>=0.2.4'], 'intervals': ['intervals>=0.7.1'],
'phone': ['phonenumbers>=5.9.2'], 'phone': ['phonenumbers>=5.9.2'],
'password': ['passlib >= 1.6, < 2.0'], 'password': ['passlib >= 1.6, < 2.0'],
'color': ['colour>=0.0.4'], 'color': ['colour>=0.0.4'],

View File

@@ -286,13 +286,17 @@ class RangeType(types.TypeDecorator, ScalarCoercible):
return value return value
def process_result_value(self, value, dialect): 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 value is not None:
if self.interval_class.step is not None: if self.interval_class.step is not None:
return self.canonicalize_result_value( return self.canonicalize_result_value(
self.interval_class(value, step=self.step) factory_func(value, step=self.step)
) )
else: else:
return self.interval_class(value, step=self.step) return factory_func(value, step=self.step)
return value return value
def canonicalize_result_value(self, value): def canonicalize_result_value(self, value):

View File

@@ -50,7 +50,7 @@ class NumberRangeTestCase(object):
assert building.persons_at_night is None assert building.persons_at_night is None
def test_update_with_none(self, session, create_building): def test_update_with_none(self, session, create_building):
interval = intervals.IntInterval('(,)') interval = intervals.IntInterval([None, None])
building = create_building(interval) building = create_building(interval)
building.persons_at_night = None building.persons_at_night = None
assert building.persons_at_night is None assert building.persons_at_night is None
@@ -61,7 +61,7 @@ class NumberRangeTestCase(object):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3', (0, 4),
) )
) )
def test_save_number_range(self, create_building, number_range): def test_save_number_range(self, create_building, number_range):
@@ -94,10 +94,6 @@ class NumberRangeTestCase(object):
building = session.query(Building).first() building = session.query(Building).first()
assert building.persons_at_night is None 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): def test_integer_coercion(self, Building):
building = Building(persons_at_night=15) building = Building(persons_at_night=15)
assert building.persons_at_night.lower == 15 assert building.persons_at_night.lower == 15
@@ -110,7 +106,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3',
(0, 4) (0, 4)
) )
) )
@@ -158,7 +153,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[[1, 3]], [[1, 3]],
['1 - 3'],
[(0, 4)], [(0, 4)],
) )
) )
@@ -180,7 +174,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3',
(0, 4), (0, 4),
) )
) )
@@ -202,7 +195,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3',
(0, 4), (0, 4),
) )
) )
@@ -224,7 +216,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3',
(1, 3), (1, 3),
2 2
) )
@@ -247,7 +238,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3',
(0, 8), (0, 8),
(-inf, inf) (-inf, inf)
) )
@@ -270,7 +260,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[2, 5], [2, 5],
'0 - 2',
0 0
) )
) )
@@ -303,7 +292,6 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase):
'number_range', 'number_range',
( (
[1, 2], [1, 2],
'1 - 3',
(0, 4), (0, 4),
[0, 3], [0, 3],
0, 0,

View File

@@ -51,7 +51,7 @@ class NumericRangeTestCase(object):
'number_range', 'number_range',
( (
[1, 3], [1, 3],
'1 - 3', (1, 3)
) )
) )
def test_save_number_range(self, create_car, number_range): def test_save_number_range(self, create_car, number_range):
@@ -84,10 +84,6 @@ class NumericRangeTestCase(object):
car = session.query(Car).first() car = session.query(Car).first()
assert car.price_range is None 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): def test_integer_coercion(self, Car):
car = Car(price_range=15) car = Car(price_range=15)
assert car.price_range.lower == 15 assert car.price_range.lower == 15
@@ -124,7 +120,6 @@ class TestNumericRangeOnPostgres(NumericRangeTestCase):
@pytest.mark.skipif('intervals is None') @pytest.mark.skipif('intervals is None')
class TestNumericRangeWithStep(object): class TestNumericRangeWithStep(object):
@pytest.fixture @pytest.fixture
def Car(self, Base): def Car(self, Base):
class Car(Base): class Car(Base):