]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
And thus ends support for Python 2.3.
authorJason Kirtland <jek@discorporate.us>
Tue, 15 Jul 2008 18:21:24 +0000 (18:21 +0000)
committerJason Kirtland <jek@discorporate.us>
Tue, 15 Jul 2008 18:21:24 +0000 (18:21 +0000)
27 files changed:
lib/sqlalchemy/engine/__init__.py
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
lib/sqlalchemy/engine/strategies.py
lib/sqlalchemy/engine/url.py
lib/sqlalchemy/exc.py
lib/sqlalchemy/ext/sqlsoup.py
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/collections.py
lib/sqlalchemy/orm/dependency.py
lib/sqlalchemy/orm/evaluator.py
lib/sqlalchemy/orm/interfaces.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/scoping.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/unitofwork.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/expression.py
lib/sqlalchemy/topological.py
lib/sqlalchemy/types.py
lib/sqlalchemy/util.py
setup.py
test/profiling/compiler.py

index eab8b3c0b47786cafdb0f1d8c3746461d2595539..d3802f30641c73ab0dbaf1db5fda0cdf4694f302 100644 (file)
@@ -180,8 +180,9 @@ def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
 def _coerce_config(configuration, prefix):
     """Convert configuration values to expected types."""
 
-    options = dict([(key[len(prefix):], configuration[key])
-                 for key in configuration if key.startswith(prefix)])
+    options = dict((key[len(prefix):], configuration[key])
+                   for key in configuration
+                   if key.startswith(prefix))
     for option, type_ in (
         ('convert_unicode', bool),
         ('pool_timeout', int),
index f356a7c050350c1bd02a4fe39b5651dee739e076..6aafafdc191858b7e449bc89dd6f89ed5d95bd3b 100644 (file)
@@ -1346,8 +1346,8 @@ class RowProxy(object):
 
     def __eq__(self, other):
         return ((other is self) or
-                (other == tuple([self.__parent._get_col(self.__row, key)
-                                 for key in xrange(len(self.__row))])))
+                (other == tuple(self.__parent._get_col(self.__row, key)
+                                for key in xrange(len(self.__row)))))
 
     def __ne__(self, other):
         return not self.__eq__(other)
@@ -1489,7 +1489,8 @@ class ResultProxy(object):
                         self.__props[o] = rec
 
             if self.__echo:
-                self.context.engine.logger.debug("Col " + repr(tuple([x[0] for x in metadata])))
+                self.context.engine.logger.debug(
+                    "Col " + repr(tuple(x[0] for x in metadata)))
 
     def _create_key_cache(self):
         # local copies to avoid circular ref against 'self'
@@ -1622,7 +1623,7 @@ class ResultProxy(object):
             # so we use an exception catch to reduce conditionals in _get_col
             if isinstance(key, slice):
                 indices = key.indices(len(row))
-                return tuple([self._get_col(row, i) for i in xrange(*indices)])
+                return tuple(self._get_col(row, i) for i in xrange(*indices))
             else:
                 raise
 
@@ -1773,7 +1774,7 @@ class BufferedColumnResultProxy(ResultProxy):
             # so we use an exception catch to reduce conditionals in _get_col
             if isinstance(key, slice):
                 indices = key.indices(len(row))
-                return tuple([self._get_col(row, i) for i in xrange(*indices)])
+                return tuple(self._get_col(row, i) for i in xrange(*indices))
             else:
                 raise
 
index dcbf8c76fc4b0fe11b0f92ddc535cc0d53a5ffb8..b68ce08185f975de2434ec945365ce9f7a4a5149 100644 (file)
@@ -136,14 +136,12 @@ class DefaultExecutionContext(base.ExecutionContext):
             # compiled clauseelement.  process bind params, process table defaults,
             # track collections used by ResultProxy to target and process results
 
-            self.processors = dict([
+            self.processors = dict(
                 (key, value) for key, value in
-                [(
-                    compiled.bind_names[bindparam],
-                    bindparam.bind_processor(self.dialect)
-                ) for bindparam in compiled.bind_names]
-                if value is not None
-            ])
+                ( (compiled.bind_names[bindparam],
+                   bindparam.bind_processor(self.dialect))
+                  for bindparam in compiled.bind_names )
+                if value is not None)
 
             self.result_map = compiled.result_map
 
@@ -212,7 +210,7 @@ class DefaultExecutionContext(base.ExecutionContext):
                 # that doesnt specify positional (because of execute_text())
                 if not isinstance(d, dict):
                     return d
-                return dict([(k.encode(self.dialect.encoding), d[k]) for k in d])
+                return dict((k.encode(self.dialect.encoding), d[k]) for k in d)
             return [proc(d) for d in params] or [{}]
 
     def __convert_compiled_params(self, compiled_parameters):
