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'],
'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'],

View File

@@ -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):

View File

@@ -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,

View File

@@ -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):