Inheritance is off by default (MongoEngine/mongoengine#122)
This commit is contained in:
@@ -29,22 +29,6 @@ class AllWarnings(unittest.TestCase):
|
||||
# restore default handling of warnings
|
||||
warnings.showwarning = self.showwarning_default
|
||||
|
||||
def test_allow_inheritance_future_warning(self):
|
||||
"""Add FutureWarning for future allow_inhertiance default change.
|
||||
"""
|
||||
|
||||
class SimpleBase(Document):
|
||||
a = IntField()
|
||||
|
||||
class InheritedClass(SimpleBase):
|
||||
b = IntField()
|
||||
|
||||
InheritedClass()
|
||||
self.assertEqual(len(self.warning_list), 1)
|
||||
warning = self.warning_list[0]
|
||||
self.assertEqual(FutureWarning, warning["category"])
|
||||
self.assertTrue("InheritedClass" in str(warning["message"]))
|
||||
|
||||
def test_dbref_reference_field_future_warning(self):
|
||||
|
||||
class Person(Document):
|
||||
@@ -93,7 +77,7 @@ class AllWarnings(unittest.TestCase):
|
||||
def test_document_collection_syntax_warning(self):
|
||||
|
||||
class NonAbstractBase(Document):
|
||||
pass
|
||||
meta = {'allow_inheritance': True}
|
||||
|
||||
class InheritedDocumentFailTest(NonAbstractBase):
|
||||
meta = {'collection': 'fail'}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
sys.path[0:0] = [""]
|
||||
import unittest
|
||||
|
||||
from mongoengine import *
|
||||
@@ -126,9 +128,6 @@ class DeltaTest(unittest.TestCase):
|
||||
'list_field': ['1', 2, {'hello': 'world'}]
|
||||
}
|
||||
self.assertEqual(doc.embedded_field._delta(), (embedded_delta, {}))
|
||||
embedded_delta.update({
|
||||
'_cls': 'Embedded',
|
||||
})
|
||||
self.assertEqual(doc._delta(),
|
||||
({'embedded_field': embedded_delta}, {}))
|
||||
|
||||
@@ -162,6 +161,7 @@ class DeltaTest(unittest.TestCase):
|
||||
doc.embedded_field.list_field = ['1', 2, embedded_2]
|
||||
self.assertEqual(doc._get_changed_fields(),
|
||||
['embedded_field.list_field'])
|
||||
|
||||
self.assertEqual(doc.embedded_field._delta(), ({
|
||||
'list_field': ['1', 2, {
|
||||
'_cls': 'Embedded',
|
||||
@@ -175,10 +175,10 @@ class DeltaTest(unittest.TestCase):
|
||||
self.assertEqual(doc._delta(), ({
|
||||
'embedded_field.list_field': ['1', 2, {
|
||||
'_cls': 'Embedded',
|
||||
'string_field': 'hello',
|
||||
'dict_field': {'hello': 'world'},
|
||||
'int_field': 1,
|
||||
'list_field': ['1', 2, {'hello': 'world'}],
|
||||
'string_field': 'hello',
|
||||
'dict_field': {'hello': 'world'},
|
||||
'int_field': 1,
|
||||
'list_field': ['1', 2, {'hello': 'world'}],
|
||||
}]
|
||||
}, {}))
|
||||
doc.save()
|
||||
@@ -467,9 +467,6 @@ class DeltaTest(unittest.TestCase):
|
||||
'db_list_field': ['1', 2, {'hello': 'world'}]
|
||||
}
|
||||
self.assertEqual(doc.embedded_field._delta(), (embedded_delta, {}))
|
||||
embedded_delta.update({
|
||||
'_cls': 'Embedded',
|
||||
})
|
||||
self.assertEqual(doc._delta(),
|
||||
({'db_embedded_field': embedded_delta}, {}))
|
||||
|
||||
@@ -520,10 +517,10 @@ class DeltaTest(unittest.TestCase):
|
||||
self.assertEqual(doc._delta(), ({
|
||||
'db_embedded_field.db_list_field': ['1', 2, {
|
||||
'_cls': 'Embedded',
|
||||
'db_string_field': 'hello',
|
||||
'db_dict_field': {'hello': 'world'},
|
||||
'db_int_field': 1,
|
||||
'db_list_field': ['1', 2, {'hello': 'world'}],
|
||||
'db_string_field': 'hello',
|
||||
'db_dict_field': {'hello': 'world'},
|
||||
'db_int_field': 1,
|
||||
'db_list_field': ['1', 2, {'hello': 'world'}],
|
||||
}]
|
||||
}, {}))
|
||||
doc.save()
|
||||
@@ -686,3 +683,7 @@ class DeltaTest(unittest.TestCase):
|
||||
doc.list_field = []
|
||||
self.assertEqual(doc._get_changed_fields(), ['list_field'])
|
||||
self.assertEqual(doc._delta(), ({}, {'list_field': 1}))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import unittest
|
||||
import sys
|
||||
|
||||
sys.path[0:0] = [""]
|
||||
|
||||
from mongoengine import *
|
||||
from mongoengine.connection import get_db
|
||||
@@ -161,7 +164,7 @@ class DynamicTest(unittest.TestCase):
|
||||
embedded_1.list_field = ['1', 2, {'hello': 'world'}]
|
||||
doc.embedded_field = embedded_1
|
||||
|
||||
self.assertEqual(doc.to_mongo(), {"_cls": "Doc",
|
||||
self.assertEqual(doc.to_mongo(), {
|
||||
"embedded_field": {
|
||||
"_cls": "Embedded",
|
||||
"string_field": "hello",
|
||||
@@ -205,7 +208,7 @@ class DynamicTest(unittest.TestCase):
|
||||
embedded_1.list_field = ['1', 2, embedded_2]
|
||||
doc.embedded_field = embedded_1
|
||||
|
||||
self.assertEqual(doc.to_mongo(), {"_cls": "Doc",
|
||||
self.assertEqual(doc.to_mongo(), {
|
||||
"embedded_field": {
|
||||
"_cls": "Embedded",
|
||||
"string_field": "hello",
|
||||
@@ -246,7 +249,6 @@ class DynamicTest(unittest.TestCase):
|
||||
|
||||
class Person(DynamicDocument):
|
||||
name = StringField()
|
||||
meta = {'allow_inheritance': True}
|
||||
|
||||
Person.drop_collection()
|
||||
|
||||
@@ -268,3 +270,7 @@ class DynamicTest(unittest.TestCase):
|
||||
person.age = 35
|
||||
person.save()
|
||||
self.assertEqual(Person.objects.first().age, 35)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -203,7 +203,6 @@ class InheritanceTest(unittest.TestCase):
|
||||
|
||||
class Animal(Document):
|
||||
name = StringField()
|
||||
meta = {'allow_inheritance': False}
|
||||
|
||||
def create_dog_class():
|
||||
class Dog(Animal):
|
||||
@@ -258,7 +257,6 @@ class InheritanceTest(unittest.TestCase):
|
||||
|
||||
class Comment(EmbeddedDocument):
|
||||
content = StringField()
|
||||
meta = {'allow_inheritance': False}
|
||||
|
||||
def create_special_comment():
|
||||
class SpecialComment(Comment):
|
||||
|
||||
@@ -1,24 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import with_statement
|
||||
import sys
|
||||
sys.path[0:0] = [""]
|
||||
|
||||
import bson
|
||||
import os
|
||||
import pickle
|
||||
import pymongo
|
||||
import sys
|
||||
import unittest
|
||||
import uuid
|
||||
import warnings
|
||||
|
||||
from nose.plugins.skip import SkipTest
|
||||
from datetime import datetime
|
||||
|
||||
from tests.fixtures import Base, Mixin, PickleEmbedded, PickleTest
|
||||
from tests.fixtures import PickleEmbedded, PickleTest
|
||||
|
||||
from mongoengine import *
|
||||
from mongoengine.errors import (NotRegistered, InvalidDocumentError,
|
||||
InvalidQueryError)
|
||||
from mongoengine.queryset import NULLIFY, Q
|
||||
from mongoengine.connection import get_db, get_connection
|
||||
from mongoengine.connection import get_db
|
||||
|
||||
TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), 'mongoengine.png')
|
||||
|
||||
@@ -461,7 +459,7 @@ class InstanceTest(unittest.TestCase):
|
||||
doc.validate()
|
||||
keys = doc._data.keys()
|
||||
self.assertEqual(2, len(keys))
|
||||
self.assertTrue(None in keys)
|
||||
self.assertTrue('id' in keys)
|
||||
self.assertTrue('e' in keys)
|
||||
|
||||
def test_save(self):
|
||||
@@ -656,8 +654,8 @@ class InstanceTest(unittest.TestCase):
|
||||
self.assertEqual(p1.name, p.parent.name)
|
||||
|
||||
def test_update(self):
|
||||
"""Ensure that an existing document is updated instead of be overwritten.
|
||||
"""
|
||||
"""Ensure that an existing document is updated instead of be
|
||||
overwritten."""
|
||||
# Create person object and save it to the database
|
||||
person = self.Person(name='Test User', age=30)
|
||||
person.save()
|
||||
@@ -753,30 +751,33 @@ class InstanceTest(unittest.TestCase):
|
||||
float_field = FloatField(default=1.1)
|
||||
boolean_field = BooleanField(default=True)
|
||||
datetime_field = DateTimeField(default=datetime.now)
|
||||
embedded_document_field = EmbeddedDocumentField(EmbeddedDoc, default=lambda: EmbeddedDoc())
|
||||
embedded_document_field = EmbeddedDocumentField(EmbeddedDoc,
|
||||
default=lambda: EmbeddedDoc())
|
||||
list_field = ListField(default=lambda: [1, 2, 3])
|
||||
dict_field = DictField(default=lambda: {"hello": "world"})
|
||||
objectid_field = ObjectIdField(default=bson.ObjectId)
|
||||
reference_field = ReferenceField(Simple, default=lambda: Simple().save())
|
||||
reference_field = ReferenceField(Simple, default=lambda:
|
||||
Simple().save())
|
||||
map_field = MapField(IntField(), default=lambda: {"simple": 1})
|
||||
decimal_field = DecimalField(default=1.0)
|
||||
complex_datetime_field = ComplexDateTimeField(default=datetime.now)
|
||||
url_field = URLField(default="http://mongoengine.org")
|
||||
dynamic_field = DynamicField(default=1)
|
||||
generic_reference_field = GenericReferenceField(default=lambda: Simple().save())
|
||||
sorted_list_field = SortedListField(IntField(), default=lambda: [1, 2, 3])
|
||||
generic_reference_field = GenericReferenceField(
|
||||
default=lambda: Simple().save())
|
||||
sorted_list_field = SortedListField(IntField(),
|
||||
default=lambda: [1, 2, 3])
|
||||
email_field = EmailField(default="ross@example.com")
|
||||
geo_point_field = GeoPointField(default=lambda: [1, 2])
|
||||
sequence_field = SequenceField()
|
||||
uuid_field = UUIDField(default=uuid.uuid4)
|
||||
generic_embedded_document_field = GenericEmbeddedDocumentField(default=lambda: EmbeddedDoc())
|
||||
|
||||
generic_embedded_document_field = GenericEmbeddedDocumentField(
|
||||
default=lambda: EmbeddedDoc())
|
||||
|
||||
Simple.drop_collection()
|
||||
Doc.drop_collection()
|
||||
|
||||
Doc().save()
|
||||
|
||||
my_doc = Doc.objects.only("string_field").first()
|
||||
my_doc.string_field = "string"
|
||||
my_doc.save()
|
||||
@@ -1707,9 +1708,12 @@ class InstanceTest(unittest.TestCase):
|
||||
peter = User.objects.create(name="Peter")
|
||||
|
||||
# Bob
|
||||
Book.objects.create(name="1", author=bob, extra={"a": bob.to_dbref(), "b": [karl.to_dbref(), susan.to_dbref()]})
|
||||
Book.objects.create(name="2", author=bob, extra={"a": bob.to_dbref(), "b": karl.to_dbref()})
|
||||
Book.objects.create(name="3", author=bob, extra={"a": bob.to_dbref(), "c": [jon.to_dbref(), peter.to_dbref()]})
|
||||
Book.objects.create(name="1", author=bob, extra={
|
||||
"a": bob.to_dbref(), "b": [karl.to_dbref(), susan.to_dbref()]})
|
||||
Book.objects.create(name="2", author=bob, extra={
|
||||
"a": bob.to_dbref(), "b": karl.to_dbref()})
|
||||
Book.objects.create(name="3", author=bob, extra={
|
||||
"a": bob.to_dbref(), "c": [jon.to_dbref(), peter.to_dbref()]})
|
||||
Book.objects.create(name="4", author=bob)
|
||||
|
||||
# Jon
|
||||
@@ -1717,23 +1721,26 @@ class InstanceTest(unittest.TestCase):
|
||||
Book.objects.create(name="6", author=peter)
|
||||
Book.objects.create(name="7", author=jon)
|
||||
Book.objects.create(name="8", author=jon)
|
||||
Book.objects.create(name="9", author=jon, extra={"a": peter.to_dbref()})
|
||||
Book.objects.create(name="9", author=jon,
|
||||
extra={"a": peter.to_dbref()})
|
||||
|
||||
# Checks
|
||||
self.assertEqual(u",".join([str(b) for b in Book.objects.all()]) , "1,2,3,4,5,6,7,8,9")
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.all()]),
|
||||
"1,2,3,4,5,6,7,8,9")
|
||||
# bob related books
|
||||
self.assertEqual(u",".join([str(b) for b in Book.objects.filter(
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.filter(
|
||||
Q(extra__a=bob) |
|
||||
Q(author=bob) |
|
||||
Q(extra__b=bob))]) ,
|
||||
Q(extra__b=bob))]),
|
||||
"1,2,3,4")
|
||||
|
||||
# Susan & Karl related books
|
||||
self.assertEqual(u",".join([str(b) for b in Book.objects.filter(
|
||||
self.assertEqual(",".join([str(b) for b in Book.objects.filter(
|
||||
Q(extra__a__all=[karl, susan]) |
|
||||
Q(author__all=[karl, susan ]) |
|
||||
Q(extra__b__all=[karl.to_dbref(), susan.to_dbref()])
|
||||
) ]) , "1")
|
||||
Q(author__all=[karl, susan]) |
|
||||
Q(extra__b__all=[
|
||||
karl.to_dbref(), susan.to_dbref()]))
|
||||
]), "1")
|
||||
|
||||
# $Where
|
||||
self.assertEqual(u",".join([str(b) for b in Book.objects.filter(
|
||||
@@ -1743,7 +1750,7 @@ class InstanceTest(unittest.TestCase):
|
||||
return this.name == '1' ||
|
||||
this.name == '2';}"""
|
||||
}
|
||||
) ]), "1,2")
|
||||
)]), "1,2")
|
||||
|
||||
|
||||
class ValidatorErrorTest(unittest.TestCase):
|
||||
|
||||
@@ -331,14 +331,10 @@ class FieldTest(unittest.TestCase):
|
||||
return "<Person: %s>" % self.name
|
||||
|
||||
Person.drop_collection()
|
||||
paul = Person(name="Paul")
|
||||
paul.save()
|
||||
maria = Person(name="Maria")
|
||||
maria.save()
|
||||
julia = Person(name='Julia')
|
||||
julia.save()
|
||||
anna = Person(name='Anna')
|
||||
anna.save()
|
||||
paul = Person(name="Paul").save()
|
||||
maria = Person(name="Maria").save()
|
||||
julia = Person(name='Julia').save()
|
||||
anna = Person(name='Anna').save()
|
||||
|
||||
paul.other.friends = [maria, julia, anna]
|
||||
paul.other.name = "Paul's friends"
|
||||
|
||||
@@ -727,7 +727,7 @@ class FieldTest(unittest.TestCase):
|
||||
"""Ensure that the list fields can handle the complex types."""
|
||||
|
||||
class SettingBase(EmbeddedDocument):
|
||||
pass
|
||||
meta = {'allow_inheritance': True}
|
||||
|
||||
class StringSetting(SettingBase):
|
||||
value = StringField()
|
||||
@@ -743,8 +743,9 @@ class FieldTest(unittest.TestCase):
|
||||
e.mapping.append(StringSetting(value='foo'))
|
||||
e.mapping.append(IntegerSetting(value=42))
|
||||
e.mapping.append({'number': 1, 'string': 'Hi!', 'float': 1.001,
|
||||
'complex': IntegerSetting(value=42), 'list':
|
||||
[IntegerSetting(value=42), StringSetting(value='foo')]})
|
||||
'complex': IntegerSetting(value=42),
|
||||
'list': [IntegerSetting(value=42),
|
||||
StringSetting(value='foo')]})
|
||||
e.save()
|
||||
|
||||
e2 = Simple.objects.get(id=e.id)
|
||||
@@ -844,7 +845,7 @@ class FieldTest(unittest.TestCase):
|
||||
"""Ensure that the dict field can handle the complex types."""
|
||||
|
||||
class SettingBase(EmbeddedDocument):
|
||||
pass
|
||||
meta = {'allow_inheritance': True}
|
||||
|
||||
class StringSetting(SettingBase):
|
||||
value = StringField()
|
||||
@@ -859,9 +860,11 @@ class FieldTest(unittest.TestCase):
|
||||
e = Simple()
|
||||
e.mapping['somestring'] = StringSetting(value='foo')
|
||||
e.mapping['someint'] = IntegerSetting(value=42)
|
||||
e.mapping['nested_dict'] = {'number': 1, 'string': 'Hi!', 'float': 1.001,
|
||||
'complex': IntegerSetting(value=42), 'list':
|
||||
[IntegerSetting(value=42), StringSetting(value='foo')]}
|
||||
e.mapping['nested_dict'] = {'number': 1, 'string': 'Hi!',
|
||||
'float': 1.001,
|
||||
'complex': IntegerSetting(value=42),
|
||||
'list': [IntegerSetting(value=42),
|
||||
StringSetting(value='foo')]}
|
||||
e.save()
|
||||
|
||||
e2 = Simple.objects.get(id=e.id)
|
||||
@@ -915,7 +918,7 @@ class FieldTest(unittest.TestCase):
|
||||
"""Ensure that the MapField can handle complex declared types."""
|
||||
|
||||
class SettingBase(EmbeddedDocument):
|
||||
pass
|
||||
meta = {"allow_inheritance": True}
|
||||
|
||||
class StringSetting(SettingBase):
|
||||
value = StringField()
|
||||
@@ -951,7 +954,8 @@ class FieldTest(unittest.TestCase):
|
||||
number = IntField(default=0, db_field='i')
|
||||
|
||||
class Test(Document):
|
||||
my_map = MapField(field=EmbeddedDocumentField(Embedded), db_field='x')
|
||||
my_map = MapField(field=EmbeddedDocumentField(Embedded),
|
||||
db_field='x')
|
||||
|
||||
Test.drop_collection()
|
||||
|
||||
@@ -1038,6 +1042,8 @@ class FieldTest(unittest.TestCase):
|
||||
class User(EmbeddedDocument):
|
||||
name = StringField()
|
||||
|
||||
meta = {'allow_inheritance': True}
|
||||
|
||||
class PowerUser(User):
|
||||
power = IntField()
|
||||
|
||||
@@ -1046,8 +1052,10 @@ class FieldTest(unittest.TestCase):
|
||||
author = EmbeddedDocumentField(User)
|
||||
|
||||
post = BlogPost(content='What I did today...')
|
||||
post.author = User(name='Test User')
|
||||
post.author = PowerUser(name='Test User', power=47)
|
||||
post.save()
|
||||
|
||||
self.assertEqual(47, BlogPost.objects.first().author.power)
|
||||
|
||||
def test_reference_validation(self):
|
||||
"""Ensure that invalid docment objects cannot be assigned to reference
|
||||
@@ -2117,12 +2125,12 @@ class FieldTest(unittest.TestCase):
|
||||
def test_sequence_fields_reload(self):
|
||||
class Animal(Document):
|
||||
counter = SequenceField()
|
||||
type = StringField()
|
||||
name = StringField()
|
||||
|
||||
self.db['mongoengine.counters'].drop()
|
||||
Animal.drop_collection()
|
||||
|
||||
a = Animal(type="Boi")
|
||||
a = Animal(name="Boi")
|
||||
a.save()
|
||||
|
||||
self.assertEqual(a.counter, 1)
|
||||
|
||||
@@ -647,7 +647,8 @@ class QuerySetTest(unittest.TestCase):
|
||||
self.assertRaises(NotUniqueError, throw_operation_error_not_unique)
|
||||
self.assertEqual(Blog.objects.count(), 2)
|
||||
|
||||
Blog.objects.insert([blog2, blog3], write_options={'continue_on_error': True})
|
||||
Blog.objects.insert([blog2, blog3], write_options={
|
||||
'continue_on_error': True})
|
||||
self.assertEqual(Blog.objects.count(), 3)
|
||||
|
||||
def test_get_changed_fields_query_count(self):
|
||||
@@ -673,7 +674,7 @@ class QuerySetTest(unittest.TestCase):
|
||||
r2 = Project(name="r2").save()
|
||||
r3 = Project(name="r3").save()
|
||||
p1 = Person(name="p1", projects=[r1, r2]).save()
|
||||
p2 = Person(name="p2", projects=[r2]).save()
|
||||
p2 = Person(name="p2", projects=[r2, r3]).save()
|
||||
o1 = Organization(name="o1", employees=[p1]).save()
|
||||
|
||||
with query_counter() as q:
|
||||
@@ -688,24 +689,24 @@ class QuerySetTest(unittest.TestCase):
|
||||
self.assertEqual(q, 0)
|
||||
|
||||
fresh_o1 = Organization.objects.get(id=o1.id)
|
||||
fresh_o1.save()
|
||||
fresh_o1.save() # No changes, does nothing
|
||||
|
||||
self.assertEqual(q, 2)
|
||||
self.assertEqual(q, 1)
|
||||
|
||||
with query_counter() as q:
|
||||
self.assertEqual(q, 0)
|
||||
|
||||
fresh_o1 = Organization.objects.get(id=o1.id)
|
||||
fresh_o1.save(cascade=False)
|
||||
fresh_o1.save(cascade=False) # No changes, does nothing
|
||||
|
||||
self.assertEqual(q, 2)
|
||||
self.assertEqual(q, 1)
|
||||
|
||||
with query_counter() as q:
|
||||
self.assertEqual(q, 0)
|
||||
|
||||
fresh_o1 = Organization.objects.get(id=o1.id)
|
||||
fresh_o1.employees.append(p2)
|
||||
fresh_o1.save(cascade=False)
|
||||
fresh_o1.employees.append(p2) # Dereferences
|
||||
fresh_o1.save(cascade=False) # Saves
|
||||
|
||||
self.assertEqual(q, 3)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user