shrine-gridfs 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -1
- data/lib/shrine/storage/gridfs.rb +62 -34
- data/shrine-gridfs.gemspec +2 -2
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e8fabfa3388d58c758b30e733442cc7391abe20
|
4
|
+
data.tar.gz: 52f633d0fbf668df2275c4b238af1954ecf77c87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe629ee33d419e92a360dbec5236a9d57f11b239f5e1ef54942341cc70d0692e83e930421143a653f4b1d1e7773ddfcb081c032cb920f31c996dd3035a35e1aa
|
7
|
+
data.tar.gz: ebf937d63144034f7354cc26f656a0a4f9bfadf18d36625911d1ad00e3adee8abc71c5d8f3de3a08b3f89080ffeac5ca47910388bdade63a4f25fbec433c8e00
|
data/README.md
CHANGED
@@ -22,6 +22,8 @@ client = Mongo::Client.new("mongodb://127.0.0.1:27017/mydb")
|
|
22
22
|
Shrine::Storage::Gridfs.new(client: client)
|
23
23
|
```
|
24
24
|
|
25
|
+
### Prefix
|
26
|
+
|
25
27
|
The default prefix (bucket name) is "fs", you can change it with the `:prefix`
|
26
28
|
option:
|
27
29
|
|
@@ -29,6 +31,15 @@ option:
|
|
29
31
|
Shrine::Storage::Gridfs.new(client: client, prefix: "foo")
|
30
32
|
```
|
31
33
|
|
34
|
+
### Chunk size
|
35
|
+
|
36
|
+
By default the Gridfs storage will store files in chunks of 256KB, you can
|
37
|
+
change that via `:chunk_size`:
|
38
|
+
|
39
|
+
```rb
|
40
|
+
Shrine::Storage::Gridfs.new(client: client, chunk_size: 1*1024*1024) # 1MB
|
41
|
+
```
|
42
|
+
|
32
43
|
### URLs
|
33
44
|
|
34
45
|
You can generate URLs through which the GridFS files will be streamed with the
|
@@ -56,7 +67,7 @@ $ bundle exec rake test
|
|
56
67
|
|
57
68
|
## Inspiration
|
58
69
|
|
59
|
-
This gem
|
70
|
+
This gem was inspired by [refile-gridfs].
|
60
71
|
|
61
72
|
## License
|
62
73
|
|
@@ -1,30 +1,50 @@
|
|
1
1
|
require "shrine"
|
2
2
|
require "mongo"
|
3
3
|
require "down"
|
4
|
-
|
5
|
-
require "stringio"
|
4
|
+
require "digest"
|
6
5
|
|
7
6
|
class Shrine
|
8
7
|
module Storage
|
9
8
|
class Gridfs
|
10
|
-
attr_reader :client, :prefix, :bucket
|
9
|
+
attr_reader :client, :prefix, :bucket, :chunk_size
|
10
|
+
|
11
|
+
BATCH_SIZE = 5 * 1024 * 1024
|
12
|
+
|
13
|
+
def initialize(client:, prefix: "fs", chunk_size: 256*1024, **options)
|
14
|
+
@client = client
|
15
|
+
@prefix = prefix
|
16
|
+
@chunk_size = chunk_size
|
17
|
+
@bucket = @client.database.fs(bucket_name: @prefix)
|
11
18
|
|
12
|
-
def initialize(client:, prefix: "fs", **options)
|
13
|
-
@client = client
|
14
|
-
@prefix = prefix
|
15
|
-
@bucket = @client.database.fs(bucket_name: @prefix)
|
16
19
|
@bucket.send(:ensure_indexes!)
|
17
20
|
end
|
18
21
|
|
19
|
-
def upload(io, id, shrine_metadata: {}, **
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
def upload(io, id, shrine_metadata: {}, **)
|
23
|
+
file = create_file(id, shrine_metadata: shrine_metadata)
|
24
|
+
|
25
|
+
until io.eof?
|
26
|
+
chunk = io.read([BATCH_SIZE, chunk_size].max, buffer ||= "")
|
27
|
+
grid_chunks = Mongo::Grid::File::Chunk.split(chunk, file.info, offset ||= 0)
|
28
|
+
|
29
|
+
chunks_collection.insert_many(grid_chunks)
|
30
|
+
|
31
|
+
offset += grid_chunks.count
|
32
|
+
grid_chunks.each { |grid_chunk| grid_chunk.data.data.clear } # deallocate strings
|
33
|
+
chunk.clear # deallocate string
|
34
|
+
end
|
35
|
+
|
36
|
+
files_collection.find(_id: file.id).update_one("$set" => {md5: file.info.md5.hexdigest})
|
37
|
+
end
|
38
|
+
|
39
|
+
def move(io, id, shrine_metadata: {}, **)
|
40
|
+
file = create_file(id, shrine_metadata: shrine_metadata)
|
41
|
+
|
42
|
+
chunks_collection.find(files_id: bson_id(io.id)).update_many("$set" => {files_id: file.id})
|
43
|
+
files_collection.delete_one(_id: bson_id(io.id))
|
24
44
|
end
|
25
45
|
|
26
|
-
def
|
27
|
-
|
46
|
+
def movable?(io, id)
|
47
|
+
io.is_a?(UploadedFile) && io.storage.is_a?(Storage::Gridfs)
|
28
48
|
end
|
29
49
|
|
30
50
|
def open(id)
|
@@ -38,45 +58,53 @@ class Shrine
|
|
38
58
|
)
|
39
59
|
end
|
40
60
|
|
41
|
-
def read(id)
|
42
|
-
stringio = StringIO.new
|
43
|
-
bucket.download_to_stream(bson_id(id), stringio)
|
44
|
-
stringio.string
|
45
|
-
end
|
46
|
-
|
47
61
|
def exists?(id)
|
48
62
|
!!bucket.find(_id: bson_id(id)).first
|
49
63
|
end
|
50
64
|
|
51
65
|
def delete(id)
|
52
66
|
bucket.delete(bson_id(id))
|
67
|
+
rescue Mongo::Error::FileNotFound
|
53
68
|
end
|
54
69
|
|
55
70
|
def multi_delete(ids)
|
56
71
|
ids = ids.map { |id| bson_id(id) }
|
57
|
-
|
58
|
-
|
72
|
+
files_collection.find(_id: {"$in" => ids}).delete_many
|
73
|
+
chunks_collection.find(files_id: {"$in" => ids}).delete_many
|
59
74
|
end
|
60
75
|
|
61
|
-
def url(id, **
|
76
|
+
def url(id, **)
|
62
77
|
end
|
63
78
|
|
64
79
|
def clear!
|
65
|
-
|
66
|
-
|
80
|
+
files_collection.find.delete_many
|
81
|
+
chunks_collection.find.delete_many
|
67
82
|
end
|
68
83
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
84
|
+
private
|
85
|
+
|
86
|
+
def create_file(id, shrine_metadata: {})
|
87
|
+
file = Mongo::Grid::File.new("",
|
88
|
+
filename: shrine_metadata["filename"] || id,
|
89
|
+
content_type: shrine_metadata["mime_type"],
|
90
|
+
metadata: shrine_metadata,
|
91
|
+
chunk_size: chunk_size,
|
92
|
+
)
|
93
|
+
id.replace(file.id.to_s + File.extname(id))
|
94
|
+
|
95
|
+
bucket.insert_one(file)
|
96
|
+
|
97
|
+
file.info.document[:md5] = Digest::MD5.new
|
98
|
+
file
|
77
99
|
end
|
78
100
|
|
79
|
-
|
101
|
+
def files_collection
|
102
|
+
bucket.files_collection
|
103
|
+
end
|
104
|
+
|
105
|
+
def chunks_collection
|
106
|
+
bucket.chunks_collection
|
107
|
+
end
|
80
108
|
|
81
109
|
def bson_id(id)
|
82
110
|
BSON::ObjectId(File.basename(id, ".*"))
|
data/shrine-gridfs.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "shrine-gridfs"
|
3
|
-
gem.version = "0.
|
3
|
+
gem.version = "0.3.0"
|
4
4
|
|
5
5
|
gem.required_ruby_version = ">= 2.1"
|
6
6
|
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.files = Dir["README.md", "LICENSE.txt", "lib/**/*.rb", "shrine-gridfs.gemspec"]
|
14
14
|
gem.require_path = "lib"
|
15
15
|
|
16
|
-
gem.add_dependency "shrine", "~> 2.
|
16
|
+
gem.add_dependency "shrine", "~> 2.2"
|
17
17
|
gem.add_dependency "mongo", ">= 2.2.2", "< 3"
|
18
18
|
gem.add_dependency "down", ">= 2.3.3"
|
19
19
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shrine-gridfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janko Marohnić
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shrine
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2.
|
26
|
+
version: '2.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mongo
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,4 +136,3 @@ signing_key:
|
|
136
136
|
specification_version: 4
|
137
137
|
summary: Provides MongoDB's GridFS storage for Shrine.
|
138
138
|
test_files: []
|
139
|
-
has_rdoc:
|