mongoid-grid_fs 1.9.2 → 2.0.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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZjEyOWUxN2IxNjBkN2U3NDdhZjc1MDg1MWM2ZDI1ODA4ZTdjNzQ3MA==
4
+ MzI1NDRlODVhMWVmODUwZmNlNGQzYmQ3NmZmYWM3MzNlYWQ4ZWZjMA==
5
5
  data.tar.gz: !binary |-
6
- ZmM1YWZkMzY5ZjEyMGJhNDc5NzNjODk2ZGUxOWY0YWQwNjYwOTM3Nw==
6
+ ZGFiNDQ5YWIwMzZiN2JmZjllYzYyODQyODAyNTY0OTQ0YzE0MWNlMg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Zjk0ZmYzMmRmY2I3N2MxZTdhYTM4MjY3M2E2ZjU1Y2RkYTE1MTdkNjg3YTRi
10
- ODhhMmE2NWVkMTgwMTRiMWU2OThlNmMxMWYyNjRhZGJjZDNiODUwMDQ4ODg2
11
- YWIxMWE2MzY2NjIwYmViYTYxODI3NWEwZGEwNjY1OTRjM2ViNGQ=
9
+ OTYyNWQ0ZTEzZmM4ZTYwZWUyOTc4NWE4NGEyNzE1MDJiOTMzMTkzNDQxNTEz
10
+ OGMwMGNhYzQ5ZmQ0NTAxOThiY2FkYTZiZmY2YjZhYzFjMmEyMGQ5NGQwMWJk
11
+ NGI3YWEzZTEyMTA3OWFlZGM2OTJmOGJlYjk4YjZhOTZkZWE5Y2M=
12
12
  data.tar.gz: !binary |-
13
- OGJhOGQwMjAwYmU4NzM5MTczNjhhYjE4ZmJmNTE1NmMwMmQ0OTk0ZTA5Mzdh
14
- M2VkNjI5MDZjN2NmYzM0NTQyMmRmZDc2ZDhmMzFhMTkxYTVkMGQ2MWU0Y2Ux
15
- NzU5NzZmZjNiYjg4MGNjNmZmYTM4ZWFiZGE3MmI0NmU5M2NiMmE=
13
+ YWUxMjcwMGRkY2EzYTI2Njk3MzgyYTRlNDg5MmJhMjVmNDRiNzllODQwNzlm
14
+ ZDI4ZmIwOWE0MmZhNjgzZDBiOGQ4YTZkODU2NWRlMDQwN2IwZDUyOThkNmJh
15
+ MDg2ZTZjNWIyN2E5MjA4MGM5MTc5NmZkY2IwZWQzZDZlMjk5NjI=
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rails"
4
+
5
+ gemspec
data/README.md CHANGED
@@ -8,31 +8,36 @@ INSTALL
8
8
 
9
9
  SYNOPSIS
10
10
  --------
11
+ ```ruby
12
+ require 'mongoid-grid_fs'
11
13
 
12
- ````ruby
13
- require 'mongoid-grid_fs'
14
- grid_fs = Mongoid::GridFs
15
- g = grid_fs.put(readable)
16
- id = g.id
17
- grid_fs.get(id)
18
- grid_fs.delete(id)
19
- ````
14
+ grid_fs = Mongoid::GridFs
15
+
16
+ g = grid_fs.put(readable)
17
+
18
+ id = g.id
19
+
20
+ grid_fs.get(id)
21
+
22
+ grid_fs.delete(id)
23
+ ```
20
24
 
21
25
  DESCRIPTION
22
26
  -----------
23
27
  mongoid_grid_fs is a pure mongoid 3 / moped implementation of the mongodb
24
28
  grid_fs specification
25
29
 
26
- ref: http://www.mongodb.org/display/DOCS/GridFS+Specification
30
+ ref: http://docs.mongodb.org/manual/reference/gridfs/
27
31
 
28
32
  it has the following features:
29
33
 
30
34
  - implementation is on top of mongoid for portability. moped (the driver) is
31
- barely used
35
+ barely used, so the library should be quite durable except in the face of
36
+ massive changes to mongoid itself.
32
37
 
33
38
  - simple, REST-like api
34
39
 
35
- - support for custom namespaces (fs.files vs. image.files)
40
+ - support for custom namespaces (fs.files vs. image.files, as per the spec)
36
41
 
37
42
  - pathnames and io-like objects can be written to the grid
38
43
 
@@ -43,8 +48,7 @@ it has the following features:
43
48
  - [] and []= methods which allow the grid to be used like a giant file
