diff --git a/mongomap/base.py b/mongomap/base.py index f4be1fb7..3138e426 100644 --- a/mongomap/base.py +++ b/mongomap/base.py @@ -1,4 +1,5 @@ + class ValidationError(Exception): pass @@ -69,7 +70,7 @@ class DocumentMetaclass(type): def __new__(cls, name, bases, attrs): metaclass = attrs.get('__metaclass__') - super_new = super(DocumentMetaclass, cls).__new__ + super_new = super(DocumentMetaclass, cls).__new__ if metaclass and issubclass(metaclass, DocumentMetaclass): return super_new(cls, name, bases, attrs) @@ -98,9 +99,12 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): """ def __new__(cls, name, bases, attrs): + super_new = super(TopLevelDocumentMetaclass, cls).__new__ # Classes defined in this package are abstract and should not have # their own metadata with DB collection, etc. - super_new = super(TopLevelDocumentMetaclass, cls).__new__ + # __metaclass__ is only set on the class with the __metaclass__ + # attribute (i.e. it is not set on subclasses). This differentiates + # 'real' documents from the 'Document' class if attrs.get('__metaclass__') == TopLevelDocumentMetaclass: return super_new(cls, name, bases, attrs) diff --git a/tests/document.py b/tests/document.py index 17365a1d..862cbe97 100644 --- a/tests/document.py +++ b/tests/document.py @@ -1,6 +1,6 @@ import unittest -from mongomap import Document, StringField, IntField +from mongomap import * class DocumentTest(unittest.TestCase): @@ -61,6 +61,14 @@ class DocumentTest(unittest.TestCase): person['name'] = 'Another User' self.assertEquals(person['name'], 'Another User') + def test_embedded_document(self): + """Ensure that embedded documents are set up correctly. + """ + class Comment(EmbeddedDocument): + content = StringField() + + self.assertTrue('content' in Comment._fields) + self.assertFalse(hasattr(Comment, '_meta')) if __name__ == '__main__':