presentability 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
- checksums.yaml.gz.sig +0 -0
- data/History.md +7 -0
- data/lib/presentability.rb +15 -1
- data/spec/presentability_spec.rb +104 -4
- data/spec/spec_helper.rb +5 -0
- data.tar.gz.sig +0 -0
- metadata +16 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5b0aae4df8ff0ef130bbcc9704f2f44a9b109dee48cc530db6abdfd0733cbd4
|
4
|
+
data.tar.gz: d149966c13d352f89c2f437c8ed251d63520ec33287c920e8ff7c1cd43eeb0e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 906172259081cb4c871975c6e8096bfcd7d8a2434903cc8bef9562b9b18c11af889ef1733372d46c94420008baf5821499d19e6708c75224abd962febabc0515
|
7
|
+
data.tar.gz: 5d2c5691ee59ba2526755a3a2eab49547d093fa1d2fbedad4163a78ea35b8acc4dc74d20f0e16a90d7b9af3cbedd9a043c68f3b402f8197ea40031984fc4773b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/History.md
CHANGED
data/lib/presentability.rb
CHANGED
@@ -54,6 +54,13 @@ require 'loggability'
|
|
54
54
|
# (the "subject"), and then applying it:
|
55
55
|
#
|
56
56
|
# ```ruby
|
57
|
+
# acme_widget = Acme::Widget.new(
|
58
|
+
# sku: "FF-2237H455",
|
59
|
+
# name: "Throbbing Frobnulator",
|
60
|
+
# unit_price: 299,
|
61
|
+
# inventory_count: 301,
|
62
|
+
# wholesale_cost: 39
|
63
|
+
# )
|
57
64
|
# presenter = Acme::Presenters.present( acme_widget )
|
58
65
|
# presenter.apply
|
59
66
|
# # => { :sku => "FF-2237H455", :name => "Throbbing Frobnulator", :unit_price => 299 }
|
@@ -65,7 +72,7 @@ module Presentability
|
|
65
72
|
|
66
73
|
|
67
74
|
# Package version
|
68
|
-
VERSION = '0.
|
75
|
+
VERSION = '0.2.0'
|
69
76
|
|
70
77
|
|
71
78
|
# Automatically load subordinate components
|
@@ -104,6 +111,13 @@ module Presentability
|
|
104
111
|
end
|
105
112
|
|
106
113
|
|
114
|
+
### Return an Array of all representations of the members of the
|
115
|
+
### +collection+ by applying a declared presentation.
|
116
|
+
def present_collection( collection, **options )
|
117
|
+
return collection.map {|object| self.present(object, **options) }
|
118
|
+
end
|
119
|
+
|
120
|
+
|
107
121
|
#########
|
108
122
|
protected
|
109
123
|
#########
|
data/spec/presentability_spec.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require_relative 'spec_helper'
|
5
5
|
|
6
|
+
require 'faker'
|
6
7
|
require 'rspec'
|
7
8
|
require 'presentability'
|
8
9
|
|
@@ -15,17 +16,35 @@ RSpec.describe Presentability do
|
|
15
16
|
return 'Acme::Entity'
|
16
17
|
end
|
17
18
|
|
18
|
-
def initialize
|
19
|
-
@foo =
|
20
|
-
@bar =
|
21
|
-
@baz =
|
19
|
+
def initialize( foo: 1, bar: 'two', baz: :three )
|
20
|
+
@foo = foo
|
21
|
+
@bar = bar
|
22
|
+
@baz = baz
|
22
23
|
end
|
23
24
|
|
24
25
|
attr_accessor :foo, :bar, :baz
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
29
|
+
let( :other_entity_class ) do
|
30
|
+
Class.new do
|
31
|
+
def self::name
|
32
|
+
return 'Acme::User'
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize( firstname, lastname, email, password )
|
36
|
+
@firstname = firstname
|
37
|
+
@lastname = lastname
|
38
|
+
@email = email
|
39
|
+
@password = password
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_accessor :firstname, :lastname, :email, :password
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
28
46
|
let( :entity_instance ) { entity_class.new }
|
47
|
+
let( :other_entity_instance ) { entity_class.new }
|
29
48
|
|
30
49
|
|
31
50
|
describe "an extended module" do
|
@@ -103,6 +122,87 @@ RSpec.describe Presentability do
|
|
103
122
|
}.to raise_error( NoMethodError, /can't expose :id -- no such attribute exists/i )
|
104
123
|
end
|
105
124
|
|
125
|
+
|
126
|
+
describe "collection handling" do
|
127
|
+
|
128
|
+
it "can present a collection" do
|
129
|
+
extended_module.presenter_for( entity_class ) do
|
130
|
+
expose :foo
|
131
|
+
expose :bar
|
132
|
+
end
|
133
|
+
collection = 5.times.map do
|
134
|
+
entity_class.new( foo: rand(100) )
|
135
|
+
end
|
136
|
+
|
137
|
+
results = extended_module.present_collection( collection )
|
138
|
+
|
139
|
+
expect( results ).to have_attributes( length: 5 )
|
140
|
+
results.each do |representation|
|
141
|
+
expect( representation ).to include( :foo, :bar )
|
142
|
+
expect( representation ).to_not include( :baz )
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
it "can present a mixed collection" do
|
148
|
+
extended_module.presenter_for( entity_class ) do
|
149
|
+
expose :foo
|
150
|
+
expose :bar
|
151
|
+
end
|
152
|
+
extended_module.presenter_for( other_entity_class ) do
|
153
|
+
expose :firstname
|
154
|
+
expose :lastname
|
155
|
+
expose :email
|
156
|
+
end
|
157
|
+
|
158
|
+
collection = 5.times.flat_map do
|
159
|
+
[
|
160
|
+
entity_class.new( foo: rand(100) ),
|
161
|
+
other_entity_class.new(
|
162
|
+
Faker::Name.first_name,
|
163
|
+
Faker::Name.last_name,
|
164
|
+
Faker::Internet.email,
|
165
|
+
Faker::Internet.password
|
166
|
+
)
|
167
|
+
]
|
168
|
+
end
|
169
|
+
|
170
|
+
results = extended_module.present_collection( collection )
|
171
|
+
|
172
|
+
expect( results ).to have_attributes( length: 10 )
|
173
|
+
results.each do |representation|
|
174
|
+
expect( representation ).to include( :foo, :bar ).
|
175
|
+
or( include(:firstname, :lastname, :email) )
|
176
|
+
expect( representation ).to_not include( :baz )
|
177
|
+
expect( representation ).to_not include( :password )
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
it "passes options to the individual presenters" do
|
183
|
+
extended_module.presenter_for( entity_class ) do
|
184
|
+
expose :foo
|
185
|
+
expose :bar, if: :include_bar
|
186
|
+
end
|
187
|
+
collection = 5.times.map do
|
188
|
+
entity_class.new( foo: rand(100) )
|
189
|
+
end
|
190
|
+
|
191
|
+
results = extended_module.present_collection( collection )
|
192
|
+
results.each do |representation|
|
193
|
+
expect( representation ).to include( :foo )
|
194
|
+
expect( representation ).to_not include( :bar, :baz )
|
195
|
+
end
|
196
|
+
|
197
|
+
results = extended_module.present_collection( collection, include_bar: true )
|
198
|
+
results.each do |representation|
|
199
|
+
expect( representation ).to include( :foo, :bar )
|
200
|
+
expect( representation ).to_not include( :baz )
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
106
206
|
end
|
107
207
|
|
108
208
|
end
|
data/spec/spec_helper.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: presentability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -33,7 +33,7 @@ cert_chain:
|
|
33
33
|
P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
|
34
34
|
btEP+7EplFuoiMfd
|
35
35
|
-----END CERTIFICATE-----
|
36
|
-
date: 2022-
|
36
|
+
date: 2022-12-06 00:00:00.000000000 Z
|
37
37
|
dependencies:
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: loggability
|
@@ -49,6 +49,20 @@ dependencies:
|
|
49
49
|
- - "~>"
|
50
50
|
- !ruby/object:Gem::Version
|
51
51
|
version: '0.18'
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: faker
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - "~>"
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '3.0'
|
59
|
+
type: :development
|
60
|
+
prerelease: false
|
61
|
+
version_requirements: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - "~>"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '3.0'
|
52
66
|
- !ruby/object:Gem::Dependency
|
53
67
|
name: rake-deveiate
|
54
68
|
requirement: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
Binary file
|