44
49
  hash in the sky
45
50
 
46
- - supprt for data_uris
47
-
51
+ - supprt for data_uris, like a html5 boss
48
52
  ````erb
49
53
 
50
54
  <%= image_tag :src => file.data_uri %>
data/Rakefile CHANGED
@@ -1,33 +1,22 @@
1
- This.name =
2
- "Mongoid::GridFs"
3
-
4
- This.synopsis =
5
- "a mongoid 3/moped compatible implementation of the grid_fs specification"
6
-
7
- This.rubyforge_project = 'codeforpeople'
8
- This.author = "Ara T. Howard"
9
- This.email = "ara.t.howard@gmail.com"
10
- This.homepage = "https://github.com/ahoward/#{ This.lib }"
11
-
12
- This.setup!
13
-
14
-
1
+ task :license do
2
+ open('LICENSE', 'w'){|fd| fd.puts "Ruby"}
3
+ end
15
4
 
16
5
  task :default do
17
6
  puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
18
7
  end
19
8
 
20
9
  task :test do
21
- This.run_tests!
10
+ run_tests!
22
11
  end
23
12
 
24
13
  namespace :test do
25
- task(:unit){ This.run_tests!(:unit) }
26
- task(:functional){ This.run_tests!(:functional) }
27
- task(:integration){ This.run_tests!(:integration) }
14
+ task(:unit){ run_tests!(:unit) }
15
+ task(:functional){ run_tests!(:functional) }
16
+ task(:integration){ run_tests!(:integration) }
28
17
  end
29
18
 
30
- def This.run_tests!(which = nil)
19
+ def run_tests!(which = nil)
31
20
  which ||= '**'
32
21
  test_dir = File.join(This.dir, "test")
33
22
  test_glob ||= File.join(test_dir, "#{ which }/**_test.rb")
@@ -38,28 +27,29 @@ def This.run_tests!(which = nil)
38
27
 
39
28
  test_rbs.each_with_index do |test_rb, index|
40
29
  testno = index + 1
41
- command = "#{ File.basename(This.ruby) } -I ./lib -I ./test/lib #{ test_rb }"
30
+ #command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
31
+ command = "#{ This.ruby } -I ./lib -I ./test/lib #{ test_rb }"
42
32
 
43
33
  puts
44
- This.say(div, :color => :cyan, :bold => true)
45
- This.say("@#{ testno } => ", :bold => true, :method => :print)
46
- This.say(command, :color => :cyan, :bold => true)
47
- This.say(line, :color => :cyan, :bold => true)
34
+ say(div, :color => :cyan, :bold => true)
35
+ say("@#{ testno } => ", :bold => true, :method => :print)
36
+ say(command, :color => :cyan, :bold => true)
37
+ say(line, :color => :cyan, :bold => true)
48
38
 
49
39
  system(command)
50
40
 
51
- This.say(line, :color => :cyan, :bold => true)
41
+ say(line, :color => :cyan, :bold => true)
52
42
 
53
43
  status = $?.exitstatus
54
44
 
55
45
  if status.zero?
56
- This.say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
57
- This.say("SUCCESS", :color => :green, :bold => true)
46
+ say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
47
+ say("SUCCESS", :color => :green, :bold => true)
58
48
  else
59
- This.say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
60
- This.say("FAILURE", :color => :red, :bold => true)
49
+ say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
50
+ say("FAILURE", :color => :red, :bold => true)
61
51
  end
62
- This.say(line, :color => :cyan, :bold => true)
52
+ say(line, :color => :cyan, :bold => true)
63
53
 
64
54
  exit(status) unless status.zero?
65
55
  end
@@ -68,10 +58,10 @@ end
68
58
 
69
59
  task :gemspec do
70
60
  ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
71
- ignore_directories = ['pkg', 'db', 'vendor', 'gemfiles']
72
- ignore_files = ['test/log', 'test/db.yml', 'a.rb', 'b.rb'] + Dir['Gemfile*'] + %w'db'
61
+ ignore_directories = ['pkg']
62
+ ignore_files = ['test/log']
73
63
 
74
- shiteless =
64
+ shiteless =
75
65
  lambda do |list|
76
66
  list.delete_if do |entry|
77
67
  next unless test(?e, entry)
@@ -79,8 +69,9 @@ task :gemspec do
79
69
  ignore_extensions.any?{|ext| ext === extension}
80
70
  end
81
71
  list.delete_if do |entry|
72
+ next unless test(?d, entry)
82
73
  dirname = File.expand_path(entry)
