Exemple #1
0
def test_to__skip_not_loaded(db):
    doc = create_fake(Doc)
    db.insert_one(doc)

    doc = db(Doc).find_one(doc.id, {'s': False})
    raw = to_mongo(doc, skip_not_loaded=True)
    assert raw == {
        '_id': doc.id,
        'i': doc.i,
        'e': {
            'ii': doc.e.ii,
            'ss': doc.e.ss,
        }
    }

    doc = db(Doc).find_one(doc.id, {'e.ss': False})
    raw = to_mongo(doc, skip_not_loaded=True)
    assert raw == {
        '_id': doc.id,
        'i': doc.i,
        's': doc.s,
        # 'e': {  # TODO: must create part of embedded document
        #     'ii': doc.e.ii,
        # }
    }
Exemple #2
0
def test_to__not_loaded_error(db):
    doc = create_fake(Doc)
    db.insert_one(doc)

    doc = db(Doc).find_one(doc.id, {'s': False})
    with pytest.raises(NotLoadedError):
        to_mongo(doc)

    doc = db(Doc).find_one(doc.id, {'e.ss': False})
    with pytest.raises(NotLoadedError):
        to_mongo(doc)
Exemple #3
0
 async def save(self, document, **collection_params):
     document.__db__ = self
     collection = self._get_collection(document.__class__,
                                       collection_params)
     document._id = await collection.save(to_mongo(document))
     document.__changed_clear__()
     return document
Exemple #4
0
 async def test():
     documents = [Doc(i=i) for i in range(5)]
     result = await db.db['testdocs'].insert_many(
         (to_mongo(d) for d in documents))
     assert len(result.inserted_ids) == len(documents)
     for _id in result.inserted_ids:
         doc = await db.get_document(Doc, _id)
         assert doc.id == _id
Exemple #5
0
 async def test():
     documents = [Doc(i=i) for i in range(5)]
     result = await db.db['testdocs'].insert_many(
         (to_mongo(d) for d in documents))
     assert len(result.inserted_ids) == len(documents)
     for _id in result.inserted_ids:
         doc = await db.get_document(Doc, _id, projection={'i': False})
         assert doc.id == _id
         assert 'i' in doc.__not_loaded__
Exemple #6
0
    def save(self, document, full=False, upsert=False, **collection_params):
        """ Save document to database.

        :param Document document: document instance for save
        :param bool full: fully resave document
            (default: `False`)
        :param bool upsert: see documentation for MongoDB's `update`
            (default: `False`)
        :param **collection_params: params for get_collection

        If document has no `_id`
        :py:meth:`insert <Database.insert>` new document.
        """
        if hasattr(document, '_id'):
            document.__db__ = self

            if full:
                self._get_collection(document, collection_params).update(
                    {'_id': document.id},
                    to_mongo(document),
                    upsert=upsert,
                    multi=False,
                )
                document.__changed_clear__()
            else:
                set_data = to_mongo(
                    document,
                    exclude=['_id'],
                    include=list(document.__changed__),
                )

                unset_data = [
                    f for f, v in document.__changed__.items()
                    if v is AttributeNotSet
                ]

                self.update_one(document,
                                set=set_data,
                                unset=unset_data,
                                **collection_params)

            return document
        else:
            return self.insert(document, **collection_params)
Exemple #7
0
    async def insert_one(self, document, **collection_params):
        document.__db__ = self
        collection = self._get_collection(document.__class__,
                                          collection_params)

        result = await collection.insert_one(to_mongo(document))

        document._id = result.inserted_id
        document.__log__.append(Insert(id=result.inserted_id))
        return result
Exemple #8
0
def test_to__include():
    doc = create_fake(Doc)
    doc.extra_doc_value = 'not serialized'
    raw = to_mongo(doc, include=['i', 'e.ss'])

    assert raw == {
        'i': doc.i,
        'e': {
            'ss': doc.e.ss,
        }
    }
