diff --git a/CHANGES.rst b/CHANGES.rst index 993a64b..a7a4241 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,13 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.7.5 (2013-03-26) +^^^^^^^^^^^^^^^^^^ + +- Fixed defer_except +- Better string representations for NumberRange + + 0.7.4 (2013-03-26) ^^^^^^^^^^^^^^^^^^ diff --git a/setup.py b/setup.py index 4120dc0..067295d 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(Command): setup( name='SQLAlchemy-Utils', - version='0.7.4', + version='0.7.5', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen', diff --git a/sqlalchemy_utils/functions.py b/sqlalchemy_utils/functions.py index 9495130..1f49f4a 100644 --- a/sqlalchemy_utils/functions.py +++ b/sqlalchemy_utils/functions.py @@ -1,3 +1,4 @@ +from sqlalchemy.orm import defer from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.query import _ColumnEntity from sqlalchemy.orm.properties import ColumnProperty diff --git a/sqlalchemy_utils/types.py b/sqlalchemy_utils/types.py index 73d6a26..0173a81 100644 --- a/sqlalchemy_utils/types.py +++ b/sqlalchemy_utils/types.py @@ -88,7 +88,8 @@ class NumberRangeType(types.TypeDecorator): impl = NumberRangeRawType def process_bind_param(self, value, dialect): - return str(value) + if value: + return value.normalized def process_result_value(self, value, dialect): return NumberRange.from_normalized_str(value) @@ -154,6 +155,10 @@ class NumberRange(object): ) return cls(min_value, max_value) + @property + def normalized(self): + return '[%s, %s]' % (self.min_value, self.max_value) + def __eq__(self, other): try: return ( @@ -167,7 +172,9 @@ class NumberRange(object): return 'NumberRange(%r, %r)' % (self.min_value, self.max_value) def __str__(self): - return '[%s, %s]' % (self.min_value, self.max_value) + if self.min_value != self.max_value: + return '%s - %s' % (self.min_value, self.max_value) + return str(self.min_value) def __add__(self, other): try: diff --git a/tests/test_number_range.py b/tests/test_number_range.py index fbe647a..4d6c7ff 100644 --- a/tests/test_number_range.py +++ b/tests/test_number_range.py @@ -34,7 +34,8 @@ class TestNumberRange(object): assert NumberRange(1, 3) == NumberRange(1, 3) def test_str_representation(self): - assert str(NumberRange(1, 3)) == '[1, 3]' + assert str(NumberRange(1, 3)) == '1 - 3' + assert str(NumberRange(1, 1)) == '1' def test_raises_exception_for_badly_constructed_range(self): with raises(NumberRangeException): @@ -46,6 +47,6 @@ class TestNumberRange(object): assert number_range.max_value == 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]' - assert str(NumberRange.from_normalized_str('(1,3)')) == '[2, 2]' + assert str(NumberRange.from_normalized_str('[1,2]')) == '1 - 2' + assert str(NumberRange.from_normalized_str('[1,3)')) == '1 - 2' + assert str(NumberRange.from_normalized_str('(1,3)')) == '2' diff --git a/tests/test_utility_functions.py b/tests/test_utility_functions.py index 26d802a..4589fcd 100644 --- a/tests/test_utility_functions.py +++ b/tests/test_utility_functions.py @@ -1,5 +1,5 @@ import sqlalchemy as sa -from sqlalchemy_utils import escape_like, sort_query +from sqlalchemy_utils import escape_like, sort_query, defer_except from tests import TestCase @@ -8,6 +8,13 @@ class TestEscapeLike(TestCase): assert escape_like('_*%') == '*_***%' +class TestDeferExcept(TestCase): + def test_deferred_loads_all_columns_except_the_ones_given(self): + query = self.session.query(self.Article) + query = defer_except(query, ['id']) + assert str(query) == 'SELECT article.id AS article_id \nFROM article' + + class TestSortQuery(TestCase): def test_without_sort_param_returns_the_query_object_untouched(self): query = self.session.query(self.Article)