83
- ignore_directories.any?{|dir| dirname.include?(File.expand_path(dir)) }
74
+ ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
84
75
  end
85
76
  list.delete_if do |entry|
86
77
  next unless test(?f, entry)
@@ -95,10 +86,10 @@ task :gemspec do
95
86
  files = shiteless[Dir::glob("**/**")]
96
87
  executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
97
88
  #has_rdoc = true #File.exist?('doc')
98
- test_files = test(?e, "test/#{ lib }.rb") ? "test/#{ lib }.rb" : nil
99
- summary = This.summary || This.synopsis || "#{ lib } kicks the ass"
100
- description = This.description || summary
101
- license = 'Ruby'
89
+ test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
90
+ summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
91
+ description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
92
+ license = object.respond_to?(:license) ? object.license : "Ruby"
102
93
 
103
94
  if This.extensions.nil?
104
95
  This.extensions = []
@@ -109,7 +100,6 @@ task :gemspec do
109
100
  end
110
101
  extensions = [extensions].flatten.compact
111
102
 
112
- # TODO
113
103
  if This.dependencies.nil?
114
104
  dependencies = []
115
105
  else
@@ -121,11 +111,15 @@ task :gemspec do
121
111
  end
122
112
  end
123
113
 
114
+ if license.nil? && test(?s, 'LICENSE')
115
+ license = IO.binread('LICENSE')
116
+ end
117
+
124
118
  template =
125
119
  if test(?e, 'gemspec.erb')
126
- This.template_for{ IO.read('gemspec.erb') }
120
+ Template{ IO.read('gemspec.erb') }
127
121
  else