@@ -315,10 +313,9 @@ class DefaultExecutionContext(base.ExecutionContext):
         from the bind parameter's ``TypeEngine`` objects.
         """
 
-        types = dict([
+        types = dict(
                 (self.compiled.bind_names[bindparam], bindparam.type)
-                 for bindparam in self.compiled.bind_names
-            ])
+                 for bindparam in self.compiled.bind_names)
 
         if self.dialect.positional:
             inputsizes = []
index aa595c8e35df0acf2be03e92c7735f6b416dc8f3..c9e65982ef074e8ae596a22c402d3273cb7f2290 100644 (file)
@@ -115,7 +115,7 @@ class DefaultEngineStrategy(EngineStrategy):
                 "Invalid argument(s) %s sent to create_engine(), "
                 "using configuration %s/%s/%s.  Please check that the "
                 "keyword arguments are appropriate for this combination "
-                "of components." % (','.join(["'%s'" % k for k in kwargs]),
+                "of components." % (','.join("'%s'" % k for k in kwargs),
                                     dialect.__class__.__name__,
                                     pool.__class__.__name__,
                                     engineclass.__name__))
index 72d09bf8589a08af1fb0d238d7c2daca799b74d1..b81a91d5980faf3c673dba2a8e1983cff54c76ac 100644 (file)
@@ -72,7 +72,7 @@ class URL(object):
         if self.query:
             keys = self.query.keys()
             keys.sort()
-            s += '?' + "&".join(["%s=%s" % (k, self.query[k]) for k in keys])
+            s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys)
         return s
     
     def __eq__(self, other):
@@ -169,7 +169,7 @@ def _parse_rfc1738_args(name):
             components['database'] = tokens[0]
             query = (len(tokens) > 1 and dict(cgi.parse_qsl(tokens[1]))) or None
             if query is not None:
-                query = dict([(k.encode('ascii'), query[k]) for k in query])
+                query = dict((k.encode('ascii'), query[k]) for k in query)
         else:
             query = None
         components['query'] = query
index 602ef9408f3f44977f46e1d4c9ead1cd5613d582..96c2e4177a4694ac93c7fe16bcbf9e90e5ae071a 100644 (file)
@@ -126,8 +126,8 @@ class DBAPIError(SQLAlchemyError):
         self.connection_invalidated = connection_invalidated
 
     def __str__(self):
-        return ' '.join([SQLAlchemyError.__str__(self),
-                         repr(self.statement), repr(self.params)])
+        return ' '.join((SQLAlchemyError.__str__(self),
+                         repr(self.statement), repr(self.params)))
 
 
 # As of 0.4, SQLError is now DBAPIError.
index 1e7ee81848400a74e4d99b0db3471f45e64dbfcd..9364f8ae7d034428ab1b6f271ccb34b878a23f60 100644 (file)
@@ -432,7 +432,7 @@ def _selectable_name(selectable):
     if isinstance(selectable, sql.Alias):
         return _selectable_name(selectable.element)
     elif isinstance(selectable, sql.Select):
-        return ''.join([_selectable_name(s) for s in selectable.froms])
+        return ''.join(_selectable_name(s) for s in selectable.froms)
     elif isinstance(selectable, schema.Table):
         return selectable.name.capitalize()
     else:
index c6c1860eae3af9e1261aff5f525a2330ee36d1ad..9009e4c4f6384c587aa208054408cdf509e51cc1 100644 (file)
@@ -877,11 +877,12 @@ class InstanceState(object):
     def unmodified(self):
         """a set of keys which have no uncommitted changes"""
 
-        return util.Set([
-            key for key in self.manager.keys() if
-            key not in self.committed_state
-            or (key in self.manager.mutable_attributes and not self.manager[key].impl.check_mutable_modified(self))
-        ])
+        return util.Set(
+            key for key in self.manager.keys()
+            if (key not in self.committed_state or
+                (key in self.manager.mutable_attributes and
+                 not self.manager[key].impl.check_mutable_modified(self))))
+
     unmodified = property(unmodified)
     
     def unloaded(self):
@@ -891,10 +892,10 @@ class InstanceState(object):
         was never populated or modified.
         
         """
-        return util.Set([
-            key for key in self.manager.keys() if
-            key not in self.committed_state and key not in self.dict
-        ])
+        return util.Set(
+            key for key in self.manager.keys()
+            if key not in self.committed_state and key not in self.dict)
+
     unloaded = property(unloaded)
 
     def expire_attributes(self, attribute_names):
index fb1d18895c590cbc32a08e738978f9e55ade1fa6..aed206957ce742de0a61085e092d449e59a19896 100644 (file)
@@ -146,8 +146,8 @@ def column_mapped_collection(mapping_spec):
         def keyfunc(value):
             state = instance_state(value)
             m = _state_mapper(state)
-            return tuple([m._get_state_attr_by_column(state, c)
-                          for c in mapping_spec])
+            return tuple(m._get_state_attr_by_column(state, c)
+                         for c in mapping_spec)
     return lambda: MappedCollection(keyfunc)
 
 def attribute_mapped_collection(attr_name):
index ec0bb4d0937357e471ea4f13bc66fae53284d238..54208484b53112e59cf246309d691efd89e9961e 100644 (file)
@@ -279,7 +279,7 @@ class DetectKeySwitch(DependencyProcessor):
             self._process_key_switches(deplist, uowcommit)
 
     def _process_key_switches(self, deplist, uowcommit):
-        switchers = util.Set([s for s in deplist if self._pks_changed(uowcommit, s)])
+        switchers = util.Set(s for s in deplist if self._pks_changed(uowcommit, s))
         if switchers:
             # yes, we're doing a linear search right now through the UOW.  only
             # takes effect when primary key values have actually changed.
