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.
0.7.5 (2013-03-26)
^^^^^^^^^^^^^^^^^^
- Fixed defer_except
- Better string representations for NumberRange
0.7.4 (2013-03-26)
^^^^^^^^^^^^^^^^^^

View File

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

View File

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

View File

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

View File

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

View File

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