gnuside-carrierwave-mongoid 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ca43efedbc77776f18febcb4221aaa33c3282ce3
4
+ data.tar.gz: 3bf91aabd888b0cc5a3d64843d9c1a7ce313654e
5
+ SHA512:
6
+ metadata.gz: a3b041ee18c6af1ead1bbaa2a5067427602dd78cd6aef24b191db4d96c54f14ca6d003c114b1199d40a920b16107a8cb6934040f54aabc13572ffb726903551e
7
+ data.tar.gz: 35fdd5f94ff329d1ea3d703e433a522b5b0dad7680cad1981a63e5cce2ab321a539e64998ea66e6260bc32ba62573e831493ef4184153263a66f83264c618485
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ pkg/*
2
+ *.gem
3
+ *.sw*
4
+ .bundle
5
+ spec/public
6
+ gemfiles/*.lock
7
+ log/*
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ glebtv-carrierwave-mongoid
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p247
data/.travis.yml ADDED
@@ -0,0 +1,19 @@
1
+ services: mongodb
2
+
3
+ notifications:
4
+ email: false
5
+
6
+ language: ruby
7
+ rvm:
8
+ - 1.9.3
9
+ - 2.0.0
10
+ - jruby-19mode
11
+ - rbx-19mode
12
+
13
+ gemfile:
14
+ - Gemfile
15
+ - gemfiles/carrierwave-0.8.gemfile
16
+ - gemfiles/carrierwave-master.gemfile
17
+ - gemfiles/mongoid-3.0.gemfile
18
+ - gemfiles/mongoid-3.1.gemfile
19
+ - gemfiles/mongoid-4.0.gemfile
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in glebtv-carrierwave-mongoid.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ glebtv-carrierwave-mongoid (0.6.5)
5
+ carrierwave (>= 0.8.0, < 0.10.0)
6
+ mongoid (>= 3.0, < 5.0)
7
+ mongoid (>= 3.0, < 5.0)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activemodel (3.2.15)
13
+ activesupport (= 3.2.15)
14
+ builder (~> 3.0.0)
15
+ activesupport (3.2.15)
16
+ i18n (~> 0.6, >= 0.6.4)
17
+ multi_json (~> 1.0)
18
+ builder (3.0.4)
19
+ carrierwave (0.9.0)
20
+ activemodel (>= 3.2.0)
21
+ activesupport (>= 3.2.0)
22
+ json (>= 1.7)
23
+ coderay (1.0.9)
24
+ diff-lcs (1.2.4)
25
+ i18n (0.6.5)
26
+ json (1.8.1)
27
+ method_source (0.8.2)
28
+ mini_magick (3.6.0)
29
+ subexec (~> 0.2.1)
30
+ mongoid (3.1.5)
31
+ activemodel (~> 3.2)
32
+ moped (~> 1.4)
33
+ origin (~> 1.0)
34
+ tzinfo (~> 0.3.29)
35
+ moped (1.5.1)
36
+ multi_json (1.8.2)
37
+ origin (1.1.0)
38
+ pry (0.9.12.2)
39
+ coderay (~> 1.0.5)
40
+ method_source (~> 0.8)
41
+ slop (~> 3.4)
42
+ rake (10.1.0)
43
+ rspec (2.14.1)
44
+ rspec-core (~> 2.14.0)
45
+ rspec-expectations (~> 2.14.0)
46
+ rspec-mocks (~> 2.14.0)
47
+ rspec-core (2.14.6)
48
+ rspec-expectations (2.14.3)
49
+ diff-lcs (>= 1.1.3, < 2.0)
50
+ rspec-mocks (2.14.4)
51
+ slop (3.4.6)
52
+ subexec (0.2.3)
53
+ tzinfo (0.3.38)
54
+
55
+ PLATFORMS
56
+ ruby
57
+
58
+ DEPENDENCIES
59
+ glebtv-carrierwave-mongoid!
60
+ mini_magick
61
+ pry
62
+ rake (~> 10.0)
63
+ rspec (~> 2.14)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008-2012 Jonas Nicklas
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,219 @@
1
+ # Fork with OPTIONAL gridfs
2
+
3
+ # CarrierWave for Mongoid
4
+
5
+ See upstream for details: https://github.com/carrierwaveuploader/carrierwave-mongoid
6
+
7
+
8
+ This functionality used to be part of CarrierWave but has since been extracted
9
+ into this gem.
10
+
11
+ ## Installation
12
+
13
+ Install the latest release:
14
+
15
+ gem install carrierwave-mongoid
16
+
17
+ Require it in your code:
18
+
19
+ ```ruby
20
+ require 'carrierwave/mongoid'
21
+ ```
22
+
23
+ Or, in Rails you can add it to your Gemfile:
24
+
25
+ ```ruby
26
+ gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
27
+ ```
28
+
29
+ Note: If using Rails 4, you'll need to make sure `mongoid-grid_fs` is `>= 1.9.0`.
30
+ If in doubt, run `bundle update mongoid-grid_fs`
31
+
32
+ ```ruby
33
+ gem 'mongoid-grid_fs', github: 'ahoward/mongoid-grid_fs'
34
+ ```
35
+
36
+ ## Getting Started
37
+
38
+ Follow the "Getting Started" directions in the main
39
+ [Carrierwave repository](https://raw.github.com/carrierwaveuploader/carrierwave/).
40
+
41
+ [Suggested] Add the field to your attr_accessor list for mass assignment
42
+ protection:
43
+
44
+ ```ruby
45
+ attr_accessible :avatar, :avatar_cache
46
+ ```
47
+
48
+ Now you can cache files by assigning them to the attribute; they will
49
+ automatically be stored when the record is saved. Ex:
50
+
51
+ ```ruby
52
+ u = User.new
53
+ u.avatar = File.open('somewhere')
54
+ u.save!
55
+ ```
56
+
57
+ ## Using MongoDB's GridFS store
58
+
59
+ In your uploader, set the storage to `:grid_fs`:
60
+
61
+ ```ruby
62
+ class AvatarUploader < CarrierWave::Uploader::Base
63
+ storage :grid_fs
64
+ end
65
+ ```
66
+
67
+ Bringing it all together, you can also configure Carrierwave to use Mongoid's
68
+ database connection and default all storage to GridFS. That might look something
69
+ like this:
70
+
71
+ ```ruby
72
+ CarrierWave.configure do |config|
73
+ config.storage = :grid_fs
74
+ config.root = Rails.root.join('tmp')
75
+ config.cache_dir = "uploads"
76
+ end
77
+ ```
78
+
79
+ ## Serving uploading files
80
+
81
+ Since GridFS doesn't make the files available via HTTP, you'll need to stream
82
+ them yourself. For example, in Rails, you could use the `send_data` method:
83
+
84
+ ```ruby
85
+ class UsersController < ApplicationController
86
+ def avatar
87
+ content = @user.avatar.read
88
+ if stale?(etag: content, last_modified: @user.updated_at.utc, public: true)
89
+ send_data content, type: @user.avatar.file.content_type, disposition: "inline"
90
+ expires_in 0, public: true
91
+ end
92
+ end
93
+ end
94
+
95
+ # and in routes.rb
96
+ resources :users do
97
+ get :avatar, on: :member
98
+ end
99
+ ```
100
+
101
+ You can optionally tell CarrierWave the URL you will serve your images from,
102
+ allowing it to generate the correct URL, by setting `grid_fs_access_url`:
103
+
104
+ ```ruby
105
+ CarrierWave.configure do |config|
106
+ config.grid_fs_access_url = "/systems/uploads"
107
+ end
108
+ ```
109
+
110
+ ## Route configuration
111
+
112
+ If you follow the instruction to this point, the uploaded images will be
113
+ stored to GridFS, and you are responsible for serving the images a public
114
+ endpoint. If you would like to use the `#url` method on the uploaded file, you
115
+ will need to take some additional steps.
116
+
117
+ The `grid_fs_access_url` configuration option is the prefix for the path of
118
+ the stored file in carrierwave.
119
+
120
+ Let's assume that we have a mounted `avatar` uploader on a `User` model and a
121
+ `GridfsController`. Let's also assume that your uploader definition
122
+ (i.e. `app/uploaders/avatar_uploader.rb`) defines `store_dir` like this:
123
+
124
+ ```ruby
125
+ def store_dir
126
+ "#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
127
+ end
128
+ ```
129
+
130
+ If `grid_fs_access_url` (in `config/initializers/carrierwave.rb`) were:
131
+
132
+ ```ruby
133
+ config.grid_fs_access_url = '/uploads/grid'
134
+ ```
135
+
136
+ You would need to define a route in your `config/routes.rb` like so:
137
+
138
+ ```ruby
139
+ match '/uploads/grid/user/avatar/:id/:filename' => 'gridfs#avatar'
140
+ ```
141
+
142
+ Now, `user.avatar.url` should return an appropriate url path to use in your
143
+ views.
144
+
145
+ ### Different uploaded versions
146
+
147
+ If you need to include different versions (e.g. thumbnails), additional routes
148
+ will help:
149
+
150
+ ```ruby
151
+ match '/uploads/grid/user/avatar/:id/:filename' => 'gridfs#thumb_avatar', constraints: { filename: /thumb.*/ }
152
+ ```
153
+
154
+ ## Version differences
155
+
156
+ | Version | Notes |
157
+ |----------|---------------------------------------------------------------------------------|
158
+ | ~> 0.6.0 | ([compare][compare-0.6], [dependencies][deps-0.6]) Mongoid 3 & 4, bug fixes |
159
+ | ~> 0.5.0 | ([compare][compare-0.5], [dependencies][deps-0.5]) Mongoid::Paranoia support |
160
+ | ~> 0.4.0 | ([compare][compare-0.4], [dependencies][deps-0.4]) Carrierwave bump |
161
+ | ~> 0.3.0 | ([compare][compare-0.3], [dependencies][deps-0.3]) Mongoid >= 3.0 |
162
+ | ~> 0.2.0 | ([compare][compare-0.2], [dependencies][deps-0.2]) Rails >= 3.2, Mongoid ~> 2.0 |
163
+ | ~> 0.1.0 | ([compare][compare-0.1], [dependencies][deps-0.1]) Rails <= 3.1 |
164
+
165
+ [compare-0.6]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.5.0...v0.6.3
166
+ [compare-0.5]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.4.0...v0.5.0
167
+ [compare-0.4]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.3.1...v0.4.0
168
+ [compare-0.3]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.2.1...v0.3.1
169
+ [compare-0.2]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.1.7...v0.2.2
170
+ [compare-0.1]: https://github.com/carrierwaveuploader/carrierwave-mongoid/compare/v0.1.1...v0.1.7
171
+
172
+ [deps-0.6]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.6.3
173
+ [deps-0.5]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.5.0
174
+ [deps-0.4]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.4.0
175
+ [deps-0.3]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.3.1
176
+ [deps-0.2]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.2.2
177
+ [deps-0.1]: https://rubygems.org/gems/carrierwave-mongoid/versions/0.1.7
178
+
179
+ ### Changes from earlier versions of CarrierWave <= 0.5.6
180
+
181
+ CarrierWave used to have built-in Mongoid support. This gem replaces that
182
+ support and only supports Mongoid ~> 2.1
183
+
184
+ You can use `upload_identifier` to retrieve the original name of the uploaded file.
185
+
186
+ In the earlier version, the mount_uploader-method for mongoid had been defined
187
+ in lib/carrierwave/orm/mongoid. This code has been moved to
188
+ carrierwave/mongoid. If you update from earlier versions, don't forget to adjust
189
+ your require accordingly in your carrierwave-initializer.
190
+
191
+ The default mount column used to be the name of the upload column plus
192
+ `_filename`. Now it is simply the name of the column. Most of the time, the
193
+ column was called `upload`, so it would have been mounted to `upload_filename`.
194
+ If you'd like to avoid a database migration, simply use the `:mount_on` option
195
+ to specify the field name explicitly. Therefore, you only have to add a
196
+ `_filename` to your column name. For example, if your column is called
197
+ `:upload`:
198
+
199
+ ```ruby
200
+ class Dokument
201
+ mount_uploader :upload, DokumentUploader, mount_on: :upload_filename
202
+ end
203
+ ```
204
+
205
+ ## Known issues and limitations
206
+
207
+ Note that files mounted in embedded documents aren't saved when parent documents
208
+ are saved. By default, mongoid does not cascade callbacks on embedded
209
+ documents. In order to save the attached files on embedded documents, you must
210
+ either explicitly call save on the embedded documents or you must configure the
211
+ embedded association to cascade the callbacks automatically. For example:
212
+
213
+ ```ruby
214
+ class User
215
+ embeds_many :pictures, cascade_callbacks: true
216
+ end
217
+ ```
218
+
219
+ You can read more about this [here](https://github.com/carrierwaveuploader/carrierwave/issues#issue/81)
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'bundler/setup'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc "Run all examples"
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ #t.rspec_path = 'bin/rspec'
9
+ t.rspec_opts = %w[--color]
10
+ end
11
+
12
+ task :default => :spec
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "carrierwave", "~> 0.8.0"
4
+
5
+ gemspec path: "../"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "carrierwave", github: "carrierwaveuploader/carrierwave", branch: "master"
4
+
5
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "mongoid-grid_fs", github: "ahoward/mongoid-grid_fs", branch: "master"
4
+ gem "mongoid", github: "mongoid/mongoid", branch: "master"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "carrierwave/mongoid/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "gnuside-carrierwave-mongoid"
7
+ s.version = Carrierwave::Mongoid::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["GlebTv", "Jonas Nicklas", "Trevor Turk", "Roland Laurès"]
10
+ s.email = ["jonas.nicklas@gmail.com", "roland.laures@gnuside.com"]
11
+ s.homepage = "https://github.com/Gnuside/carrierwave-mongoid"
12
+ s.summary = "This fork is made to be compatible with rails 4"
13
+ s.description = "This fork is made to be compatible with rails 4"
14
+ s.license = "MIT"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency "mongoid", [">= 3.0", "< 5.0"]
22
+ s.add_dependency "carrierwave", [">= 0.8.0", "< 0.10.0"]
23
+ s.add_dependency "mongoid", [">= 4.0.0"]
24
+ s.add_dependency "mongoid-grid_fs", [">= 1.9"]
25
+ s.add_development_dependency "rspec", ["~> 2.14"]
26
+ s.add_development_dependency "rake", ["~> 10.0"]
27
+ s.add_development_dependency "mini_magick"
28
+ s.add_development_dependency "pry"
29
+ end
@@ -0,0 +1,118 @@
1
+ # encoding: utf-8
2
+
3
+ require 'mongoid'
4
+ require 'carrierwave'
5
+ require 'carrierwave/validations/active_model'
6
+
7
+ module CarrierWave
8
+ module Mongoid
9
+ include CarrierWave::Mount
10
+ ##
11
+ # See +CarrierWave::Mount#mount_uploader+ for documentation
12
+ #
13
+ def mount_uploader(column, uploader=nil, options={}, &block)
14
+ field_name = options[:mount_on] || column
15
+ unless fields.keys.include?(field_name.to_s) || fields.values.map { |f| f.options[:as].to_s }.include?(field_name.to_s)
16
+ field field_name
17
+ end
18
+
19
+ super
20
+
21
+ alias_method :read_uploader, :read_attribute
22
+ alias_method :write_uploader, :write_attribute
23
+ public :read_uploader
24
+ public :write_uploader
25
+
26
+ include CarrierWave::Validations::ActiveModel
27
+
28
+ validates_integrity_of column if uploader_option(column.to_sym, :validate_integrity)
29
+ validates_processing_of column if uploader_option(column.to_sym, :validate_processing)
30
+
31
+ after_save :"store_#{column}!"
32
+ before_save :"write_#{column}_identifier"
33
+ after_destroy :"remove_#{column}!"
34
+ before_update :"store_previous_model_for_#{column}"
35
+ after_save :"remove_previously_stored_#{column}"
36
+
37
+ class_eval <<-RUBY, __FILE__, __LINE__+1
38
+ def #{column}=(new_file)
39
+ column = _mounter(:#{column}).serialization_column
40
+
41
+ # mongoid won't upload a new file if there was no file previously.
42
+ write_uploader(column, '_old_') if self.persisted? && read_uploader(column).nil?
43
+
44
+ send(:"\#{column}_will_change!")
45
+ super
46
+ end
47
+
48
+ def remove_#{column}=(arg)
49
+ column = _mounter(:#{column}).serialization_column
50
+ send(:"\#{column}_will_change!")
51
+ super
52
+ end
53
+
54
+ def remove_#{column}!
55
+ super unless respond_to?(:paranoid?) && paranoid? && flagged_for_destroy?
56
+ end
57
+
58
+ # Overrides Mongoid's default dirty behavior to instead work more like
59
+ # ActiveRecord's. Mongoid doesn't deem an attribute as changed unless
60
+ # the new value is different than the original. Given that CarrierWave
61
+ # caches files before save, it's necessary to know that there's a
62
+ # pending change even though the attribute value itself might not
63
+ # reflect that yet.
64
+ def #{column}_changed?
65
+ changed_attributes.has_key?("#{column}")
66
+ end
67
+
68
+ # The default Mongoid attribute_will_change! method is not enough
69
+ # when we want to upload a new file in an existing embedded document.
70
+ # The custom version of that method forces the callbacks to be
71
+ # ran and so does the upload.
72
+ def #{column}_will_change!
73
+ changed_attributes["#{column}"] = '_new_'
74
+ end
75
+
76
+ def find_previous_model_for_#{column}
77
+ if self.embedded?
78
+ ancestors = [[ self.metadata.key, self._parent ]].tap { |x| x.unshift([ x.first.last.metadata.key, x.first.last._parent ]) while x.first.last.embedded? }
79
+ first_parent = ancestors.first.last
80
+ reloaded_parent = first_parent.class.unscoped.find(first_parent.to_key.first)
81
+ association = ancestors.inject(reloaded_parent) { |parent,(key,ancestor)| (parent.is_a?(Array) ? parent.find(ancestor.to_key.first) : parent).send(key) }
82
+ association.is_a?(Array) ? association.find(to_key.first) : association
83
+ else
84
+ self.class.unscoped.for_ids(to_key).first
85
+ end
86
+ end
87
+
88
+ def serializable_hash(options=nil)
89
+ hash = {}
90
+
91
+ except = options && options[:except] && Array.wrap(options[:except]).map(&:to_s)
92
+ only = options && options[:only] && Array.wrap(options[:only]).map(&:to_s)
93
+
94
+ self.class.uploaders.each do |column, uploader|
95
+ if (!only && !except) || (only && only.include?(column.to_s)) || (except && !except.include?(column.to_s))
96
+ hash[column.to_s] = _mounter(column.to_sym).uploader.serializable_hash
97
+ end
98
+ end
99
+ super(options).merge(hash)
100
+ end
101
+ RUBY
102
+ end
103
+ end # Mongoid
104
+ end # CarrierWave
105
+
106
+ if defined?(Mongoid::GridFs)
107
+ CarrierWave::Storage.autoload :GridFS, 'carrierwave/storage/grid_fs'
108
+
109
+ class CarrierWave::Uploader::Base
110
+ add_config :grid_fs_access_url
111
+
112
+ configure do |config|
113
+ config.storage_engines[:grid_fs] = "CarrierWave::Storage::GridFS"
114
+ end
115
+ end
116
+ end
117
+
118
+ Mongoid::Document::ClassMethods.send(:include, CarrierWave::Mongoid)