]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- implement armin's awesome metaclass adaptor, can drop the refs to MetaBase.
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 May 2013 20:20:59 +0000 (16:20 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 May 2013 20:20:59 +0000 (16:20 -0400)
lib/sqlalchemy/event.py
lib/sqlalchemy/sql/functions.py
lib/sqlalchemy/sql/visitors.py
lib/sqlalchemy/util/compat.py

index d8c44dd05118d57e6a8b99f99a227bdff93ac5f7..bfd027ead0686f8703a97a7d05cf185d22b25799 100644 (file)
@@ -171,8 +171,7 @@ class _EventMeta(type):
     associated _Dispatch classes."""
 
     def __init__(cls, classname, bases, dict_):
-        if classname != 'MetaBase':
-            _create_dispatcher_class(cls, classname, bases, dict_)
+        _create_dispatcher_class(cls, classname, bases, dict_)
         return type.__init__(cls, classname, bases, dict_)
 
 
index 244505bed104cef046fa5eda47142beaa4f23809..5e2d0792cbe4c8c884dab6fb4d7c4cb76151f086 100644 (file)
@@ -31,14 +31,13 @@ def register_function(identifier, fn, package="_default"):
 
 class _GenericMeta(VisitableType):
     def __init__(cls, clsname, bases, clsdict):
-        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)
+        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)
 
 
index 4d294846280e8be818b566de09a5121ad96fab68..62f46ab64cca5e22b58ad60848fbdd00be74f36c 100644 (file)
@@ -49,7 +49,7 @@ class VisitableType(type):
     Classes having no __visit_name__ attribute will remain unaffected.
     """
     def __init__(cls, clsname, bases, clsdict):
-        if clsname not in ('MetaBase', 'Visitable') and \
+        if clsname != 'Visitable' and \
                 hasattr(cls, '__visit_name__'):
             _generate_dispatch(cls)
 
index 3bbce5ddebfb886956b558a59b77fce95a27d493..fea22873c5860a614d89d7f530af3ca588828657 100644 (file)
@@ -209,6 +209,21 @@ else:
 
 
 def with_metaclass(meta, *bases):
-    """Create a base class with a metaclass."""
+    """Create a base class with a metaclass.
+
+    Drops the middle class upon creation.
+
+    Source: http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/
+
+    """
+
+    class metaclass(meta):
+        __call__ = type.__call__
+        __init__ = type.__init__
+        def __new__(cls, name, this_bases, d):
+            if this_bases is None:
+                return type.__new__(cls, name, (), d)
+            return meta(name, bases, d)
+    return metaclass('temporary_class', None, {})
+
 
-    return meta("MetaBase", bases, {})