rack-gridfs 0.4.1 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGES.md +75 -0
- data/LICENSE +1 -1
- data/README.md +226 -0
- data/Rakefile +10 -11
- data/lib/rack-gridfs.rb +1 -0
- data/lib/rack/gridfs.rb +3 -1
- data/lib/rack/gridfs/endpoint/base.rb +8 -6
- data/lib/rack/gridfs/version.rb +1 -1
- metadata +163 -145
- data/CHANGES.rdoc +0 -41
- data/README.rdoc +0 -150
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ab436c3dc05107e4b93ceea00c2a7fe0f78b226e
|
4
|
+
data.tar.gz: 2231fb606b3aed0c9ab17676308b7bfd8adc3ef7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2362e5546421a1257120ea3cae2bf6a79ff8960c2245ab9f58b4135bf9d4f72684f086e4d3c46b9072d2cbbd3578e63a594c607977434f4f666f3ccc7e89098b
|
7
|
+
data.tar.gz: 8f22ad6d2c767bda454a3deef0412cc206f232cb46f9504da80203eaa160d35dc8c13cec441e5b0400b0ec90dbf29dc434ce48419c1ea286fe4423fdca2f31a4
|
data/CHANGES.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
CHANGE LOG
|
2
|
+
----------
|
3
|
+
|
4
|
+
### 0.4.3 / November 4, 2015 ###
|
5
|
+
|
6
|
+
Same as v0.4.2, but v0.4.2 gem yanked because of faulty gemspec file (grumble).
|
7
|
+
|
8
|
+
### 0.4.2 / November 3, 2015 ###
|
9
|
+
|
10
|
+
[full commit log](https://github.com/skinandbones/rack-gridfs/compare/v0.4.1...v0.4.2)
|
11
|
+
|
12
|
+
It's been awhile, eh? No compatibility with new `mongo` 2.x releases yet,
|
13
|
+
we'll look to bring that in an 0.5 or 1.0 release. This is primarily a bug fix
|
14
|
+
release for users affected by incompatible bson 2.x being allowed by some
|
15
|
+
historical `mongo` driver versions.
|
16
|
+
|
17
|
+
#### Features ####
|
18
|
+
|
19
|
+
- Eliminate need for `:require` option in Gemfile ([Konstantin Shabanov])
|
20
|
+
- Add `fs_name` option as supported by the Mongo driver ([max-power])
|
21
|
+
|
22
|
+
#### Bug Fixes ####
|
23
|
+
|
24
|
+
- Prevent bson 2.x being allowed to resolve dependency constraints, where some
|
25
|
+
historical versions of the `mongo` gem used a ">= 1.x" constraint spec.
|
26
|
+
See [#14](https://github.com/skinandbones/rack-gridfs/issues/14) for instance.
|
27
|
+
|
28
|
+
|
29
|
+
### 0.4.1 / June 26, 2011 ###
|
30
|
+
|
31
|
+
[full commit log](https://github.com/skinandbones/rack-gridfs/compare/v0.4.0...v0.4.1)
|
32
|
+
|
33
|
+
#### Bug Fixes ####
|
34
|
+
|
35
|
+
- URL-decode before filename lookup so that non-ASCII filenames are handled
|
36
|
+
correctly ([Konstantin Shabanov])
|
37
|
+
|
38
|
+
|
39
|
+
### 0.4.0 / May 12, 2011 ###
|
40
|
+
|
41
|
+
Major refactoring and loads of new features! Thanks to [Ben Marini] for his
|
42
|
+
substantial contributions to this release.
|
43
|
+
|
44
|
+
[full commit log](https://github.com/skinandbones/rack-gridfs/compare/v0.2.0...v0.4.0)
|
45
|
+
|
46
|
+
#### Features ####
|
47
|
+
|
48
|
+
- Allow configuration of MongoDB authentication ([Steve Sloan])
|
49
|
+
- Allow option to look up objects by GridFS filename instead of `ObjectId`
|
50
|
+
([SHIBATA Hiroshi])
|
51
|
+
- Return iterable GridIO object instead of file contents, so Rack can stream in
|
52
|
+
chunks ([Ches Martin])
|
53
|
+
- `Rack::GridFS::Endpoint`: support for mounting as a Rack endpoint in addition
|
54
|
+
to middleware ([Ben Marini])
|
55
|
+
- Cache headers: set `Last-Modified` and `Etag` so that `Rack::ConditionalGet`
|
56
|
+
sends 304s. `expires` option to set `Cache-Control` ([Alexander Gräfe] & [Ben
|
57
|
+
Marini])
|
58
|
+
- `mime-types` dependency so GridFS lib can determine content types ([Ben
|
59
|
+
Marini])
|
60
|
+
- You can now pass a `Mongo::DB` instance instead of discrete database
|
61
|
+
configuration parameters. Connections are retried so we take advantage of a
|
62
|
+
`ReplSetConnection` in high-availability architectures ([Ben Marini])
|
63
|
+
|
64
|
+
#### Bug Fixes ####
|
65
|
+
|
66
|
+
- `BSON::ObjectID` renamed to `ObjectId`, and other changes supporting
|
67
|
+
current versions of Mongo libraries
|
68
|
+
|
69
|
+
[Alexander Gräfe]: https://github.com/rickenharp
|
70
|
+
[SHIBATA Hiroshi]: https://github.com/hsbt
|
71
|
+
[Ben Marini]: https://github.com/bmarini
|
72
|
+
[Ches Martin]: https://github.com/ches
|
73
|
+
[max-power]: https://github.com/max-power
|
74
|
+
[Konstantin Shabanov]: https://github.com/etehtsea
|
75
|
+
[Steve Sloan]: https://github.com/CodeMonkeySteve
|
data/LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,226 @@
|
|
1
|
+
Rack::GridFS
|
2
|
+
============
|
3
|
+
|
4
|
+
Rack::GridFS is a Rack middleware for creating HTTP endpoints for files
|
5
|
+
stored in MongoDB's GridFS. You can configure a prefix string which
|
6
|
+
will be used to match the path of a request, and further look up GridFS
|
7
|
+
files based on either their `ObjectId` or `filename` field.
|
8
|
+
|
9
|
+
For example,
|
10
|
+
|
11
|
+
GET '/gridfs/someobjectid'
|
12
|
+
|
13
|
+
If the prefix is "gridfs", then the id will be be "someobjectid".
|
14
|
+
|
15
|
+
You can also use `Rack::GridFS::Endpoint` as a rack endpoint if you want to
|
16
|
+
handle routing another way.
|
17
|
+
|
18
|
+
### Status ###
|
19
|
+
|
20
|
+
The library hasn't been updated for some time and is in the process of being
|
21
|
+
brought up to modern standards on the `master` branch. It does not yet work
|
22
|
+
with 2.x versions of the `mongo` driver gem, which means that you will not be
|
23
|
+
able to use it together with Mongoid 5.x (patches welcome if you need it faster
|
24
|
+
than we can deliver it). Since Mongoid 3.x and 4.x use the `moped` gem instead
|
25
|
+
of `mongo`, though, you may be able to use the current rack-gridfs release in
|
26
|
+
apps still using one of these older Mongoid versions. rack-gridfs should
|
27
|
+
support the latest 1.x `mongo` releases, [which support MongoDB 3.0][driver compat].
|
28
|
+
|
29
|
+
If your head is spinning, [this official blog post][driver 2.0] gives a good
|
30
|
+
breakdown of driver version history and the future.
|
31
|
+
|
32
|
+
[driver 2.0]: https://www.mongodb.com/blog/post/announcing-ruby-driver-20-rewrite
|
33
|
+
[driver compat]: https://docs.mongodb.org/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-mongodb-ruby
|
34
|
+
|
35
|
+
Features
|
36
|
+
--------
|
37
|
+
|
38
|
+
- Use as rack middleware or mount as a rack endpoint
|
39
|
+
- File lookup using a path or object id
|
40
|
+
- Chunked transfer encoding, keeps memory usage low
|
41
|
+
- Content-Type header set using 'mime-types' gem
|
42
|
+
- Last-Modified and Etag headers set automatically for conditional get support
|
43
|
+
- Cache-Control header support
|
44
|
+
- High availability when using replication sets
|
45
|
+
|
46
|
+
Installation
|
47
|
+
------------
|
48
|
+
|
49
|
+
$ gem install rack-gridfs
|
50
|
+
|
51
|
+
Or in a Bundler project, add to your `Gemfile`:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
gem 'rack-gridfs', '~> 0.4'
|
55
|
+
```
|
56
|
+
|
57
|
+
Usage
|
58
|
+
-----
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
require 'rack/gridfs'
|
62
|
+
|
63
|
+
use Rack::GridFS, :prefix => 'gridfs',
|
64
|
+
:hostname => 'localhost',
|
65
|
+
:port => 27017,
|
66
|
+
:database => 'test'
|
67
|
+
```
|
68
|
+
|
69
|
+
Options:
|
70
|
+
|
71
|
+
- `prefix`: a string used to match against incoming paths and route to through
|
72
|
+
the middleware. Default 'gridfs'.
|
73
|
+
- `lookup`: whether to look up a file based on `:id` or `:path` (example
|
74
|
+
below). Default is `:id`.
|
75
|
+
- `fs_name`: collection name for the file system, if not using the Mongo driver
|
76
|
+
default ("fs").
|
77
|
+
|
78
|
+
You must also specify MongoDB database details:
|
79
|
+
|
80
|
+
- `hostname`: the hostname/IP where the MongoDB server is running. Default 'localhost'.
|
81
|
+
- `port`: the port of the MongoDB server. Default 27017.
|
82
|
+
- `database`: the name of the MongoDB database to connect to.
|
83
|
+
- `username` and `password`: if you need to authenticate to MongoDB.
|
84
|
+
|
85
|
+
Alternatively you can pass in a `Mongo::DB` instance instead:
|
86
|
+
|
87
|
+
- `db`: `MongoMapper.database`, or `Mongoid.database` for example.
|
88
|
+
|
89
|
+
### Simple Sinatra Example ###
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
require 'rubygems'
|
93
|
+
require 'sinatra'
|
94
|
+
|
95
|
+
require 'rack/gridfs'
|
96
|
+
use Rack::GridFS, :database => 'test', :prefix => 'gridfs'
|
97
|
+
|
98
|
+
get /.*/ do
|
99
|
+
"The URL did not match a file in GridFS."
|
100
|
+
end
|
101
|
+
```
|
102
|
+
|
103
|
+
### Usage with Rails 2 ###
|
104
|
+
|
105
|
+
To use `Rack::GridFS` in a Rails application, add it as middleware in
|
106
|
+
`application.rb` or `config/environments/*` with something like this:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
config.middleware.insert_after Rack::Runtime, Rack::GridFS,
|
110
|
+
:prefix => 'uploads', :database => "my_app_#{Rails.env}"
|
111
|
+
```
|
112
|
+
|
113
|
+
Run `rake middleware` to decide for yourself where to best place it in
|
114
|
+
the middleware stack for your app using [the Rails convenience methods],
|
115
|
+
taking into consideration that it can probably be near the top since it simply
|
116
|
+
returns a "static" file or a 404.
|
117
|
+
|
118
|
+
[the Rails convenience methods]: http://guides.rubyonrails.org/rails_on_rack.html#configuring-middleware-stack,
|
119
|
+
|
120
|
+
### Usage with Rails 3 ###
|
121
|
+
|
122
|
+
To use in Rails 3, you can insert into the middleware stack as above, or mount
|
123
|
+
the app directly in your routes (recommended). In `config/routes.rb`:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database), :at => "gridfs"
|
127
|
+
```
|
128
|
+
|
129
|
+
This allows for much more straightforward and sensible configuration, if you do
|
130
|
+
not require other middleware in front of GridFS (Rack-based authorization, for
|
131
|
+
instance).
|
132
|
+
|
133
|
+
### Path (filename) Lookup ###
|
134
|
+
|
135
|
+
The `:lookup => :path` option causes files to be looked up from the GridFS
|
136
|
+
store based on their `filename` field (which can be a full file path) rather than
|
137
|
+
`ObjectId` (requests still need to match the `prefix` you've set). This allows
|
138
|
+
you to find files based on essentially arbitrary URLs such as:
|
139
|
+
|
140
|
+
GET '/prefix/media/images/jane_avatar.jpg'
|
141
|
+
|
142
|
+
How filenames are set is specific to your application. We'll look at an example
|
143
|
+
with Carrierwave below.
|
144
|
+
|
145
|
+
**NOTE**: The Mongo Ruby driver will try to create an index on the `filename`
|
146
|
+
field for you automatically, but if you are using filename lookup you'll want to
|
147
|
+
double-check that it is created appropriately (on slaves only if you have a
|
148
|
+
master-slave architecture, etc.).
|
149
|
+
|
150
|
+
### Carrierwave Example ###
|
151
|
+
|
152
|
+
Path lookup works well for usage with [Carrierwave]. As a minimal example with
|
153
|
+
Mongoid:
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
# config/initializers/carrierwave.rb
|
157
|
+
CarrierWave.configure do |config|
|
158
|
+
config.storage = :grid_fs
|
159
|
+
config.grid_fs_connection = Mongoid.database
|
160
|
+
config.grid_fs_access_url = "/uploads"
|
161
|
+
end
|
162
|
+
|
163
|
+
# app/uploaders/avatar_uploader.rb
|
164
|
+
class AvatarUploader < CarrierWave::Uploader::Base
|
165
|
+
# (Virtual) path where uploaded files will be stored, appended to the
|
166
|
+
# gridfs_access_url by methods used with view helpers
|
167
|
+
def store_dir
|
168
|
+
"#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# app/models/user.rb
|
173
|
+
class User
|
174
|
+
include Mongoid::Document
|
175
|
+
mount_uploader :avatar, AvatarUploader
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
```eruby
|
180
|
+
<%# app/views/user/show.html.erb %>
|
181
|
+
<%= image_tag(@user.avatar.url) if @user.avatar? %>
|
182
|
+
```
|
183
|
+
|
184
|
+
This will result in URL paths like `/uploads/user/avatar/4d250d04a8f41c0a31000006/original_filename.jpg`
|
185
|
+
being generated for the view helpers, and Carrierwave will store
|
186
|
+
`user/avatar/4d250d04a8f41c0a31000006/original_filename.jpg` as the
|
187
|
+
`filename` in GridFS. Thus, you can configure `Rack::GridFS` to serve
|
188
|
+
these files as such:
|
189
|
+
|
190
|
+
```ruby
|
191
|
+
config.middleware.insert_after Rack::Runtime, Rack::GridFS,
|
192
|
+
:prefix => 'uploads', :lookup => :path, :database => "my_app_#{Rails.env}"
|
193
|
+
```
|
194
|
+
|
195
|
+
[Carrierwave]: https://github.com/jnicklas/carrierwave.
|
196
|
+
|
197
|
+
Ruby Version and Mongo Driver Compatibility Notes
|
198
|
+
-------------------------------------------------
|
199
|
+
|
200
|
+
If for some reason you need support for ancient versions of the `mongo` driver
|
201
|
+
prior to v1.2, these were supported in rack-gridfs 0.3.0 and below. 0.4.x
|
202
|
+
supports `mongo` 1.2+ which made substantial changes to the earlier GridFS
|
203
|
+
API.
|
204
|
+
|
205
|
+
Support for Ruby 1.8 is no longer being tested and will be dropped in the next
|
206
|
+
version that supports `mongo` 2.x (the driver itself officially drops 1.8
|
207
|
+
support). It was supported up to rack-gridfs gem release/git tag v0.4.2.
|
208
|
+
|
209
|
+
Development and Contributing
|
210
|
+
----------------------------
|
211
|
+
|
212
|
+
Running the project and unit tests in development follows typical procedure for
|
213
|
+
a Ruby project:
|
214
|
+
|
215
|
+
$ git clone https://github.com/skinandbones/rack-gridfs.git
|
216
|
+
$ cd rack-gridfs
|
217
|
+
$ bundle install
|
218
|
+
$ bundle exec rake test
|
219
|
+
|
220
|
+
Note that the test suite expects that you have MongoDB running locally on the
|
221
|
+
default port and will use a database called `test`.
|
222
|
+
|
223
|
+
Copyright
|
224
|
+
---------
|
225
|
+
|
226
|
+
Copyright (c) 2010-2015 Blake Carlson. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
require 'bundler/setup'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'yard'
|
4
|
+
|
5
|
+
require File.expand_path("../lib/rack/gridfs/version", __FILE__)
|
6
|
+
|
2
7
|
Bundler::GemHelper.install_tasks
|
3
8
|
|
4
|
-
require 'rake/testtask'
|
5
9
|
Rake::TestTask.new(:test) do |test|
|
6
10
|
test.libs << 'lib' << 'test'
|
7
11
|
test.pattern = 'test/**/*_test.rb'
|
8
12
|
test.verbose = true
|
9
13
|
end
|
10
14
|
|
15
|
+
task :default => :test
|
16
|
+
|
11
17
|
begin
|
12
18
|
require 'rcov/rcovtask'
|
13
19
|
Rcov::RcovTask.new do |test|
|
@@ -22,14 +28,7 @@ rescue LoadError
|
|
22
28
|
end
|
23
29
|
end
|
24
30
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
Rake::RDocTask.new do |rdoc|
|
29
|
-
require File.expand_path("../lib/rack/gridfs/version", __FILE__)
|
30
|
-
|
31
|
-
rdoc.rdoc_dir = 'rdoc'
|
32
|
-
rdoc.title = "Rack::GridFS #{Rack::GridFS::VERSION}"
|
33
|
-
rdoc.rdoc_files.include(%w[ README* CHANGES* ])
|
34
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
31
|
+
YARD::Rake::YardocTask.new do |t|
|
32
|
+
t.name = 'doc'
|
33
|
+
t.files = ['lib/**/*.rb']
|
35
34
|
end
|
data/lib/rack-gridfs.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rack/gridfs'
|
data/lib/rack/gridfs.rb
CHANGED
@@ -39,9 +39,11 @@ module Rack
|
|
39
39
|
|
40
40
|
# TODO: doc explanation/example of custom mapper
|
41
41
|
def normalize_options(options)
|
42
|
+
options = options.dup
|
43
|
+
|
42
44
|
options.tap do |opts|
|
43
45
|
opts[:prefix] ||= "gridfs"
|
44
|
-
opts[:prefix].gsub
|
46
|
+
opts[:prefix] = options[:prefix].gsub(/^\//, '')
|
45
47
|
opts[:mapper] ||= lambda { |path| %r!^/#{options[:prefix]}/(.+)!.match(path)[1] }
|
46
48
|
end
|
47
49
|
end
|
@@ -7,9 +7,10 @@ module Rack
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@options = default_options.merge(options)
|
9
9
|
|
10
|
-
@db
|
11
|
-
@lookup
|
12
|
-
@mapper
|
10
|
+
@db = @options[:db]
|
11
|
+
@lookup = @options[:lookup]
|
12
|
+
@mapper = @options[:mapper]
|
13
|
+
@fs_name = @options[:fs_name]
|
13
14
|
end
|
14
15
|
|
15
16
|
def call(env)
|
@@ -31,7 +32,8 @@ module Rack
|
|
31
32
|
def default_options
|
32
33
|
{
|
33
34
|
:lookup => :id,
|
34
|
-
:mapper => lambda { |path| %r!/(.+)!.match(path)[1] }
|
35
|
+
:mapper => lambda { |path| %r!/(.+)!.match(path)[1] },
|
36
|
+
:fs_name => Mongo::Grid::DEFAULT_FS_NAME
|
35
37
|
}
|
36
38
|
end
|
37
39
|
|
@@ -62,10 +64,10 @@ module Rack
|
|
62
64
|
def find_file(id_or_path)
|
63
65
|
case @lookup.to_sym
|
64
66
|
when :id
|
65
|
-
Mongo::Grid.new(db).get(BSON::ObjectId.from_string(id_or_path))
|
67
|
+
Mongo::Grid.new(db, @fs_name).get(BSON::ObjectId.from_string(id_or_path))
|
66
68
|
when :path
|
67
69
|
path = CGI::unescape(id_or_path)
|
68
|
-
Mongo::GridFileSystem.new(db).open(path, "r")
|
70
|
+
Mongo::GridFileSystem.new(db, @fs_name).open(path, "r")
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
data/lib/rack/gridfs/version.rb
CHANGED
metadata
CHANGED
@@ -1,197 +1,215 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-gridfs
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
- 1
|
10
|
-
version: 0.4.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.3
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Blake Carlson
|
8
|
+
- Ches Martin
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
hash: 3
|
28
|
-
segments:
|
29
|
-
- 0
|
30
|
-
version: "0"
|
12
|
+
date: 2015-11-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bson
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.2'
|
21
|
+
type: :runtime
|
31
22
|
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.2'
|
28
|
+
- !ruby/object:Gem::Dependency
|
32
29
|
name: rack
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
33
35
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
-
none: false
|
38
|
-
requirements:
|
39
|
-
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
hash: 11
|
42
|
-
segments:
|
43
|
-
- 1
|
44
|
-
- 2
|
45
|
-
version: "1.2"
|
46
36
|
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
47
43
|
name: mongo
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.2'
|
48
49
|
type: :runtime
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
hash: 3
|
57
|
-
segments:
|
58
|
-
- 0
|
59
|
-
version: "0"
|
60
50
|
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.2'
|
56
|
+
- !ruby/object:Gem::Dependency
|
61
57
|
name: mime-types
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
62
63
|
type: :runtime
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: bundler
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
68
74
|
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
hash: 23
|
71
|
-
segments:
|
72
|
-
- 1
|
73
|
-
- 0
|
74
|
-
- 0
|
75
|
+
- !ruby/object:Gem::Version
|
75
76
|
version: 1.0.0
|
77
|
+
type: :development
|
76
78
|
prerelease: false
|
77
|
-
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.0.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: minitest
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '5.8'
|
78
91
|
type: :development
|
79
|
-
version_requirements: *id004
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - "="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
hash: 35
|
87
|
-
segments:
|
88
|
-
- 0
|
89
|
-
- 9
|
90
|
-
- 12
|
91
|
-
version: 0.9.12
|
92
92
|
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '5.8'
|
98
|
+
- !ruby/object:Gem::Dependency
|
93
99
|
name: mocha
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '1.1'
|
94
105
|
type: :development
|
95
|
-
version_requirements: *id005
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - ">="
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
hash: 3
|
103
|
-
segments:
|
104
|
-
- 0
|
105
|
-
version: "0"
|
106
106
|
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '1.1'
|
112
|
+
- !ruby/object:Gem::Dependency
|
107
113
|
name: rack-test
|
108
|
-
|
109
|
-
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
112
|
-
none: false
|
113
|
-
requirements:
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
114
116
|
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
|
118
|
-
- 0
|
119
|
-
version: "0"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
120
|
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
121
127
|
name: rake
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
122
133
|
type: :development
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
none: false
|
127
|
-
requirements:
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
128
137
|
- - ">="
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: shoulda-context
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '1.2'
|
147
|
+
type: :development
|
134
148
|
prerelease: false
|
135
|
-
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '1.2'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: yard
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
136
161
|
type: :development
|
137
|
-
|
138
|
-
|
139
|
-
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
description: Rack middleware for creating HTTP endpoints for files stored in MongoDB's
|
169
|
+
GridFS
|
170
|
+
email:
|
140
171
|
- blake@coin-operated.net
|
172
|
+
- ches@whiskeyandgrits.net
|
141
173
|
executables: []
|
142
|
-
|
143
174
|
extensions: []
|
144
|
-
|
145
|
-
|
146
|
-
-
|
175
|
+
extra_rdoc_files:
|
176
|
+
- CHANGES.md
|
177
|
+
- LICENSE
|
178
|
+
- README.md
|
179
|
+
files:
|
180
|
+
- CHANGES.md
|
147
181
|
- LICENSE
|
148
|
-
- README.
|
149
|
-
|
182
|
+
- README.md
|
183
|
+
- Rakefile
|
184
|
+
- lib/rack-gridfs.rb
|
185
|
+
- lib/rack/gridfs.rb
|
186
|
+
- lib/rack/gridfs/endpoint.rb
|
150
187
|
- lib/rack/gridfs/endpoint/base.rb
|
151
188
|
- lib/rack/gridfs/endpoint/caching.rb
|
152
189
|
- lib/rack/gridfs/endpoint/connection.rb
|
153
|
-
- lib/rack/gridfs/endpoint.rb
|
154
190
|
- lib/rack/gridfs/version.rb
|
155
|
-
- lib/rack/gridfs.rb
|
156
|
-
- LICENSE
|
157
|
-
- README.rdoc
|
158
|
-
- Rakefile
|
159
|
-
- CHANGES.rdoc
|
160
|
-
has_rdoc: true
|
161
191
|
homepage: http://github.com/skinandbones/rack-gridfs
|
162
192
|
licenses: []
|
163
|
-
|
193
|
+
metadata: {}
|
164
194
|
post_install_message:
|
165
195
|
rdoc_options: []
|
166
|
-
|
167
|
-
require_paths:
|
196
|
+
require_paths:
|
168
197
|
- lib
|
169
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
-
|
171
|
-
requirements:
|
198
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
199
|
+
requirements:
|
172
200
|
- - ">="
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
version: "0"
|
178
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
-
none: false
|
180
|
-
requirements:
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: '0'
|
203
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
181
205
|
- - ">="
|
182
|
-
- !ruby/object:Gem::Version
|
183
|
-
hash: 23
|
184
|
-
segments:
|
185
|
-
- 1
|
186
|
-
- 3
|
187
|
-
- 6
|
206
|
+
- !ruby/object:Gem::Version
|
188
207
|
version: 1.3.6
|
189
208
|
requirements: []
|
190
|
-
|
191
209
|
rubyforge_project: rack-gridfs
|
192
|
-
rubygems_version:
|
210
|
+
rubygems_version: 2.4.5.1
|
193
211
|
signing_key:
|
194
|
-
specification_version:
|
212
|
+
specification_version: 4
|
195
213
|
summary: Serve MongoDB GridFS files from Rack
|
196
214
|
test_files: []
|
197
|
-
|
215
|
+
has_rdoc:
|
data/CHANGES.rdoc
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
== CHANGE LOG
|
2
|
-
|
3
|
-
=== 0.4.1 / June 26, 2011
|
4
|
-
|
5
|
-
{full commit log}[https://github.com/skinandbones/rack-gridfs/compare/v0.4.0...v0.4.1]
|
6
|
-
|
7
|
-
==== Bug Fixes
|
8
|
-
|
9
|
-
- URL-decode before filename lookup so that non-ASCII filenames are handled
|
10
|
-
correctly (Konstantin Shabanov)
|
11
|
-
|
12
|
-
|
13
|
-
=== 0.4.0 / May 12, 2011
|
14
|
-
|
15
|
-
Major refactoring and loads of new features! Thanks to {Ben Marini}[https://github.com/bmarini]
|
16
|
-
for his substantial contributions to this release.
|
17
|
-
|
18
|
-
{full commit log}[https://github.com/skinandbones/rack-gridfs/compare/v0.2.0...v0.4.0]
|
19
|
-
|
20
|
-
==== Features
|
21
|
-
|
22
|
-
- Allow configuration of MongoDB authentication (Steve Sloan)
|
23
|
-
- Allow option to look up objects by GridFS filename instead of +ObjectId+
|
24
|
-
(SHIBATA Hiroshi)
|
25
|
-
- Return iterable GridIO object instead of file contents, so Rack can stream in
|
26
|
-
chunks (Ches Martin)
|
27
|
-
- <tt>Rack::GridFS::Endpoint</tt>: support for mounting as a Rack endpoint in
|
28
|
-
addition to middleware (Ben Marini)
|
29
|
-
- Cache headers: set <tt>Last-Modified</tt> and +Etag+ so that
|
30
|
-
<tt>Rack::ConditionalGet</tt> sends 304s. +expires+ option to set
|
31
|
-
<tt>Cache-Control</tt> (Alexander Gräfe & Ben Marini)
|
32
|
-
- <tt>mime-types</tt> dependency so GridFS lib can determine content types
|
33
|
-
(Ben Marini)
|
34
|
-
- You can now pass a <tt>Mongo::DB</tt> instance instead of discrete database
|
35
|
-
configuration parameters. Connections are retried so we take advantage of a
|
36
|
-
+ReplSetConnection+ in high-availability architectures (Ben Marini)
|
37
|
-
|
38
|
-
==== Bug Fixes
|
39
|
-
|
40
|
-
- <tt>BSON::ObjectID</tt> renamed to +ObjectId+, and other changes supporting
|
41
|
-
current versions of Mongo libraries
|
data/README.rdoc
DELETED
@@ -1,150 +0,0 @@
|
|
1
|
-
= Rack::GridFS
|
2
|
-
|
3
|
-
Rack:GridFS is a Rack middleware for creating HTTP endpoints for files
|
4
|
-
stored in MongoDB's GridFS. You can configure a prefix string which
|
5
|
-
will be used to match the path of a request, and further look up GridFS
|
6
|
-
files based on either their +ObjectId+ or +filename+ field.
|
7
|
-
|
8
|
-
For example,
|
9
|
-
|
10
|
-
GET '/gridfs/someobjectid'
|
11
|
-
|
12
|
-
If the prefix is "gridfs", then the id will be be "someobjectid".
|
13
|
-
|
14
|
-
You can also use Rack::GridFS::Endpoint as a rack endpoint if you want to
|
15
|
-
handle routing another way
|
16
|
-
|
17
|
-
== Mongo Driver Compatibility Notes
|
18
|
-
|
19
|
-
This version is currently based on mongo-1.2+. As there were significant changes
|
20
|
-
to the GridFS API prior to v1.0, you may have luck with the git-tagged version
|
21
|
-
0.2.0 of this library with earlier versions of the driver.
|
22
|
-
|
23
|
-
== Installation
|
24
|
-
|
25
|
-
gem install rack-gridfs
|
26
|
-
|
27
|
-
== Features
|
28
|
-
- Use as rack middleware or mount as a rack endpoint
|
29
|
-
- File lookup using a path or object id
|
30
|
-
- Chunked transfer encoding, keeps memory usage low
|
31
|
-
- Content-Type header set using 'mime-types' gem
|
32
|
-
- Last-Modified and Etag headers set automatically for conditional get support
|
33
|
-
- Cache-Control header support
|
34
|
-
- High availability when using replication sets
|
35
|
-
|
36
|
-
== Usage
|
37
|
-
|
38
|
-
require 'rack/gridfs'
|
39
|
-
use Rack::GridFS, :prefix => 'gridfs', :hostname => 'localhost', :port => 27017, :database => 'test'
|
40
|
-
|
41
|
-
Options:
|
42
|
-
- +prefix+: a string used to match against incoming paths and route to through
|
43
|
-
the middleware. Default 'gridfs'.
|
44
|
-
- +lookup+: whether to look up a file based on <tt>:id</tt> or <tt>:path</tt>
|
45
|
-
(example below). Default is <tt>:id</tt>.
|
46
|
-
|
47
|
-
You must also specify MongoDB database details:
|
48
|
-
- +hostname+: the hostname/IP where the MongoDB server is running. Default 'localhost'.
|
49
|
-
- +port+: the port of the MongoDB server. Default 27017.
|
50
|
-
- +database+: the name of the MongoDB database to connect to.
|
51
|
-
- +username+ and +password+: if you need to authenticate to MongoDB.
|
52
|
-
|
53
|
-
Alternatively you can pass in a <tt>Mongo::DB</tt> instance instead:
|
54
|
-
- +db+: MongoMapper.database, or Mongoid.database for example.
|
55
|
-
|
56
|
-
=== Simple Sinatra Example
|
57
|
-
|
58
|
-
require 'rubygems'
|
59
|
-
require 'sinatra'
|
60
|
-
|
61
|
-
require 'rack/gridfs'
|
62
|
-
use Rack::GridFS, :database => 'test', :prefix => 'gridfs'
|
63
|
-
|
64
|
-
get /.*/ do
|
65
|
-
"The URL did not match a file in GridFS."
|
66
|
-
end
|
67
|
-
|
68
|
-
=== Usage with Rails 2
|
69
|
-
|
70
|
-
To use <tt>Rack::GridFS</tt> in a Rails application, add it as middleware in
|
71
|
-
<tt>application.rb</tt> or <tt>config/environments/*</tt>with something like this:
|
72
|
-
|
73
|
-
config.middleware.insert_after Rack::Runtime, Rack::GridFS,
|
74
|
-
:prefix => 'uploads', :database => "my_app_#{Rails.env}"
|
75
|
-
|
76
|
-
Run <tt>rake middleware</tt> to decide for yourself where to best place it in
|
77
|
-
the middleware stack for your app using {the Rails convenience methods}[http://guides.rubyonrails.org/rails_on_rack.html#configuring-middleware-stack],
|
78
|
-
taking into consideration that it can probably be near the top since it simply
|
79
|
-
returns a "static" file or a 404.
|
80
|
-
|
81
|
-
=== Usage with Rails 3
|
82
|
-
|
83
|
-
To use in Rails 3, you can insert into the middleware stack as above, or mount
|
84
|
-
the app directly in your routes (recommended). In <tt>config/routes.rb</tt>:
|
85
|
-
|
86
|
-
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database), :at => "gridfs"
|
87
|
-
|
88
|
-
This allows for much more straightforward and sensible configuration, if you do
|
89
|
-
not require other middleware in front of GridFS (Rack-based authorization, for
|
90
|
-
instance).
|
91
|
-
|
92
|
-
=== Path (filename) Lookup
|
93
|
-
|
94
|
-
The <tt>:lookup => :path</tt> option causes files to be looked up from the GridFS
|
95
|
-
store based on their +filename+ field (which can be a full file path) rather than
|
96
|
-
+ObjectId+ (requests still need to match the +prefix+ you've set). This allows
|
97
|
-
you to find files based on essentially arbitrary URLs such as:
|
98
|
-
|
99
|
-
GET '/prefix/media/images/jane_avatar.jpg'
|
100
|
-
|
101
|
-
How filenames are set is specific to your application. We'll look at an example
|
102
|
-
with Carrierwave below.
|
103
|
-
|
104
|
-
*NOTE*: The Mongo Ruby driver will try to create an index on the +filename+
|
105
|
-
field for you automatically, but if you are using filename lookup you'll want to
|
106
|
-
double-check that it is created appropriately (on slaves only if you have a
|
107
|
-
master-slave architecture, etc.).
|
108
|
-
|
109
|
-
=== Carrierwave Example
|
110
|
-
|
111
|
-
Path lookup works well for usage with Carrierwave[https://github.com/jnicklas/carrierwave].
|
112
|
-
As a minimal example with Mongoid:
|
113
|
-
|
114
|
-
# config/initializers/carrierwave.rb
|
115
|
-
CarrierWave.configure do |config|
|
116
|
-
config.storage = :grid_fs
|
117
|
-
config.grid_fs_connection = Mongoid.database
|
118
|
-
config.grid_fs_access_url = "/uploads"
|
119
|
-
end
|
120
|
-
|
121
|
-
# app/uploaders/avatar_uploader.rb
|
122
|
-
class AvatarUploader < CarrierWave::Uploader::Base
|
123
|
-
# (Virtual) path where uploaded files will be stored, appended to the
|
124
|
-
# gridfs_access_url by methods used with view helpers
|
125
|
-
def store_dir
|
126
|
-
"#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# app/models/user.rb
|
131
|
-
class User
|
132
|
-
include Mongoid::Document
|
133
|
-
mount_uploader :avatar, AvatarUploader
|
134
|
-
end
|
135
|
-
|
136
|
-
# app/views/user/show.html.erb
|
137
|
-
<%= image_tag(@user.avatar.url) if @user.avatar? %>
|
138
|
-
|
139
|
-
This will result in URL paths like <tt>/uploads/user/avatar/4d250d04a8f41c0a31000006/original_filename.jpg</tt>
|
140
|
-
being generated for the view helpers, and Carrierwave will store
|
141
|
-
<tt>user/avatar/4d250d04a8f41c0a31000006/original_filename.jpg</tt> as the
|
142
|
-
+filename+ in GridFS. Thus, you can configure <tt>Rack::GridFS</tt> to serve
|
143
|
-
these files as such:
|
144
|
-
|
145
|
-
config.middleware.insert_after Rack::Runtime, Rack::GridFS,
|
146
|
-
:prefix => 'uploads', :lookup => :path, :database => "my_app_#{Rails.env}"
|
147
|
-
|
148
|
-
== Copyright
|
149
|
-
|
150
|
-
Copyright (c) 2010-2011 Blake Carlson. See LICENSE for details.
|