shrine-mongoid 0.2.4 → 1.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +151 -16
- data/lib/shrine/plugins/mongoid.rb +65 -36
- data/shrine-mongoid.gemspec +4 -5
- metadata +17 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 45431f2e800408a6e913a40b3dfa5987d78f431554ebf526bfed1b5e250814e9
|
4
|
+
data.tar.gz: 592c042cfbeca066f1399b458b933350d109ccd304e835d84245c6f930cc1c7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 121e53e6388fbdc2577be588825e464fcd4f6e50ae8d9358fd954cfc687e6fb0ecc8d8624621e66c234e84b89290ebc664335243922878231da28a5949760b78
|
7
|
+
data.tar.gz: 6daa8495e1780e7e638120169cb7f4ff95e47d46c6c5721653bdb5c15770f8213a60dd30dbf35df927e44c082e8547736a7d560cca886a657ee493a3710e716b
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@ Provides [Mongoid] integration for [Shrine].
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
```ruby
|
8
|
-
gem "shrine-mongoid"
|
8
|
+
gem "shrine-mongoid", "~> 1.0"
|
9
9
|
```
|
10
10
|
|
11
11
|
## Usage
|
@@ -14,33 +14,165 @@ gem "shrine-mongoid"
|
|
14
14
|
Shrine.plugin :mongoid
|
15
15
|
```
|
16
16
|
```rb
|
17
|
-
class
|
17
|
+
class ImageUploader < Shrine
|
18
|
+
end
|
19
|
+
```
|
20
|
+
```rb
|
21
|
+
class Photo
|
22
|
+
include Mongoid::Document
|
23
|
+
include ImageUploader::Attachment(:image)
|
24
|
+
|
25
|
+
field :image_data, type: String # or `type: Hash`
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
The `Shrine::Attachment` module will add [model] methods, as well as
|
30
|
+
[callbacks](#callbacks) and [validations](#validations) to tie attachment
|
31
|
+
process to the record lifecycle:
|
32
|
+
|
33
|
+
```rb
|
34
|
+
photo = Photo.new
|
35
|
+
|
36
|
+
photo.image = file # cache attachment
|
37
|
+
|
38
|
+
photo.image #=> #<Shrine::UploadedFile @id="bc2e13.jpg" @storage_key=:cache ...>
|
39
|
+
photo.image_data #=> '{"id":"bc2e13.jpg","storage":"cache","metadata":{...}}'
|
40
|
+
|
41
|
+
photo.save # persist, promote attachment, then persist again
|
42
|
+
|
43
|
+
photo.image #=> #<Shrine::UploadedFile @id="397eca.jpg" @storage_key=:store ...>
|
44
|
+
photo.image_data #=> '{"id":"397eca.jpg","storage":"store","metadata":{...}}'
|
45
|
+
|
46
|
+
photo.destroy # delete attachment
|
47
|
+
|
48
|
+
photo.image.exists? #=> false
|
49
|
+
```
|
50
|
+
|
51
|
+
### Callbacks
|
52
|
+
|
53
|
+
#### After Save
|
54
|
+
|
55
|
+
After a record is saved, `Attacher#finalize` is called, which promotes cached
|
56
|
+
file to permanent storage and deletes previous file if any.
|
57
|
+
|
58
|
+
```rb
|
59
|
+
photo = Photo.new
|
60
|
+
|
61
|
+
photo.image = file
|
62
|
+
photo.image.storage_key #=> :cache
|
63
|
+
|
64
|
+
photo.save
|
65
|
+
photo.image.storage_key #=> :store
|
66
|
+
```
|
67
|
+
|
68
|
+
#### After Destroy
|
69
|
+
|
70
|
+
After a record is destroyed, `Attacher#destroy_attached` method is called,
|
71
|
+
which deletes stored attached file if any.
|
72
|
+
|
73
|
+
```rb
|
74
|
+
photo = Photo.find(photo_id)
|
75
|
+
photo.image #=> #<Shrine::UploadedFile>
|
76
|
+
photo.image.exists? #=> true
|
77
|
+
|
78
|
+
photo.destroy
|
79
|
+
photo.image.exists? #=> false
|
80
|
+
```
|
81
|
+
|
82
|
+
#### Skipping Callbacks
|
83
|
+
|
84
|
+
If you don't want the attachment module to add any callbacks to your model, you
|
85
|
+
can set `:callbacks` to `false`:
|
86
|
+
|
87
|
+
```rb
|
88
|
+
plugin :mongoid, callbacks: false
|
89
|
+
```
|
90
|
+
|
91
|
+
### Validations
|
92
|
+
|
93
|
+
If you're using the [`validation`][validation] plugin, the attachment module
|
94
|
+
will automatically merge attacher errors with model errors.
|
95
|
+
|
96
|
+
```rb
|
97
|
+
class ImageUploader < Shrine
|
98
|
+
plugin :validation_helpers
|
99
|
+
|
100
|
+
Attacher.validate do
|
101
|
+
validate_max_size 10 * 1024 * 1024
|
102
|
+
end
|
103
|
+
end
|
104
|
+
```
|
105
|
+
```rb
|
106
|
+
photo = Photo.new
|
107
|
+
photo.image = file
|
108
|
+
photo.valid?
|
109
|
+
photo.errors #=> { image: ["size must not be greater than 10.0 MB"] }
|
110
|
+
```
|
111
|
+
|
112
|
+
#### Attachment Presence
|
113
|
+
|
114
|
+
If you want to validate presence of the attachment, you can use ActiveModel's
|
115
|
+
presence validator:
|
116
|
+
|
117
|
+
```rb
|
118
|
+
class Photo
|
18
119
|
include Mongoid::Document
|
19
|
-
include ImageUploader
|
120
|
+
include ImageUploader::Attachment(:image)
|
20
121
|
|
21
|
-
|
122
|
+
validates_presence_of :image
|
22
123
|
end
|
23
124
|
```
|
24
125
|
|
25
|
-
|
126
|
+
#### Skipping Validations
|
127
|
+
|
128
|
+
If don't want the attachment module to merge file validations errors into
|
129
|
+
model errors, you can set `:validations` to `false`:
|
26
130
|
|
27
131
|
```rb
|
28
|
-
|
29
|
-
post.image = file
|
30
|
-
post.image.storage_key #=> "cache"
|
31
|
-
post.save
|
32
|
-
post.image.storage_key #=> "store"
|
33
|
-
post.destroy
|
34
|
-
post.image.exists? #=> false
|
132
|
+
plugin :mongoid, validations: false
|
35
133
|
```
|
36
134
|
|
37
|
-
|
38
|
-
|
135
|
+
## Attacher
|
136
|
+
|
137
|
+
You can also use `Shrine::Attacher` directly (with or without the
|
138
|
+
`Shrine::Attachment` module):
|
139
|
+
|
140
|
+
```rb
|
141
|
+
class Photo
|
142
|
+
include Mongoid::Document
|
39
143
|
|
144
|
+
field :image_data, type: String # or `type: Hash`
|
145
|
+
end
|
146
|
+
```
|
40
147
|
```rb
|
41
|
-
|
148
|
+
photo = Photo.new
|
149
|
+
attacher = ImageUploader::Attacher.from_model(photo, :image)
|
150
|
+
|
151
|
+
attacher.assign(file) # cache
|
152
|
+
|
153
|
+
attacher.file #=> #<Shrine::UploadedFile @id="bc2e13.jpg" @storage_key=:cache ...>
|
154
|
+
photo.image_data #=> '{"id":"bc2e13.jpg","storage":"cache","metadata":{...}}'
|
155
|
+
|
156
|
+
photo.save # persist
|
157
|
+
attacher.finalize # promote
|
158
|
+
photo.save # persist
|
159
|
+
|
160
|
+
attacher.file #=> #<Shrine::UploadedFile @id="397eca.jpg" @storage_key=:store ...>
|
161
|
+
photo.image_data #=> '{"id":"397eca.jpg","storage":"store","metadata":{...}}'
|
42
162
|
```
|
43
163
|
|
164
|
+
### Pesistence
|
165
|
+
|
166
|
+
The following persistence methods are added to `Shrine::Attacher`:
|
167
|
+
|
168
|
+
| Method | Description |
|
169
|
+
| :----- | :---------- |
|
170
|
+
| `Attacher#atomic_promote` | calls `Attacher#promote` and persists if the attachment hasn't changed |
|
171
|
+
| `Attacher#atomic_persist` | saves changes if the attachment hasn't changed |
|
172
|
+
| `Attacher#persist` | saves any changes to the underlying record |
|
173
|
+
|
174
|
+
See [persistence] docs for more details.
|
175
|
+
|
44
176
|
## Contributing
|
45
177
|
|
46
178
|
You can run the tests with the Rake task:
|
@@ -54,4 +186,7 @@ $ bundle exec rake test
|
|
54
186
|
[MIT](LICENSE.txt)
|
55
187
|
|
56
188
|
[Mongoid]: https://github.com/mongodb/mongoid
|
57
|
-
[Shrine]: https://github.com/
|
189
|
+
[Shrine]: https://github.com/shrinerb/shrine
|
190
|
+
[model]: https://github.com/shrinerb/shrine/blob/master/doc/plugins/model.md#readme
|
191
|
+
[validation]: https://github.com/shrinerb/shrine/blob/master/doc/plugins/validation.md#readme
|
192
|
+
[persistence]: https://github.com/shrinerb/shrine/blob/master/doc/plugins/persistence.md#readme
|
@@ -1,11 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "mongoid"
|
2
4
|
|
3
5
|
class Shrine
|
4
6
|
module Plugins
|
5
7
|
module Mongoid
|
6
|
-
def self.
|
7
|
-
uploader.
|
8
|
-
uploader.
|
8
|
+
def self.load_dependencies(uploader, *)
|
9
|
+
uploader.plugin :model
|
10
|
+
uploader.plugin :_persistence, plugin: self
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configure(uploader, **opts)
|
14
|
+
uploader.opts[:mongoid] ||= { validations: true, callbacks: true }
|
15
|
+
uploader.opts[:mongoid].merge!(opts)
|
9
16
|
end
|
10
17
|
|
11
18
|
module AttachmentMethods
|
@@ -14,59 +21,81 @@ class Shrine
|
|
14
21
|
|
15
22
|
return unless model < ::Mongoid::Document
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
24
|
+
name = @name
|
25
|
+
|
26
|
+
if shrine_class.opts[:mongoid][:validations]
|
27
|
+
# add validation plugin integration
|
28
|
+
model.validate do
|
29
|
+
next unless send(:"#{name}_attacher").respond_to?(:errors)
|
30
|
+
|
31
|
+
send(:"#{name}_attacher").errors.each do |message|
|
32
|
+
errors.add(name, message)
|
23
33
|
end
|
24
|
-
|
34
|
+
end
|
25
35
|
end
|
26
36
|
|
27
|
-
if shrine_class.opts[:
|
28
|
-
model.
|
29
|
-
|
30
|
-
#{
|
37
|
+
if shrine_class.opts[:mongoid][:callbacks]
|
38
|
+
model.before_save do
|
39
|
+
if send(:"#{name}_attacher").changed?
|
40
|
+
send(:"#{name}_attacher").save
|
31
41
|
end
|
42
|
+
end
|
32
43
|
|
33
|
-
|
34
|
-
|
44
|
+
model.after_save do
|
45
|
+
if send(:"#{name}_attacher").changed?
|
46
|
+
send(:"#{name}_attacher").finalize
|
47
|
+
send(:"#{name}_attacher").persist
|
35
48
|
end
|
49
|
+
end
|
36
50
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
RUBY
|
51
|
+
model.after_destroy do
|
52
|
+
send(:"#{name}_attacher").destroy_attached
|
53
|
+
end
|
41
54
|
end
|
42
|
-
end
|
43
|
-
end
|
44
55
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
56
|
+
define_method :reload do |*args|
|
57
|
+
result = super(*args)
|
58
|
+
instance_variable_set(:"@#{name}_attacher", nil)
|
59
|
+
result
|
60
|
+
end
|
49
61
|
end
|
50
62
|
end
|
51
63
|
|
64
|
+
# The _persistence plugin uses #mongoid_persist, #mongoid_reload and
|
65
|
+
# #mongoid? to implement the following methods:
|
66
|
+
#
|
67
|
+
# * Attacher#persist
|
68
|
+
# * Attacher#atomic_persist
|
69
|
+
# * Attacher#atomic_promote
|
52
70
|
module AttacherMethods
|
53
71
|
private
|
54
72
|
|
55
|
-
#
|
56
|
-
|
57
|
-
|
58
|
-
record.save
|
73
|
+
# Saves changes to the model instance, raising exception on validation
|
74
|
+
# errors. Used by the _persistence plugin.
|
75
|
+
def mongoid_persist
|
76
|
+
record.save(validate: false)
|
59
77
|
end
|
60
78
|
|
61
|
-
|
62
|
-
|
79
|
+
# Yields the reloaded record. Used by the _persistence plugin.
|
80
|
+
def mongoid_reload
|
81
|
+
record_copy = record.dup
|
82
|
+
record_copy.id = record.id
|
83
|
+
|
84
|
+
yield record_copy.reload
|
63
85
|
end
|
64
86
|
|
65
|
-
|
66
|
-
|
67
|
-
|
87
|
+
# Returns true if the data attribute represents a Hash field. Used by
|
88
|
+
# the _persistence plugin to determine whether serialization should be
|
89
|
+
# skipped.
|
90
|
+
def mongoid_hash_attribute?
|
91
|
+
field = record.class.fields[attribute.to_s]
|
92
|
+
field && field.type == Hash
|
93
|
+
end
|
68
94
|
|
69
|
-
|
95
|
+
# Returns whether the record is a Mongoid document. Used by the
|
96
|
+
# _persistence plugin.
|
97
|
+
def mongoid?
|
98
|
+
record.is_a?(::Mongoid::Document)
|
70
99
|
end
|
71
100
|
end
|
72
101
|
end
|
data/shrine-mongoid.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "shrine-mongoid"
|
3
|
-
gem.version = "0.
|
3
|
+
gem.version = "1.0.0.beta"
|
4
4
|
|
5
|
-
gem.required_ruby_version = ">= 2.
|
5
|
+
gem.required_ruby_version = ">= 2.3"
|
6
6
|
|
7
7
|
gem.summary = "Provides Mongoid integration for Shrine."
|
8
|
-
gem.homepage = "https://github.com/
|
8
|
+
gem.homepage = "https://github.com/shrinerb/shrine-mongoid"
|
9
9
|
gem.authors = ["Janko Marohnić"]
|
10
10
|
gem.email = ["janko.marohnic@gmail.com"]
|
11
11
|
gem.license = "MIT"
|
@@ -13,10 +13,9 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.files = Dir["README.md", "LICENSE.txt", "lib/**/*.rb", "*.gemspec"]
|
14
14
|
gem.require_path = "lib"
|
15
15
|
|
16
|
-
gem.add_dependency "shrine", "
|
16
|
+
gem.add_dependency "shrine", ">= 3.0.0.beta2", "< 4"
|
17
17
|
gem.add_dependency "mongoid", ">= 5.0"
|
18
18
|
|
19
|
-
gem.add_development_dependency "shrine-memory"
|
20
19
|
gem.add_development_dependency "rake"
|
21
20
|
gem.add_development_dependency "minitest"
|
22
21
|
gem.add_development_dependency "mocha"
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shrine-mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janko Marohnić
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shrine
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0.beta2
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
22
|
+
version: '4'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: 3.0.0.beta2
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '4'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: mongoid
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +44,6 @@ dependencies:
|
|
38
44
|
- - ">="
|
39
45
|
- !ruby/object:Gem::Version
|
40
46
|
version: '5.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: shrine-memory
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
47
|
- !ruby/object:Gem::Dependency
|
56
48
|
name: rake
|
57
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,7 +97,7 @@ files:
|
|
105
97
|
- README.md
|
106
98
|
- lib/shrine/plugins/mongoid.rb
|
107
99
|
- shrine-mongoid.gemspec
|
108
|
-
homepage: https://github.com/
|
100
|
+
homepage: https://github.com/shrinerb/shrine-mongoid
|
109
101
|
licenses:
|
110
102
|
- MIT
|
111
103
|
metadata: {}
|
@@ -117,15 +109,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
109
|
requirements:
|
118
110
|
- - ">="
|
119
111
|
- !ruby/object:Gem::Version
|
120
|
-
version: '2.
|
112
|
+
version: '2.3'
|
121
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
114
|
requirements:
|
123
|
-
- - "
|
115
|
+
- - ">"
|
124
116
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
117
|
+
version: 1.3.1
|
126
118
|
requirements: []
|
127
|
-
|
128
|
-
rubygems_version: 2.5.1
|
119
|
+
rubygems_version: 3.0.3
|
129
120
|
signing_key:
|
130
121
|
specification_version: 4
|
131
122
|
summary: Provides Mongoid integration for Shrine.
|