--- elixir/entity.py.orig	2009-11-13 19:50:38 UTC
+++ elixir/entity.py
@@ -3,7 +3,7 @@ This module provides the ``Entity`` base class, as wel
 ``EntityMeta``.
 '''
 
-from py23compat import sorted
+from .py23compat import sorted
 
 import sys
 import types
@@ -172,7 +172,7 @@ class EntityDescriptor(object):
             self.identity = self.identity(entity)
 
         if self.polymorphic:
-            if not isinstance(self.polymorphic, basestring):
+            if not isinstance(self.polymorphic, str):
                 self.polymorphic = options.DEFAULT_POLYMORPHIC_COL_NAME
 
     #---------------------
@@ -226,7 +226,7 @@ class EntityDescriptor(object):
                         if col.primary_key:
                             self.add_column(col.copy())
             elif not self.has_pk and self.auto_primarykey:
-                if isinstance(self.auto_primarykey, basestring):
+                if isinstance(self.auto_primarykey, str):
                     colname = self.auto_primarykey
                 else:
                     colname = options.DEFAULT_AUTO_PRIMARYKEY_NAME
@@ -298,7 +298,7 @@ class EntityDescriptor(object):
                                        options.POLYMORPHIC_COL_TYPE))
 
             if self.version_id_col:
-                if not isinstance(self.version_id_col, basestring):
+                if not isinstance(self.version_id_col, str):
                     self.version_id_col = options.DEFAULT_VERSION_ID_COL_NAME
                 self.add_column(Column(self.version_id_col, Integer))
 
@@ -306,7 +306,7 @@ class EntityDescriptor(object):
         self.entity.table = Table(self.tablename, self.metadata,
                                   *args, **kwargs)
         if DEBUG:
-            print self.entity.table.repr2()
+            print(self.entity.table.repr2())
 
     def setup_reltables(self):
         self.call_builders('create_tables')
@@ -365,7 +365,7 @@ class EntityDescriptor(object):
         return children
 
     def translate_order_by(self, order_by):
-        if isinstance(order_by, basestring):
+        if isinstance(order_by, str):
             order_by = [order_by]
 
         order = []
@@ -505,12 +505,12 @@ class EntityDescriptor(object):
         # get one in any case.
         table = type.__getattribute__(self.entity, 'table')
         if table is not None:
-            if check_duplicate and col.key in table.columns.keys():
+            if check_duplicate and col.key in list(table.columns.keys()):
                 raise Exception("Column '%s' already exist in table '%s' ! " %
                                 (col.key, table.name))
             table.append_column(col)
             if DEBUG:
-                print "table.append_column(%s)" % col
+                print("table.append_column(%s)" % col)
 
     def add_constraint(self, constraint):
         self.constraints.append(constraint)
@@ -537,7 +537,7 @@ class EntityDescriptor(object):
         if mapper:
             mapper.add_property(name, property)
             if DEBUG:
-                print "mapper.add_property('%s', %s)" % (name, repr(property))
+                print("mapper.add_property('%s', %s)" % (name, repr(property)))
 
     def add_mapper_extension(self, extension):
         extensions = self.mapper_options.get('extension', [])
@@ -795,7 +795,7 @@ def instrument_class(cls):
 
     # Process attributes (using the assignment syntax), looking for
     # 'Property' instances and attaching them to this entity.
-    properties = [(name, attr) for name, attr in cls.__dict__.iteritems()
+    properties = [(name, attr) for name, attr in cls.__dict__.items()
                                if isinstance(attr, Property)]
     sorted_props = sorted(base_props + properties,
                           key=lambda i: i[1]._counter)
@@ -924,7 +924,7 @@ def setup_entities(entities):
         # delete all Elixir properties so that it doesn't interfere with
         # SQLAlchemy. At this point they should have be converted to
         # builders.
-        for name, attr in entity.__dict__.items():
+        for name, attr in list(entity.__dict__.items()):
             if isinstance(attr, Property):
                 delattr(entity, name)
 
@@ -1004,7 +1004,7 @@ class EntityBase(object):
         self.set(**kwargs)
 
     def set(self, **kwargs):
-        for key, value in kwargs.iteritems():
+        for key, value in kwargs.items():
             setattr(self, key, value)
 
     def update_or_create(cls, data, surrogate=True):
@@ -1038,7 +1038,7 @@ class EntityBase(object):
 
         mapper = sqlalchemy.orm.object_mapper(self)
 
-        for key, value in data.iteritems():
+        for key, value in data.items():
             if isinstance(value, dict):
                 dbvalue = getattr(self, key)
                 rel_class = mapper.get_property(key).mapper.class_
@@ -1074,7 +1074,7 @@ class EntityBase(object):
                                       if isinstance(p, ColumnProperty)]
         data = dict([(name, getattr(self, name))
                      for name in col_prop_names if name not in exclude])
-        for rname, rdeep in deep.iteritems():
+        for rname, rdeep in deep.items():
             dbdata = getattr(self, rname)
             #FIXME: use attribute names (ie coltoprop) instead of column names
             fks = self.mapper.get_property(rname).remote_side
@@ -1145,7 +1145,7 @@ class EntityBase(object):
     get = classmethod(get)
 
 
-class Entity(EntityBase):
+class Entity(EntityBase, metaclass=EntityMeta):
     '''
     The base class for all entities
 
@@ -1167,6 +1167,5 @@ class Entity(EntityBase):
     For further information, please refer to the provided examples or
     tutorial.
     '''
-    __metaclass__ = EntityMeta
 
 
--- elixir/py23compat.py.orig	2009-10-02 10:19:50 UTC
+++ elixir/py23compat.py
@@ -11,7 +11,7 @@ orig_cmp = cmp
 def sort_list(l, cmp=None, key=None, reverse=False):
     try:
         l.sort(cmp, key, reverse)
-    except TypeError, e:
+    except TypeError as e:
         if not str(e).startswith('sort expected at most 1 arguments'):
             raise
         if cmp is None:
--- elixir/relationships.py.orig	2009-11-13 20:04:26 UTC
+++ elixir/relationships.py
@@ -412,7 +412,7 @@ from sqlalchemy import ForeignKeyConstraint, Column, T
 from sqlalchemy.orm import relation, backref, class_mapper
 from sqlalchemy.ext.associationproxy import association_proxy
 
-import options
+from . import options
 from elixir.statements import ClassMutator
 from elixir.properties import Property
 from elixir.entity import EntityMeta, DEBUG
@@ -495,7 +495,7 @@ class Relationship(Property):
 
     def target(self):
         if not self._target:
-            if isinstance(self.of_kind, basestring):
+            if isinstance(self.of_kind, str):
                 collection = self.entity._descriptor.collection
                 self._target = collection.resolve(self.of_kind, self.entity)
             else:
@@ -1115,7 +1115,7 @@ class ManyToMany(Relationship):
             self.table = Table(tablename, e1_desc.metadata,
                                schema=schema, *args, **complete_kwargs)
             if DEBUG:
-                print self.table.repr2()
+                print(self.table.repr2())
 
     def _build_join_clauses(self):
         # In the case we have a self-reference, we need to build join clauses
@@ -1222,7 +1222,7 @@ def _get_join_clauses(local_table, local_cols1, local_
     # match.
 
 #TODO: rewrite this. Even with the comment, I don't even understand it myself.
-    for cols, constraint in constraint_map.iteritems():
+    for cols, constraint in constraint_map.items():
         if cols == cols1 or (cols != cols2 and
                              not cols1 and (cols2 in constraint_map or
                                             cols2 is None)):
