grip 0.3.0 → 0.4.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/.gitignore +2 -1
- data/README.rdoc +10 -4
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/grip.gemspec +52 -0
- data/lib/grip.rb +55 -57
- data/test/{cthulhu.png → fixtures/cthulhu.png} +0 -0
- data/test/{sample.pdf → fixtures/sample.pdf} +0 -0
- data/test/test_grip.rb +58 -43
- data/test/test_helper.rb +15 -17
- metadata +7 -4
data/.gitignore
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
*.gem
|
1
|
+
*.gem
|
2
|
+
pkg/*
|
data/README.rdoc
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
|
2
|
-
==============
|
1
|
+
= grip
|
3
2
|
|
4
|
-
GridFS
|
3
|
+
GridFS attachments for MongoMapper
|
5
4
|
|
6
|
-
|
5
|
+
= installation
|
6
|
+
|
7
|
+
The grip gem is hosted on gemcutter.org:
|
8
|
+
|
9
|
+
* gem install grip
|
10
|
+
|
11
|
+
|
12
|
+
= Usage
|
7
13
|
|
8
14
|
class Foo
|
9
15
|
include MongoMapper::Document
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'jeweler'
|
8
|
+
Jeweler::Tasks.new do |g|
|
9
|
+
g.name = 'grip'
|
10
|
+
g.summary = %(GridFS attachments for MongoMapper)
|
11
|
+
g.description = %(GridFS attachments for MongoMapper)
|
12
|
+
g.email = 'signalstatic@gmail.com'
|
13
|
+
g.homepage = 'http://github.com/twoism/grip'
|
14
|
+
g.authors = %w(twoism)
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts 'Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com'
|
19
|
+
end
|
20
|
+
|
21
|
+
Rake::TestTask.new do |t|
|
22
|
+
t.libs = %w(test)
|
23
|
+
t.pattern = 'test/**/*_test.rb'
|
24
|
+
end
|
25
|
+
|
26
|
+
task :default => :test
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.4.0
|
data/grip.gemspec
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{grip}
|
8
|
+
s.version = "0.4.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["twoism"]
|
12
|
+
s.date = %q{2009-12-23}
|
13
|
+
s.description = %q{GridFS attachments for MongoMapper}
|
14
|
+
s.email = %q{signalstatic@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"grip.gemspec",
|
26
|
+
"lib/grip.rb",
|
27
|
+
"test/fixtures/cthulhu.png",
|
28
|
+
"test/fixtures/sample.pdf",
|
29
|
+
"test/test_grip.rb",
|
30
|
+
"test/test_helper.rb"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/twoism/grip}
|
33
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.3.5}
|
36
|
+
s.summary = %q{GridFS attachments for MongoMapper}
|
37
|
+
s.test_files = [
|
38
|
+
"test/test_grip.rb",
|
39
|
+
"test/test_helper.rb"
|
40
|
+
]
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
47
|
+
else
|
48
|
+
end
|
49
|
+
else
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/lib/grip.rb
CHANGED
@@ -1,76 +1,74 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def save_attachments
|
13
|
-
self.class.attachment_definitions.each do |attachment|
|
14
|
-
name, file = attachment
|
15
|
-
if file.is_a?(File)
|
16
|
-
|
17
|
-
file_path = file.original_filename rescue file.path.split("/").last
|
18
|
-
path = file_save_path(name,file_path)
|
19
|
-
|
20
|
-
GridStore.open(self.class.database, path, 'w') do |f|
|
21
|
-
content_type = file.content_type rescue MIME::Types.type_for(file.path).first.content_type
|
22
|
-
f.content_type = content_type
|
23
|
-
f.puts file.read
|
24
|
-
end
|
25
|
-
|
26
|
-
self.send("#{name}_path=",path)
|
27
|
-
save_to_collection
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def destroy_attached_files
|
33
|
-
self.class.attachment_definitions.each do |name, attachment|
|
34
|
-
GridStore.unlink(self.class.database, send("#{name}_path"))
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def file_from_grid name
|
39
|
-
GridStore.open(self.class.database, send("#{name}_path"), 'r') {|f| f }
|
40
|
-
end
|
1
|
+
require 'mongo/gridfs'
|
2
|
+
require 'mime/types'
|
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
|
41
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
|
+
# }
|
19
|
+
|
20
|
+
module Grip
|
21
|
+
def self.included(base)
|
22
|
+
base.extend Grip::ClassMethods
|
42
23
|
end
|
24
|
+
|
43
25
|
module ClassMethods
|
44
|
-
|
45
|
-
def has_grid_attachment name
|
46
|
-
include InstanceMethods
|
47
|
-
|
48
|
-
# thanks to thoughtbot's paperclip!
|
26
|
+
def has_grid_attachment(name)
|
49
27
|
write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
|
50
28
|
attachment_definitions[name] = {}
|
51
29
|
|
52
|
-
|
53
|
-
|
30
|
+
after_save :save_attachments
|
31
|
+
before_destroy :destroy_attached_files
|
32
|
+
|
33
|
+
key "#{name}_size".to_sym, Integer
|
34
|
+
key "#{name}_path".to_sym, String
|
35
|
+
key "#{name}_name".to_sym, String
|
36
|
+
key "#{name}_content_type".to_sym, String
|
37
|
+
|
38
|
+
define_method(name) do
|
39
|
+
GridFS::GridStore.read(self.class.database, self["#{name}_path"])
|
54
40
|
end
|
55
|
-
|
56
|
-
define_method
|
41
|
+
|
42
|
+
define_method("#{name}=") do |file|
|
43
|
+
self['_id'] = Mongo::ObjectID.new if _id.blank?
|
44
|
+
self["#{name}_size"] = File.size(file)
|
45
|
+
self["#{name}_name"] = File.basename(file.path)
|
46
|
+
self["#{name}_path"] = "#{self.class.to_s.underscore}/#{name}/#{_id}"
|
47
|
+
self["#{name}_content_type"] = file.content_type rescue MIME::Types.type_for(self["#{name}_name"]).to_s
|
57
48
|
self.class.attachment_definitions[name] = file
|
58
49
|
end
|
59
|
-
|
60
|
-
key "#{name}_path".to_sym, String
|
61
50
|
end
|
62
51
|
|
63
52
|
def attachment_definitions
|
64
53
|
read_inheritable_attribute(:attachment_definitions)
|
65
54
|
end
|
66
|
-
|
67
55
|
end
|
68
56
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
57
|
+
def save_attachments
|
58
|
+
self.class.attachment_definitions.each do |attachment|
|
59
|
+
name, file = attachment
|
60
|
+
|
61
|
+
if (file.is_a?(File) || file.is_a?(Tempfile))
|
62
|
+
GridFS::GridStore.open(self.class.database, self["#{name}_path"], 'w', :content_type => self["#{name}_content_type"]) do |f|
|
63
|
+
f.write(file.read)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def destroy_attached_files
|
70
|
+
self.class.attachment_definitions.each do |name, attachment|
|
71
|
+
GridFS::GridStore.unlink(self.class.database, self["#{name}_path"])
|
74
72
|
end
|
75
73
|
end
|
76
74
|
end
|
File without changes
|
File without changes
|
data/test/test_grip.rb
CHANGED
@@ -1,58 +1,73 @@
|
|
1
1
|
require "test_helper"
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/../lib/grip')
|
3
|
-
|
4
2
|
|
5
3
|
class Foo
|
6
4
|
include MongoMapper::Document
|
7
5
|
include Grip
|
8
|
-
|
6
|
+
|
9
7
|
has_grid_attachment :image
|
10
8
|
has_grid_attachment :pdf
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
class GripTest < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
MongoMapper.connection.drop_database "test-attachments"
|
14
|
+
MongoMapper.database = "test-attachments"
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
should "only define callbacks once" do
|
28
|
-
assert_equal(1, Foo.after_save.collect(&:method).count)
|
29
|
-
assert_equal(1, Foo.before_destroy.collect(&:method).count)
|
30
|
-
end
|
31
|
-
|
32
|
-
should "have correct mime type" do
|
33
|
-
assert_equal("image/png", @from_collection.image.content_type)
|
34
|
-
assert_equal("application/pdf", @from_collection.pdf.content_type)
|
35
|
-
end
|
36
|
-
|
37
|
-
should "respond to the dynamic keys" do
|
38
|
-
[:pdf_path,:image_path].each {|k| assert @document.respond_to? k }
|
39
|
-
end
|
40
|
-
|
41
|
-
should "have the correct paths" do
|
42
|
-
assert_equal("foo/#{@document.id}/image/cthulhu.png", @document.image_path)
|
43
|
-
assert_equal("foo/#{@document.id}/pdf/sample.pdf", @document.pdf_path)
|
44
|
-
end
|
45
|
-
|
46
|
-
should "cleanup attachments" do
|
47
|
-
img_path = "foo/#{@document._id}/image/cthulhu.png", @document.image_path
|
48
|
-
pdf_path = "foo/#{@document._id}/pdf/sample.pdf", @document.pdf_path
|
16
|
+
dir = File.dirname(__FILE__) + '/fixtures'
|
17
|
+
@pdf = File.open("#{dir}/sample.pdf", 'r')
|
18
|
+
@image = File.open("#{dir}/cthulhu.png", 'r')
|
19
|
+
|
20
|
+
@doc = Foo.create(:image => @image, :pdf => @pdf)
|
21
|
+
@doc.reload
|
22
|
+
end
|
49
23
|
|
50
|
-
|
24
|
+
def teardown
|
25
|
+
@pdf.close
|
26
|
+
@image.close
|
27
|
+
end
|
51
28
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
29
|
+
test "assigns keys correctly" do
|
30
|
+
assert_equal 27582, @doc.image_size
|
31
|
+
assert_equal 8775, @doc.pdf_size
|
32
|
+
|
33
|
+
assert_equal 'cthulhu.png', @doc.image_name
|
34
|
+
assert_equal 'sample.pdf', @doc.pdf_name
|
35
|
+
|
36
|
+
assert_equal "image/png", @doc.image_content_type
|
37
|
+
assert_equal "application/pdf", @doc.pdf_content_type
|
38
|
+
|
39
|
+
assert_equal "foo/image/#{@doc.id}", @doc.image_path
|
40
|
+
assert_equal "foo/pdf/#{@doc.id}", @doc.pdf_path
|
41
|
+
|
42
|
+
collection = MongoMapper.database['fs.files']
|
43
|
+
|
44
|
+
assert_equal "image/png", collection.find_one(:filename => @doc.image_path)['contentType']
|
45
|
+
assert_equal "application/pdf", collection.find_one(:filename => @doc.pdf_path)['contentType']
|
46
|
+
end
|
47
|
+
|
48
|
+
test "responds to dynamic keys" do
|
49
|
+
[ :pdf_size, :pdf_path, :pdf_name, :pdf_content_type,
|
50
|
+
:image_size, :image_path, :image_name, :image_content_type
|
51
|
+
].each do |method|
|
52
|
+
assert @doc.respond_to?(method)
|
56
53
|
end
|
57
54
|
end
|
55
|
+
|
56
|
+
test "saves attachments correctly" do
|
57
|
+
assert_equal @image.read, @doc.image
|
58
|
+
assert_equal @pdf.read, @doc.pdf
|
59
|
+
|
60
|
+
assert GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
|
61
|
+
assert GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
|
62
|
+
end
|
63
|
+
|
64
|
+
test "cleans up attachments on destroy" do
|
65
|
+
assert GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
|
66
|
+
assert GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
|
67
|
+
|
68
|
+
@doc.destroy
|
69
|
+
|
70
|
+
assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.image_path)
|
71
|
+
assert ! GridFS::GridStore.exist?(MongoMapper.database, @doc.pdf_path)
|
72
|
+
end
|
58
73
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,25 +1,23 @@
|
|
1
|
-
|
1
|
+
require 'test/unit'
|
2
|
+
require 'pp'
|
2
3
|
|
4
|
+
require 'mongo_mapper'
|
3
5
|
|
6
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/grip')
|
4
7
|
|
5
8
|
MongoMapper.database = "test-attachments"
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# Make sure that each test case has a teardown
|
19
|
-
# method to clear the db after each test.
|
20
|
-
def inherited(base)
|
21
|
-
base.define_method teardown do
|
22
|
-
super
|
10
|
+
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
|
23
21
|
end
|
24
22
|
end
|
25
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- twoism
|
@@ -25,12 +25,15 @@ extra_rdoc_files:
|
|
25
25
|
files:
|
26
26
|
- .gitignore
|
27
27
|
- LICENSE
|
28
|
+
- README.rdoc
|
29
|
+
- Rakefile
|
30
|
+
- VERSION
|
31
|
+
- grip.gemspec
|
28
32
|
- lib/grip.rb
|
29
|
-
- test/cthulhu.png
|
30
|
-
- test/sample.pdf
|
33
|
+
- test/fixtures/cthulhu.png
|
34
|
+
- test/fixtures/sample.pdf
|
31
35
|
- test/test_grip.rb
|
32
36
|
- test/test_helper.rb
|
33
|
-
- README.rdoc
|
34
37
|
has_rdoc: true
|
35
38
|
homepage: http://github.com/twoism/grip
|
36
39
|
licenses: []
|