From ffda0eac518630185e7eb212e8b9acbe9ec09d02 Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Tue, 26 Mar 2013 15:50:29 +0200 Subject: [PATCH] ValueErrors now wrapped in RangeExceptions --- CHANGES.rst | 6 ++++++ setup.py | 2 +- sqlalchemy_utils/types.py | 24 +++++++++++++++++------- tests/test_number_range.py | 4 ++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index a7a4241..cd8cf6c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.7.6 (2013-03-26) +^^^^^^^^^^^^^^^^^^ + +- NumberRange now wraps ValueErrors as NumberRangeExceptions + + 0.7.5 (2013-03-26) ^^^^^^^^^^^^^^^^^^ diff --git a/setup.py b/setup.py index 067295d..9aafeea 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(Command): setup( name='SQLAlchemy-Utils', - version='0.7.5', + version='0.7.6', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen', diff --git a/sqlalchemy_utils/types.py b/sqlalchemy_utils/types.py index 0173a81..ec447b7 100644 --- a/sqlalchemy_utils/types.py +++ b/sqlalchemy_utils/types.py @@ -96,6 +96,10 @@ class NumberRangeType(types.TypeDecorator): class NumberRangeException(Exception): + pass + + +class RangeBoundsException(NumberRangeException): def __init__(self, min_value, max_value): self.message = 'Min value %d is bigger than max value %d.' % ( min_value, @@ -106,7 +110,7 @@ class NumberRangeException(Exception): class NumberRange(object): def __init__(self, min_value, max_value): if min_value > max_value: - raise NumberRangeException(min_value, max_value) + raise RangeBoundsException(min_value, max_value) self.min_value = min_value self.max_value = max_value @@ -131,9 +135,12 @@ class NumberRange(object): """ if value is not None: values = value[1:-1].split(',') - min_value, max_value = map( - lambda a: int(a.strip()), values - ) + try: + min_value, max_value = map( + lambda a: int(a.strip()), values + ) + except ValueError, e: + raise NumberRangeException(e.message) if value[0] == '(': min_value += 1 @@ -150,9 +157,12 @@ class NumberRange(object): if len(values) == 1: min_value = max_value = int(value.strip()) else: - min_value, max_value = map( - lambda a: int(a.strip()), values - ) + try: + min_value, max_value = map( + lambda a: int(a.strip()), values + ) + except ValueError, e: + raise NumberRangeException(e.message) return cls(min_value, max_value) @property diff --git a/tests/test_number_range.py b/tests/test_number_range.py index 4d6c7ff..c09874e 100644 --- a/tests/test_number_range.py +++ b/tests/test_number_range.py @@ -46,6 +46,10 @@ class TestNumberRange(object): assert number_range.min_value == 1 assert number_range.max_value == 1 + def test_from_str_exception_handling(self): + with raises(NumberRangeException): + NumberRange.from_str('1 - ') + def test_from_normalized_str(self): assert str(NumberRange.from_normalized_str('[1,2]')) == '1 - 2' assert str(NumberRange.from_normalized_str('[1,3)')) == '1 - 2'