Fixed defer_except and NumberRange
This commit is contained in:
@@ -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)
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
2
setup.py
2
setup.py
@@ -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',
|
||||||
|
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
@@ -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'
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user