mongoid-grid_fs 2.3.0 → 2.4.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 +2 -5
- data/Rakefile +10 -7
- data/lib/mongoid-grid_fs.rb +1 -1
- data/lib/mongoid/grid_fs.rb +427 -429
- data/lib/mongoid/grid_fs/version.rb +1 -1
- data/test/mongoid-grid_fs_test.rb +124 -135
- data/test/testing.rb +61 -58
- metadata +7 -7
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
Testing Mongoid::GridFs do
|
4
|
-
##
|
5
|
-
#
|
4
|
+
##
|
5
|
+
#
|
6
6
|
GridFs = Mongoid::GridFs
|
7
7
|
|
8
8
|
prepare do
|
@@ -10,239 +10,228 @@ Testing Mongoid::GridFs do
|
|
10
10
|
GridFs::Chunk.delete_all
|
11
11
|
end
|
12
12
|
|
13
|
-
##
|
14
|
-
#
|
13
|
+
##
|
14
|
+
#
|
15
15
|
context '#put' do
|
16
|
-
|
17
16
|
test 'default' do
|
18
17
|
filename = __FILE__
|
19
18
|
basename = File.basename(filename)
|
20
19
|
|
21
|
-
g = assert{ GridFs.put(filename) }
|
20
|
+
g = assert { GridFs.put(filename) }
|
22
21
|
|
23
|
-
assert{ g.filename =~ %r
|
24
|
-
assert{ g.content_type ==
|
25
|
-
assert{ g.data == IO.read(filename) }
|
22
|
+
assert { g.filename =~ %r{ #{ object_id_re } / #{ basename } \Z}imox }
|
23
|
+
assert { g.content_type == 'application/x-ruby' }
|
24
|
+
assert { g.data == IO.read(filename) }
|
26
25
|
end
|
27
26
|
|
28
27
|
test 'with a :filename' do
|
29
28
|
filename = 'path/info/a.rb'
|
30
29
|
|
31
|
-
g = assert{ GridFs.put(__FILE__, :
|
30
|
+
g = assert { GridFs.put(__FILE__, filename: filename) }
|
32
31
|
|
33
|
-
assert{ g.filename == filename }
|
32
|
+
assert { g.filename == filename }
|
34
33
|
end
|
35
34
|
|
36
35
|
test 'with your own attributes' do
|
37
|
-
my_value =
|
36
|
+
my_value = 'my_value'
|
38
37
|
|
39
|
-
g = assert{ GridFs.put(__FILE__, :
|
38
|
+
g = assert { GridFs.put(__FILE__, my_value: my_value) }
|
40
39
|
|
41
|
-
assert{ g.my_value == my_value }
|
40
|
+
assert { g.my_value == my_value }
|
42
41
|
end
|
43
42
|
|
44
43
|
test 'when error occurs (eg. missing file)' do
|
45
44
|
file = '/path/to/missing'
|
46
45
|
|
47
|
-
assert_raises(Errno::ENOENT){ GridFs.put(file) }
|
46
|
+
assert_raises(Errno::ENOENT) { GridFs.put(file) }
|
48
47
|
end
|
49
|
-
|
50
48
|
end
|
51
49
|
|
52
|
-
|
53
|
-
|
54
|
-
#
|
50
|
+
##
|
51
|
+
#
|
55
52
|
context '#get' do
|
56
|
-
|
57
53
|
test 'default' do
|
58
|
-
id = assert{ GridFs::File.last.id }
|
59
|
-
g = assert{ GridFs.get(id) }
|
54
|
+
id = assert { GridFs::File.last.id }
|
55
|
+
g = assert { GridFs.get(id) }
|
60
56
|
end
|
61
|
-
|
62
57
|
end
|
63
58
|
|
64
|
-
##
|
65
|
-
#
|
59
|
+
##
|
60
|
+
#
|
66
61
|
context '#delete' do
|
67
|
-
|
68
62
|
test 'default' do
|
69
|
-
id = assert{ GridFs::File.last.id }
|
70
|
-
g = assert{ GridFs.get(id) }
|
71
|
-
assert{ GridFs.delete(id) }
|
72
|
-
assert_raises(Mongoid::Errors::DocumentNotFound){ GridFs.get(id) }
|
63
|
+
id = assert { GridFs::File.last.id }
|
64
|
+
g = assert { GridFs.get(id) }
|
65
|
+
assert { GridFs.delete(id) }
|
66
|
+
assert_raises(Mongoid::Errors::DocumentNotFound) { GridFs.get(id) }
|
73
67
|
end
|
74
|
-
|
75
68
|
end
|
76
69
|
|
77
|
-
##
|
78
|
-
#
|
70
|
+
##
|
71
|
+
#
|
79
72
|
context '[] and []=' do
|
80
|
-
|
81
73
|
test 'default' do
|
82
74
|
path = 'a.rb'
|
83
75
|
data = IO.read(__FILE__)
|
84
76
|
|
85
77
|
sio = SIO.new(path, data)
|
86
78
|
|
87
|
-
g = assert{ GridFs[path] = sio
|
79
|
+
g = assert { (GridFs[path] = sio) && GridFs[path] }
|
88
80
|
|
89
|
-
assert{ g.data == data }
|
90
|
-
assert{ g.content_type ==
|
81
|
+
assert { g.data == data }
|
82
|
+
assert { g.content_type == 'application/x-ruby' }
|
91
83
|
|
92
84
|
before = GridFs::File.count
|
93
85
|
|
94
|
-
data = "#{
|
86
|
+
data = "#{Time.now.to_f}-#{rand}"
|
95
87
|
|
96
|
-
assert{ GridFs[path] = SIO.new(path, data) }
|
97
|
-
assert{ GridFs[path].data == data }
|
88
|
+
assert { GridFs[path] = SIO.new(path, data) }
|
89
|
+
assert { GridFs[path].data == data }
|
98
90
|
|
99
91
|
after = GridFs::File.count
|
100
92
|
|
101
93
|
created = after - before
|
102
94
|
|
103
|
-
assert{ created == 1 }
|
95
|
+
assert { created == 1 }
|
104
96
|
end
|
105
97
|
|
106
|
-
##
|
107
|
-
#
|
108
|
-
|
98
|
+
##
|
99
|
+
#
|
100
|
+
context 'data uris' do
|
101
|
+
test 'default' do
|
102
|
+
id = assert { GridFs::File.last.id }
|
103
|
+
g = assert { GridFs.get(id) }
|
109
104
|
|
110
|
-
|
111
|
-
|
112
|
-
g = assert{ GridFs.get(id) }
|
105
|
+
content_type = g.content_type
|
106
|
+
base64 = [g.to_s].pack('m').chomp
|
113
107
|
|
114
|
-
|
115
|
-
base64 = [g.to_s].pack('m').chomp
|
108
|
+
data_uri = "data:#{content_type};base64,".concat(base64)
|
116
109
|
|
117
|
-
|
118
|
-
|
119
|
-
assert{ g.data_uri == data_uri }
|
110
|
+
assert { g.data_uri == data_uri }
|
111
|
+
end
|
120
112
|
end
|
121
113
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
g = assert { GridFs.get(id) }
|
131
|
-
assert { g.data[1..3] == g.slice(1..3) }
|
132
|
-
end
|
114
|
+
##
|
115
|
+
#
|
116
|
+
context 'slicing and dicing' do
|
117
|
+
test 'range' do
|
118
|
+
id = assert { GridFs::File.last.id }
|
119
|
+
g = assert { GridFs.get(id) }
|
120
|
+
assert { g.data[1..3] == g.slice(1..3) }
|
121
|
+
end
|
133
122
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
123
|
+
test 'start and length' do
|
124
|
+
id = assert { GridFs::File.last.id }
|
125
|
+
g = assert { GridFs.get(id) }
|
126
|
+
assert { g.data[1, 3] == g.slice(1, 3) }
|
127
|
+
end
|
139
128
|
|
140
|
-
|
141
|
-
|
142
|
-
|
129
|
+
test 'just a single param' do
|
130
|
+
id = assert { GridFs::File.last.id }
|
131
|
+
g = assert { GridFs.get(id) }
|
143
132
|
|
144
|
-
|
145
|
-
|
133
|
+
assert { g.data[1] == g.slice(1) }
|
134
|
+
end
|
146
135
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
136
|
+
test 'getting the last index' do
|
137
|
+
id = assert { GridFs::File.last.id }
|
138
|
+
g = assert { GridFs.get(id) }
|
139
|
+
assert { g.data[-1] == g.slice(-1) }
|
140
|
+
end
|
152
141
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
142
|
+
test 'yanking from the end of the data' do
|
143
|
+
id = assert { GridFs::File.last.id }
|
144
|
+
g = assert { GridFs.get(id) }
|
145
|
+
assert { g.data[-3, 2] == g.slice(-3, 2) }
|
146
|
+
end
|
158
147
|
|
159
|
-
|
160
|
-
|
148
|
+
test 'multiple chunks...' do
|
149
|
+
path = 'slice_and_dice.txt'
|
161
150
|
|
162
|
-
|
151
|
+
assert { GridFs[path] = SIO.new(path, 'foobar' * 256 * 1024) }
|
163
152
|
|
164
|
-
|
153
|
+
g = GridFs[path]
|
165
154
|
|
166
|
-
|
167
|
-
|
155
|
+
assert { g.chunks.count > 0 }
|
156
|
+
assert { g.data[10, (256 * 1024 * 2)] == g.slice(10, (256 * 1024 * 2)) }
|
157
|
+
end
|
168
158
|
end
|
169
|
-
end
|
170
159
|
|
171
|
-
##
|
172
|
-
#
|
173
|
-
|
174
|
-
|
175
|
-
|
160
|
+
##
|
161
|
+
#
|
162
|
+
context 'iterating each chunk' do
|
163
|
+
test 'having file size more than 42mb' do
|
164
|
+
require 'tempfile'
|
176
165
|
|
177
|
-
|
178
|
-
|
179
|
-
|
166
|
+
orig, copy = %w(orig copy).map do |suffix|
|
167
|
+
Tempfile.new("mongoid-grid_fs~43mb.#{suffix}")
|
168
|
+
end
|
180
169
|
|
181
|
-
|
182
|
-
|
170
|
+
kilobyte = 'x' * 1024
|
171
|
+
(43 * 1024).times { orig.write(kilobyte) }
|
183
172
|
|
184
|
-
|
185
|
-
|
186
|
-
|
173
|
+
GridFs.get(GridFs.put(orig.path).id).each do |chunk|
|
174
|
+
copy.print(chunk.to_s)
|
175
|
+
end
|
187
176
|
|
188
|
-
|
177
|
+
assert { File.size(orig.path) == File.size(copy.path) }
|
178
|
+
end
|
189
179
|
end
|
190
|
-
end
|
191
180
|
|
192
|
-
##
|
193
|
-
#
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
181
|
+
##
|
182
|
+
#
|
183
|
+
context 'namespaces' do
|
184
|
+
test 'default' do
|
185
|
+
assert { GridFs.namespace.prefix == 'fs' }
|
186
|
+
assert { GridFs.file_model.collection_name.to_s == 'fs.files' }
|
187
|
+
assert { GridFs.chunk_model.collection_name.to_s == 'fs.chunks' }
|
188
|
+
end
|
200
189
|
|
201
|
-
|
202
|
-
|
190
|
+
test 'new' do
|
191
|
+
ns = GridFs.namespace_for(:ns)
|
203
192
|
|
204
|
-
|
193
|
+
assert { ns.prefix == 'ns' }
|
205
194
|
|
206
|
-
|
207
|
-
|
195
|
+
assert { ns.file_model < Mongoid::Document }
|
196
|
+
assert { ns.file_model.collection_name.to_s == 'ns.files' }
|
208
197
|
|
209
|
-
|
210
|
-
|
198
|
+
assert { ns.chunk_model < Mongoid::Document }
|
199
|
+
assert { ns.chunk_model.collection_name.to_s == 'ns.chunks' }
|
211
200
|
|
212
|
-
|
201
|
+
assert { ns.file_model.destroy_all }
|
213
202
|
|
214
|
-
|
203
|
+
count = GridFs::File.count
|
215
204
|
|
216
|
-
|
217
|
-
|
218
|
-
|
205
|
+
assert { ns.file_model.count == 0 }
|
206
|
+
assert { ns.put __FILE__ }
|
207
|
+
assert { ns.file_model.count == 1 }
|
219
208
|
|
220
|
-
|
209
|
+
assert { count == GridFs::File.count }
|
210
|
+
end
|
221
211
|
end
|
222
212
|
end
|
223
213
|
|
224
|
-
|
225
|
-
|
226
|
-
##
|
227
|
-
#
|
214
|
+
##
|
215
|
+
#
|
228
216
|
context 'rails' do
|
229
217
|
test 'paths' do
|
230
218
|
testdir = File.dirname(__FILE__)
|
231
219
|
gemdir = File.dirname(testdir)
|
232
220
|
libdir = File.join(gemdir, 'lib')
|
233
221
|
|
234
|
-
expanded = proc{|paths| Array(paths).map{|path| File.expand_path(path)}}
|
222
|
+
expanded = proc { |paths| Array(paths).map { |path| File.expand_path(path) } }
|
235
223
|
|
236
|
-
assert
|
237
|
-
expanded[
|
238
|
-
|
224
|
+
assert do
|
225
|
+
expanded[Mongoid::GridFs::Engine.paths['app/models']] == expanded[libdir]
|
226
|
+
end
|
239
227
|
end
|
240
228
|
end
|
241
229
|
|
242
230
|
protected
|
231
|
+
|
243
232
|
def object_id_re
|
244
233
|
object_id = defined?(Moped::BSON) ? Moped::BSON::ObjectId.new : BSON::ObjectId.new
|
245
234
|
|
246
|
-
|
235
|
+
/ \w{#{ object_id.to_s.size }} /iomx
|
247
236
|
end
|
248
237
|
end
|
data/test/testing.rb
CHANGED
@@ -7,17 +7,17 @@ libdir = File.join(rootdir, 'lib')
|
|
7
7
|
|
8
8
|
STDOUT.sync = true
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
$LOAD_PATH.unshift(testdir) unless $LOAD_PATH.include?(testdir)
|
11
|
+
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
12
|
+
$LOAD_PATH.unshift(rootdir) unless $LOAD_PATH.include?(rootdir)
|
13
13
|
|
14
14
|
class Testing
|
15
15
|
class Slug < ::String
|
16
|
-
def
|
16
|
+
def self.for(*args)
|
17
17
|
string = args.flatten.compact.join('-')
|
18
|
-
words = string.to_s.scan(
|
19
|
-
words.map!{|word| word.gsub
|
20
|
-
words.delete_if{|word| word.nil?
|
18
|
+
words = string.to_s.scan(/\w+/)
|
19
|
+
words.map! { |word| word.gsub /[^0-9a-zA-Z_-]/, '' }
|
20
|
+
words.delete_if { |word| word.nil? || word.strip.empty? }
|
21
21
|
new(words.join('-').downcase)
|
22
22
|
end
|
23
23
|
end
|
@@ -25,7 +25,7 @@ class Testing
|
|
25
25
|
class Context
|
26
26
|
attr_accessor :name
|
27
27
|
|
28
|
-
def initialize(name, *
|
28
|
+
def initialize(name, *_args)
|
29
29
|
@name = name
|
30
30
|
end
|
31
31
|
|
@@ -39,21 +39,21 @@ def Testing(*args, &block)
|
|
39
39
|
Class.new(::Minitest::Test) do
|
40
40
|
i_suck_and_my_tests_are_order_dependent!
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
## class methods
|
43
|
+
#
|
44
44
|
class << self
|
45
45
|
def contexts
|
46
46
|
@contexts ||= []
|
47
47
|
end
|
48
48
|
|
49
49
|
def context(*args, &block)
|
50
|
-
return contexts.last if
|
50
|
+
return contexts.last if args.empty? && block.nil?
|
51
51
|
|
52
52
|
context = Testing::Context.new(*args)
|
53
53
|
contexts.push(context)
|
54
54
|
|
55
55
|
begin
|
56
|
-
|
56
|
+
yield(context)
|
57
57
|
ensure
|
58
58
|
contexts.pop
|
59
59
|
end
|
@@ -61,22 +61,24 @@ def Testing(*args, &block)
|
|
61
61
|
|
62
62
|
def slug_for(*args)
|
63
63
|
string = [context, args].flatten.compact.join('-')
|
64
|
-
words = string.to_s.scan(
|
65
|
-
words.map!{|word| word.gsub
|
66
|
-
words.delete_if{|word| word.nil?
|
64
|
+
words = string.to_s.scan(/\w+/)
|
65
|
+
words.map! { |word| word.gsub /[^0-9a-zA-Z_-]/, '' }
|
66
|
+
words.delete_if { |word| word.nil? || word.strip.empty? }
|
67
67
|
words.join('-').downcase.sub(/_$/, '')
|
68
68
|
end
|
69
69
|
|
70
|
-
def name
|
70
|
+
def name
|
71
|
+
const_get(:Name)
|
72
|
+
end
|
71
73
|
|
72
|
-
def testno
|
74
|
+
def testno
|
73
75
|
'%05d' % (@testno ||= 0)
|
74
76
|
ensure
|
75
77
|
@testno += 1
|
76
78
|
end
|
77
79
|
|
78
80
|
def testing(*args, &block)
|
79
|
-
method = [
|
81
|
+
method = ['test', testno, slug_for(*args)].delete_if(&:empty?).join('_')
|
80
82
|
define_method(method, &block)
|
81
83
|
end
|
82
84
|
|
@@ -105,43 +107,43 @@ def Testing(*args, &block)
|
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
+
## configure the subclass!
|
111
|
+
#
|
110
112
|
const_set(:Testno, '0')
|
111
|
-
slug = slug_for(*args).
|
112
|
-
name = ['TESTING', '%03d' % const_get(:Testno), slug].delete_if
|
113
|
+
slug = slug_for(*args).tr('-', '_')
|
114
|
+
name = ['TESTING', '%03d' % const_get(:Testno), slug].delete_if(&:empty?).join('_')
|
113
115
|
name = name.upcase!
|
114
116
|
const_set(:Name, name)
|
115
117
|
const_set(:Missing, Object.new.freeze)
|
116
118
|
|
117
|
-
|
118
|
-
|
119
|
+
## instance methods
|
120
|
+
#
|
119
121
|
alias_method('__assert__', 'assert')
|
120
122
|
|
121
123
|
def assert(*args, &block)
|
122
|
-
if args.size == 1
|
124
|
+
if (args.size == 1) && args.first.is_a?(Hash)
|
123
125
|
options = args.first
|
124
|
-
expected = getopt(:expected, options){ missing }
|
125
|
-
actual = getopt(:actual, options){ missing }
|
126
|
-
if expected == missing
|
126
|
+
expected = getopt(:expected, options) { missing }
|
127
|
+
actual = getopt(:actual, options) { missing }
|
128
|
+
if (expected == missing) && (actual == missing)
|
127
129
|
actual, expected, *ignored = options.to_a.flatten
|
128
130
|
end
|
129
|
-
expected = expected.call
|
130
|
-
actual = actual.call
|
131
|
+
expected = expected.call if expected.respond_to?(:call)
|
132
|
+
actual = actual.call if actual.respond_to?(:call)
|
131
133
|
assert_equal(expected, actual)
|
132
134
|
end
|
133
135
|
|
134
|
-
if block
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
136
|
+
result = if block
|
137
|
+
label = "assert(#{args.join(' ')})"
|
138
|
+
result = nil
|
139
|
+
result = yield
|
140
|
+
__assert__(result, label)
|
141
|
+
result
|
142
|
+
else
|
143
|
+
result = args.shift
|
144
|
+
label = "assert(#{args.join(' ')})"
|
145
|
+
__assert__(result, label)
|
146
|
+
result
|
145
147
|
end
|
146
148
|
end
|
147
149
|
|
@@ -151,46 +153,47 @@ def Testing(*args, &block)
|
|
151
153
|
|
152
154
|
def getopt(opt, hash, options = nil, &block)
|
153
155
|
[opt.to_s, opt.to_s.to_sym].each do |key|
|
154
|
-
return hash[key] if hash.
|
156
|
+
return hash[key] if hash.key?(key)
|
155
157
|
end
|
156
158
|
default =
|
157
159
|
if block
|
158
|
-
|
160
|
+
yield
|
159
161
|
else
|
160
162
|
options.is_a?(Hash) ? options[:default] : nil
|
161
163
|
end
|
162
|
-
|
164
|
+
default
|
163
165
|
end
|
164
166
|
|
165
|
-
def subclass_of
|
167
|
+
def subclass_of(exception)
|
166
168
|
class << exception
|
167
|
-
def ==(other)
|
169
|
+
def ==(other)
|
170
|
+
super || self > other
|
171
|
+
end
|
168
172
|
end
|
169
173
|
exception
|
170
174
|
end
|
171
175
|
|
172
|
-
|
173
|
-
|
176
|
+
##
|
177
|
+
#
|
174
178
|
module_eval(&block)
|
175
179
|
|
176
|
-
|
177
|
-
|
180
|
+
setup
|
181
|
+
prepare.each(&:call)
|
178
182
|
|
179
|
-
at_exit
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
+
at_exit do
|
184
|
+
teardown
|
185
|
+
cleanup.each(&:call)
|
186
|
+
end
|
183
187
|
|
184
188
|
self
|
185
189
|
end
|
186
190
|
end
|
187
191
|
|
188
|
-
|
189
|
-
if $0 == __FILE__
|
192
|
+
if $PROGRAM_NAME == __FILE__
|
190
193
|
|
191
194
|
Testing 'Testing' do
|
192
|
-
testing('foo'){ assert true }
|
193
|
-
test{ assert true }
|
195
|
+
testing('foo') { assert true }
|
196
|
+
test { assert true }
|
194
197
|
p instance_methods.grep(/test/)
|
195
198
|
end
|
196
199
|
|