grip 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.DS_Store +0 -0
- data/README.markdown +71 -0
- data/Rakefile +3 -1
- data/VERSION +1 -1
- data/grip.gemspec +14 -8
- data/lib/grip.rb +1 -1
- data/lib/grip/attachment.rb +32 -27
- data/lib/grip/has_attachment.rb +17 -11
- data/test/{test_grip_attachment.rb → grip_attachment_test.rb} +0 -0
- data/test/{test_has_attachment.rb → has_attachment_test.rb} +0 -0
- data/test/test_helper.rb +1 -0
- metadata +29 -10
- data/README.rdoc +0 -47
data/.DS_Store
CHANGED
Binary file
|
data/README.markdown
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
grip
|
2
|
+
====
|
3
|
+
|
4
|
+
GridFS attachments for MongoMapper.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
The grip gem is hosted on gemcutter.org and uses Miso (http://github.com/Fingertips/Miso) for image resizing
|
10
|
+
|
11
|
+
gem install miso grip
|
12
|
+
|
13
|
+
Setup (Rails)
|
14
|
+
-------------
|
15
|
+
|
16
|
+
# config/environment.rb
|
17
|
+
|
18
|
+
config.gem 'grip'
|
19
|
+
|
20
|
+
Then:
|
21
|
+
|
22
|
+
rake gems:install
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
Usage (See tests for better docs)
|
29
|
+
---------------------------------
|
30
|
+
|
31
|
+
Create a MongoMapper model and `include MongoMapper::Grip::HasAttachment` and call `has_grid_attachment :<attachment_name>` to the model. Then if your attachment is an image, you can specify a hash of variants along with their :width & :height.
|
32
|
+
|
33
|
+
|
34
|
+
class Doc
|
35
|
+
include MongoMapper::Document
|
36
|
+
include MongoMapper::Grip::HasAttachment
|
37
|
+
has_grid_attachment :image, :variants => {:thumb => {:width=>50,:height=>50}}
|
38
|
+
end
|
39
|
+
|
40
|
+
To save a file to your model, just send any file to the symbol that you specified.
|
41
|
+
|
42
|
+
image = File.open('foo.png', 'r')
|
43
|
+
@doc = Doc.create(:image => image)
|
44
|
+
|
45
|
+
Alternately just set it on the model and save:
|
46
|
+
|
47
|
+
@doc.image = image
|
48
|
+
|
49
|
+
Each attachment as well as variants respond to the following methods:
|
50
|
+
|
51
|
+
puts @doc.image.name
|
52
|
+
=> "image"
|
53
|
+
|
54
|
+
puts @doc.image.file_size
|
55
|
+
=> 100
|
56
|
+
|
57
|
+
puts @doc.image.file_name
|
58
|
+
=> "foo.png"
|
59
|
+
|
60
|
+
puts @doc.image.grid_key
|
61
|
+
=> "docs/<id>/image"
|
62
|
+
|
63
|
+
@doc.image.file # contents read from gridfs for serving from rack/metal/controller
|
64
|
+
|
65
|
+
Variants are created `after_save` and can be referenced through the attachment they belong to:
|
66
|
+
|
67
|
+
@doc.image.thumb.name
|
68
|
+
@doc.image.thumb.file_name
|
69
|
+
@doc.image.thumb.grid_key
|
70
|
+
@doc.image.thumb.content_type
|
71
|
+
|
data/Rakefile
CHANGED
@@ -12,10 +12,12 @@ begin
|
|
12
12
|
g.email = 'signalstatic@gmail.com'
|
13
13
|
g.homepage = 'http://github.com/twoism/grip'
|
14
14
|
g.authors = %w(twoism jnunemaker)
|
15
|
+
g.add_dependency 'rmagick'
|
16
|
+
g.add_dependency 'miso'
|
15
17
|
end
|
16
18
|
Jeweler::GemcutterTasks.new
|
17
19
|
rescue LoadError
|
18
|
-
puts 'Jeweler not available. Install it with: sudo gem install
|
20
|
+
puts 'Jeweler not available. Install it with: sudo gem install jeweler'
|
19
21
|
end
|
20
22
|
|
21
23
|
Rake::TestTask.new do |t|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.2
|
data/grip.gemspec
CHANGED
@@ -5,22 +5,22 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{grip}
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.2"
|
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{
|
12
|
+
s.date = %q{2010-01-07}
|
13
13
|
s.description = %q{GridFS attachments for MongoMapper}
|
14
14
|
s.email = %q{signalstatic@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
"README.
|
17
|
+
"README.markdown"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".DS_Store",
|
21
21
|
".gitignore",
|
22
22
|
"LICENSE",
|
23
|
-
"README.
|
23
|
+
"README.markdown",
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"grip.gemspec",
|
@@ -30,10 +30,10 @@ Gem::Specification.new do |s|
|
|
30
30
|
"test/factories.rb",
|
31
31
|
"test/fixtures/cthulhu.png",
|
32
32
|
"test/fixtures/sample.pdf",
|
33
|
+
"test/grip_attachment_test.rb",
|
33
34
|
"test/growler.rb",
|
35
|
+
"test/has_attachment_test.rb",
|
34
36
|
"test/models.rb",
|
35
|
-
"test/test_grip_attachment.rb",
|
36
|
-
"test/test_has_attachment.rb",
|
37
37
|
"test/test_helper.rb"
|
38
38
|
]
|
39
39
|
s.homepage = %q{http://github.com/twoism/grip}
|
@@ -43,10 +43,10 @@ Gem::Specification.new do |s|
|
|
43
43
|
s.summary = %q{GridFS attachments for MongoMapper}
|
44
44
|
s.test_files = [
|
45
45
|
"test/factories.rb",
|
46
|
+
"test/grip_attachment_test.rb",
|
46
47
|
"test/growler.rb",
|
48
|
+
"test/has_attachment_test.rb",
|
47
49
|
"test/models.rb",
|
48
|
-
"test/test_grip_attachment.rb",
|
49
|
-
"test/test_has_attachment.rb",
|
50
50
|
"test/test_helper.rb"
|
51
51
|
]
|
52
52
|
|
@@ -55,9 +55,15 @@ Gem::Specification.new do |s|
|
|
55
55
|
s.specification_version = 3
|
56
56
|
|
57
57
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
58
|
+
s.add_runtime_dependency(%q<rmagick>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<miso>, [">= 0"])
|
58
60
|
else
|
61
|
+
s.add_dependency(%q<rmagick>, [">= 0"])
|
62
|
+
s.add_dependency(%q<miso>, [">= 0"])
|
59
63
|
end
|
60
64
|
else
|
65
|
+
s.add_dependency(%q<rmagick>, [">= 0"])
|
66
|
+
s.add_dependency(%q<miso>, [">= 0"])
|
61
67
|
end
|
62
68
|
end
|
63
69
|
|
data/lib/grip.rb
CHANGED
data/lib/grip/attachment.rb
CHANGED
@@ -3,8 +3,13 @@ module MongoMapper
|
|
3
3
|
class Attachment
|
4
4
|
include MongoMapper::Document
|
5
5
|
|
6
|
-
belongs_to
|
7
|
-
|
6
|
+
belongs_to :owner,
|
7
|
+
:polymorphic => true
|
8
|
+
|
9
|
+
many :attached_variants,
|
10
|
+
:as => :owner,
|
11
|
+
:class_name => "MongoMapper::Grip::Attachment",
|
12
|
+
:dependent => :destroy
|
8
13
|
|
9
14
|
key :owner_id, ObjectId, :required => true
|
10
15
|
key :owner_type, String, :required => true
|
@@ -15,8 +20,8 @@ module MongoMapper
|
|
15
20
|
key :content_type, String
|
16
21
|
key :variants, Hash
|
17
22
|
|
18
|
-
after_save
|
19
|
-
before_destroy
|
23
|
+
after_save :build_variants
|
24
|
+
before_destroy :destroy_file
|
20
25
|
|
21
26
|
def file=new_file
|
22
27
|
raise InvalidFile unless (new_file.is_a?(File) || new_file.is_a?(Tempfile))
|
@@ -25,7 +30,7 @@ module MongoMapper
|
|
25
30
|
self.file_size = File.size(new_file.path)
|
26
31
|
self.content_type = MIME::Types.type_for(new_file.path)
|
27
32
|
|
28
|
-
write_to_grid new_file
|
33
|
+
write_to_grid self,new_file
|
29
34
|
end
|
30
35
|
|
31
36
|
def file
|
@@ -36,32 +41,32 @@ module MongoMapper
|
|
36
41
|
"#{owner_type.pluralize}/#{owner_id}/#{name}".downcase
|
37
42
|
end
|
38
43
|
|
44
|
+
def self.create_method method_name, &block
|
45
|
+
define_method(method_name) do |*args|
|
46
|
+
yield *args
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
private
|
40
51
|
def build_variants
|
41
52
|
self.variants.each do |variant, dimensions|
|
42
53
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
EOF
|
54
|
+
self.class.create_method variant.to_sym do
|
55
|
+
attached_variants.find_or_create_by_name(:name=>"#{variant.to_s}")
|
56
|
+
end
|
48
57
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
self.class.create_method "#{variant}=".to_sym do |file_hash|
|
59
|
+
|
60
|
+
new_attachment = Attachment.find_or_initialize_by_name_and_owner_id("#{variant.to_s}",self._id)
|
61
|
+
new_attachment.owner_type = self.class.to_s
|
62
|
+
new_attachment.file_name = File.basename(file_hash[:uploaded_file].path)
|
63
|
+
new_attachment.file_size = File.size(file_hash[:resized_file].path)
|
64
|
+
new_attachment.content_type = MIME::Types.type_for(file_hash[:uploaded_file].path)
|
65
|
+
new_attachment.save!
|
57
66
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
EOF
|
64
|
-
|
67
|
+
write_to_grid new_attachment, file_hash[:resized_file]
|
68
|
+
end
|
69
|
+
|
65
70
|
end
|
66
71
|
end
|
67
72
|
|
@@ -69,8 +74,8 @@ module MongoMapper
|
|
69
74
|
GridFS::GridStore.unlink(self.class.database, grid_key)
|
70
75
|
end
|
71
76
|
|
72
|
-
def write_to_grid new_file
|
73
|
-
GridFS::GridStore.open(self.class.database, grid_key, 'w', :content_type => content_type) do |f|
|
77
|
+
def write_to_grid attachment, new_file
|
78
|
+
GridFS::GridStore.open(self.class.database, attachment.grid_key, 'w', :content_type => attachment.content_type) do |f|
|
74
79
|
f.write new_file.read
|
75
80
|
end
|
76
81
|
end
|
data/lib/grip/has_attachment.rb
CHANGED
@@ -13,11 +13,11 @@ module MongoMapper
|
|
13
13
|
|
14
14
|
define_method("#{name}=") do |new_file|
|
15
15
|
raise InvalidFile unless (new_file.is_a?(File) || new_file.is_a?(Tempfile))
|
16
|
-
|
16
|
+
|
17
|
+
self.class.uploaded_files[name][:file] = new_file
|
17
18
|
self['_id'] = Mongo::ObjectID.new if _id.blank?
|
18
|
-
new_attachment =
|
19
|
+
new_attachment = attachments.find_or_create_by_name(name.to_s)
|
19
20
|
update_attachment_attributes!(new_attachment, new_file, opts)
|
20
|
-
self.class.uploaded_files[name][:file] = new_file
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
@@ -31,8 +31,10 @@ module MongoMapper
|
|
31
31
|
base.extend ClassMethods
|
32
32
|
base.class_eval do
|
33
33
|
after_save :save_attachments
|
34
|
-
|
35
|
-
|
34
|
+
many :attachments,
|
35
|
+
:as => :owner,
|
36
|
+
:class_name => "MongoMapper::Grip::Attachment",
|
37
|
+
:dependent => :destroy
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -56,16 +58,20 @@ module MongoMapper
|
|
56
58
|
|
57
59
|
def create_variant attachment, variant, dimensions
|
58
60
|
tmp_file = self.class.uploaded_files[attachment.name.to_sym][:file]
|
59
|
-
|
60
|
-
|
61
|
+
begin
|
62
|
+
tmp = Tempfile.new("#{attachment.name}_#{variant}")
|
63
|
+
image = Miso::Image.new(tmp_file.path)
|
61
64
|
|
62
|
-
|
63
|
-
|
65
|
+
image.crop(dimensions[:width], dimensions[:height]) if dimensions[:crop]
|
66
|
+
image.fit(dimensions[:width], dimensions[:height]) unless dimensions[:crop]
|
64
67
|
|
65
|
-
|
68
|
+
image.write(tmp.path)
|
69
|
+
rescue RuntimeError => e
|
70
|
+
warn "Image was not resized. #{e}"
|
71
|
+
tmp = tmp_file
|
72
|
+
end
|
66
73
|
|
67
74
|
file_hash = {:resized_file => tmp,:uploaded_file => tmp_file}
|
68
|
-
|
69
75
|
attachment.send("#{variant}=", file_hash)
|
70
76
|
end
|
71
77
|
|
File without changes
|
File without changes
|
data/test/test_helper.rb
CHANGED
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.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- twoism
|
@@ -10,10 +10,29 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2010-01-07 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rmagick
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
version:
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: miso
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
version:
|
17
36
|
description: GridFS attachments for MongoMapper
|
18
37
|
email: signalstatic@gmail.com
|
19
38
|
executables: []
|
@@ -22,12 +41,12 @@ extensions: []
|
|
22
41
|
|
23
42
|
extra_rdoc_files:
|
24
43
|
- LICENSE
|
25
|
-
- README.
|
44
|
+
- README.markdown
|
26
45
|
files:
|
27
46
|
- .DS_Store
|
28
47
|
- .gitignore
|
29
48
|
- LICENSE
|
30
|
-
- README.
|
49
|
+
- README.markdown
|
31
50
|
- Rakefile
|
32
51
|
- VERSION
|
33
52
|
- grip.gemspec
|
@@ -37,10 +56,10 @@ files:
|
|
37
56
|
- test/factories.rb
|
38
57
|
- test/fixtures/cthulhu.png
|
39
58
|
- test/fixtures/sample.pdf
|
59
|
+
- test/grip_attachment_test.rb
|
40
60
|
- test/growler.rb
|
61
|
+
- test/has_attachment_test.rb
|
41
62
|
- test/models.rb
|
42
|
-
- test/test_grip_attachment.rb
|
43
|
-
- test/test_has_attachment.rb
|
44
63
|
- test/test_helper.rb
|
45
64
|
has_rdoc: true
|
46
65
|
homepage: http://github.com/twoism/grip
|
@@ -72,8 +91,8 @@ specification_version: 3
|
|
72
91
|
summary: GridFS attachments for MongoMapper
|
73
92
|
test_files:
|
74
93
|
- test/factories.rb
|
94
|
+
- test/grip_attachment_test.rb
|
75
95
|
- test/growler.rb
|
96
|
+
- test/has_attachment_test.rb
|
76
97
|
- test/models.rb
|
77
|
-
- test/test_grip_attachment.rb
|
78
|
-
- test/test_has_attachment.rb
|
79
98
|
- test/test_helper.rb
|
data/README.rdoc
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
= grip
|
2
|
-
|
3
|
-
GridFS attachments for MongoMapper
|
4
|
-
|
5
|
-
= installation
|
6
|
-
|
7
|
-
The grip gem is hosted on gemcutter.org:
|
8
|
-
|
9
|
-
gem install miso grip
|
10
|
-
|
11
|
-
|
12
|
-
= Usage (See tests for better docs)
|
13
|
-
|
14
|
-
class Doc
|
15
|
-
include MongoMapper::Document
|
16
|
-
include MongoMapper::Grip::HasAttachment
|
17
|
-
|
18
|
-
has_grid_attachment :image, :versions => {:thumb => {:width=>50,:height=>50}}
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
image = File.open('foo.png', 'r')
|
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
|
-
|