From e9702534bca24af8163c508fc675b6d3634dc6d4 Mon Sep 17 00:00:00 2001 From: Adam Holmberg Date: Wed, 11 Feb 2015 15:44:28 -0600 Subject: [PATCH] Reorganize exceptions, centralize UnicodeMixin --- cassandra/cqlengine/__init__.py | 18 ++++++++++++++ cassandra/cqlengine/columns.py | 12 ++-------- cassandra/cqlengine/connection.py | 11 +++++---- cassandra/cqlengine/exceptions.py | 24 ++++--------------- cassandra/cqlengine/functions.py | 12 +--------- cassandra/cqlengine/management.py | 3 +-- cassandra/cqlengine/models.py | 18 ++++++++------ cassandra/cqlengine/named.py | 2 +- cassandra/cqlengine/operators.py | 11 +-------- cassandra/cqlengine/query.py | 13 +++++++--- cassandra/cqlengine/statements.py | 9 +------ .../model/test_class_construction.py | 5 ++-- .../cqlengine/model/test_polymorphism.py | 6 ++--- .../cqlengine/query/test_datetime_queries.py | 3 +-- .../integration/cqlengine/test_ifnotexists.py | 3 +-- .../integration/cqlengine/test_transaction.py | 3 +-- 16 files changed, 65 insertions(+), 88 deletions(-) diff --git a/cassandra/cqlengine/__init__.py b/cassandra/cqlengine/__init__.py index 684a94af..38a02fd3 100644 --- a/cassandra/cqlengine/__init__.py +++ b/cassandra/cqlengine/__init__.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import six + + # compaction SizeTieredCompactionStrategy = "SizeTieredCompactionStrategy" LeveledCompactionStrategy = "LeveledCompactionStrategy" @@ -21,3 +24,18 @@ CACHING_ALL = "ALL" CACHING_KEYS_ONLY = "KEYS_ONLY" CACHING_ROWS_ONLY = "ROWS_ONLY" CACHING_NONE = "NONE" + + +class CQLEngineException(Exception): + pass + + +class ValidationError(CQLEngineException): + pass + + +class UnicodeMixin(object): + if six.PY3: + __str__ = lambda x: x.__unicode__() + else: + __str__ = lambda x: six.text_type(x).encode('utf-8') diff --git a/cassandra/cqlengine/columns.py b/cassandra/cqlengine/columns.py index 8548355b..22bc07d3 100644 --- a/cassandra/cqlengine/columns.py +++ b/cassandra/cqlengine/columns.py @@ -17,24 +17,16 @@ from datetime import date, datetime import logging import re import six -import sys import warnings from cassandra.cqltypes import DateType from cassandra.encoder import cql_quote -from cassandra.cqlengine.exceptions import ValidationError + +from cassandra.cqlengine import ValidationError log = logging.getLogger(__name__) -# move to central spot -class UnicodeMixin(object): - if sys.version_info > (3, 0): - __str__ = lambda x: x.__unicode__() - else: - __str__ = lambda x: six.text_type(x).encode('utf-8') - - class BaseValueManager(object): def __init__(self, instance, column, value): diff --git a/cassandra/cqlengine/connection.py b/cassandra/cqlengine/connection.py index 253598c2..d62063b3 100644 --- a/cassandra/cqlengine/connection.py +++ b/cassandra/cqlengine/connection.py @@ -19,7 +19,8 @@ import six from cassandra import ConsistencyLevel from cassandra.cluster import Cluster, _NOT_SET, NoHostAvailable from cassandra.query import SimpleStatement, Statement, dict_factory -from cassandra.cqlengine.exceptions import CQLEngineException, UndefinedKeyspaceException + +from cassandra.cqlengine import CQLEngineException from cassandra.cqlengine.statements import BaseCQLStatement @@ -27,10 +28,6 @@ log = logging.getLogger(__name__) NOT_SET = _NOT_SET # required for passing timeout to Session.execute - -class CQLConnectionError(CQLEngineException): - pass - Host = namedtuple('Host', ['name', 'port']) cluster = None @@ -39,6 +36,10 @@ lazy_connect_args = None default_consistency_level = ConsistencyLevel.ONE +class UndefinedKeyspaceException(CQLEngineException): + pass + + def default(): """ Configures the global mapper connection to localhost, using the driver defaults diff --git a/cassandra/cqlengine/exceptions.py b/cassandra/cqlengine/exceptions.py index 6bc6e624..8e80f71a 100644 --- a/cassandra/cqlengine/exceptions.py +++ b/cassandra/cqlengine/exceptions.py @@ -12,26 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging +import warnings -class CQLEngineException(Exception): - pass +import cassandra.cqlengine -class ModelException(CQLEngineException): - pass +CQLEngineException = cassandra.cqlengine.CQLEngineException - -class ValidationError(CQLEngineException): - pass - - -class UndefinedKeyspaceException(CQLEngineException): - pass - - -class LWTException(CQLEngineException): - pass - - -class IfNotExistsWithCounterColumn(CQLEngineException): - pass +ValidationError = cassandra.cqlengine.ValidationError diff --git a/cassandra/cqlengine/functions.py b/cassandra/cqlengine/functions.py index b00f2456..5c6e4c7c 100644 --- a/cassandra/cqlengine/functions.py +++ b/cassandra/cqlengine/functions.py @@ -13,18 +13,8 @@ # limitations under the License. from datetime import datetime -import six -import sys -from cassandra.cqlengine.exceptions import ValidationError -# move to central spot - - -class UnicodeMixin(object): - if sys.version_info > (3, 0): - __str__ = lambda x: x.__unicode__() - else: - __str__ = lambda x: six.text_type(x).encode('utf-8') +from cassandra.cqlengine import UnicodeMixin, ValidationError class QueryValue(UnicodeMixin): diff --git a/cassandra/cqlengine/management.py b/cassandra/cqlengine/management.py index 958d252f..261bcabf 100644 --- a/cassandra/cqlengine/management.py +++ b/cassandra/cqlengine/management.py @@ -19,9 +19,8 @@ import six import warnings from cassandra.metadata import KeyspaceMetadata -from cassandra.cqlengine import SizeTieredCompactionStrategy, LeveledCompactionStrategy +from cassandra.cqlengine import CQLEngineException, SizeTieredCompactionStrategy, LeveledCompactionStrategy from cassandra.cqlengine.connection import execute, get_cluster -from cassandra.cqlengine.exceptions import CQLEngineException from cassandra.cqlengine.models import Model from cassandra.cqlengine.named import NamedTable diff --git a/cassandra/cqlengine/models.py b/cassandra/cqlengine/models.py index f04abfa9..0ef949d2 100644 --- a/cassandra/cqlengine/models.py +++ b/cassandra/cqlengine/models.py @@ -17,8 +17,8 @@ import re import six import warnings +from cassandra.cqlengine import CQLEngineException, ValidationError from cassandra.cqlengine import columns -from cassandra.cqlengine.exceptions import ModelException, CQLEngineException, ValidationError from cassandra.cqlengine.query import ModelQuerySet, DMLQuery, AbstractQueryableColumn, NOT_SET from cassandra.cqlengine.query import DoesNotExist as _DoesNotExist from cassandra.cqlengine.query import MultipleObjectsReturned as _MultipleObjectsReturned @@ -27,11 +27,15 @@ from cassandra.util import OrderedDict log = logging.getLogger(__name__) +class ModelException(CQLEngineException): + pass + + class ModelDefinitionException(ModelException): pass -class PolyMorphicModelException(ModelException): +class PolymorphicModelException(ModelException): pass @@ -411,7 +415,7 @@ class BaseModel(object): disc_key = field_dict.get(cls._discriminator_column_name) if disc_key is None: - raise PolyMorphicModelException('discriminator value was not found in values') + raise PolymorphicModelException('discriminator value was not found in values') poly_base = cls if cls._is_polymorphic_base else cls._polymorphic_base @@ -420,12 +424,12 @@ class BaseModel(object): poly_base._discover_polymorphic_submodels() klass = poly_base._get_model_by_discriminator_value(disc_key) if klass is None: - raise PolyMorphicModelException( + raise PolymorphicModelException( 'unrecognized discriminator column {} for class {}'.format(disc_key, poly_base.__name__) ) if not issubclass(klass, cls): - raise PolyMorphicModelException( + raise PolymorphicModelException( '{} is not a subclass of {}'.format(klass.__name__, cls.__name__) ) @@ -643,7 +647,7 @@ class BaseModel(object): # handle polymorphic models if self._is_polymorphic: if self._is_polymorphic_base: - raise PolyMorphicModelException('cannot save polymorphic base model') + raise PolymorphicModelException('cannot save polymorphic base model') else: setattr(self, self._discriminator_column_name, self.__discriminator_value__) @@ -693,7 +697,7 @@ class BaseModel(object): # handle polymorphic models if self._is_polymorphic: if self._is_polymorphic_base: - raise PolyMorphicModelException('cannot update polymorphic base model') + raise PolymorphicModelException('cannot update polymorphic base model') else: setattr(self, self._discriminator_column_name, self.__disciminator_value__) diff --git a/cassandra/cqlengine/named.py b/cassandra/cqlengine/named.py index c8b1c4c2..b38c0782 100644 --- a/cassandra/cqlengine/named.py +++ b/cassandra/cqlengine/named.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from cassandra.cqlengine.exceptions import CQLEngineException +from cassandra.cqlengine import CQLEngineException from cassandra.cqlengine.query import AbstractQueryableColumn, SimpleQuerySet from cassandra.cqlengine.query import DoesNotExist as _DoesNotExist from cassandra.cqlengine.query import MultipleObjectsReturned as _MultipleObjectsReturned diff --git a/cassandra/cqlengine/operators.py b/cassandra/cqlengine/operators.py index fd18f585..08c8ccb3 100644 --- a/cassandra/cqlengine/operators.py +++ b/cassandra/cqlengine/operators.py @@ -12,22 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import six -import sys +from cassandra.cqlengine import UnicodeMixin class QueryOperatorException(Exception): pass -# move to central spot -class UnicodeMixin(object): - if sys.version_info > (3, 0): - __str__ = lambda x: x.__unicode__() - else: - __str__ = lambda x: six.text_type(x).encode('utf-8') - - class BaseQueryOperator(UnicodeMixin): # The symbol that identifies this operator in kwargs # ie: colname__ diff --git a/cassandra/cqlengine/query.py b/cassandra/cqlengine/query.py index 10da4921..62000f75 100644 --- a/cassandra/cqlengine/query.py +++ b/cassandra/cqlengine/query.py @@ -17,10 +17,9 @@ from datetime import datetime, timedelta import time import six -from cassandra.cqlengine import columns +from cassandra.cqlengine import columns, CQLEngineException, ValidationError, UnicodeMixin from cassandra.cqlengine.connection import execute, NOT_SET -from cassandra.cqlengine.exceptions import CQLEngineException, ValidationError, LWTException, IfNotExistsWithCounterColumn -from cassandra.cqlengine.functions import Token, BaseQueryFunction, QueryValue, UnicodeMixin +from cassandra.cqlengine.functions import Token, BaseQueryFunction, QueryValue from cassandra.cqlengine.operators import (InOperator, EqualsOperator, GreaterThanOperator, GreaterThanOrEqualOperator, LessThanOperator, LessThanOrEqualOperator, BaseWhereOperator) @@ -36,6 +35,14 @@ class QueryException(CQLEngineException): pass +class IfNotExistsWithCounterColumn(CQLEngineException): + pass + + +class LWTException(CQLEngineException): + pass + + class DoesNotExist(QueryException): pass diff --git a/cassandra/cqlengine/statements.py b/cassandra/cqlengine/statements.py index 97dd4565..7c9f281e 100644 --- a/cassandra/cqlengine/statements.py +++ b/cassandra/cqlengine/statements.py @@ -15,8 +15,8 @@ from datetime import datetime, timedelta import time import six -import sys +from cassandra.cqlengine import UnicodeMixin from cassandra.cqlengine.functions import QueryValue from cassandra.cqlengine.operators import BaseWhereOperator, InOperator @@ -25,13 +25,6 @@ class StatementException(Exception): pass -class UnicodeMixin(object): - if sys.version_info > (3, 0): - __str__ = lambda x: x.__unicode__() - else: - __str__ = lambda x: six.text_type(x).encode('utf-8') - - class ValueQuoter(UnicodeMixin): def __init__(self, value): diff --git a/tests/integration/cqlengine/model/test_class_construction.py b/tests/integration/cqlengine/model/test_class_construction.py index 015d9929..141f6f62 100644 --- a/tests/integration/cqlengine/model/test_class_construction.py +++ b/tests/integration/cqlengine/model/test_class_construction.py @@ -15,9 +15,8 @@ from uuid import uuid4 import warnings -from cassandra.cqlengine import columns -from cassandra.cqlengine.exceptions import ModelException, CQLEngineException -from cassandra.cqlengine.models import Model, ModelDefinitionException, ColumnQueryEvaluator +from cassandra.cqlengine import columns, CQLEngineException +from cassandra.cqlengine.models import Model, ModelException, ModelDefinitionException, ColumnQueryEvaluator from cassandra.cqlengine.query import ModelQuerySet, DMLQuery from tests.integration.cqlengine.base import BaseCassEngTestCase diff --git a/tests/integration/cqlengine/model/test_polymorphism.py b/tests/integration/cqlengine/model/test_polymorphism.py index f40f008e..cf4a72e7 100644 --- a/tests/integration/cqlengine/model/test_polymorphism.py +++ b/tests/integration/cqlengine/model/test_polymorphism.py @@ -120,7 +120,7 @@ class TestPolymorphicModel(BaseCassEngTestCase): management.drop_table(Poly2) def test_saving_base_model_fails(self): - with self.assertRaises(models.PolyMorphicModelException): + with self.assertRaises(models.PolymorphicModelException): PolyBase.create() def test_saving_subclass_saves_poly_key(self): @@ -208,9 +208,9 @@ class TestUnindexedPolymorphicQuery(BaseCassEngTestCase): assert len(list(UnindexedPoly2.objects(partition=p1.partition, cluster__in=[p2.cluster, p3.cluster]))) == 2 def test_conflicting_type_results(self): - with self.assertRaises(models.PolyMorphicModelException): + with self.assertRaises(models.PolymorphicModelException): list(UnindexedPoly1.objects(partition=self.p1.partition)) - with self.assertRaises(models.PolyMorphicModelException): + with self.assertRaises(models.PolymorphicModelException): list(UnindexedPoly2.objects(partition=self.p1.partition)) diff --git a/tests/integration/cqlengine/query/test_datetime_queries.py b/tests/integration/cqlengine/query/test_datetime_queries.py index f69d97c0..936f4fc7 100644 --- a/tests/integration/cqlengine/query/test_datetime_queries.py +++ b/tests/integration/cqlengine/query/test_datetime_queries.py @@ -17,10 +17,9 @@ from uuid import uuid4 from tests.integration.cqlengine.base import BaseCassEngTestCase -from cassandra.cqlengine.exceptions import ModelException from cassandra.cqlengine.management import sync_table from cassandra.cqlengine.management import drop_table -from cassandra.cqlengine.models import Model +from cassandra.cqlengine.models import Model, ModelException from cassandra.cqlengine import columns from cassandra.cqlengine import query diff --git a/tests/integration/cqlengine/test_ifnotexists.py b/tests/integration/cqlengine/test_ifnotexists.py index d1c5b4ec..9cc4d3c5 100644 --- a/tests/integration/cqlengine/test_ifnotexists.py +++ b/tests/integration/cqlengine/test_ifnotexists.py @@ -17,10 +17,9 @@ from unittest import skipUnless from uuid import uuid4 from cassandra.cqlengine import columns -from cassandra.cqlengine.exceptions import LWTException, IfNotExistsWithCounterColumn from cassandra.cqlengine.management import sync_table, drop_table from cassandra.cqlengine.models import Model -from cassandra.cqlengine.query import BatchQuery +from cassandra.cqlengine.query import BatchQuery, LWTException, IfNotExistsWithCounterColumn from tests.integration.cqlengine.base import BaseCassEngTestCase from tests.integration import PROTOCOL_VERSION diff --git a/tests/integration/cqlengine/test_transaction.py b/tests/integration/cqlengine/test_transaction.py index b2b2511a..bc64dc84 100644 --- a/tests/integration/cqlengine/test_transaction.py +++ b/tests/integration/cqlengine/test_transaction.py @@ -20,8 +20,7 @@ from uuid import uuid4 from cassandra.cqlengine import columns from cassandra.cqlengine.management import sync_table, drop_table from cassandra.cqlengine.models import Model -from cassandra.cqlengine.exceptions import LWTException -from cassandra.cqlengine.query import BatchQuery +from cassandra.cqlengine.query import BatchQuery, LWTException from cassandra.cqlengine.statements import TransactionClause from tests.integration.cqlengine.base import BaseCassEngTestCase