upholsterer 0.4.1 → 0.4.2
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/Gemfile +3 -1
- data/Gemfile.lock +15 -1
- data/lib/upholsterer/base.rb +38 -10
- data/lib/upholsterer/version.rb +1 -1
- data/simple_presenter.gemspec +1 -0
- data/spec/base_spec.rb +26 -0
- data/spec/support/collect_presenter.rb +35 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 951c39ccba5741d0f3addf2eef2352f3271733bf
|
4
|
+
data.tar.gz: 5c6b534c4197de44df7f0a52a426b903defa9739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff954b798cd7f48f522e9c55ffa85d602a067699d090d642685d6dbbcb624258ea46e8ac539761f16df1f8414bae1dd91f42f23a353fa51864e4a10e9867c14
|
7
|
+
data.tar.gz: 16ec28b9b63b9aa81b7a10b1fd33cc6658907b1b70e441f349b57895890192f2934c7ce53f43fce095b211ae5c99378a9777cc6ccb12135790fcf658255b0f78
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
upholsterer (0.4.
|
4
|
+
upholsterer (0.4.2)
|
5
|
+
activesupport
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
8
9
|
specs:
|
10
|
+
activesupport (4.1.0)
|
11
|
+
i18n (~> 0.6, >= 0.6.9)
|
12
|
+
json (~> 1.7, >= 1.7.7)
|
13
|
+
minitest (~> 5.1)
|
14
|
+
thread_safe (~> 0.1)
|
15
|
+
tzinfo (~> 1.1)
|
9
16
|
awesome_print (1.2.0)
|
10
17
|
coderay (1.0.9)
|
11
18
|
diff-lcs (1.2.4)
|
19
|
+
i18n (0.6.11)
|
20
|
+
json (1.8.1)
|
12
21
|
method_source (0.8.2)
|
22
|
+
minitest (5.4.2)
|
13
23
|
pry (0.9.12.2)
|
14
24
|
coderay (~> 1.0.5)
|
15
25
|
method_source (~> 0.8)
|
@@ -34,11 +44,15 @@ GEM
|
|
34
44
|
diff-lcs (>= 1.1.3, < 2.0)
|
35
45
|
rspec-mocks (2.14.4)
|
36
46
|
slop (3.4.6)
|
47
|
+
thread_safe (0.3.4)
|
48
|
+
tzinfo (1.2.2)
|
49
|
+
thread_safe (~> 0.1)
|
37
50
|
|
38
51
|
PLATFORMS
|
39
52
|
ruby
|
40
53
|
|
41
54
|
DEPENDENCIES
|
55
|
+
activesupport
|
42
56
|
pry-meta
|
43
57
|
rake
|
44
58
|
rspec
|
data/lib/upholsterer/base.rb
CHANGED
@@ -97,25 +97,53 @@ module Upholsterer
|
|
97
97
|
# The presenter above will expose the methods +body+, +created_at+, and +user_name+.
|
98
98
|
# Additionaly, it will create an alias called +author+ to the +name+ attribute.
|
99
99
|
#
|
100
|
-
def self.expose(*attrs)
|
100
|
+
def self.expose(*attrs, &block)
|
101
101
|
options = attrs.pop if attrs.last.kind_of?(Hash)
|
102
102
|
options ||= {}
|
103
103
|
|
104
|
-
|
105
|
-
|
104
|
+
container = options.fetch(:with, nil)
|
105
|
+
method_prefix = container if options.fetch(:prefix, true)
|
106
|
+
|
107
|
+
if block_given? and container.present?
|
108
|
+
wrapper_method = "#{ attrs.join('_') }_wrapper"
|
109
|
+
wrapper_instance_variable = "@#{ wrapper_method }"
|
110
|
+
|
111
|
+
define_method wrapper_method do
|
112
|
+
unless instance_variable_defined?(wrapper_instance_variable)
|
113
|
+
if respond_to?(container)
|
114
|
+
object_container = public_send(container)
|
115
|
+
else
|
116
|
+
object_container = subject.public_send(container)
|
117
|
+
end
|
106
118
|
|
119
|
+
wrapper = instance_eval(&block).new(object_container)
|
120
|
+
|
121
|
+
instance_variable_set(wrapper_instance_variable, wrapper)
|
122
|
+
end
|
123
|
+
|
124
|
+
instance_variable_get(wrapper_instance_variable)
|
125
|
+
end
|
126
|
+
|
127
|
+
private wrapper_method
|
128
|
+
end
|
129
|
+
|
130
|
+
attrs.each do |attr_name|
|
107
131
|
method_name = [
|
108
|
-
|
132
|
+
method_prefix,
|
109
133
|
options.fetch(:as, attr_name)
|
110
|
-
].compact.join(
|
134
|
+
].compact.join('_')
|
111
135
|
|
112
136
|
attributes[method_name.to_sym] = [attr_name, options]
|
113
137
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
138
|
+
if block_given? and container.present?
|
139
|
+
delegate attr_name, to: wrapper_method, prefix: !!method_prefix
|
140
|
+
else
|
141
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
142
|
+
def #{method_name}(&block) # def user_name(&block)
|
143
|
+
proxy_message(#{container.inspect}, "#{attr_name}", &block) # proxy_message("user", "name")
|
144
|
+
end # end
|
145
|
+
RUBY
|
146
|
+
end
|
119
147
|
end
|
120
148
|
end
|
121
149
|
|
data/lib/upholsterer/version.rb
CHANGED
data/simple_presenter.gemspec
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -178,4 +178,30 @@ describe Upholsterer::Base do
|
|
178
178
|
its([:user_name]) { should eq 'John Doe'}
|
179
179
|
its([:post_title]) { should eq 'Some post'}
|
180
180
|
end
|
181
|
+
|
182
|
+
describe 'expose with block' do
|
183
|
+
let(:project) { double id: 1, description: 'description', type: 'type' }
|
184
|
+
subject { CollectPresenter.new(entity) }
|
185
|
+
|
186
|
+
context 'Test presenter' do
|
187
|
+
let(:entity) { double name: 'Test', project: project, email: 'foo@bar.com' }
|
188
|
+
|
189
|
+
its(:id) { should eq 1 }
|
190
|
+
its(:name) { should eq 'Test' }
|
191
|
+
its(:email) { should eq 'foo@bar.com' }
|
192
|
+
its(:type) { should eq 'test_type' }
|
193
|
+
its(:description) { should eq 'test_description' }
|
194
|
+
its(:to_json) { should eq '{"name":"Test","email":"foo@bar.com","id":1,"description":"test_description","type":"test_type"}'}
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'Real presenter' do
|
198
|
+
let(:entity) { double name: 'Real', project: project, email: 'foo@bar.com' }
|
199
|
+
|
200
|
+
its(:name) { should eq 'Real' }
|
201
|
+
its(:email) { should eq 'foo@bar.com' }
|
202
|
+
its(:type) { should eq 'real_type' }
|
203
|
+
its(:description) { should eq 'real_description' }
|
204
|
+
its(:to_json) { should eq '{"name":"Real","email":"foo@bar.com","id":1,"description":"real_description","type":"real_type"}'}
|
205
|
+
end
|
206
|
+
end
|
181
207
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class CollectPresenter < Presenter
|
2
|
+
expose :name, :email
|
3
|
+
expose :id, with: :project, prefix: false
|
4
|
+
expose :description, :type, with: :project, prefix: false do
|
5
|
+
"#{ name }ProjectPresenter".constantize
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestProjectPresenter
|
10
|
+
def initialize(project)
|
11
|
+
@project = project
|
12
|
+
end
|
13
|
+
|
14
|
+
def description
|
15
|
+
"test_#{ @project.description}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def type
|
19
|
+
"test_#{ @project.type }"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class RealProjectPresenter
|
24
|
+
def initialize(project)
|
25
|
+
@project = project
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
"real_#{ @project.description}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def type
|
33
|
+
"real_#{ @project.type }"
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upholsterer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-12-
|
13
|
+
date: 2014-12-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -54,6 +54,20 @@ dependencies:
|
|
54
54
|
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: activesupport
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
57
71
|
description: A simple presenter/facade/decorator/whatever implementation.
|
58
72
|
email:
|
59
73
|
- fnando.vieira@gmail.com
|
@@ -79,6 +93,7 @@ files:
|
|
79
93
|
- spec/base_spec.rb
|
80
94
|
- spec/spec_helper.rb
|
81
95
|
- spec/support/alias_presenter.rb
|
96
|
+
- spec/support/collect_presenter.rb
|
82
97
|
- spec/support/comment.rb
|
83
98
|
- spec/support/comment_presenter.rb
|
84
99
|
- spec/support/iterator_presenter.rb
|