hanami-shrine 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/katafrakt/hanami-shrine.svg)](https://travis-ci.org/katafrakt/hanami-shrine)
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/hanami-shrine.svg)](https://badge.fury.io/rb/hanami-shrine)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/katafrakt/hanami-shrine/badges/gpa.svg)](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
|