@@ -502,7 +502,7 @@ class MapperStub(object):
         self._inheriting_mappers = []
 
     def polymorphic_iterator(self):
-        return iter([self])
+        return iter((self,))
 
     def _register_dependencies(self, uowcommit):
         pass
index 30d2e8aed4e27d5bb00f9f6b08d9d2e335edbca4..2fbf3eac44da7d10db6df5756477c428f27e13d4 100644 (file)
@@ -6,15 +6,15 @@ import operator
 class UnevaluatableError(Exception):
     pass
 
-_straight_ops = Set([getattr(operators, op) for op in [
-    'add', 'mul', 'sub', 'div', 'mod', 'truediv', 'lt', 'le', 'ne', 'gt', 'ge', 'eq'
-]])
+_straight_ops = Set(getattr(operators, op)
+                    for op in ('add', 'mul', 'sub', 'div', 'mod', 'truediv',
+                               'lt', 'le', 'ne', 'gt', 'ge', 'eq'))
 
 
-_notimplemented_ops = Set([getattr(operators, op) for op in [
-    'like_op', 'notlike_op', 'ilike_op', 'notilike_op', 'between_op', 'in_op', 'notin_op',
-    'endswith_op', 'concat_op',
-]])
+_notimplemented_ops = Set(getattr(operators, op)
+                          for op in ('like_op', 'notlike_op', 'ilike_op',
+                                     'notilike_op', 'between_op', 'in_op',
+                                     'notin_op', 'endswith_op', 'concat_op'))
 
 class EvaluatorCompiler(object):
     def process(self, clause):
