Fixed defer_except and NumberRange

This commit is contained in:
Konsta Vesterinen
2013-03-26 15:15:11 +02:00
parent e1c039925f
commit 1aecfe1f83
6 changed files with 31 additions and 8 deletions

View File

@@ -4,6 +4,13 @@ Changelog
Here you can see the full list of changes between each SQLAlchemy-Utils release. 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) 0.7.4 (2013-03-26)
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^

View File

@@ -24,7 +24,7 @@ class PyTest(Command):
setup( setup(
name='SQLAlchemy-Utils', name='SQLAlchemy-Utils',
version='0.7.4', version='0.7.5',
url='https://github.com/kvesteri/sqlalchemy-utils', url='https://github.com/kvesteri/sqlalchemy-utils',
license='BSD', license='BSD',
author='Konsta Vesterinen', author='Konsta Vesterinen',

View File

@@ -1,3 +1,4 @@
from sqlalchemy.orm import defer
from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.mapper import Mapper
from sqlalchemy.orm.query import _ColumnEntity from sqlalchemy.orm.query import _ColumnEntity
from sqlalchemy.orm.properties import ColumnProperty from sqlalchemy.orm.properties import ColumnProperty

View File

@@ -88,7 +88,8 @@ class NumberRangeType(types.TypeDecorator):
impl = NumberRangeRawType impl = NumberRangeRawType
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
return str(value) if value:
return value.normalized
def process_result_value(self, value, dialect): def process_result_value(self, value, dialect):
return NumberRange.from_normalized_str(value) return NumberRange.from_normalized_str(value)
@@ -154,6 +155,10 @@ class NumberRange(object):
) )
return cls(min_value, max_value) return cls(min_value, max_value)
@property
def normalized(self):
return '[%s, %s]' % (self.min_value, self.max_value)
def __eq__(self, other): def __eq__(self, other):
try: try:
return ( return (
@@ -167,7 +172,9 @@ class NumberRange(object):
return 'NumberRange(%r, %r)' % (self.min_value, self.max_value) return 'NumberRange(%r, %r)' % (self.min_value, self.max_value)
def __str__(self): 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): def __add__(self, other):
try: try:

View File

@@ -34,7 +34,8 @@ class TestNumberRange(object):
assert NumberRange(1, 3) == NumberRange(1, 3) assert NumberRange(1, 3) == NumberRange(1, 3)
def test_str_representation(self): 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): def test_raises_exception_for_badly_constructed_range(self):
with raises(NumberRangeException): with raises(NumberRangeException):
@@ -46,6 +47,6 @@ class TestNumberRange(object):
assert number_range.max_value == 1 assert number_range.max_value == 1
def test_from_normalized_str(self): def test_from_normalized_str(self):
assert str(NumberRange.from_normalized_str('[1,2]')) == '[1, 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)')) == '1 - 2'
assert str(NumberRange.from_normalized_str('(1,3)')) == '[2, 2]' assert str(NumberRange.from_normalized_str('(1,3)')) == '2'

View File

@@ -1,5 +1,5 @@
import sqlalchemy as sa 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 from tests import TestCase
@@ -8,6 +8,13 @@ class TestEscapeLike(TestCase):
assert escape_like('_*%') == '*_***%' 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): class TestSortQuery(TestCase):
def test_without_sort_param_returns_the_query_object_untouched(self): def test_without_sort_param_returns_the_query_object_untouched(self):
query = self.session.query(self.Article) query = self.session.query(self.Article)