Exemple #9
0
    def insert(self, document):
        """ Insert document to database

        :param Document document: document instance for insert to database

        It's set :attr:`yadm.documents.Document._id`.
        """
        document.__db__ = self
        collection = self._get_collection(document.__class__)
        document._id = collection.insert(to_mongo(document))
        document.__fields_changed__.clear()
        return document
Exemple #10
0
    def insert_one(self, document, **collection_params):
        """ Insert document to database.
        """
        document.__db__ = self
        collection = self._get_collection(document.__class__,
                                          collection_params)

        result = collection.insert_one(to_mongo(document))

        document._id = result.inserted_id
        document.__log__.append(Insert(id=result.inserted_id))
        return result
Exemple #11
0
    def insert(self, document):
        """ Insert document to database

        :param Document document: document instance for insert to database

        It's set :attr:`yadm.documents.Document._id`.
        """
        document.__db__ = self
        collection = self._get_collection(document.__class__)
        document._id = collection.insert(to_mongo(document))
        document.__fields_changed__.clear()
        return document
Exemple #12
0
    def insert_one(self, document, **collection_params):
        """ Insert document to database.
        """
        document.__db__ = self
        collection = self._get_collection(document.__class__,
                                          collection_params)

        result = collection.insert_one(to_mongo(document))

        document._id = result.inserted_id
        document.__log__.append(Insert(id=result.inserted_id))
        return result
Exemple #13
0
    def test_serialize_cycle(self, db):
        doc = self.Doc()
        doc.money = fields.Money(1, 'RUB')
        db.save(doc)

        data = db(self.Doc).find_one()

        data_tm = to_mongo(data)
        assert data_tm['money'][0] == 100
        assert data_tm['money'][1] == 643

        data_fm = from_mongo(self.Doc, data_tm)
        assert data_fm.money == fields.Money(1, 'RUB')
Exemple #14
0
    def test_serialize_cycle(self, db):
        doc = self.Doc()
        doc.money = fields.Money(1, 'RUB')
        db.save(doc)

        data = db(self.Doc).find_one()

        data_tm = to_mongo(data)
        assert data_tm['money'][0] == 100
        assert data_tm['money'][1] == 643

        data_fm = from_mongo(self.Doc, data_tm)
        assert data_fm.money == fields.Money(1, 'RUB')
Exemple #15
0
    def save(self, document, full=False, upsert=False):
        """ Save document to database

        :param Document document: document instance for save
        :param bool full: fully resave document
            (default: `False`)
        :param bool upsert: see documentation for MongoDB's `update`
            (default: `False`)

        If document has not `id` this :meth:`insert` new document.
        """
        if hasattr(document, '_id'):
            document.__db__ = self

            if full:
                self._get_collection(document).update(
                    {'_id': document.id},
                    to_mongo(document),
                    upsert=upsert,
                    multi=False,
                )
            else:
                self._get_collection(document).update(
                    {'_id': document.id},
                    {
                        '$set':
                        to_mongo(document,
                                 exclude=['_id'],
                                 include=document.__fields__.keys()),
                        # include=document.__fields_changed__),  # must be!
                    },
                    upsert=upsert,
                    multi=False,
                )

            document.__fields_changed__.clear()
            return document
        else:
            return self.insert(document)
Exemple #16
0
    def insert(self, document):
        """ Insert document to database.

        :param Document document: document instance for insert to database

        It's bind new document to database set
        :py:attr:`_id <yadm.documents.Document._id>`.
        """
        document.__db__ = self
        collection = self._get_collection(document.__class__)
        document._id = collection.insert(to_mongo(document))
        document.__changed_clear__()
        return document
Exemple #17
0
def test_to__exclude():
    doc = create_fake(Doc)
    doc.extra_doc_value = 'not serialized'
    raw = to_mongo(doc, exclude=['i'])

    assert raw == {
        '_id': doc.id,
        's': doc.s,
        'e': {
            'ii': doc.e.ii,
            'ss': doc.e.ss,
        }
    }
