grip 0.5.1 → 0.6.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.
data/.DS_Store ADDED
Binary file
data/README.rdoc CHANGED
@@ -6,34 +6,42 @@ GridFS attachments for MongoMapper
6
6
 
7
7
  The grip gem is hosted on gemcutter.org:
8
8
 
9
- * gem install grip
9
+ gem install miso grip
10
10
 
11
11
 
12
- = Usage
12
+ = Usage (See tests for better docs)
13
13
 
14
- class Foo
14
+ class Doc
15
15
  include MongoMapper::Document
16
16
  include Grip
17
17
 
18
18
  has_grid_attachment :image, :versions => {:thumb => {:width=>50,:height=>50}}
19
- has_grid_attachment :pdf
20
19
 
21
- # Hook for resizing or whatever gets you there.
22
- # any specified options are passed back to you
23
- # at this point.
24
- # Just return the file when you're done.
25
- def process_image opts
26
- puts "processing"
27
- opts[:file]
28
- end
29
20
  end
30
21
 
31
22
  image = File.open('foo.png', 'r')
32
- pdf = File.open('foo.pdf', 'r')
33
- foo = Foo.create(:image => image, :pdf => pdf)
34
-
35
- foo.image # contents read from gridfs for serving from rack/metal/controller
36
- foo.image_name # foo.jpg
37
- foo.image_content_type # image/png
38
- foo.image_size # File.size of the file
39
- foo.image_path # path in grid fs foo/image/:id where :id is foo.id
23
+ @doc = Doc.create(:image => image)
24
+
25
+ puts @doc.image.name
26
+ => "image"
27
+ puts @doc.image.file_size
28
+ => 100
29
+ puts @doc.image.file_name
30
+ => "foo.png"
31
+ puts @doc.image.grid_key
32
+ => "docs/<id>/image"
33
+
34
+ # works on nested variants as well
35
+
36
+ puts @doc.image.thumb.name
37
+ => "thumb"
38
+ puts @doc.image.thumb.file_size
39
+ => 50
40
+ puts @doc.image.thumb.file_name
41
+ => "foo.png"
42
+ puts @doc.image.thumb.grid_key
43
+ => "attachments/<id>/thumb"
44
+
45
+
46
+ @doc.image.file # contents read from gridfs for serving from rack/metal/controller
47
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.1
1
+ 0.6.0
data/grip.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{grip}
8
- s.version = "0.5.1"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["twoism", "jnunemaker"]
12
- s.date = %q{2009-12-30}
12
+ s.date = %q{2009-12-31}
13
13
  s.description = %q{GridFS attachments for MongoMapper}
14
14
  s.email = %q{signalstatic@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -17,16 +17,23 @@ Gem::Specification.new do |s|
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
- ".gitignore",
20
+ ".DS_Store",
21
+ ".gitignore",
21
22
  "LICENSE",
22
23
  "README.rdoc",
23
24
  "Rakefile",
24
25
  "VERSION",
25
26
  "grip.gemspec",
26
27
  "lib/grip.rb",
28
+ "lib/grip/attachment.rb",
29
+ "lib/grip/has_attachment.rb",
30
+ "test/factories.rb",
27
31
  "test/fixtures/cthulhu.png",
28
32
  "test/fixtures/sample.pdf",
29
- "test/test_grip.rb",
33
+ "test/growler.rb",
34
+ "test/models.rb",
35
+ "test/test_grip_attachment.rb",
36
+ "test/test_has_attachment.rb",
30
37
  "test/test_helper.rb"
31
38
  ]