index 96a6e340c17af2967e1aada21ef954e3753d9f5b..7d0bae1da7dec2e78858fd3ea8cd0284a5254eee 100644 (file)
@@ -368,7 +368,7 @@ class MapperProperty(object):
         See PropertyLoader for the related instance implementation.
         """
 
-        return iter([])
+        return iter(())
 
     def set_parent(self, parent):
         self.parent = parent
index 6196682dd0c71883a906363dd6242dc230ad5cb5..97bf6644f047594012d9d5f1bb2bc3e90850d131 100644 (file)
@@ -510,7 +510,7 @@ class Mapper(object):
         self._cols_by_table = {}
 
         all_cols = util.Set(chain(*[col.proxy_set for col in self._columntoproperty]))
-        pk_cols = util.Set([c for c in all_cols if c.primary_key])
+        pk_cols = util.Set(c for c in all_cols if c.primary_key)
 
         # identify primary key columns which are also mapped by this mapper.
         for t in util.Set(self.tables + [self.mapped_table]):
@@ -519,15 +519,14 @@ class Mapper(object):
                 # ordering is important since it determines the ordering of mapper.primary_key (and therefore query.get())
                 self._pks_by_table[t] = util.OrderedSet(t.primary_key).intersection(pk_cols)
             self._cols_by_table[t] = util.OrderedSet(t.c).intersection(all_cols)
-        
-        # determine cols that aren't expressed within our tables; 
-        # mark these as "read only" properties which are refreshed upon 
-        # INSERT/UPDATE
-        self._readonly_props = util.Set([
-            self._columntoproperty[col] for col in self._columntoproperty if 
-                not hasattr(col, 'table') or col.table not in self._cols_by_table
-        ])
-        
+
+        # determine cols that aren't expressed within our tables; mark these
+        # as "read only" properties which are refreshed upon INSERT/UPDATE
+        self._readonly_props = util.Set(
+            self._columntoproperty[col]
+            for col in self._columntoproperty
+            if not hasattr(col, 'table') or col.table not in self._cols_by_table)
+
         # if explicit PK argument sent, add those columns to the primary key mappings
         if self.primary_key_argument:
             for k in self.primary_key_argument:
@@ -544,9 +543,12 @@ class Mapper(object):
         else:
             # determine primary key from argument or mapped_table pks - reduce to the minimal set of columns
             if self.primary_key_argument:
-                primary_key = sqlutil.reduce_columns([self.mapped_table.corresponding_column(c) for c in self.primary_key_argument])
+                primary_key = sqlutil.reduce_columns(
+                    self.mapped_table.corresponding_column(c)
+                    for c in self.primary_key_argument)
             else:
-                primary_key = sqlutil.reduce_columns(self._pks_by_table[self.mapped_table])
+                primary_key = sqlutil.reduce_columns(
+                    self._pks_by_table[self.mapped_table])
 
             if len(primary_key) == 0:
                 raise sa_exc.ArgumentError("Mapper %s could not assemble any primary key columns for mapped table '%s'" % (self, self.mapped_table.description))
index b6f1c803f38c619fc337bed89b97804c0797fa4d..76bcde0dc94e99cca251892491c827c61f1a0a34 100644 (file)
@@ -638,9 +638,9 @@ class PropertyLoader(StrategizedProperty):
         else:
             self.secondary_synchronize_pairs = None
 
-        self._foreign_keys = util.Set([r for l, r in self.synchronize_pairs])
+        self._foreign_keys = util.Set(r for l, r in self.synchronize_pairs)
         if self.secondary_synchronize_pairs:
-            self._foreign_keys.update([r for l, r in self.secondary_synchronize_pairs])
+            self._foreign_keys.update(r for l, r in self.secondary_synchronize_pairs)
 
     def _determine_direction(self):
         if self.secondaryjoin is not None:
@@ -726,9 +726,9 @@ class PropertyLoader(StrategizedProperty):
         if log.is_info_enabled(self.logger):
             self.logger.info(str(self) + " setup primary join %s" % self.primaryjoin)
             self.logger.info(str(self) + " setup secondary join %s" % self.secondaryjoin)
-            self.logger.info(str(self) + " synchronize pairs [%s]" % ",".join(["(%s => %s)" % (l, r) for l, r in self.synchronize_pairs]))
-            self.logger.info(str(self) + " secondary synchronize pairs [%s]" % ",".join(["(%s => %s)" % (l, r) for l, r in self.secondary_synchronize_pairs or []]))
-            self.logger.info(str(self) + " local/remote pairs [%s]" % ",".join(["(%s / %s)" % (l, r) for l, r in self.local_remote_pairs]))
+            self.logger.info(str(self) + " synchronize pairs [%s]" % ",".join("(%s => %s)" % (l, r) for l, r in self.synchronize_pairs))
+            self.logger.info(str(self) + " secondary synchronize pairs [%s]" % ",".join(("(%s => %s)" % (l, r) for l, r in self.secondary_synchronize_pairs or [])))
+            self.logger.info(str(self) + " local/remote pairs [%s]" % ",".join("(%s / %s)" % (l, r) for l, r in self.local_remote_pairs))
             self.logger.info(str(self) + " relation direction %s" % self.direction)
 
         if self.uselist is None and self.direction is MANYTOONE:
index c9b2dd9aa857d7c11101ec9e70a96433f40e2dc5..6bc1ce7feada18a94e0ab87049b8607bb82ff6e5 100644 (file)
@@ -445,7 +445,7 @@ class Query(object):
     query_from_parent = classmethod(util.deprecated(None, False)(query_from_parent))
 
     def correlate(self, *args):
-        self._correlate = self._correlate.union([_orm_selectable(s) for s in args])
+        self._correlate = self._correlate.union(_orm_selectable(s) for s in args)
     correlate = _generative()(correlate)
 
     def autoflush(self, setting):
@@ -1078,7 +1078,9 @@ class Query(object):
         (process, labels) = zip(*[query_entity.row_processor(self, context, custom_rows) for query_entity in self._entities])
 
         if not single_entity:
-            labels = dict([(label, property(util.itemgetter(i))) for i, label in enumerate(labels) if label])
+            labels = dict((label, property(util.itemgetter(i)))
+                          for i, label in enumerate(labels)
+                          if label)
             rowtuple = type.__new__(type, "RowTuple", (tuple,), labels)
             rowtuple.keys = labels.keys
         
@@ -1100,7 +1102,8 @@ class Query(object):
             elif single_entity:
                 rows = [process[0](context, row) for row in fetch]
             else:
-                rows = [rowtuple([proc(context, row) for proc in process]) for row in fetch]
+                rows = [rowtuple(proc(context, row) for proc in process)
+                        for row in fetch]
 
             if filter:
                 rows = filter(rows)
@@ -1160,7 +1163,7 @@ class Query(object):
                 try:
                     params[_get_params[primary_key].key] = ident[i]
                 except IndexError:
-                    raise sa_exc.InvalidRequestError("Could not find enough values to formulate primary key for query.get(); primary key columns are %s" % ', '.join(["'%s'" % str(c) for c in q.mapper.primary_key]))
+                    raise sa_exc.InvalidRequestError("Could not find enough values to formulate primary key for query.get(); primary key columns are %s" % ', '.join("'%s'" % str(c) for c in q.mapper.primary_key))
             q._params = params
 
         if lockmode is not None:
@@ -1444,7 +1447,9 @@ class Query(object):
         """
         for entity, (mapper, adapter, s, i, w) in self._mapper_adapter_map.iteritems():
             if mapper.single and mapper.inherits and mapper.polymorphic_on and mapper.polymorphic_identity is not None:
-                crit = mapper.polymorphic_on.in_([m.polymorphic_identity for m in mapper.polymorphic_iterator()])
+                crit = mapper.polymorphic_on.in_(
+                    m.polymorphic_identity
+                    for m in mapper.polymorphic_iterator())
                 if adapter:
                     crit = adapter.traverse(crit)
                 crit = self._adapt_clause(crit, False, False)
@@ -1625,10 +1630,10 @@ class _ColumnEntity(_QueryEntity):
         self.column = column
         self.entity_name = None
         self.froms = util.Set()
-        self.entities = util.OrderedSet([
-            elem._annotations['parententity'] for elem in visitors.iterate(column, {}) 
-            if 'parententity' in elem._annotations
-        ])
+        self.entities = util.OrderedSet(
+            elem._annotations['parententity']
+            for elem in visitors.iterate(column, {})
+            if 'parententity' in elem._annotations)
         
         if self.entities:
             self.entity_zero = list(self.entities)[0]
index d551bc9bc9e47fa904252184363682e7dc6206ff..aa79e610fe3a9f1485ac8a2b3c6ae62cc2928509 100644 (file)
@@ -59,9 +59,9 @@ class ScopedSession(object):
 
         from sqlalchemy.orm import mapper
 