Exemple #18
0
    def save(self, document, full=False, upsert=False):
        """ Save document to database

        :param Document document: document instance for save
        :param bool full: fully resave document
            (default: `False`)
        :param bool upsert: see documentation for MongoDB's `update`
            (default: `False`)

        If document has not `id` this :meth:`insert` new document.
        """
        if hasattr(document, '_id'):
            document.__db__ = self

            if full:
                self._get_collection(document).update(
                    {'_id': document.id},
                    to_mongo(document),
                    upsert=upsert,
                    multi=False,
                )
            else:
                self._get_collection(document).update(
                    {'_id': document.id},
                    {'$set': to_mongo(
                        document,
                        exclude=['_id'],
                        include=document.__fields__.keys()),
                        # include=document.__fields_changed__),  # must be!
                    },
                    upsert=upsert,
                    multi=False,
                )

            document.__fields_changed__.clear()
            return document
        else:
            return self.insert(document)
Exemple #19
0
    async def save(self, document, **collection_params):
        document.__db__ = self
        if not hasattr(document, 'id'):
            document.id = ObjectId()

        raw = to_mongo(document)
        collection = self._get_collection(document, collection_params)
        await collection.find_one_and_replace(
            filter={'_id': document.id},
            replacement=raw,
            return_document=pymongo.collection.ReturnDocument.AFTER,
            upsert=True,
        )
        document.__log__.append(Save(id=document.id))
        return document
Exemple #20
0
    async def find_one_and_replace(self, document, *,
                                   return_document=ReturnDocument.BEFORE):
        """ Find a single document and replace it.
        """
        data = await self._collection.find_one_and_replace(
            filter=self._criteria,
            projection=self._projection,
            replacement=to_mongo(document),
            sort=self._sort,
            return_document=return_document,
        )
        if data is None:  # pragma: no cover
            return None

        return self._from_mongo_one(data, projection=self._projection)
Exemple #21
0
    def insert(self, document):
        """ Add insert document to bulk.

        :param Document document: document for insert

        .. warning::
            This unlike :py:class:`Database.insert <yadm.database.Database.insert>`!
            Currently, it is not bind objects to database and set id.
        """
        if not isinstance(document, self._document_class):
            raise TypeError("Bulk.insert() argument must be a {}, not '{}'"
                            "".format(self._document_class,
                                      document.__class__))

        self._bulk_mongo.insert(to_mongo(document))
Exemple #22
0
    async def find_one_and_replace(self,
                                   document,
                                   *,
                                   return_document=ReturnDocument.BEFORE):
        """ Find a single document and replace it.
        """
        data = await self._collection.find_one_and_replace(
            filter=self._criteria,
            projection=self._projection,
            replacement=to_mongo(document),
            sort=self._sort,
            return_document=return_document,
        )
        if data is None:  # pragma: no cover
            return None

        return self._from_mongo_one(data, projection=self._projection)
Exemple #23
0
 def insert_one(self, document):
     self._batch.append(InsertOne(to_mongo(document)))
Exemple #24
0
 def replace_one(self, cliteria, document, upsert=False):
     self._batch.append(
         ReplaceOne(cliteria, to_mongo(document), upsert=upsert))
Exemple #25
0
 def insert_one(self, document):
     self._batch.append(InsertOne(to_mongo(document)))
Exemple #26
0
 def gen(documents):
     for document in documents:
         yield to_mongo(document)
         document.__log__.append(Insert())
Exemple #27
0
 def to_mongo(self, document, value):
     if value is None:
         return None
     else:
         return to_mongo(value)
Exemple #28
0
 def to_mongo(self, document, value):
     return to_mongo(value)
Exemple #29
0
 def to_mongo(self, document, value):
     return to_mongo(value)
Exemple #30
0
 async def test():
     assert (await db.update_one(doc)) is None
     assert (await db.db['testdocs'].find_one(doc.id)) == to_mongo(doc)
Exemple #31
0
 def gen(documents):
     for document in documents:
         yield to_mongo(document)
         document.__log__.append(Insert())
Exemple #32
0
 def replace_one(self, cliteria, document, upsert=False):
     self._batch.append(ReplaceOne(cliteria, to_mongo(document), upsert=upsert))