Added ColorType

This commit is contained in:
Konsta Vesterinen
2013-04-29 18:18:21 +03:00
parent 9380c3b35c
commit c9c4979452
8 changed files with 113 additions and 13 deletions

View File

@@ -4,6 +4,12 @@ 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.10.0 (2013-04-29)
^^^^^^^^^^^^^^^^^^^
- Added ColorType
0.9.1 (2013-04-15) 0.9.1 (2013-04-15)
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^

View File

@@ -8,23 +8,23 @@ SQLAlchemy-Utils
SQLAlchemy-Utils provides various utility classes and functions for SQLAlchemy. SQLAlchemy-Utils provides various utility classes and functions for SQLAlchemy.
ScalarList ScalarListType
---------- --------------
ScalarList type provides convenient way for saving multiple scalar values in one ScalarListType type provides convenient way for saving multiple scalar values in one
column. ScalarList works like list on python side and saves the result as comma-separated list column. ScalarListType works like list on python side and saves the result as comma-separated list
in the database (custom separators can also be used). in the database (custom separators can also be used).
Example :: Example ::
from sqlalchemy_utils import ScalarList from sqlalchemy_utils import ScalarListType
class User(Base): class User(Base):
__tablename__ = 'user' __tablename__ = 'user'
id = db.Column(db.Integer, autoincrement=True) id = db.Column(db.Integer, autoincrement=True)
hobbies = db.Column(ScalarList()) hobbies = db.Column(ScalarListType())
user = User() user = User()
@@ -37,13 +37,13 @@ You can easily set up integer lists too:
:: ::
from sqlalchemy_utils import ScalarList from sqlalchemy_utils import ScalarListType
class Player(Base): class Player(Base):
__tablename__ = 'player' __tablename__ = 'player'
id = db.Column(db.Integer, autoincrement=True) id = db.Column(db.Integer, autoincrement=True)
points = db.Column(ScalarList(int)) points = db.Column(ScalarListType(int))
player = Player() player = Player()
@@ -51,8 +51,46 @@ You can easily set up integer lists too:
session.commit() session.commit()
NumberRange ColorType
----------- ---------
ColorType provides a way for saving Color (from colour package) objects into database.
ColorType saves Color objects as strings on the way in and converts them back to objects when querying the database.
::
from colour import Color
from sqlalchemy_utils import ColorType
class Document(Base):
__tablename__ = 'player'
id = db.Column(db.Integer, autoincrement=True)
name = db.Column(db.Unicode(50))
background_color = db.Column(ColorType)
document = Document()
document.background_color = Color('#F5F5F5')
session.commit()
Querying the database returns Color objects:
::
document = session.query(Document).first()
document.background_color.hex
# '#f5f5f5'
For more information about colour package and Color object, see https://github.com/vaab/colour
NumberRangeType
---------------
NumberRangeType provides way for saving range of numbers into database. NumberRangeType provides way for saving range of numbers into database.

View File

@@ -1,3 +1,4 @@
SQLAlchemy>=0.7.8 SQLAlchemy>=0.7.8
psycopg2>=2.4.6 psycopg2>=2.4.6
phonenumbers>=5.4b1 phonenumbers>=5.4b1
colour==0.0.2

View File

@@ -24,7 +24,7 @@ class PyTest(Command):
setup( setup(
name='SQLAlchemy-Utils', name='SQLAlchemy-Utils',
version='0.9.1', version='0.10.0',
url='https://github.com/kvesteri/sqlalchemy-utils', url='https://github.com/kvesteri/sqlalchemy-utils',
license='BSD', license='BSD',
author='Konsta Vesterinen', author='Konsta Vesterinen',
@@ -40,7 +40,8 @@ setup(
install_requires=[ install_requires=[
'SQLAlchemy>=0.7.8', 'SQLAlchemy>=0.7.8',
'psycopg2>=2.4.6', 'psycopg2>=2.4.6',
'phonenumbers>=5.4b1' 'phonenumbers>=5.4b1',
'colour==0.0.2'
], ],
cmdclass={'test': PyTest}, cmdclass={'test': PyTest},
classifiers=[ classifiers=[

View File

@@ -1,6 +1,7 @@
from .functions import sort_query, defer_except, escape_like from .functions import sort_query, defer_except, escape_like
from .merge import merge, Merger from .merge import merge, Merger
from .types import ( from .types import (
ColorType,
EmailType, EmailType,
instrumented_list, instrumented_list,
InstrumentedList, InstrumentedList,
@@ -21,6 +22,7 @@ __all__ = (
escape_like, escape_like,
instrumented_list, instrumented_list,
merge, merge,
ColorType,
EmailType, EmailType,
InstrumentedList, InstrumentedList,
Merger, Merger,

View File

@@ -1,4 +1,5 @@
import phonenumbers import phonenumbers
from colour import Color
from functools import wraps from functools import wraps
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.orm.collections import InstrumentedList as _InstrumentedList from sqlalchemy.orm.collections import InstrumentedList as _InstrumentedList
@@ -84,6 +85,29 @@ class PhoneNumberType(types.TypeDecorator):
return value return value
class ColorType(types.TypeDecorator):
"""
Changes Color objects to a string representation on the way in and
changes them back to Color objects on the way out.
"""
STORE_FORMAT = 'hex'
impl = types.Unicode(20)
def __init__(self, max_length=20, *args, **kwargs):
super(ColorType, self).__init__(*args, **kwargs)
self.impl = types.Unicode(max_length)
def process_bind_param(self, value, dialect):
if value:
return getattr(value, self.STORE_FORMAT)
return value
def process_result_value(self, value, dialect):
if value:
return Color(value)
return value
class ScalarListException(Exception): class ScalarListException(Exception):
pass pass

28
tests/test_color.py Normal file
View File

@@ -0,0 +1,28 @@
from colour import Color
import sqlalchemy as sa
from sqlalchemy_utils import ColorType
from tests import DatabaseTestCase
class TestColorType(DatabaseTestCase):
def create_models(self):
class Document(self.Base):
__tablename__ = 'document'
id = sa.Column(sa.Integer, primary_key=True)
bg_color = sa.Column(ColorType)
def __repr__(self):
return 'Document(%r)' % self.id
self.Document = Document
def test_color_parameter_processing(self):
document = self.Document(
bg_color=Color(u'white')
)
self.session.add(document)
self.session.commit()
document = self.session.query(self.Document).first()
assert document.bg_color.hex == Color(u'white').hex

View File

@@ -11,7 +11,7 @@ class TestEmailType(DatabaseTestCase):
email = sa.Column(EmailType) email = sa.Column(EmailType)
def __repr__(self): def __repr__(self):
return 'Building(%r)' % self.id return 'User(%r)' % self.id
self.User = User self.User = User