Fix interval string handling
This commit is contained in:
2
setup.py
2
setup.py
@@ -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'],
|
||||||
|
@@ -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):
|
||||||
|
@@ -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,
|
||||||
|
@@ -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):
|
||||||
|
Reference in New Issue
Block a user