def test_grid_out_custom_opts(self): db = self.db.with_options(codec_options=UPPERSTR_DECODER_CODECOPTS) one = GridIn(db.fs, _id=5, filename="my_file", contentType="text/html", chunkSize=1000, aliases=["foo"], metadata={"foo": 'red', "bar": 'blue'}, bar=3, baz="hello") one.write(b"hello world") one.close() two = GridOut(db.fs, 5) self.assertEqual("my_file", two.name) self.assertEqual("my_file", two.filename) self.assertEqual(5, two._id) self.assertEqual(11, two.length) self.assertEqual("text/html", two.content_type) self.assertEqual(1000, two.chunk_size) self.assertTrue(isinstance(two.upload_date, datetime.datetime)) self.assertEqual(["foo"], two.aliases) self.assertEqual({"foo": 'red', "bar": 'blue'}, two.metadata) self.assertEqual(3, two.bar) self.assertEqual("5eb63bbbe01eeed093cb22bb8f5acdc3", two.md5) for attr in ["_id", "name", "content_type", "length", "chunk_size", "upload_date", "aliases", "metadata", "md5"]: self.assertRaises(AttributeError, setattr, two, attr, 5)
def get_version(self, filename, version=-1, **kwargs): """Get a file from GridFS by ``"filename"`` or metadata fields. Returns a version of the file in GridFS whose filename matches `filename` and whose metadata fields match the supplied keyword arguments, as an instance of :class:`~gridfs.grid_file.GridOut`. Version numbering is a convenience atop the GridFS API provided by MongoDB. If more than one file matches the query (either by `filename` alone, by metadata fields, or by a combination of both), then version ``-1`` will be the most recently uploaded matching file, ``-2`` the second most recently uploaded, etc. Version ``0`` will be the first version uploaded, ``1`` the second version, etc. So if three versions have been uploaded, then version ``0`` is the same as version ``-3``, version ``1`` is the same as version ``-2``, and version ``2`` is the same as version ``-1``. Raises :class:`~gridfs.errors.NoFile` if no such version of that file exists. An index on ``{filename: 1, uploadDate: -1}`` will automatically be created when this method is called the first time. :Parameters: - `filename`: ``"filename"`` of the file to get, or `None` - `version` (optional): version of the file to get (defaults to -1, the most recent version uploaded) - `**kwargs` (optional): find files by custom metadata. .. versionchanged:: 1.11 `filename` defaults to None; .. versionadded:: 1.11 Accept keyword arguments to find files by custom metadata. .. versionadded:: 1.9 """ # This is took from pymongo source. We need to go a little deeper here self._GridFS__files.ensure_index([("filename", ASCENDING), ("uploadDate", DESCENDING)]) ########## Begin of MongoKit hack ########## cursor = self._GridFS__files.find( self._get_spec(filename=filename, **kwargs)) ########## end of MongoKit hack ############ if version < 0: skip = abs(version) - 1 cursor.limit(-1).skip(skip).sort("uploadDate", DESCENDING) else: cursor.limit(-1).skip(version).sort("uploadDate", ASCENDING) try: grid_file = cursor.next() return GridOut(self._GridFS__collection, grid_file["_id"]) except StopIteration: raise NoFile("no version %d for filename %r" % (version, filename))
def get_version(self, filename, version=-1): """Get a file from GridFS by ``"filename"``. Returns a version of the file in GridFS with the name `filename` as an instance of :class:`~gridfs.grid_file.GridOut`. Version ``-1`` will be the most recently uploaded, ``-2`` the second most recently uploaded, etc. Version ``0`` will be the first version uploaded, ``1`` the second version, etc. So if three versions have been uploaded, then version ``0`` is the same as version ``-3``, version ``1`` is the same as version ``-2``, and version ``2`` is the same as version ``-1``. Raises :class:`~gridfs.errors.NoFile` if no such version of that file exists. An index on ``{filename: 1, uploadDate: -1}`` will automatically be created when this method is called the first time. :Parameters: - `filename`: ``"filename"`` of the file to get - `version` (optional): version of the file to get (defualts to -1, the most recent version uploaded) .. versionadded:: 1.9 """ # This is took from pymongo source. We need to go a little deeper here self._GridFS__files.ensure_index([("filename", ASCENDING), ("uploadDate", DESCENDING)]) ########## Begin of MongoKit hack ########## cursor = self._GridFS__files.find(self._get_spec(filename=filename)) ########## end of MongoKit hack ############ if version < 0: skip = abs(version) - 1 cursor.limit(-1).skip(skip).sort("uploadDate", DESCENDING) else: cursor.limit(-1).skip(version).sort("uploadDate", ASCENDING) try: grid_file = cursor.next() return GridOut(self._GridFS__collection, grid_file["_id"]) except StopIteration: raise NoFile("no version %d for filename %r" % (version, filename))
def read_image(fs_object: gridfs.GridOut) -> Image.Image: return Image.open(BytesIO(fs_object.read()))