hanami-shrine 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +3 -0
- data/README.md +14 -25
- data/hanami-shrine.gemspec +1 -1
- data/lib/hanami/shrine/version.rb +1 -1
- data/lib/shrine/plugins/hanami.rb +76 -27
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e247ae2c7d1155f30389af1800709dd2eca26692
|
4
|
+
data.tar.gz: b9cce6169be65754c1e79f3b2b14557c7eebbae1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79e3315c7a4cb0a14898b17eb67eaf995419971472fdb0b3f447158dc46b758d3c03ed5d7d01bed6730249ceefa1181a8e061cd3803184499d1dd23358168f13
|
7
|
+
data.tar.gz: fbf4bb823e49230e23ea3dee488b691e05ffe3ff86342406e8da955d6ae428d7c02e2483c8a8777b10e674c13e7ad63b729840442074e535517a7a2f4956cdfc
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,6 +4,13 @@ This gem aims at providing support for [Shrine](https://github.com/janko-m/shrin
|
|
4
4
|
|
5
5
|
[](https://travis-ci.org/katafrakt/hanami-shrine)
|
6
6
|
[](https://badge.fury.io/rb/hanami-shrine)
|
7
|
+
[](https://codeclimate.com/github/katafrakt/hanami-shrine)
|
8
|
+
|
9
|
+
### Current compatibility status
|
10
|
+
|
11
|
+
* working with Hanami version 0.7.x
|
12
|
+
* working with Hanami version 0.8.x without validations (which have been extracted to separate gem)
|
13
|
+
* does not work work with Hanami 0.9.x (work in progress, see [#1](https://github.com/katafrakt/hanami-shrine/issues/1))
|
7
14
|
|
8
15
|
## Installation
|
9
16
|
|
@@ -30,7 +37,7 @@ end
|
|
30
37
|
Then, in your repository add (assuming your attachment is `avatar`):
|
31
38
|
|
32
39
|
```ruby
|
33
|
-
|
40
|
+
prepend ImageAttachment.repository(:avatar)
|
34
41
|
```
|
35
42
|
|
36
43
|
And in your entity:
|
@@ -39,32 +46,14 @@ And in your entity:
|
|
39
46
|
include ImageAttachment[:avatar]
|
40
47
|
```
|
41
48
|
|
42
|
-
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
class ImageAttachment < Shrine
|
46
|
-
plugin :hanami, validations: true
|
47
|
-
end
|
48
|
-
```
|
49
|
-
|
50
|
-
And you can write some validation code. For example:
|
51
|
-
|
52
|
-
```ruby
|
53
|
-
class ImageAttachment < Shrine
|
54
|
-
plugin :validation_helpers
|
55
|
-
plugin :determine_mime_type
|
56
|
-
plugin :hanami, validations: true
|
57
|
-
|
58
|
-
Attacher.validate do
|
59
|
-
validate_max_size 180_000, message: "is too large (max is 2 MB)"
|
60
|
-
validate_mime_type_inclusion ["image/jpg", "image/jpeg"]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
```
|
49
|
+
For inspiration read a [blog post](http://katafrakt.me/2016/02/04/shrine-hanami-uploads/), look at [the specs](https://github.com/katafrakt/hanami-shrine/tree/master/spec/hanami) or [example repo](https://github.com/katafrakt/hanami-shrine-example).
|
64
50
|
|
65
|
-
|
51
|
+
## Important changes since 0.1 version
|
66
52
|
|
67
|
-
|
53
|
+
As Hanami has been upgraded to 0.9, it started to use new engine for the entities in `hanami-model`. It required heavy changes in `hanami-shrine` to accomodate to new paradigm. Unfortunately, some of them are breaking. Here's a summary list:
|
54
|
+
* Validations are gone (for now, hopefully)
|
55
|
+
* You need to use `prepend` instead of `extend` in your repository
|
56
|
+
* Entities are now read-only. You need to initialize them with the attachment, not add it later: `MyEntity.new(avatar: File.open('my_avatar.png')`. This is a Hanami change, but it's worth mentioning here as well.
|
68
57
|
|
69
58
|
## Development
|
70
59
|
|
data/hanami-shrine.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.add_dependency 'shrine'
|
23
|
-
spec.add_dependency 'hanami-model'
|
23
|
+
spec.add_dependency 'hanami-model', '>= 0.7'
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -3,65 +3,114 @@ require 'shrine'
|
|
3
3
|
class Shrine
|
4
4
|
module Plugins
|
5
5
|
module Hanami
|
6
|
-
def self.configure(uploader, validations: nil)
|
7
|
-
uploader.opts[:hanami_validations] = validations
|
8
|
-
end
|
9
|
-
|
10
6
|
module AttachmentMethods
|
11
7
|
def initialize(name)
|
12
8
|
super
|
13
9
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
11
|
+
module EntitySupport
|
12
|
+
attr_reader :attributes
|
13
|
+
def initialize(attributes)
|
14
|
+
attachment = attributes[:#{name}]
|
15
|
+
@_#{name} = attachment
|
16
|
+
self.#{name}_attacher
|
17
|
+
super(attributes)
|
21
18
|
end
|
22
|
-
|
23
|
-
|
19
|
+
|
20
|
+
def #{name}_data=(data)
|
21
|
+
@#{name}_data = data
|
22
|
+
end
|
23
|
+
|
24
|
+
def #{name}_data
|
25
|
+
super || @#{name}_data
|
26
|
+
end
|
27
|
+
|
28
|
+
def #{name}
|
29
|
+
@_#{name} || super
|
30
|
+
end
|
31
|
+
|
32
|
+
def attributes
|
33
|
+
@_#{name} ? super.merge(#{name}: @_#{name}) : super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
prepend EntitySupport
|
38
|
+
RUBY
|
24
39
|
end
|
25
40
|
end
|
26
41
|
|
27
42
|
module ClassMethods
|
28
43
|
def repository(name)
|
29
|
-
RepositoryMethods.new(name)
|
44
|
+
RepositoryMethods.new(name, self)
|
30
45
|
end
|
31
46
|
end
|
32
47
|
|
33
48
|
class RepositoryMethods < Module
|
34
|
-
def initialize(name)
|
49
|
+
def initialize(name, attacher_class)
|
35
50
|
module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
36
51
|
def create(entity)
|
37
|
-
save_#{name}_attachment(entity) { super }
|
52
|
+
save_#{name}_attachment(entity) { |new_entity| super(new_entity) }
|
38
53
|
end
|
39
|
-
def update(entity)
|
40
|
-
save_#{name}_attachment(entity) { super }
|
54
|
+
def update(id, entity)
|
55
|
+
save_#{name}_attachment(entity) { |new_entity| super(id, new_entity) }
|
41
56
|
end
|
42
57
|
def persist(entity)
|
43
|
-
save_#{name}_attachment(entity) { super }
|
58
|
+
save_#{name}_attachment(entity) { |new_entity| super(new_entity) }
|
44
59
|
end
|
45
|
-
def delete(
|
46
|
-
delete_#{name}_attachment(
|
60
|
+
def delete(id)
|
61
|
+
delete_#{name}_attachment(id) { super(id) }
|
47
62
|
end
|
48
63
|
|
49
64
|
private
|
50
|
-
def save_#{name}_attachment(
|
51
|
-
|
65
|
+
def save_#{name}_attachment(original_entity)
|
66
|
+
attacher_proxy = Entity.attacher(:#{name}, #{attacher_class})
|
52
67
|
|
53
|
-
|
54
|
-
|
55
|
-
|
68
|
+
if original_entity.#{name}
|
69
|
+
attacher_proxy.#{name} = original_entity.#{name}
|
70
|
+
attacher_proxy.#{name}_attacher.save
|
71
|
+
|
72
|
+
attacher_proxy.#{name}_attacher.replace
|
73
|
+
attacher_proxy.#{name}_attacher._promote
|
74
|
+
|
75
|
+
original_entity_attributes = original_entity.attributes
|
76
|
+
original_entity_attributes.delete(:#{name})
|
77
|
+
|
78
|
+
entity = original_entity.class.new(original_entity_attributes.merge(#{name}_data: attacher_proxy.#{name}_data))
|
79
|
+
else
|
80
|
+
entity = original_entity
|
81
|
+
end
|
82
|
+
|
83
|
+
yield(entity)
|
56
84
|
end
|
57
85
|
|
58
|
-
def delete_#{name}_attachment(
|
86
|
+
def delete_#{name}_attachment(id)
|
87
|
+
entity = find(id)
|
59
88
|
yield
|
60
89
|
entity.#{name}_attacher.destroy
|
61
90
|
end
|
62
91
|
RUBY
|
63
92
|
end
|
64
93
|
end
|
94
|
+
|
95
|
+
module Entity
|
96
|
+
def self.attacher(name, attacher)
|
97
|
+
attachment_proxy ||= Class.new
|
98
|
+
attachment_proxy.send(:include, attacher[name])
|
99
|
+
attachment_proxy.class_eval do
|
100
|
+
define_method :initialize do |attributes|
|
101
|
+
end
|
102
|
+
|
103
|
+
define_method :"#{name}_data" do
|
104
|
+
@attachment_data
|
105
|
+
end
|
106
|
+
|
107
|
+
define_method :"#{name}_data=" do |data|
|
108
|
+
@attachment_data = data
|
109
|
+
end
|
110
|
+
end
|
111
|
+
attachment_proxy.new({})
|
112
|
+
end
|
113
|
+
end
|
65
114
|
end
|
66
115
|
|
67
116
|
register_plugin(:hanami, Hanami)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-shrine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paweł Świątkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shrine
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '0.7'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '0.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
148
|
version: '0'
|
149
149
|
requirements: []
|
150
150
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.5.1
|
152
152
|
signing_key:
|
153
153
|
specification_version: 4
|
154
154
|
summary: Support for Shrine gem in Hanami framework
|