grip 0.4.4 → 0.5.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.
Files changed (6) hide show
  1. data/README.rdoc +1 -1
  2. data/VERSION +1 -1
  3. data/grip.gemspec +2 -2
  4. data/lib/grip.rb +73 -38
  5. data/test/test_grip.rb +11 -2
  6. metadata +2 -2
data/README.rdoc CHANGED
@@ -15,7 +15,7 @@ The grip gem is hosted on gemcutter.org:
15
15
  include MongoMapper::Document
16
16
  include Grip
17
17
 
18
- has_grid_attachment :image, :resize => {:width=>50,:height=>50}
18
+ has_grid_attachment :image, :versions => {:thumb => {:width=>50,:height=>50}}
19
19
  has_grid_attachment :pdf
20
20
 
21
21
  # Hook for resizing or whatever gets you there.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.4
1
+ 0.5.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.4.4"
8
+ s.version = "0.5.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-23}
12
+ s.date = %q{2009-12-30}
13
13
  s.description = %q{GridFS attachments for MongoMapper}
14
14
  s.email = %q{signalstatic@gmail.com}
15
15
  s.extra_rdoc_files = [
data/lib/grip.rb CHANGED
@@ -1,28 +1,14 @@
1
1
  require 'mongo/gridfs'
2
2
  require 'mime/types'
3
3
  require 'tempfile'
4
-
5
- # if thumbnailable?
6
- # tmp = Tempfile.new("thumb_#{filename}")
7
- # MojoMagick::resize(uploaded_file.path, tmp.path, {:width => 50, :height => 40, :scale => '>'})
8
- # self.thumbnail = tmp.read
9
- # end
10
-
11
- # open : db, name, mode, options (:root, :metadata, :content_type)
12
- # read : db, name, length, offset
13
- # unlink : db, names
14
- # list : db, root collection
15
- #
16
- # GridStore.open(database, 'filename', 'w') { |f|
17
- # f.puts "Hello, world!"
18
- # }
4
+ require 'mojo_magick'
19
5
 
20
6
  module Grip
21
7
  def self.included(base)
22
8
  base.extend Grip::ClassMethods
23
9
  base.class_eval do
24
- after_save :save_attachments
25
- before_destroy :destroy_attached_files
10
+ after_save :save_attachments
11
+ before_destroy :destroy_attached_files
26
12
  end
27
13
  end
28
14
 
@@ -31,26 +17,40 @@ module Grip
31
17
  write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
32
18
  attachment_definitions[name] = opts
33
19
 
34
- key "#{name}_size".to_sym, Integer
35
- key "#{name}_path".to_sym, String
36
- key "#{name}_name".to_sym, String
37
- key "#{name}_content_type".to_sym, String
20
+ build_attachment_keys_for name
38
21
 
39
22
  define_method(name) do
40
- # open returns the correct mime-type,
41
- # read returns a string. Not sure if
42
- # this is a GridFS problem or not
43
23
  GridFS::GridStore.open(self.class.database, self["#{name}_path"], 'r') {|f| f }
44
24
  end
45
25
 
46
26
  define_method("#{name}=") do |file|
47
- self['_id'] = Mongo::ObjectID.new if _id.blank?
48
- self["#{name}_size"] = File.size(file)
49
- self["#{name}_name"] = File.basename(file.path)
50
- self["#{name}_path"] = "#{self.class.to_s.underscore}/#{name}/#{_id}"
51
- self["#{name}_content_type"] = file.content_type rescue MIME::Types.type_for(self["#{name}_name"]).to_s
27
+ update_attachment_attributes!(name, file)
52
28
  self.class.attachment_definitions[name][:file] = file
53
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
54
  end
55
55
 
56
56
  def attachment_definitions
@@ -58,23 +58,58 @@ module Grip
58
58
  end
59
59
  end
60
60
 
61
+ def update_attachment_attributes! name, file, is_version = false
62
+ raise Grip::InvalidFileException unless (file.is_a?(File) || file.is_a?(Tempfile))
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.
61
79
  def save_attachments
62
- self.class.attachment_definitions.each do |attachment|
80
+ self.class.attachment_definitions.each do |definition|
81
+ attr_name, opts = definition
63
82
 
64
- name, opts = attachment
65
-
66
- if (opts[:file].is_a?(File) || opts[:file].is_a?(Tempfile))
67
- GridFS::GridStore.open(self.class.database, self["#{name}_path"], 'w', :content_type => self["#{name}_content_type"]) do |f|
68
- processed_or_not = self.respond_to?("process_#{name}") ? send("process_#{name}",opts) : opts[:file]
69
- f.write(processed_or_not)
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
+ tmp = Tempfile.new("#{attr_name}_#{version}")
90
+ MojoMagick::resize(opts[:file].path, tmp.path, dimensions)
91
+ send("#{attr_name}_#{version}=", tmp)
92
+ GridFS::GridStore.open(self.class.database, self["#{attr_name}_#{version}_path"], 'w', :content_type => self["#{attr_name}_content_type"]) do |f|
93
+ f.write tmp.read
94
+ end
70
95
  end
96
+ save_to_collection
71
97
  end
72
- end
98
+ end unless self.class.attachment_definitions.nil?
73
99
  end
74
100
 
75
101
  def destroy_attached_files
76
102
  self.class.attachment_definitions.each do |name, attachment|
77
103
  GridFS::GridStore.unlink(self.class.database, self["#{name}_path"])
78
- end
104
+ unless attachment[:versions].nil?
105
+ attachment[:versions].each do |v,dim|
106
+ GridFS::GridStore.unlink(self.class.database, self["#{name}_#{v}_path"])
107
+ end
108
+ end
109
+ end unless self.class.attachment_definitions.nil?
110
+ end
111
+
112
+ class Grip::InvalidFileException < Exception
79
113
  end
114
+
80
115
  end
data/test/test_grip.rb CHANGED
@@ -4,7 +4,7 @@ class Foo
4
4
  include MongoMapper::Document
5
5
  include Grip
6
6
 
7
- has_grid_attachment :image, :resize => {:width=>50,:height=>50}
7
+ has_grid_attachment :image, :versions => {:thumb => {:width=>50,:height=>50}}
8
8
  has_grid_attachment :pdf
9
9
 
10
10
  def process_image opts
@@ -38,9 +38,11 @@ class GripTest < Test::Unit::TestCase
38
38
  assert_equal 'sample.pdf', @doc.pdf_name
39
39
 
40
40
  assert_equal "image/png", @doc.image_content_type
41
+ assert_equal "image/png", @doc.image_thumb_content_type
41
42
  assert_equal "application/pdf", @doc.pdf_content_type
42
43
 
43
44
  assert_equal "foo/image/#{@doc.id}", @doc.image_path
45
+ assert_equal "foo/image_thumb/#{@doc.id}", @doc.image_thumb_path
44
46
  assert_equal "foo/pdf/#{@doc.id}", @doc.pdf_path
45
47
 
46
48
  collection = MongoMapper.database['fs.files']
@@ -51,7 +53,8 @@ class GripTest < Test::Unit::TestCase
51
53
 
52
54
  test "responds to dynamic keys" do
53
55
  [ :pdf_size, :pdf_path, :pdf_name, :pdf_content_type,
54
- :image_size, :image_path, :image_name, :image_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
55
58
  ].each do |method|
56
59
  assert @doc.respond_to?(method)
57
60
  end
@@ -77,6 +80,12 @@ class GripTest < Test::Unit::TestCase
77
80
  @doc.destroy
78
81
 
79
82
  assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
83
+ assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.image_thumb_path)
80
84
  assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
81
85
  end
86
+
87
+ test "should raise invalid file exception" do
88
+ assert_raise(Grip::InvalidFileException) { @doc.image = ""; @doc.save! }
89
+ end
90
+
82
91
  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.4.4
4
+ version: 0.5.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-23 00:00:00 -05:00
13
+ date: 2009-12-30 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16