-        extension_args = dict([(arg, kwargs.pop(arg))
-                               for arg in get_cls_kwargs(_ScopedExt)
-                               if arg in kwargs])
+        extension_args = dict((arg, kwargs.pop(arg))
+                              for arg in get_cls_kwargs(_ScopedExt)
+                              if arg in kwargs)
 
         kwargs['extension'] = extension = to_list(kwargs.get('extension', []))
         if extension_args:
index 3073e17dba05425006d5e552e3616213fbbcb36e..c58a04547fc92b9b54f2c8f674840747fc06f577 100644 (file)
@@ -475,7 +475,7 @@ class LazyLoader(AbstractRelationLoader):
                 secondaryjoin = visitors.replacement_traverse(secondaryjoin, {}, col_to_bind)
             lazywhere = sql.and_(lazywhere, secondaryjoin)
     
-        bind_to_col = dict([(binds[col].key, col) for col in binds])
+        bind_to_col = dict((binds[col].key, col) for col in binds)
         
         return (lazywhere, bind_to_col, equated_columns)
     _create_lazy_clause = classmethod(_create_lazy_clause)
index 4edfeefdceb6905da2b35ed083f0c41d3b9b1e7a..ec3275f0673017491558b90606c10a36e3307018 100644 (file)
@@ -310,7 +310,9 @@ class UOWTransaction(object):
                 ret.append(task)
 
         if self._should_log_debug:
-            self.logger.debug("Dependent tuples:\n" + "\n".join(["(%s->%s)" % (d[0].class_.__name__, d[1].class_.__name__) for d in self.dependencies]))
+            self.logger.debug("Dependent tuples:\n" + "\n".join(
+                    "(%s->%s)" % (d[0].class_.__name__, d[1].class_.__name__)
+                    for d in self.dependencies))
             self.logger.debug("Dependency sort:\n"+ str(ret))
         return ret
 
index 46d527d06b21992625f6dddfed68cc93b62c8975..e600694e0588bdc6d4e0e05898d9788d0e7e4cb1 100644 (file)
@@ -12,8 +12,9 @@ from sqlalchemy.sql import expression, util as sql_util, operators
 from sqlalchemy.orm.interfaces import MapperExtension, EXT_CONTINUE, PropComparator, MapperProperty
 from sqlalchemy.orm import attributes, exc
 
-all_cascades = util.FrozenSet(["delete", "delete-orphan", "all", "merge",
-                         "expunge", "save-update", "refresh-expire", "none"])
+all_cascades = util.FrozenSet(("delete", "delete-orphan", "all", "merge",
+                               "expunge", "save-update", "refresh-expire",
+                               "none"))
 
 _INSTRUMENTOR = ('mapper', 'instrumentor')
 
@@ -21,7 +22,7 @@ class CascadeOptions(object):
     """Keeps track of the options sent to relation().cascade"""
 
     def __init__(self, arg=""):
-        values = util.Set([c.strip() for c in arg.split(',')])
+        values = util.Set(c.strip() for c in arg.split(','))
         self.delete_orphan = "delete-orphan" in values
         self.delete = "delete" in values or "all" in values
         self.save_update = "save-update" in values or "all" in values
@@ -79,7 +80,8 @@ def polymorphic_union(table_map, typecolname, aliasname='p_union'):
                                      [sql.literal_column("'%s'" % type).label(typecolname)],
                                      from_obj=[table]))
         else:
-            result.append(sql.select([col(name, table) for name in colnames], from_obj=[table]))
+            result.append(sql.select([col(name, table) for name in colnames],
+                                     from_obj=[table]))
     return sql.union_all(*result).alias(aliasname)
 
 def identity_key(*args, **kwargs):
