grip 0.6.1 → 0.6.2
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 +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
|
-
|