mongoid_grid 0.0.8 → 0.0.10
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/README.txt +15 -37
- data/lib/{mongoid/grid.rb → mongoid_grid.rb} +15 -9
- metadata +8 -37
- data/lib/rack/grid.rb +0 -115
- data/test/test_rack_grid.rb +0 -0
data/README.txt
CHANGED
@@ -1,61 +1,39 @@
|
|
1
|
-
Mongoid::Grid
|
1
|
+
Mongoid::Grid
|
2
2
|
|
3
|
-
|
4
|
-
by grip (http://github.com/jnunemaker/grip)
|
5
|
-
|
6
|
-
Rack::Grid is used to serve a GridFS file from rack. Mostly copied
|
7
|
-
from http://github.com/skinandbones/rack-gridfs
|
8
|
-
|
9
|
-
Download the source at
|
10
|
-
http://github.com/dusty/mongoid_grid
|
3
|
+
mongoid_grid is a GridFS plugin for Mongoid::Document
|
11
4
|
|
5
|
+
***NOTE: The rack helper is no longer included in this project. If you
|
6
|
+
need it, please switch to rack_grid: https://github.com/dusty/rack_grid
|
12
7
|
|
13
8
|
Installation
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
# gem install mongoid_grid
|
18
|
-
|
19
|
-
Or, make your own gem.
|
20
|
-
|
21
|
-
# git clone http://github.com/dusty/mongoid_grid
|
22
|
-
# cd mongoid_grid
|
10
|
+
# git clone https://github.com/dusty/mongoid_grid.git
|
23
11
|
# gem build mongoid_grid.gemspec
|
24
|
-
|
25
|
-
Then require the libraries you want to use.
|
26
|
-
|
27
|
-
require 'mongoid/grid'
|
28
|
-
require 'rack/grid'
|
29
|
-
|
12
|
+
# gem install mongoid_grid-0.0.x.gem
|
30
13
|
|
31
14
|
Usage
|
32
15
|
|
16
|
+
require 'mongoid_grid'
|
33
17
|
class Monkey
|
34
18
|
include Mongoid::Document
|
35
19
|
include Mongoid::Grid
|
36
20
|
field :name
|
37
21
|
attachment :image
|
38
22
|
end
|
39
|
-
|
23
|
+
|
40
24
|
m = Monkey.create(:name => 'name')
|
41
|
-
|
25
|
+
|
42
26
|
# To add an attachment
|
43
27
|
m.image = File.open('/tmp/me.jpg')
|
44
28
|
m.save
|
45
|
-
|
29
|
+
|
46
30
|
# To remove an attachment
|
47
31
|
m.image = nil
|
48
32
|
m.save
|
49
|
-
|
33
|
+
|
50
34
|
# To get the attachment
|
51
35
|
m.image.read
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
use Rack::Grid, :database => 'my_db'
|
57
|
-
end
|
58
|
-
|
59
|
-
<img src="<%= m.image_url %>" alt="<%= m.image_name %>" />
|
60
|
-
|
61
|
-
|
36
|
+
|
37
|
+
Inspired By
|
38
|
+
- http://github.com/jnunemaker/grip
|
39
|
+
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'mime/types'
|
2
|
-
require 'mongoid'
|
3
2
|
module Mongoid
|
4
3
|
module Grid
|
5
4
|
|
@@ -19,7 +18,7 @@ module Mongoid
|
|
19
18
|
# Callbacks to handle the attachment saving and deleting
|
20
19
|
after_save :create_attachments
|
21
20
|
after_save :delete_attachments
|
22
|
-
after_destroy :destroy_attachments
|
21
|
+
after_destroy :destroy_attachments, :delete_attachments
|
23
22
|
|
24
23
|
##
|
25
24
|
# Fields for the attachment.
|
@@ -114,13 +113,18 @@ module Mongoid
|
|
114
113
|
# Attachments we need to add after save.
|
115
114
|
def create_attachment(name,file)
|
116
115
|
if file.respond_to?(:read)
|
117
|
-
filename = file.respond_to?(:original_filename)
|
118
|
-
|
116
|
+
filename = if file.respond_to?(:original_filename) && file.original_filename
|
117
|
+
file.original_filename
|
118
|
+
elsif file.respond_to?(:tempfile)
|
119
|
+
File.basename(file.tempfile.path)
|
120
|
+
else
|
121
|
+
File.basename(file.path)
|
122
|
+
end
|
119
123
|
type = MIME::Types.type_for(filename).first
|
120
124
|
mime = type ? type.content_type : "application/octet-stream"
|
121
125
|
send("#{name}_id=", BSON::ObjectId.new)
|
122
126
|
send("#{name}_name=", filename)
|
123
|
-
send("#{name}_size=", File.size(file))
|
127
|
+
send("#{name}_size=", File.size(file.respond_to?(:tempfile) ? file.tempfile : file))
|
124
128
|
send("#{name}_type=", mime)
|
125
129
|
create_attachment_queue[name] = file
|
126
130
|
end
|
@@ -156,10 +160,12 @@ module Mongoid
|
|
156
160
|
# Attachments we need to remove after save
|
157
161
|
def delete_attachment(name,id)
|
158
162
|
delete_attachment_queue[name] = id if id.is_a?(BSON::ObjectId)
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
+
unless destroyed?
|
164
|
+
send("#{name}_id=", nil)
|
165
|
+
send("#{name}_name=", nil)
|
166
|
+
send("#{name}_size=", nil)
|
167
|
+
send("#{name}_type=", nil)
|
168
|
+
end
|
163
169
|
end
|
164
170
|
|
165
171
|
##
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_grid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
version: 0.0.8
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.10
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Dusty Doris
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
13
|
+
date: 2011-05-10 00:00:00 -04:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,29 +21,10 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 0
|
30
24
|
version: "0"
|
31
25
|
type: :runtime
|
32
26
|
version_requirements: *id001
|
33
|
-
|
34
|
-
name: mongoid
|
35
|
-
prerelease: false
|
36
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
|
-
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
segments:
|
42
|
-
- 2
|
43
|
-
- 0
|
44
|
-
- 0
|
45
|
-
- beta
|
46
|
-
- 19
|
47
|
-
version: 2.0.0.beta.19
|
48
|
-
type: :runtime
|
49
|
-
version_requirements: *id002
|
50
|
-
description: Plugin for Mongoid to use GridFS and a Rack helper
|
27
|
+
description: Plugin for Mongoid::Document to attach files via GridFS
|
51
28
|
email: github@dusty.name
|
52
29
|
executables: []
|
53
30
|
|
@@ -57,12 +34,10 @@ extra_rdoc_files:
|
|
57
34
|
- README.txt
|
58
35
|
files:
|
59
36
|
- README.txt
|
60
|
-
- lib/
|
61
|
-
- lib/rack/grid.rb
|
37
|
+
- lib/mongoid_grid.rb
|
62
38
|
- test/test_mongoid_grid.rb
|
63
|
-
- test/test_rack_grid.rb
|
64
39
|
has_rdoc: true
|
65
|
-
homepage: http://github.com/dusty/
|
40
|
+
homepage: http://github.com/dusty/mongo_grid
|
66
41
|
licenses: []
|
67
42
|
|
68
43
|
post_install_message:
|
@@ -75,23 +50,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
75
50
|
requirements:
|
76
51
|
- - ">="
|
77
52
|
- !ruby/object:Gem::Version
|
78
|
-
segments:
|
79
|
-
- 0
|
80
53
|
version: "0"
|
81
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
55
|
none: false
|
83
56
|
requirements:
|
84
57
|
- - ">="
|
85
58
|
- !ruby/object:Gem::Version
|
86
|
-
segments:
|
87
|
-
- 0
|
88
59
|
version: "0"
|
89
60
|
requirements: []
|
90
61
|
|
91
62
|
rubyforge_project: none
|
92
|
-
rubygems_version: 1.
|
63
|
+
rubygems_version: 1.6.2
|
93
64
|
signing_key:
|
94
65
|
specification_version: 3
|
95
|
-
summary: Plugin for Mongoid to
|
66
|
+
summary: Plugin for Mongoid::Document to attach files via GridFS
|
96
67
|
test_files: []
|
97
68
|
|
data/lib/rack/grid.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
require 'timeout'
|
2
|
-
require 'mongo'
|
3
|
-
|
4
|
-
module Rack
|
5
|
-
class Grid
|
6
|
-
class ConnectionError < StandardError ; end
|
7
|
-
|
8
|
-
attr_reader :host, :port, :database, :prefix, :username, :password
|
9
|
-
|
10
|
-
def initialize(app, options = {})
|
11
|
-
opts = {}
|
12
|
-
options.each { |k,v| opts[k.to_s] = v }
|
13
|
-
options = {
|
14
|
-
'host' => 'localhost',
|
15
|
-
'prefix' => 'grid',
|
16
|
-
'port' => Mongo::Connection::DEFAULT_PORT
|
17
|
-
}.merge(opts)
|
18
|
-
|
19
|
-
@app = app
|
20
|
-
@host = options['host']
|
21
|
-
@port = options['port']
|
22
|
-
@database = options['database']
|
23
|
-
@prefix = options['prefix']
|
24
|
-
@username = options['username']
|
25
|
-
@password = options['password']
|
26
|
-
@db = options['db']
|
27
|
-
|
28
|
-
@cache_control = options['cache_control']
|
29
|
-
end
|
30
|
-
|
31
|
-
def db
|
32
|
-
@db = @db.call() if Proc === @db
|
33
|
-
connect! unless @db
|
34
|
-
@db
|
35
|
-
end
|
36
|
-
|
37
|
-
##
|
38
|
-
# Strip the _id out of the path. This allows the user to send something
|
39
|
-
# like /grid/4ba69fde8c8f369a6e000003/filename.jpg to find the file
|
40
|
-
# with an id of 4ba69fde8c8f369a6e000003.
|
41
|
-
def call(env)
|
42
|
-
@env = env
|
43
|
-
request = Rack::Request.new(@env)
|
44
|
-
if request.path_info =~ /^\/#{prefix}\/(\w+).*$/
|
45
|
-
grid_request($1)
|
46
|
-
else
|
47
|
-
@app.call(env)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
##
|
52
|
-
# Get file from GridFS or return a 404
|
53
|
-
def grid_request(id)
|
54
|
-
file = Mongo::Grid.new(db).get(BSON::ObjectId.from_string(id))
|
55
|
-
|
56
|
-
etag, last_modified = file.instance_variable_get(:@md5), Time.at( file.upload_date.to_i )
|
57
|
-
headers = {
|
58
|
-
'ETag' => "\"#{etag}\"",
|
59
|
-
'Last-Modified' => last_modified.httpdate,
|
60
|
-
'Cache-Control' => cache_control_header,
|
61
|
-
}
|
62
|
-
if not_modified?( etag, last_modified )
|
63
|
-
[304, headers, 'Not Modified']
|
64
|
-
else
|
65
|
-
[200, headers.update('Content-Type' => file.content_type), [file.read]]
|
66
|
-
end
|
67
|
-
rescue Mongo::GridError, BSON::InvalidObjectId
|
68
|
-
[404, {'Content-Type' => 'text/plain'}, ['File not found.']]
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
def connect!
|
73
|
-
Timeout::timeout(5) do
|
74
|
-
@db = Mongo::Connection.new(host,port).db(database)
|
75
|
-
db.authenticate(username, password) if (username || password)
|
76
|
-
end
|
77
|
-
rescue StandardError => e
|
78
|
-
raise ConnectionError, "Timeout connecting to GridFS (#{e.to_s})"
|
79
|
-
end
|
80
|
-
|
81
|
-
DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate"
|
82
|
-
def cache_control_header
|
83
|
-
if @cache_control.blank?
|
84
|
-
DEFAULT_CACHE_CONTROL
|
85
|
-
|
86
|
-
elsif @cache_control[:no_cache]
|
87
|
-
'no-cache'
|
88
|
-
|
89
|
-
else
|
90
|
-
extras = @cache_control[:extras]
|
91
|
-
max_age = @cache_control[:max_age]
|
92
|
-
|
93
|
-
options = []
|
94
|
-
options << "max-age=#{max_age.to_i}" if max_age
|
95
|
-
options << (@cache_control[:public] ? 'public' : 'private')
|
96
|
-
options << 'must-revalidate' if @cache_control[:must_revalidate]
|
97
|
-
options.concat(extras) if extras
|
98
|
-
|
99
|
-
options.join(', ')
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def not_modified?( etag, last_modified )
|
104
|
-
if_none_match = @env['HTTP_IF_NONE_MATCH']
|
105
|
-
if if_modified_since = @env['HTTP_IF_MODIFIED_SINCE']
|
106
|
-
if_modified_since = Time.rfc2822( if_modified_since ) rescue nil
|
107
|
-
end
|
108
|
-
|
109
|
-
not_modified = if_none_match.present? || if_modified_since.present?
|
110
|
-
not_modified &&= (if_none_match == "\"#{etag}\"") if if_none_match && etag
|
111
|
-
not_modified &&= (if_modified_since >= last_modified) if if_modified_since && last_modified
|
112
|
-
not_modified
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
data/test/test_rack_grid.rb
DELETED
File without changes
|