@@ -159,8 +161,8 @@ class ExtensionCarrier(object):
 
     """
 
-    interface = util.Set([method for method in dir(MapperExtension)
-                          if not method.startswith('_')])
+    interface = util.Set(method for method in dir(MapperExtension)
+                         if not method.startswith('_'))
 
     def __init__(self, extensions=None):
         self.methods = {}
index fff93df721a1ee1605eabccc80ea2336d41effc7..ac5c790097598cf5ae61f44a127cec19a1cf2aac 100644 (file)
@@ -282,8 +282,10 @@ class Table(SchemaItem, expression.TableClause):
 
     def __extra_kwargs(self, **kwargs):
         # validate remaining kwargs that they all specify DB prefixes
-        if len([k for k in kwargs if not re.match(r'^(?:%s)_' % '|'.join(databases.__all__), k)]):
-            raise TypeError("Invalid argument(s) for Table: %s" % repr(kwargs.keys()))
+        if len([k for k in kwargs
+                if not re.match(r'^(?:%s)_' % '|'.join(databases.__all__), k)]):
+            raise TypeError(
+                "Invalid argument(s) for Table: %s" % repr(kwargs.keys()))
         self.kwargs.update(kwargs)
 
     def __post_init(self, *args, **kwargs):
@@ -1251,7 +1253,7 @@ class PrimaryKeyConstraint(Constraint):
         if kwargs:
             raise exc.ArgumentError(
                 'Unknown PrimaryKeyConstraint argument(s): %s' %
-                ', '.join([repr(x) for x in kwargs.keys()]))
+                ', '.join(repr(x) for x in kwargs.keys()))
 
         super(PrimaryKeyConstraint, self).__init__(**constraint_args)
         self.__colnames = list(columns)
@@ -1314,7 +1316,7 @@ class UniqueConstraint(Constraint):
         if kwargs:
             raise exc.ArgumentError(
                 'Unknown UniqueConstraint argument(s): %s' %
-                ', '.join([repr(x) for x in kwargs.keys()]))
+                ', '.join(repr(x) for x in kwargs.keys()))
 
         super(UniqueConstraint, self).__init__(**constraint_args)
         self.__colnames = list(columns)
@@ -1410,8 +1412,7 @@ class Index(SchemaItem):
 
     def __repr__(self):
         return 'Index("%s", %s%s)' % (self.name,
-                                      ', '.join([repr(c)
-                                                 for c in self.columns]),
+                                      ', '.join(repr(c) for c in self.columns),
                                       (self.unique and ', unique=True') or '')
 
 class MetaData(SchemaItem):
index df5e853fabb6468fa78dbfd263718bccbaa9e00e..f21badf219a8c11655f186c8ff73f4e6ad1b1b28 100644 (file)
@@ -312,7 +312,8 @@ class DefaultCompiler(engine.Compiled):
             sep = ', '
         else:
             sep = " " + self.operator_string(clauselist.operator) + " "
-        return sep.join([s for s in [self.process(c) for c in clauselist.clauses] if s is not None])
+        return sep.join(s for s in (self.process(c) for c in clauselist.clauses)
+                        if s is not None)
 
     def visit_calculatedclause(self, clause, **kwargs):
         return self.process(clause.clause_expr)
@@ -346,7 +347,9 @@ class DefaultCompiler(engine.Compiled):
             stack_entry['is_subquery'] = True
         self.stack.append(stack_entry)
 
-        text = string.join([self.process(c, asfrom=asfrom, parens=False) for c in cs.selects], " " + cs.keyword + " ")
+        text = string.join((self.process(c, asfrom=asfrom, parens=False)
+                            for c in cs.selects),
+                           " " + cs.keyword + " ")
         group_by = self.process(cs._group_by_clause, asfrom=asfrom)
         if group_by:
             text += " GROUP BY " + group_by
@@ -519,7 +522,7 @@ class DefaultCompiler(engine.Compiled):
 
         if froms:
             text += " \nFROM "
-            text += string.join(from_strings, ', ')
+            text += ', '.join(from_strings)
         else:
             text += self.default_from()
 
@@ -602,9 +605,9 @@ class DefaultCompiler(engine.Compiled):
 
         return (insert + " INTO %s (%s) VALUES (%s)" %
                 (preparer.format_table(insert_stmt.table),
-                 ', '.join([preparer.quote(c[0].name, c[0].quote)
-                            for c in colparams]),
-                 ', '.join([c[1] for c in colparams])))
+                 ', '.join(preparer.quote(c[0].name, c[0].quote)
+                           for c in colparams),
+                 ', '.join(c[1] for c in colparams)))
 
     def visit_update(self, update_stmt):
         self.stack.append({'from':util.Set([update_stmt.table])})
@@ -612,7 +615,13 @@ class DefaultCompiler(engine.Compiled):
         self.isupdate = True
         colparams = self._get_colparams(update_stmt)
 
-        text = "UPDATE " + self.preparer.format_table(update_stmt.table) + " SET " + string.join(["%s=%s" % (self.preparer.quote(c[0].name, c[0].quote), c[1]) for c in colparams], ', ')
+        text = ' '.join((
+            "UPDATE",
+            self.preparer.format_table(update_stmt.table),
+            'SET',
+            ', '.join(self.preparer.quote(c[0].name, c[0].quote) + '=' + c[1]
+                      for c in colparams)
+            ))
 
         if update_stmt._whereclause:
             text += " WHERE " + self.process(update_stmt._whereclause)
@@ -645,7 +654,8 @@ class DefaultCompiler(engine.Compiled):
         if self.column_keys is None:
             parameters = {}
         else:
-            parameters = dict([(getattr(key, 'key', key), None) for key in self.column_keys])
+            parameters = dict((getattr(key, 'key', key), None)
+                              for key in self.column_keys)
 
         if stmt.parameters is not None:
             for k, v in stmt.parameters.iteritems():
@@ -789,8 +799,11 @@ class SchemaGenerator(DDLBase):
             if column.default is not None:
                 self.traverse_single(column.default)
 
-        self.append("\n" + " ".join(['CREATE'] + table._prefixes + ['TABLE', self.preparer.format_table(table), "("]))
-
+        self.append("\n" + " ".join(['CREATE'] +
+                                    table._prefixes +
+                                    ['TABLE',
+                                     self.preparer.format_table(table),
+                                     "("]))
         separator = "\n"
 
         # if only one primary key, specify it along with the column
@@ -858,7 +871,8 @@ class SchemaGenerator(DDLBase):
         if constraint.name is not None:
             self.append("CONSTRAINT %s " % self.preparer.format_constraint(constraint))
         self.append("PRIMARY KEY ")
-        self.append("(%s)" % ', '.join([self.preparer.quote(c.name, c.quote) for c in constraint]))
+        self.append("(%s)" % ', '.join(self.preparer.quote(c.name, c.quote)
+                                       for c in constraint))
         self.define_constraint_deferrability(constraint)
 
     def visit_foreign_key_constraint(self, constraint):
@@ -879,9 +893,11 @@ class SchemaGenerator(DDLBase):
                         preparer.format_constraint(constraint))
         table = list(constraint.elements)[0].column.table
         self.append("FOREIGN KEY(%s) REFERENCES %s (%s)" % (
-            ', '.join([preparer.quote(f.parent.name, f.parent.quote) for f in constraint.elements]),
+            ', '.join(preparer.quote(f.parent.name, f.parent.quote)
+                      for f in constraint.elements),
             preparer.format_table(table),
-            ', '.join([preparer.quote(f.column.name, f.column.quote) for f in constraint.elements])
+            ', '.join(preparer.quote(f.column.name, f.column.quote)
+                      for f in constraint.elements)
         ))
         if constraint.ondelete is not None:
             self.append(" ON DELETE %s" % constraint.ondelete)
@@ -894,7 +910,7 @@ class SchemaGenerator(DDLBase):
         if constraint.name is not None:
             self.append("CONSTRAINT %s " %
                         self.preparer.format_constraint(constraint))
-        self.append(" UNIQUE (%s)" % (', '.join([self.preparer.quote(c.name, c.quote) for c in constraint])))
+        self.append(" UNIQUE (%s)" % (', '.join(self.preparer.quote(c.name, c.quote) for c in constraint)))
         self.define_constraint_deferrability(constraint)
 
     def define_constraint_deferrability(self, constraint):
@@ -917,7 +933,8 @@ class SchemaGenerator(DDLBase):
         self.append("INDEX %s ON %s (%s)" \
                     % (preparer.quote(self._validate_identifier(index.name, True), index.quote),
                        preparer.format_table(index.table),
-                       string.join([preparer.quote(c.name, c.quote) for c in index.columns], ', ')))
+                       ', '.join(preparer.quote(c.name, c.quote)
+                                 for c in index.columns)))
         self.execute()
 
 
index 308f4b2020cbbfc69ca1d290a4f0020fd2df5d9b..2237391010f2ed01208b64f943db233afefa7e91 100644 (file)
@@ -1501,7 +1501,8 @@ class ColumnElement(ClauseElement, _CompareMixin):
     
     def base_columns(self):
         if not hasattr(self, '_base_columns'):
-            self._base_columns = util.Set([c for c in self.proxy_set if not hasattr(c, 'proxies')])
+            self._base_columns = util.Set(c for c in self.proxy_set
+                                          if not hasattr(c, 'proxies'))
         return self._base_columns
     base_columns = property(base_columns)
 
@@ -1964,7 +1965,8 @@ class _TextClause(ClauseElement):
     type = property(type)
 
     def _copy_internals(self, clone=_clone):
-        self.bindparams = dict([(b.key, clone(b)) for b in self.bindparams.values()])
+        self.bindparams = dict((b.key, clone(b))
+                               for b in self.bindparams.values())
 
     def get_children(self, **kwargs):
         return self.bindparams.values()
@@ -2317,8 +2319,9 @@ class Join(FromClause):
         global sql_util
         if not sql_util:
             from sqlalchemy.sql import util as sql_util
-        self._primary_key.extend(sql_util.reduce_columns([c for c in columns if c.primary_key], self.onclause))
-        self._columns.update([(col._label, col) for col in columns])
+        self._primary_key.extend(sql_util.reduce_columns(
+                (c for c in columns if c.primary_key), self.onclause))
+        self._columns.update((col._label, col) for col in columns)
         self._foreign_keys.update(itertools.chain(*[col.foreign_keys for col in columns]))    
         self._oid_column = self.left.oid_column
 
@@ -2981,10 +2984,9 @@ class Select(_SelectBaseMixin, FromClause):
             self._whereclause = None
 
         if from_obj:
-            self._froms.update([
+            self._froms.update(
                 _is_literal(f) and _TextClause(f) or f
-                for f in util.to_list(from_obj)
-            ])
+                for f in util.to_list(from_obj))
 
         if having:
             self._having = _literal_as_text(having)
@@ -3067,9 +3069,10 @@ class Select(_SelectBaseMixin, FromClause):
 
     def _copy_internals(self, clone=_clone):
         self._reset_exported()
-        from_cloned = dict([(f, clone(f)) for f in self._froms.union(self._correlate)])
-        self._froms = util.Set([from_cloned[f] for f in self._froms])
-        self._correlate = util.Set([from_cloned[f] for f in self._correlate])
+        from_cloned = dict((f, clone(f))
+                           for f in self._froms.union(self._correlate))
+        self._froms = util.Set(from_cloned[f] for f in self._froms)
+        self._correlate = util.Set(from_cloned[f] for f in self._correlate)
         self._raw_columns = [clone(c) for c in self._raw_columns]
         for attr in ('_whereclause', '_having', '_order_by_clause', '_group_by_clause'):
             if getattr(self, attr) is not None:
index 9ef3dfaf45cca5f744fae0b480ce2d773477afbd..c4c610b354186b86b591df397ff5f39ff116402a 100644 (file)
@@ -76,7 +76,7 @@ class _Node(object):
             str(self.item) + \
             (self.cycles is not None and (" (cycles: " + repr([x for x in self.cycles]) + ")") or "") + \
             "\n" + \
-            ''.join([str(n) for n in self.children])
+            ''.join(str(n) for n in self.children)
 
     def __repr__(self):
         return "%s" % (str(self.item))
@@ -150,7 +150,7 @@ class _EdgeCollection(object):
                     yield child
 
     def __len__(self):
-        return sum([len(x) for x in self.parent_to_children.values()])
+        return sum(len(x) for x in self.parent_to_children.values())
 
     def __iter__(self):
         for parent, children in self.parent_to_children.iteritems():
@@ -301,7 +301,7 @@ def _find_cycles(edges):
         traverse(parent)
 
     # sets are not hashable, so uniquify with id
-    unique_cycles = dict([(id(s), s) for s in cycles.values()]).values()
+    unique_cycles = dict((id(s), s) for s in cycles.values()).values()
     for cycle in unique_cycles:
         edgecollection = [edge for edge in edges
                           if edge[0] in cycle and edge[1] in cycle]
index 6b63377545e3303f08721b1e770f79295fb4c66c..163a6d7c48b29e857587ce45c1a84dff1cae4b48 100644 (file)
@@ -152,8 +152,8 @@ class AbstractType(object):
     def __repr__(self):
         return "%s(%s)" % (
             self.__class__.__name__,
-            ", ".join(["%s=%r" % (k, getattr(self, k, None))
-                      for k in inspect.getargspec(self.__init__)[0][1:]]))
+            ", ".join("%s=%r" % (k, getattr(self, k, None))
+                      for k in inspect.getargspec(self.__init__)[0][1:]))
 
 class TypeEngine(AbstractType):
     def dialect_impl(self, dialect, **kwargs):
index c9982a9fa092759767ecb6c659e35676bd833a83..7a6b964aadb4cb1063252af54b5e2866c00f17f0 100644 (file)
@@ -525,7 +525,7 @@ def dictlike_iteritems(dictlike):
                 yield key, getter(key)
         return iterator()
     elif hasattr(dictlike, 'keys'):
-        return iter([(key, getter(key)) for key in dictlike.keys()])
+        return iter((key, getter(key)) for key in dictlike.keys())
     else:
         raise TypeError(
             "Object '%r' is not dict-like" % dictlike)
@@ -535,7 +535,7 @@ def assert_arg_type(arg, argtype, name):
         return arg
     else:
         if isinstance(argtype, tuple):
-            raise exc.ArgumentError("Argument '%s' is expected to be one of type %s, got '%s'" % (name, ' or '.join(["'%s'" % str(a) for a in argtype]), str(type(arg))))
+            raise exc.ArgumentError("Argument '%s' is expected to be one of type %s, got '%s'" % (name, ' or '.join("'%s'" % str(a) for a in argtype), str(type(arg))))
         else:
             raise exc.ArgumentError("Argument '%s' is expected to be of type '%s', got '%s'" % (name, str(argtype), str(type(arg))))
 
@@ -856,21 +856,21 @@ class OrderedSet(Set):
 
     def intersection(self, other):
         other = Set(other)
-        return self.__class__([a for a in self if a in other])
+        return self.__class__(a for a in self if a in other)
 
     __and__ = intersection
 
     def symmetric_difference(self, other):
         other = Set(other)
-        result = self.__class__([a for a in self if a not in other])
-        result.update([a for a in other if a not in self])
+        result = self.__class__(a for a in self if a not in other)
+        result.update(a for a in other if a not in self)
         return result
 
     __xor__ = symmetric_difference
 
     def difference(self, other):
         other = Set(other)
-        return self.__class__([a for a in self if a not in other])
+        return self.__class__(a for a in self if a not in other)
 
     __sub__ = difference
 
@@ -1233,7 +1233,7 @@ class WeakCompositeKey(object):
         return cmp(tuple(self), tuple(other))
 
     def __iter__(self):
-        return iter([arg() for arg in self.args])
+        return iter(arg() for arg in self.args)
 
 class _symbol(object):
     def __init__(self, name):
index bb8e689fdec3e9e8684d34863d2ac96f16c444c0..2b4b831307e64703c1edc179da83f27fcb72d602 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1,10 +1,14 @@
 from ez_setup import use_setuptools
 use_setuptools()
+import os
+import sys
+from os import path
 from setuptools import setup, find_packages
 from distutils.command.build_py import build_py as _build_py
 from setuptools.command.sdist import sdist as _sdist
-import os
-from os import path
+
+if sys.version_info < (2, 4):
+    raise Exception("SQLAlchemy requires Python 2.4 or higher.")
 
 v = open(path.join(path.dirname(__file__), 'VERSION'))
 VERSION = v.readline().strip()
index a62c63c6b80f0bde2730ec9d2017d1446221270b..b37b63297d117bfcf6df187d454f122ebdedbd25 100644 (file)
@@ -15,7 +15,7 @@ class CompileTest(TestBase, AssertsExecutionResults):
             Column('c1', Integer, primary_key=True),
             Column('c2', String(30)))
 
-    @profiling.function_call_count(67, {'2.3': 44, '2.4': 42})
+    @profiling.function_call_count(72, {'2.3': 44, '2.4': 46})
     def test_insert(self):
         t1.insert().compile()