32
39
  s.homepage = %q{http://github.com/twoism/grip}
@@ -35,7 +42,11 @@ Gem::Specification.new do |s|
35
42
  s.rubygems_version = %q{1.3.5}
36
43
  s.summary = %q{GridFS attachments for MongoMapper}
37
44
  s.test_files = [
38
- "test/test_grip.rb",
45
+ "test/factories.rb",
46
+ "test/growler.rb",
47
+ "test/models.rb",
48
+ "test/test_grip_attachment.rb",
49
+ "test/test_has_attachment.rb",
39
50
  "test/test_helper.rb"
40
51
  ]
41
52
 
data/lib/grip.rb CHANGED
@@ -1,125 +1,10 @@
1
- require 'mongo/gridfs'
2
- require 'mime/types'
3
- require 'tempfile'
4
- require 'miso'
1
+ %w{mongo_mapper mongo/gridfs mime/types ftools tempfile rmagick miso}.each { |lib| require lib }
5
2
 
6
- module Grip
7
- def self.included(base)
8
- base.extend Grip::ClassMethods
9
- base.class_eval do
10
- after_save :save_attachments
11
- before_destroy :destroy_attached_files
12
- end
3
+ module MongoMapper
4
+ module Grip
5
+ class GripError < StandardError; end
6
+ class InvalidFile < GripError; end
13
7
  end
14
-
15
- module ClassMethods
16
- def has_grid_attachment(name,opts={})
17
- write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
18
- attachment_definitions[name] = opts
19
-
20
- build_attachment_keys_for name
21
-
22
- define_method(name) do
23
- GridFS::GridStore.open(self.class.database, self["#{name}_path"], 'r') {|f| f }
24
- end
25
-
26
- define_method("#{name}=") do |file|
27
- update_attachment_attributes!(name, file)
28
- self.class.attachment_definitions[name][:file] = file
29
- end
30
-
31
- unless opts[:versions].nil?
32
- opts[:versions].each do |v,dimensions|
33
-
34
- version_name = "#{name}_#{v}"
35
- build_attachment_keys_for version_name
36
-
37
- define_method(version_name) do
38
- GridFS::GridStore.open(self.class.database, self["#{version_name}_path"], 'r') {|f| f }
39
- end
40
-
41
- define_method("#{version_name}=") do |file|
42
- update_attachment_attributes!("#{version_name}", file, true)
43
- self["#{version_name}_content_type"] = self["#{name}_content_type"]
44
- end
45
- end
46
- end
47
- end
48
-
49
- def build_attachment_keys_for name
50
- key "#{name}_size".to_sym, Integer
51
- key "#{name}_path".to_sym, String
52
- key "#{name}_name".to_sym, String
53
- key "#{name}_content_type".to_sym, String
54
- end
55
-
56
- def attachment_definitions
57
- read_inheritable_attribute(:attachment_definitions)
58
- end
59
- end
60
-
61
- def update_attachment_attributes! name, file, is_version = false
62
- raise Grip::InvalidFileException unless (file.is_a?(File) || file.is_a?(Tempfile) || file.is_a?(Miso::Image))
63
-
64
- self["#{name}_size"] = File.size(file)
65
- self["#{name}_name"] = File.basename(file.path)
66
-
67
- unless is_version
68
- self['_id'] = Mongo::ObjectID.new if _id.blank?
69
- self["#{name}_content_type"] = file.content_type rescue MIME::Types.type_for(self["#{name}_name"]).to_s
70
- self["#{name}_path"] = "#{self.class.to_s.underscore}/#{name}/#{_id}"
71
- else
72
- self["#{name}_path"] = "#{self.class.to_s.underscore}/#{name}/#{_id}"
73
- end
74
- end
75
-
76
- # Roll through attachment definitions and check if they are a File or Tempfile. Both types are
77
- # nescessary for file uploads to work properly. Each file checks for a <attr_name>_process
78
- # callback for pre-processing before save.
79
- def save_attachments
80
- self.class.attachment_definitions.each do |definition|
81
- attr_name, opts = definition
82
-
83
- GridFS::GridStore.open(self.class.database, self["#{attr_name}_path"], 'w', :content_type => self["#{attr_name}_content_type"]) do |f|
84
- f.write opts[:file].read
85
- end
86
-
87
- unless opts[:versions].nil?
88
- opts[:versions].each do |version,dimensions|
89
-
90
- tmp = Tempfile.new("#{attr_name}_#{version}")
91
- image = Miso::Image.new(opts[:file].path)
92
-
93
- image.crop(dimensions[:width], dimensions[:height]) if opts[:crop]
94
- image.fit(dimensions[:width], dimensions[:height]) unless opts[:crop]
95
-
96
- image.write(tmp.path)
97
-
98
- # update <name>_<version> attrs and assign the file
99
- send("#{attr_name}_#{version}=", tmp)
100
-
101
- GridFS::GridStore.open(self.class.database, self["#{attr_name}_#{version}_path"], 'w', :content_type => self["#{attr_name}_content_type"]) do |f|
102
- f.write tmp.read
103
- end
104
-
105
- end
106
- save_to_collection
107
- end
108
- end unless self.class.attachment_definitions.nil?
109
- end
110
-
111
- def destroy_attached_files
112
- self.class.attachment_definitions.each do |name, attachment|
113
- GridFS::GridStore.unlink(self.class.database, self["#{name}_path"])
114
- unless attachment[:versions].nil?
115
- attachment[:versions].each do |v,dim|
116
- GridFS::GridStore.unlink(self.class.database, self["#{name}_#{v}_path"])
117
- end
118
- end
119
- end unless self.class.attachment_definitions.nil?
120
- end
121
-
122
- class Grip::InvalidFileException < Exception
123
- end
124
-
125
8
  end
9
+
10
+ %w{grip/attachment grip/has_attachment}.each { |lib| require lib }
@@ -0,0 +1,84 @@
1
+ module MongoMapper
2
+ module Grip
3
+ class Attachment
4
+ include MongoMapper::Document
5
+
6
+ belongs_to :owner, :polymorphic => true
7
+ many :attached_variants, :as => :owner, :class_name => "MongoMapper::Grip::Attachment", :dependent => :destroy
8
+
9
+ key :owner_id, ObjectId, :required => true
10
+ key :owner_type, String, :required => true
11
+
12
+ key :name, String
13
+ key :file_name, String
14
+ key :file_size, Integer
15
+ key :content_type, String
16
+ key :variants, Hash
17
+
18
+ after_save :build_variants
19
+
20
+ def file=new_file
21
+ raise InvalidFile unless (new_file.is_a?(File) || new_file.is_a?(Tempfile))
22
+
23
+ self.file_name = File.basename(new_file.path)
24
+ self.file_size = File.size(new_file.path)
25
+ self.content_type = MIME::Types.type_for(new_file.path)
26
+
27
+ write_to_grid new_file
28
+ end
29
+
30
+ def file
31
+ read_from_grid grid_key
32
+ end
33
+
34
+ def grid_key
35
+ "#{owner_type.pluralize}/#{owner_id}/#{name}".downcase
36
+ end
37
+
38
+ def self.create_method sym, &block
39
+ define_method sym do |*block.args|
40
+ yield
41
+ end
42
+ end
43
+
44
+ private
45
+ def build_variants
46
+ self.variants.each do |variant, dimensions|
47
+
48
+ eval <<-EOF
49
+ def #{variant}
50
+ Attachment.find_or_initialize_by_name_and_owner_id("#{variant.to_s}",self._id)
51
+ end
52
+ EOF
53
+
54
+ eval <<-EOF
55
+ def #{variant}=(file_hash)
56
+ new_attachment = Attachment.find_or_initialize_by_name_and_owner_id("#{variant.to_s}",self._id)
57
+ new_attachment.owner_type = self.class.to_s
58
+ new_attachment.file_name = File.basename(file_hash[:uploaded_file].path)
59
+ new_attachment.file_size = File.size(file_hash[:resized_file].path)
60
+ new_attachment.content_type = MIME::Types.type_for(file_hash[:uploaded_file].path)
61
+ new_attachment.save!
62
+
63
+ GridFS::GridStore.open(self.class.database, new_attachment.grid_key, 'w', :content_type => new_attachment.content_type) do |f|
64
+ f.write file_hash[:resized_file].read
65
+ end
66
+
67
+ end
68
+ EOF
69
+
70
+ end
71
+ end
72
+
73
+ def write_to_grid new_file
74
+ GridFS::GridStore.open(self.class.database, grid_key, 'w', :content_type => content_type) do |f|
75
+ f.write new_file.read
76
+ end
77
+ end
78
+
79
+ def read_from_grid key
80
+ GridFS::GridStore.open(self.class.database, key, 'r') { |f| f }
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,75 @@
1
+ module MongoMapper
2
+ module Grip
3
+ module HasAttachment
4
+ module ClassMethods
5
+
6
+ def has_grid_attachment name, opts={}
7
+ write_inheritable_attribute(:uploaded_files, {}) if uploaded_files.nil?
8
+ uploaded_files[name] = opts
9
+
10
+ define_method(name) do
11
+ attachments.find(:first,:conditions=>{:name=>name.to_s})
12
+ end
13
+
14
+ define_method("#{name}=") do |new_file|
15
+ raise InvalidFile unless (new_file.is_a?(File) || new_file.is_a?(Tempfile))
16
+
17
+ self['_id'] = Mongo::ObjectID.new if _id.blank?
18
+ new_attachment = Attachment.find_or_initialize_by_name_and_owner_id(name.to_s,self._id)
19
+ update_attachment_attributes!(new_attachment, new_file, opts)
20
+ self.class.uploaded_files[name][:file] = new_file
21
+ end
22
+
23
+ end
24
+
25
+ def uploaded_files
26
+ read_inheritable_attribute(:uploaded_files)
27
+ end
28
+
29
+ end
30
+ def self.included(base)
31
+ base.extend ClassMethods
32
+ base.class_eval do
33
+ after_save :save_attachments
34
+ before_destroy :destroy_attached_files
35
+
36
+ many :attachments, :as => :owner, :class_name => "MongoMapper::Grip::Attachment", :dependent => :destroy
37
+ end
38
+ end
39
+
40
+ def update_attachment_attributes! new_attachment, new_file, opts
41
+ new_attachment.owner_type = self.class.to_s
42
+ new_attachment.file_name = File.basename(new_file.path)
43
+ new_attachment.file_size = File.size(new_file.path)
44
+ new_attachment.content_type = MIME::Types.type_for(new_file.path)
45
+ new_attachment.file = new_file
46
+ new_attachment.variants = opts[:variants] || {}
47
+ new_attachment.save!
48
+ end
49
+
50
+ def save_attachments
51
+ attachments.each do |attachment|
52
+ attachment.variants.each do |variant,dimensions|
53
+ create_variant(attachment,variant,dimensions)
54
+ end
55
+ end
56
+ end
57
+
58
+ def create_variant attachment, variant, dimensions
59
+ tmp_file = self.class.uploaded_files[attachment.name.to_sym][:file]
60
+ tmp = Tempfile.new("#{attachment.name}_#{variant}")
61
+ image = Miso::Image.new(tmp_file.path)
62
+
63
+ image.crop(dimensions[:width], dimensions[:height]) if dimensions[:crop]
64
+ image.fit(dimensions[:width], dimensions[:height]) unless dimensions[:crop]
65
+
66
+ image.write(tmp.path)
67
+
68
+ file_hash = {:resized_file => tmp,:uploaded_file => tmp_file}
69
+
70
+ attachment.send("#{variant}=", file_hash)
71
+ end
72
+
73
+ end
74
+ end
75
+ end
data/test/factories.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "mongo_mapper"
2
+ variants = { :thumb => {:width=>50,:height=>50} }
3
+ Factory.define :attachment do |a|
4
+ a.owner_id Mongo::ObjectID.new
5
+ a.owner_type 'Mock'
6
+ a.name 'image'
7
+ a.file_name 'mock.png'
8
+ a.file_size 100
9
+ a.content_type 'image/png'
10
+ a.variants variants
11
+ end
data/test/growler.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'ruby-growl'
2
+ class Growler
3
+ def self.growl msg
4
+ g = Growl.new "localhost", "ruby-growl",
5
+ ["ruby-growl Notification"]
6
+ g.notify "ruby-growl Notification", ":::: From Rails ::::::::",
7
+ "#{msg}",1,true
8
+ end
9
+ end
data/test/models.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Doc
2
+ include MongoMapper::Document
3
+ include MongoMapper::Grip::HasAttachment
4
+ has_grid_attachment :image, :variants => {:thumb=>{:width=>50,:height=>50},:super_thumb=>{:width=>10,:height=>10}}
5
+ end
@@ -0,0 +1,64 @@
1
+ require "test_helper"
2
+
3
+ include MongoMapper::Grip
4
+
5
+ class GripAttachmentTest < Test::Unit::TestCase
6
+ context "An Attachment" do
7
+ setup do
8
+ @attachment = Attachment.new( :name => "image", :owner_type => "Mock", :owner_id => Mongo::ObjectID.new )
9
+ @dir = File.dirname(__FILE__) + '/fixtures'
10
+ @image = File.open("#{@dir}/cthulhu.png", 'r')
11
+ @file_system = MongoMapper.database['fs.files']
12
+ end
13
+
14
+ teardown do
15
+ @file_system.drop
16
+ @image.close
17
+ end
18
+
19
+ should "be an Attachment" do
20
+ assert @attachment.is_a?(Attachment)
21
+ end
22
+
23
+ should "belong to :owner" do
24
+ name,assoc = Attachment.associations.first
25
+ #assert_equal(:owner, assoc.name)
26
+ #assert_equal(:belongs_to, assoc.type)
27
+ end
28
+
29
+ context "with a valid file" do
30
+ setup do
31
+ @attachment.file = @image
32
+ end
33
+
34
+ should "have correct :content_type" do
35
+ assert_equal("image/png", @attachment.content_type)
36
+ end
37
+
38
+ should "have correct :file_size" do
39
+ assert_equal(27582, @attachment.file_size)
40
+ end
41
+
42
+ should "have correct :file_name" do
43
+ assert_equal("cthulhu.png", @attachment.file_name)
44
+ end
45
+
46
+ should "read file from grid store" do
47
+ assert_equal "image/png", @file_system.find_one(:filename => @attachment.grid_key)['contentType']
48
+ end
49
+
50
+ should "return a GridStore" do
51
+ assert_equal(GridFS::GridStore, @attachment.file.class)
52
+ end
53
+
54
+ end
55
+
56
+ context "with an invalid file" do
57
+ should "raise Grip::InvalidFile" do
58
+ assert_raise(InvalidFile) { @attachment.file = Hash.new }
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,68 @@
1
+ require "test_helper"
2
+ require "models"
3
+ include MongoMapper::Grip
4
+
5
+ class HasAttachmentTest < Test::Unit::TestCase
6
+ context "A Doc that has_grid_attachment :image" do
7
+ setup do
8
+ @document = Doc.new
9
+ @dir = File.dirname(__FILE__) + '/fixtures'
10
+ @image = File.open("#{@dir}/cthulhu.png", 'r')
11
+ @file_system = MongoMapper.database['fs.files']
12
+ end
13
+
14
+ teardown do
15
+ @file_system.drop
16
+ @image.close
17
+ end
18
+
19
+ should "have many attachments" do
20
+ name,assoc = Doc.associations.first
21
+ assert_equal(:attachments, assoc.name)
22
+ assert_equal(:many, assoc.type)
23
+ end
24
+
25
+ should "have :after_save callback" do
26
+ assert_equal(1, Doc.after_save.collect(&:method).count)
27
+ end
28
+
29
+ should "have :before_destroy callback" do
30
+ assert_equal(1, Doc.before_destroy.collect(&:method).count)
31
+ end
32
+
33
+ context "when assigned a file" do
34
+ setup do
35
+ @document.image = @image
36
+ @document.save!
37
+ end
38
+
39
+ should "should return an Attachment" do
40
+ assert_equal(MongoMapper::Grip::Attachment, @document.image.class)
41
+ end
42
+
43
+ should "read file from grid store" do
44
+ assert_equal "image/png", @file_system.find_one(:filename => @document.image.grid_key)['contentType']
45
+ end
46
+
47
+ should "have :thumb variant" do
48
+ assert @document.image.respond_to?( :thumb )
49
+ end
50
+
51
+ should "have 2 variants" do
52
+ assert_equal(2, @document.image.attached_variants.count)
53
+ end
54
+
55
+ should "be resized" do
56
+ assert @document.image.file_size > @document.image.thumb.file_size
57
+ assert @document.image.file_size > @document.image.super_thumb.file_size
58
+ end
59
+
60
+ should "retrieve variants from grid" do
61
+ assert_equal "image/png", @file_system.find_one(:filename => @document.image.thumb.grid_key)['contentType']
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+
68
+ end
data/test/test_helper.rb CHANGED
@@ -1,23 +1,23 @@
1
- require 'test/unit'
2
- require 'pp'
3
-
4
- require 'mongo_mapper'
5
-
1
+ %w{test/unit shoulda factory_girl mongo_mapper factories}.each { |lib| require lib }
2
+ require 'growler'
6
3
  require File.expand_path(File.dirname(__FILE__) + '/../lib/grip')
7
4
 
8
- MongoMapper.database = "test-attachments"
5
+ TEST_DB = 'test-grip'
6
+
7
+ MongoMapper.database = TEST_DB
9
8
 
10
9
  class Test::Unit::TestCase
11
- def self.test(name, &block)
12
- test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
13
- defined = instance_method(test_name) rescue false
14
- raise "#{test_name} is already defined in #{self}" if defined
15
- if block_given?
16
- define_method(test_name, &block)
17
- else
18
- define_method(test_name) do
19
- flunk "No implementation provided for #{name}"
20
- end
10
+ def teardown
11
+ MongoMapper.database.collections.each do |coll|
12
+ coll.remove
13
+ end
14
+ end
15
+
16
+ # Make sure that each test case has a teardown
17
+ # method to clear the db after each test.
18
+ def inherited(base)
19
+ base.define_method teardown do
20
+ super
21
21
  end
22
22
  end
23
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - twoism
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-12-30 00:00:00 -05:00
13
+ date: 2009-12-31 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -24,6 +24,7 @@ extra_rdoc_files:
24
24
  - LICENSE
25
25
  - README.rdoc
26
26
  files:
27
+ - .DS_Store
27
28
  - .gitignore
28
29
  - LICENSE
29
30
  - README.rdoc
@@ -31,9 +32,15 @@ files:
31
32
  - VERSION
32
33
  - grip.gemspec
33
34
  - lib/grip.rb
35
+ - lib/grip/attachment.rb
36
+ - lib/grip/has_attachment.rb
37
+ - test/factories.rb
34
38
  - test/fixtures/cthulhu.png
35
39
  - test/fixtures/sample.pdf
36
- - test/test_grip.rb
40
+ - test/growler.rb
41
+ - test/models.rb
42
+ - test/test_grip_attachment.rb
43
+ - test/test_has_attachment.rb
37
44
  - test/test_helper.rb
38
45
  has_rdoc: true
39
46
  homepage: http://github.com/twoism/grip
@@ -64,5 +71,9 @@ signing_key:
64
71
  specification_version: 3
65
72
  summary: GridFS attachments for MongoMapper
66
73
  test_files:
67
- - test/test_grip.rb
74
+ - test/factories.rb
75
+ - test/growler.rb
76
+ - test/models.rb
77
+ - test/test_grip_attachment.rb
78
+ - test/test_has_attachment.rb
68
79
  - test/test_helper.rb
data/test/test_grip.rb DELETED
@@ -1,91 +0,0 @@
1
- require "test_helper"
2
-
3
- class Foo
4
- include MongoMapper::Document
5
- include Grip
6
-
7
- has_grid_attachment :image, :versions => {:thumb => {:width=>50,:height=>50}}
8
- has_grid_attachment :pdf
9
-
10
- def process_image opts
11
- opts[:file]
12
- end
13
- end
14
-
15
- class GripTest < Test::Unit::TestCase
16
- def setup
17
- MongoMapper.connection.drop_database "test-attachments"
18
- MongoMapper.database = "test-attachments"
19
-
20
- dir = File.dirname(__FILE__) + '/fixtures'
21
- @pdf = File.open("#{dir}/sample.pdf", 'r')
22
- @image = File.open("#{dir}/cthulhu.png", 'r')
23
-
24
- @doc = Foo.create(:image => @image, :pdf => @pdf)
25
- @doc.reload
26
- end
27
-
28
- def teardown
29
- @pdf.close
30
- @image.close
31
- end
32
-
33
- test "assigns keys correctly" do
34
- assert_equal 27582, @doc.image_size
35
- assert_equal 8775, @doc.pdf_size
36
-
37
- assert_equal 'cthulhu.png', @doc.image_name
38
- assert_equal 'sample.pdf', @doc.pdf_name
39
-
40
- assert_equal "image/png", @doc.image_content_type
41
- assert_equal "image/png", @doc.image_thumb_content_type
42
- assert_equal "application/pdf", @doc.pdf_content_type
43
-
44
- assert_equal "foo/image/#{@doc.id}", @doc.image_path
45
- assert_equal "foo/image_thumb/#{@doc.id}", @doc.image_thumb_path
46
- assert_equal "foo/pdf/#{@doc.id}", @doc.pdf_path
47
-
48
- collection = MongoMapper.database['fs.files']
49
-
50
- assert_equal "image/png", collection.find_one(:filename => @doc.image_path)['contentType']
51
- assert_equal "application/pdf", collection.find_one(:filename => @doc.pdf_path)['contentType']
52
- end
53
-
54
- test "responds to dynamic keys" do
55
- [ :pdf_size, :pdf_path, :pdf_name, :pdf_content_type,
56
- :image_size, :image_path, :image_name, :image_content_type,
57
- :image_thumb_size, :image_thumb_path, :image_thumb_name, :image_thumb_content_type
58
- ].each do |method|
59
- assert @doc.respond_to?(method)
60
- end
61
- end
62
-
63
- test "callbacks assigned only once each" do
64
- assert_equal(1, Foo.after_save.collect(&:method).count)
65
- assert_equal(1, Foo.before_destroy.collect(&:method).count)
66
- end
67
-
68
- test "saves attachments correctly" do
69
- assert_equal "image/png", @doc.image.content_type
70
- assert_equal "application/pdf", @doc.pdf.content_type
71
-
72
- assert GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
73
- assert GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
74
- end
75
-
76
- test "cleans up attachments on destroy" do
77
- assert GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
78
- assert GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
79
-
80
- @doc.destroy
81
-
82
- assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
83
- assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.image_thumb_path)
84
- assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
85
- end
86
-
87
- test "should raise invalid file exception" do
88
- assert_raise(Grip::InvalidFileException) { @doc.image = ""; @doc.save! }
89
- end
90
-
91
- end