128
- This.template_for {
122
+ Template {
129
123
  <<-__
130
124
  ## <%= lib %>.gemspec
131
125
  #
@@ -160,20 +154,20 @@ task :gemspec do
160
154
  }
161
155
  end
162
156
 
163
- FileUtils.mkdir_p(This.pkgdir)
157
+ Fu.mkdir_p(This.pkgdir)
164
158
  gemspec = "#{ lib }.gemspec"
165
159
  open(gemspec, "w"){|fd| fd.puts(template)}
166
160
  This.gemspec = gemspec
167
161
  end
168
162
 
169
163
  task :gem => [:clean, :gemspec] do
170
- FileUtils.mkdir_p(This.pkgdir)
164
+ Fu.mkdir_p(This.pkgdir)
171
165
  before = Dir['*.gem']
172
166
  cmd = "gem build #{ This.gemspec }"
173
167
  `#{ cmd }`
174
168
  after = Dir['*.gem']
175
169
  gem = ((after - before).first || after.first) or abort('no gem!')
176
- FileUtils.mv(gem, This.pkgdir)
170
+ Fu.mv(gem, This.pkgdir)
177
171
  This.gem = File.join(This.pkgdir, File.basename(gem))
178
172
  end
179
173
 
@@ -187,21 +181,21 @@ task :readme do
187
181
  samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
188
182
 
189
183
  cmd = "cat #{ sample }"
190
- samples << This.util.indent(prompt + cmd, 2) << "\n\n"
191
- samples << This.util.indent(`#{ cmd }`, 4) << "\n"
184
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
185
+ samples << Util.indent(`#{ cmd }`, 4) << "\n"
192
186
 
193
187
  cmd = "ruby #{ sample }"
194
- samples << This.util.indent(prompt + cmd, 2) << "\n\n"
188
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
195
189
 
196
190
  cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
197
- samples << This.util.indent(`#{ cmd } 2>&1`, 4) << "\n"
191
+ samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
198
192
  end
199
193
 
200
194
  template =
201
- if test(?e, 'readme.erb')
202
- This.template_for{ IO.read('readme.erb') }
195
+ if test(?e, 'README.erb')
196
+ Template{ IO.read('README.erb') }
203
197
  else
204
- This.template_for {
198
+ Template {
205
199
  <<-__
206
200
  NAME
207
201
  #{ lib }
@@ -222,7 +216,7 @@ end
222
216
 
223
217
 
224
218
  task :clean do
225
- Dir[File.join(This.pkgdir, '**/**')].each{|entry| FileUtils.rm_rf(entry)}
219
+ Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
226
220
  end
227
221
 
228
222
 
@@ -237,11 +231,11 @@ task :release => [:clean, :gemspec, :gem] do
237
231
  system(cmd)
238
232
  abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
239
233
 
240
- #cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.gem }"
241
- #puts cmd
242
- #puts
243
- #system(cmd)
244
- #abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
234
+ cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.gem }"
235
+ puts cmd
236
+ puts
237
+ system(cmd)
238
+ abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
245
239
  end
246
240
 
247
241
 
@@ -253,106 +247,151 @@ BEGIN {
253
247
  #
254
248
  $VERBOSE = nil
255
249
 
250
+ require 'ostruct'
256
251
  require 'erb'
257
252
  require 'fileutils'
258
253
  require 'rbconfig'
259
254
  require 'pp'
260
255
 
261
- # cache a bunch of stuff about this rakefile/environment
256
+ # fu shortcut
262
257
  #
258
+ Fu = FileUtils
263
259
 
264
- This =
265
- Class.new(Hash) do
260
+ # pkg dir
261
+ #
262
+ Dir.chdir(File.dirname(__FILE__))
266
263
 
267
- def method_missing(method, *args, &block)
268
- if method.to_s =~ /=/
269
- key = method.to_s.chomp('=')
270
- value = block ? block : args.shift
264
+ # config object
265
+ #
266
+ class Cfg < ::Hash
267
+ def method_missing(method, *args, &block)
268
+ method = method.to_s
269
+ case method
270
+ when /=$/
271
+ key = method.chomp('=')
272
+ value = args.shift
271
273
  self[key] = value
274
+ when /\?$/
275
+ key = method.chomp('?')
276
+ self.key?(key)
277
+ when /\!$/
278
+ key = method.chomp('!')
279
+ self[key] = !!self[key]
272
280
  else
273
- key = method.to_s
274
- if block
275
- value = block
276
- self[key] = value
277
- else
278
- value = self[key]
279
-
280
- if value.respond_to?(:call)
281
- self[key] = value.call()
281
+ key = method
282
+ if args.empty? && block.nil?
283
+ if has_key?(key)
284
+ self[key]
282
285
  else
283
- value
286
+ nil
287
+ #raise IndexError, key
284
288
  end
289
+ else
290
+ value =
291
+ case
292
+ when args.size > 0
293
+ args.shift
294
+ when block
295
+ block.call
296
+ end
297
+ self[key] = value
285
298
  end
286
- end
287
- end
288
-
289
- def inspect
290
- expand!
291
- PP.pp(self, '')
292
299
  end
300
+ end
293
301
 
294
- def expand!
295
- keys.each do |key|
296
- value = self[key]
297
- if value.respond_to?(:call)
298
- self[key] = value.call()
299
- end
300
- end
301
- end
302
+ def eval(string)
303
+ instance_eval(string)
304
+ end
305
+ end
302
306
 
303
- end.new()
307
+ # cache a bunch of stuff about this rakefile/environment
308
+ #
309
+ This = Cfg.new
304
310
 
305
311
  This.file = File.expand_path(__FILE__)
306
312
  This.dir = File.dirname(This.file)
307
313
  This.pkgdir = File.join(This.dir, 'pkg')
308
314
 
309
- # defaults
315
+ # load config iff present
310
316
  #
311
- This.lib do
312
- File.basename(Dir.pwd)
313
- end
317
+ This.eval(IO.binread('config.rb')) if test(?s, 'config.rb')
314
318
 
315
- def This.setup!
316
- begin
317
- require "./lib/#{ This.lib }"
318
- rescue LoadError
319
- abort("could not load #{ This.lib }")
319
+ # grok lib
320
+ #
321
+ unless This.lib?
322
+ lib = ENV['LIB']
323
+ unless lib
324
+ lib = File.basename(Dir.pwd)
320
325
  end
326
+ This.lib = lib
321
327
  end
322
328
 
323
- This.name do
324
- This.name = This.lib.capitalize
329
+ # load lib
330
+ #
331
+ $LOAD_PATH.unshift('./lib')
332
+ Kernel.require(This.lib)
333
+
334
+ # grok the lib's object
335
+ #
336
+ unless This.object?
337
+ unless This.name?
338
+ This.name = File.basename(This.lib).split('_').each{|s| s.capitalize }.join('')
339
+ end
340
+ This.object = eval(This.name)
341
+ else
342
+ if This.object.is_a?(String)
343
+ This.object = eval(This.object)
344
+ unless This.name?
345
+ This.name = This.object.name
346
+ end
347
+ end
325
348
  end
326
349
 
327
- This.object do
328
- begin
329
- This.object = eval(This.name)
330
- rescue Object
331
- abort("could not determine object from #{ This.name }")
350
+ # grok version
351
+ #
352
+ unless This.version?
353
+ if This.object.respond_to?(:version)
354
+ This.version = This.object.send(:version)
332
355
  end
333
356
  end
357
+ abort 'no version' unless This.version?
334
358
 
335
- This.version do
336
- This.object.send(:version)
359
+ # see if dependencies are exported by the module
360
+ #
361
+ if This.object.respond_to?(:dependencies)
362
+ This.dependencies = This.object.dependencies
363
+ else
364
+ This.dependencies = []
337
365
  end
338
366
 
339
- This.dependencies do
340
- if This.object.respond_to?(:dependencies)
341
- This.object.dependencies
367
+ # set some reasonable defaults
368
+ #
369
+ {
370
+
371
+ :synopsis => "#{ This.name } kicks the ass",
372
+ :rubyforge_project => 'codeforpeople',
373
+ :author => "Ara T. Howard",
374
+ :email => "ara.t.howard@gmail.com",
375
+ :homepage => "https://github.com/ahoward/#{ This.lib }"
376
+
377
+ }.each do |key, val|
378
+ unless This.send("#{ key }?")
379
+ This.send("#{ key }=", val)
342
380
  end
343
381
  end
344
382
 
345
- This.ruby do
346
- c = Config::CONFIG
347
- bindir = c["bindir"] || c['BINDIR']
348
- ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
349
- ruby_ext = c['EXEEXT'] || ''
350
- File.join(bindir, (ruby_install_name + ruby_ext))
351
- end
383
+ # discover full path to this ruby executable
384
+ #
385
+ c = Config::CONFIG
386
+ bindir = c["bindir"] || c['BINDIR']
387
+ ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
388
+ ruby_ext = c['EXEEXT'] || ''
389
+ ruby = File.join(bindir, (ruby_install_name + ruby_ext))
390
+ This.ruby = ruby
352
391
 
353
392
  # some utils
354
393
  #
355
- This.util = Module.new do
394
+ module Util
356
395
  def indent(s, n = 2)
357
396
  s = unindent(s)
358
397
  ws = ' ' * n
@@ -362,33 +401,27 @@ BEGIN {
362
401
  def unindent(s)
363
402
  indent = nil
364
403
  s.each_line do |line|
365
- next if line =~ %r/^\s*$/
366
- indent = line[%r/^\s*/] and break
367
- end
368
- indent ? s.gsub(%r/^#{ indent }/, "") : s
404
+ next if line =~ %r/^\s*$/
405
+ indent = line[%r/^\s*/] and break
369
406
  end
370
-
407
+ indent ? s.gsub(%r/^#{ indent }/, "") : s
408
+ end
371
409
  extend self
372
410
  end
373
411
 
374
412
  # template support
375
413
  #
376
- This.template = Class.new do
414
+ class Template
377
415
  def initialize(&block)
378
416
  @block = block
379
417
  @template = block.call.to_s
380
418
  end
381
-
382
419
  def expand(b=nil)
383
- ERB.new(This.util.unindent(@template)).result((b||@block).binding)
420
+ ERB.new(Util.unindent(@template)).result((b||@block).binding)
384
421
  end
385
-
386
422
  alias_method 'to_s', 'expand'
387
423
  end
388
-
389
- def This.template_for(*args, &block)
390
- This.template.new(*args, &block)
391
- end
424
+ def Template(*args, &block) Template.new(*args, &block) end
392
425
 
393
426
  # colored console output support
394
427
  #
@@ -404,6 +437,7 @@ BEGIN {
404
437
  :blink => "\e[5m",
405
438
  :reverse => "\e[7m",
406
439
  :concealed => "\e[8m",
440
+
407
441
  :black => "\e[30m",
408
442
  :red => "\e[31m",
409
443
  :green => "\e[32m",
@@ -412,6 +446,7 @@ BEGIN {
412
446
  :magenta => "\e[35m",
413
447
  :cyan => "\e[36m",
414
448
  :white => "\e[37m",
449
+
415
450
  :on_black => "\e[40m",
416
451
  :on_red => "\e[41m",
417
452
  :on_green => "\e[42m",
@@ -421,8 +456,7 @@ BEGIN {
421
456
  :on_cyan => "\e[46m",
422
457
  :on_white => "\e[47m"
423
458
  }
424
-
425
- def This.say(something, *args)
459
+ def say(phrase, *args)
426
460
  options = args.last.is_a?(Hash) ? args.pop : {}
427
461
  options[:color] = args.shift.to_s.to_sym unless args.empty?
428
462
  keys = options.keys
@@ -431,7 +465,7 @@ BEGIN {
431
465
  color = options[:color]
432
466
  bold = options.has_key?(:bold)
433
467
 
434
- parts = [something]
468
+ parts = [phrase]
435
469
  parts.unshift(This.ansi[color]) if color
436
470
  parts.unshift(This.ansi[:bold]) if bold
437
471
  parts.push(This.ansi[:clear]) if parts.size > 1
data/config.rb ADDED
@@ -0,0 +1,5 @@
1
+
2
+ object "Mongoid::GridFs"
3
+
4
+ synopsis "a mongoid 3/moped compatible implementation of the grid_fs specification"
5
+
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rails"
4
+ gem "mongoid", github: "mongoid/mongoid", branch: "3.0.0-stable"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rails"
4
+ gem "mongoid", github: "mongoid/mongoid", branch: "3.1.0-stable"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rails", github: "rails/rails", branch: "4-0-stable"
4
+ gem "mongoid", github: "mongoid/mongoid", branch: "master"
5
+
6
+ gemspec path: "../"
@@ -2,7 +2,7 @@
2
2
  #
3
3
  module Mongoid
4
4
  class GridFS
5
- const_set :Version, '1.9.2'
5
+ const_set :Version, '2.0.0'
6
6
 
7
7
  class << GridFS
8
8
  def version
@@ -12,7 +12,7 @@
12
12
  def dependencies
13
13
  {
14
14
  'mongoid' => [ 'mongoid' , '>= 3.0', '< 5.0' ] ,
15
- 'mime/types' => [ 'mime-types' , '>= 1.19', '< 3.0'] ,
15
+ 'mime/types' => [ 'mime-types' , '>= 1.0', '< 3.0'] ,
16
16
  }
17
17
  end
18
18
 
@@ -173,20 +173,29 @@
173
173
  attributes[:uploadDate] = attributes.delete(:upload_date)
174
174
  end
175
175
 
176
+ if attributes.has_key?(:meta_data)
177
+ attributes[:metadata] = attributes.delete(:meta_data)
178
+ end
179
+
180
+ if attributes.has_key?(:aliases)
181
+ attributes[:aliases] = Array(attributes.delete(:aliases)).flatten.compact.map{|a| "#{ a }"}
182
+ end
183
+
176
184
  md5 = Digest::MD5.new
177
185
  length = 0
178
186
  chunkSize = file.chunkSize
179
187
  n = 0
180
188
 
181
189
  GridFS.reading(readable) do |io|
182
-
183
- filename =
184
- attributes[:filename] ||=
190
+ unless attributes.has_key?(:filename)
191
+ attributes[:filename] =
185
192
  [file.id.to_s, GridFS.extract_basename(io)].join('/').squeeze('/')
193
+ end
186
194
 
187
- content_type =
188
- attributes[:contentType] ||=
189
- GridFS.extract_content_type(filename) || file.contentType
195
+ unless attributes.has_key?(:contentType)
196
+ attributes[:contentType] =
197
+ GridFS.extract_content_type(attributes[:filename]) || file.contentType
198
+ end
190
199
 
191
200
  GridFS.chunking(io, chunkSize) do |buf|
192
201
  md5 << buf
@@ -198,7 +207,6 @@
198
207
  chunk.save!
199
208
  chunks.push(chunk)
200
209
  end
201
-
202
210
  end
203
211
 
204
212
  attributes[:length] ||= length
@@ -246,12 +254,14 @@
246
254
  end
247
255
 
248
256
  def [](filename)
249
- file_model.where(:filename => filename.to_s).first
257
+ file_model.
258
+ where(:filename => filename.to_s).
259
+ order_by(:uploadDate => :desc).
260
+ limit(1).
261
+ first
250
262
  end
251
263
 
252
264
  def []=(filename, readable)
253
- file = self[filename]
254
- file.destroy if file
255
265
  put(readable, :filename => filename.to_s)
256
266
  end
257
267
 
@@ -312,29 +322,51 @@
312
322
  self.defaults.chunkSize = 4 * (mb = 2**20)
313
323
  self.defaults.contentType = 'application/octet-stream'
314
324
 
315
- field(:filename, :type => String)
316
- field(:contentType, :type => String, :default => defaults.contentType)
317
-
318
325
  field(:length, :type => Integer, :default => 0)
319
326
  field(:chunkSize, :type => Integer, :default => defaults.chunkSize)
320
327
  field(:uploadDate, :type => Time, :default => Time.now.utc)
321
328
  field(:md5, :type => String, :default => Digest::MD5.hexdigest(''))
322
329
 
323
- %w( filename contentType length chunkSize uploadDate md5 ).each do |f|
330
+ field(:filename, :type => String)
331
+ field(:contentType, :type => String, :default => defaults.contentType)
332
+ field(:aliases, :type => Array)
333
+ field(:metadata) rescue nil
334
+
335
+ required = %w( length chunkSize uploadDate md5 )
336
+
337
+ required.each do |f|
324
338
  validates_presence_of(f)
325
339
  end
326
- validates_uniqueness_of(:filename)
327
340
 
328
- has_many(:chunks, :class_name => chunk_model_name, :inverse_of => :files, :dependent => :destroy, :order => [:n, :asc])
341
+ index({:filename => 1})
342
+ index({:aliases => 1})
343
+ index({:uploadDate => 1})
344
+ index({:md5 => 1})
329
345
 
330
- index({:filename => 1}, :unique => true)
346
+ has_many(:chunks, :class_name => chunk_model_name, :inverse_of => :files, :dependent => :destroy, :order => [:n, :asc])
331
347
 
332
348
  def path
333
349
  filename
334
350
  end
335
351
 
336
352
  def basename
337
- ::File.basename(filename)
353
+ ::File.basename(filename) if filename
354
+ end
355
+
356
+ def attachment_filename(*paths)
357
+ return basename if basename
358
+
359
+ if paths.empty?
360
+ paths.push('attachment')
361
+ paths.push(id.to_s)
362
+ paths.push(updateDate.iso8601)
363
+ end
364
+
365
+ path = paths.join('--')
366
+ base = ::File.basename(path).split('.', 2).first
367
+ ext = GridFS.extract_extension(contentType)
368
+
369
+ "#{ base }.#{ ext }"
338
370
  end
339
371
 
340
372
  def prefix
@@ -570,6 +602,14 @@
570
602
  end
571
603
  end
572
604
 
605
+ def GridFS.extract_extension(content_type)
606
+ list = MIME::Types[content_type.to_s]
607
+ type = list.first
608
+ if type
609
+ type.extensions.first
610
+ end
611
+ end
612
+
573
613
  def GridFS.cleanname(pathname)
574
614
  basename = ::File.basename(pathname.to_s)
575
615
  CGI.unescape(basename).gsub(%r/[^0-9a-zA-Z_@)(~.-]/, '_').gsub(%r/_+/,'_')
@@ -592,7 +632,7 @@
592
632
  options.to_options!
593
633
 
594
634
  if options[:inline] == false or options[:attachment] == true
595
- headers['Content-Disposition'] = "attachment; filename=#{ grid_fs_file.filename }"
635
+ headers['Content-Disposition'] = "attachment; filename=#{ grid_fs_file.attachment_filename }"
596
636
  end
597
637
 
598
638
  self.content_type = grid_fs_file.content_type
@@ -3,16 +3,22 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "mongoid-grid_fs"
6
- spec.version = "1.9.2"
6
+ spec.version = "2.0.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "mongoid-grid_fs"
9
- spec.description = "a mongoid 3/moped compatible implementation of the grid_fs specification"
9
+ spec.description = "description: mongoid-grid_fs kicks the ass"
10
10
  spec.license = "Ruby"
11
11
 
12
12
  spec.files =
13
- ["LICENSE",
13
+ ["Gemfile",
14
+ "LICENSE",
14
15
  "README.md",
15
16
  "Rakefile",
17
+ "config.rb",
18
+ "gemfiles",
19
+ "gemfiles/mongoid-3.0.gemfile",
20
+ "gemfiles/mongoid-3.1.gemfile",
21
+ "gemfiles/mongoid-4.0.gemfile",
16
22
  "lib",
17
23
  "lib/app",
18
24
  "lib/app/models",
@@ -24,6 +30,8 @@ Gem::Specification::new do |spec|
24
30
  "lib/app/models/mongoid/grid_fs/fs/file.rb",
25
31
  "lib/mongoid-grid_fs.rb",
26
32
  "mongoid-grid_fs.gemspec",
33
+ "script",
34
+ "script/shell",
27
35
  "test",
28
36
  "test/helper.rb",
29
37
  "test/mongoid-grid_fs_test.rb",
@@ -38,7 +46,7 @@ Gem::Specification::new do |spec|
38
46
 
39
47
  spec.add_dependency(*["mongoid", ">= 3.0", "< 5.0"])
40
48
 
41
- spec.add_dependency(*["mime-types", ">= 1.19", "< 3.0"])
49
+ spec.add_dependency(*["mime-types", ">= 1.0", "< 3.0"])
42
50
 
43
51
 
44
52
  spec.extensions.push(*[])
data/script/shell ADDED
@@ -0,0 +1,51 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ #
4
+ gem 'rails', '>= 3', '< 4'
5
+ require 'rails'
6
+ require 'active_model'
7
+
8
+ #
9
+ require 'pry'
10
+
11
+ #
12
+ require_relative '../lib/mongoid-grid_fs.rb'
13
+
14
+ #
15
+ Mongoid.configure do |config|
16
+ config.connect_to('mongoid-grid_fs_test')
17
+ end
18
+
19
+ #
20
+ require 'irb'
21
+
22
+ $FUCKING_HACK = IRB.method(:load_modules)
23
+
24
+ def IRB.load_modules
25
+ $FUCKING_HACK.call()
26
+
27
+ prompt = 'mongoid_grid_fs'
28
+
29
+ IRB.conf[:PROMPT][:RO] = {
30
+ :PROMPT_I=>"#{ prompt }:%03n:%i> ",
31
+ :PROMPT_N=>"#{ prompt }:%03n:%i> ",
32
+ :PROMPT_S=>"#{ prompt }:%03n:%i%l ",
33
+ :PROMPT_C=>"#{ prompt }:%03n:%i* ",
34
+ :RETURN=>"=> %s\n"
35
+ }
36
+
37
+ IRB.conf[:PROMPT_MODE] = :RO
38
+ IRB.conf[:AUTO_INDENT] = true
39
+ end
40
+
41
+ #
42
+ module ::Kernel
43
+ def grid_fs
44
+ Mongoid::GridFS
45
+ end
46
+ end
47
+
48
+ #
49
+ ARGV.clear
50
+
51
+ ::IRB.start
data/test/helper.rb CHANGED
@@ -11,8 +11,6 @@ class SIO < StringIO
11
11
  end
12
12
  end
13
13
 
14
- # this triggers mongoid to load rails...
15
- module Rails; end
16
14
 
17
15
  require_relative 'testing'
18
16
  require_relative '../lib/mongoid-grid_fs.rb'
@@ -93,14 +93,16 @@ Testing Mongoid::GridFs do
93
93
 
94
94
  before = GridFs::File.count
95
95
 
96
- assert{ GridFs[path] = SIO.new(path, 'foobar') }
97
- assert{ GridFs[path].data == 'foobar' }
96
+ data = "#{ Time.now.to_f }-#{ rand }"
97
+
98
+ assert{ GridFs[path] = SIO.new(path, data) }
99
+ assert{ GridFs[path].data == data }
98
100
 
99
101
  after = GridFs::File.count
100
102
 
101
103
  created = after - before
102
104
 
103
- assert{ created.zero? }
105
+ assert{ created == 1 }
104
106
  end
105
107
 
106
108
  ##
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-grid_fs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ara T. Howard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-04 00:00:00.000000000 Z
11
+ date: 2014-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ! '>='
38
38
  - !ruby/object:Gem::Version
39
- version: '1.19'
39
+ version: '1.0'
40
40
  - - <
41
41
  - !ruby/object:Gem::Version
42
42
  version: '3.0'
@@ -46,24 +46,30 @@ dependencies:
46
46
  requirements:
47
47
  - - ! '>='
48
48
  - !ruby/object:Gem::Version
49
- version: '1.19'
49
+ version: '1.0'
50
50
  - - <
51
51
  - !ruby/object:Gem::Version
52
52
  version: '3.0'
53
- description: a mongoid 3/moped compatible implementation of the grid_fs specification
53
+ description: ! 'description: mongoid-grid_fs kicks the ass'
54
54
  email: ara.t.howard@gmail.com
55
55
  executables: []
56
56
  extensions: []
57
57
  extra_rdoc_files: []
58
58
  files:
59
+ - Gemfile
59
60
  - LICENSE
60
61
  - README.md
61
62
  - Rakefile
63
+ - config.rb
64
+ - gemfiles/mongoid-3.0.gemfile
65
+ - gemfiles/mongoid-3.1.gemfile
66
+ - gemfiles/mongoid-4.0.gemfile
62
67
  - lib/app/models/mongoid/grid_fs.rb
63
68
  - lib/app/models/mongoid/grid_fs/fs/chunk.rb
64
69
  - lib/app/models/mongoid/grid_fs/fs/file.rb
65
70
  - lib/mongoid-grid_fs.rb
66
71
  - mongoid-grid_fs.gemspec
72
+ - script/shell
67
73
  - test/helper.rb
68
74
  - test/mongoid-grid_fs_test.rb
69
75
  - test/testing.rb