summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--09notes.txt6
-rw-r--r--lib/sqlalchemy/engine/strategies.py19
-rw-r--r--lib/sqlalchemy/engine/url.py13
-rw-r--r--lib/sqlalchemy/event.py7
-rw-r--r--lib/sqlalchemy/orm/collections.py6
-rw-r--r--lib/sqlalchemy/orm/interfaces.py1
-rw-r--r--lib/sqlalchemy/orm/mapper.py5
-rw-r--r--lib/sqlalchemy/sql/compiler.py16
-rw-r--r--lib/sqlalchemy/sql/functions.py17
-rw-r--r--lib/sqlalchemy/sql/visitors.py8
10 files changed, 39 insertions, 59 deletions
diff --git a/09notes.txt b/09notes.txt
index 6b6295c4f..73652f96d 100644
--- a/09notes.txt
+++ b/09notes.txt
@@ -3,4 +3,8 @@
- make sure input() function in dogpile example works in py2
- we want to get rid of any support for sets.Set entirely; check to see what
-impact this has
+impact this has. in langhelpers as well as in collections.py
+- give raise_from_cause some more manual tests:
+ - schema.py has one
+ - engine/strategies.py on connect
+ - sql/compiler.py for column errors in create table \ No newline at end of file
diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py
index bed14c671..c65986ca2 100644
--- a/lib/sqlalchemy/engine/strategies.py
+++ b/lib/sqlalchemy/engine/strategies.py
@@ -80,19 +80,12 @@ class DefaultEngineStrategy(EngineStrategy):
return dialect.connect(*cargs, **cparams)
except Exception as e:
invalidated = dialect.is_disconnect(e, None, None)
-# start Py3K
- raise exc.DBAPIError.instance(None, None,
- e, dialect.dbapi.Error,
- connection_invalidated=invalidated
- ) from e
-# end Py3K
-# start Py2K
-# import sys
-# raise exc.DBAPIError.instance(
-# None, None, e, dialect.dbapi.Error,
-# connection_invalidated=invalidated
-# ), None, sys.exc_info()[2]
-# end Py2K
+ util.raise_from_cause(
+ exc.DBAPIError.instance(None, None,
+ e, dialect.dbapi.Error,
+ connection_invalidated=invalidated
+ )
+ )
creator = kwargs.pop('creator', connect)
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py
index 45768c5dc..b7d56374e 100644
--- a/lib/sqlalchemy/engine/url.py
+++ b/lib/sqlalchemy/engine/url.py
@@ -14,7 +14,6 @@ be used directly and is also accepted directly by ``create_engine()``.
"""
import re
-import urllib.request, urllib.parse, urllib.error
from .. import exc, util
from . import Dialect
@@ -67,7 +66,7 @@ class URL(object):
if self.username is not None:
s += self.username
if self.password is not None:
- s += ':' + urllib.parse.quote_plus(self.password)
+ s += ':' + util.quote_plus(self.password)
s += "@"
if self.host is not None:
s += self.host
@@ -76,7 +75,7 @@ class URL(object):
if self.database is not None:
s += '/' + self.database
if self.query:
- keys = list(self.query.keys())
+ keys = list(self.query)
keys.sort()
s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys)
return s
@@ -177,17 +176,15 @@ def _parse_rfc1738_args(name):
tokens = components['database'].split('?', 2)
components['database'] = tokens[0]
query = (len(tokens) > 1 and dict(util.parse_qsl(tokens[1]))) or None
-# start Py2K
-# if query is not None:
-# query = dict((k.encode('ascii'), query[k]) for k in query)
-# end Py2K
+ if util.py2k and query is not None:
+ query = dict((k.encode('ascii'), query[k]) for k in query)
else:
query = None
components['query'] = query
if components['password'] is not None:
components['password'] = \
- urllib.parse.unquote_plus(components['password'])
+ util.unquote_plus(components['password'])
name = components.pop('name')
return URL(name, **components)
diff --git a/lib/sqlalchemy/event.py b/lib/sqlalchemy/event.py
index 316161fdf..79d024f9b 100644
--- a/lib/sqlalchemy/event.py
+++ b/lib/sqlalchemy/event.py
@@ -171,7 +171,8 @@ class _EventMeta(type):
associated _Dispatch classes."""
def __init__(cls, classname, bases, dict_):
- _create_dispatcher_class(cls, classname, bases, dict_)
+ if classname != 'MetaBase':
+ _create_dispatcher_class(cls, classname, bases, dict_)
return type.__init__(cls, classname, bases, dict_)
@@ -200,11 +201,9 @@ def _remove_dispatcher(cls):
if not _registrars[k]:
del _registrars[k]
-class Events(object): #util.with_metaclass(_EventMeta, object)):
+class Events(util.with_metaclass(_EventMeta, object)):
"""Define event listening functions for a particular target type."""
- __metaclass__ = _EventMeta
-
@classmethod
def _accept_with(cls, target):
# Mapper, ClassManager, Session override this to
diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py
index 0a11b83c6..c2a2c23f0 100644
--- a/lib/sqlalchemy/orm/collections.py
+++ b/lib/sqlalchemy/orm/collections.py
@@ -1272,11 +1272,7 @@ def _dict_decorators():
l.pop('Unspecified')
return l
-if util.py3k_warning:
- _set_binop_bases = (set, frozenset)
-else:
- import sets
- _set_binop_bases = (set, frozenset, sets.BaseSet)
+_set_binop_bases = (set, frozenset)
def _set_binops_check_strict(self, obj):
diff --git a/lib/sqlalchemy/orm/interfaces.py b/lib/sqlalchemy/orm/interfaces.py
index f14c8ca47..a81404401 100644
--- a/lib/sqlalchemy/orm/interfaces.py
+++ b/lib/sqlalchemy/orm/interfaces.py
@@ -16,6 +16,7 @@ classes within should be considered mostly private.
"""
+from __future__ import absolute_import
from .. import exc as sa_exc, util, inspect
from ..sql import operators
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 91c678547..645bf86e7 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -13,6 +13,7 @@ This is a semi-private module; the main configurational API of the ORM is
available in :class:`~sqlalchemy.orm.`.
"""
+from __future__ import absolute_import
import types
import weakref
@@ -26,8 +27,8 @@ from . import instrumentation, attributes, \
from .interfaces import MapperProperty, _InspectionAttr, _MappedAttribute
from .util import _INSTRUMENTOR, _class_to_mapper, \
- _state_mapper, class_mapper, \
- PathRegistry
+ _state_mapper, class_mapper, \
+ PathRegistry
import sys
properties = util.importlater("sqlalchemy.orm", "properties")
descriptor_props = util.importlater("sqlalchemy.orm", "descriptor_props")
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index e5a2da366..b3f74ceef 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -1869,22 +1869,12 @@ class DDLCompiler(engine.Compiled):
if column.primary_key:
first_pk = True
except exc.CompileError as ce:
-# start Py3K
- raise exc.CompileError("(in table '%s', column '%s'): %s"
- % (
+ util.raise_from_cause(
+ exc.CompileError("(in table '%s', column '%s'): %s" % (
table.description,
column.name,
ce.args[0]
- )) from ce
-# end Py3K
-# start Py2K
-# raise exc.CompileError("(in table '%s', column '%s'): %s"
-# % (
-# table.description,
-# column.name,
-# ce.args[0]
-# )), None, sys.exc_info()[2]
-# end Py2K
+ )))
const = self.create_table_constraints(table)
if const:
diff --git a/lib/sqlalchemy/sql/functions.py b/lib/sqlalchemy/sql/functions.py
index a2b7ac628..244505bed 100644
--- a/lib/sqlalchemy/sql/functions.py
+++ b/lib/sqlalchemy/sql/functions.py
@@ -31,17 +31,18 @@ def register_function(identifier, fn, package="_default"):
class _GenericMeta(VisitableType):
def __init__(cls, clsname, bases, clsdict):
- cls.name = name = clsdict.get('name', clsname)
- cls.identifier = identifier = clsdict.get('identifier', name)
- package = clsdict.pop('package', '_default')
- # legacy
- if '__return_type__' in clsdict:
- cls.type = clsdict['__return_type__']
- register_function(identifier, cls, package)
+ if clsname != 'MetaBase':
+ cls.name = name = clsdict.get('name', clsname)
+ cls.identifier = identifier = clsdict.get('identifier', name)
+ package = clsdict.pop('package', '_default')
+ # legacy
+ if '__return_type__' in clsdict:
+ cls.type = clsdict['__return_type__']
+ register_function(identifier, cls, package)
super(_GenericMeta, cls).__init__(clsname, bases, clsdict)
-class GenericFunction(Function, metaclass=_GenericMeta):
+class GenericFunction(util.with_metaclass(_GenericMeta, Function)):
"""Define a 'generic' function.
A generic function is a pre-established :class:`.Function`
diff --git a/lib/sqlalchemy/sql/visitors.py b/lib/sqlalchemy/sql/visitors.py
index 6efce504a..4d2948462 100644
--- a/lib/sqlalchemy/sql/visitors.py
+++ b/lib/sqlalchemy/sql/visitors.py
@@ -49,11 +49,9 @@ class VisitableType(type):
Classes having no __visit_name__ attribute will remain unaffected.
"""
def __init__(cls, clsname, bases, clsdict):
- if cls.__name__ == 'Visitable' or not hasattr(cls, '__visit_name__'):
- super(VisitableType, cls).__init__(clsname, bases, clsdict)
- return
-
- _generate_dispatch(cls)
+ if clsname not in ('MetaBase', 'Visitable') and \
+ hasattr(cls, '__visit_name__'):
+ _generate_dispatch(cls)
super(VisitableType, cls).__init__(clsname, bases, clsdict)