grape-entity 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/CHANGELOG.md +6 -0
- data/lib/grape_entity/entity.rb +24 -2
- data/lib/grape_entity/version.rb +1 -1
- data/spec/grape_entity/entity_spec.rb +66 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4165ed088e82e10584f53bf9436053d18c647b41
|
4
|
+
data.tar.gz: be2d0321743d7d27dcc1d3c1f30a9e5483e5c92d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2059bf88e77709d197f923e0c4659747d83ed2a859325cecdcbb286cdc828a82a07a8c6571df886be941059b6c2c98110327c04809d453824ff377d387919c5e
|
7
|
+
data.tar.gz: e2c16d535392af2daf37b834589f63933f66f960c15e199956419dd894a3bd95ab06b76a53b3ca594714f854845c4137b65add706b8be02c8d6e580b7d3e2062
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.4.2 (2014-04-03)
|
2
|
+
==================
|
3
|
+
|
4
|
+
* [#60](https://github.com/intridea/grape-entity/issues/59): Performance issues introduced by nested exposures - [@AlexYankee](https://github.com/AlexYankee).
|
5
|
+
* [#60](https://github.com/intridea/grape-entity/issues/57): Nested exposure double-exposes a field - [@AlexYankee](https://github.com/AlexYankee).
|
6
|
+
|
1
7
|
0.4.1 (2014-02-13)
|
2
8
|
==================
|
3
9
|
|
data/lib/grape_entity/entity.rb
CHANGED
@@ -136,9 +136,13 @@ module Grape
|
|
136
136
|
options[:proc] = block if block_given? && block.parameters.any?
|
137
137
|
|
138
138
|
@nested_attributes ||= []
|
139
|
+
|
139
140
|
args.each do |attribute|
|
140
141
|
unless @nested_attributes.empty?
|
141
142
|
attribute = "#{@nested_attributes.last}__#{attribute}"
|
143
|
+
options[:nested] = true
|
144
|
+
nested_exposures_hash[@nested_attributes.last.to_sym] ||= {}
|
145
|
+
nested_exposures_hash[@nested_attributes.last.to_sym][attribute.to_sym] = options
|
142
146
|
end
|
143
147
|
|
144
148
|
exposures[attribute.to_sym] = options
|
@@ -180,6 +184,24 @@ module Grape
|
|
180
184
|
@exposures
|
181
185
|
end
|
182
186
|
|
187
|
+
class << self
|
188
|
+
attr_accessor :_nested_exposures_hash
|
189
|
+
|
190
|
+
def nested_exposures_hash
|
191
|
+
self._nested_exposures_hash ||= {}
|
192
|
+
end
|
193
|
+
|
194
|
+
def nested_exposures
|
195
|
+
value = nested_exposures_hash
|
196
|
+
|
197
|
+
if superclass.respond_to? :nested_exposures
|
198
|
+
value = superclass.nested_exposures.deep_merge(value)
|
199
|
+
end
|
200
|
+
|
201
|
+
value
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
183
205
|
# Returns a hash, the keys are symbolized references to fields in the entity,
|
184
206
|
# the values are document keys in the entity's documentation key. When calling
|
185
207
|
# #docmentation, any exposure without a documentation key will be ignored.
|
@@ -324,7 +346,7 @@ module Grape
|
|
324
346
|
end
|
325
347
|
|
326
348
|
def valid_exposures
|
327
|
-
exposures.select do |attribute, exposure_options|
|
349
|
+
exposures.reject { |a, options| options[:nested] }.select do |attribute, exposure_options|
|
328
350
|
valid_exposure?(attribute, exposure_options)
|
329
351
|
end
|
330
352
|
end
|
@@ -390,7 +412,7 @@ module Grape
|
|
390
412
|
end
|
391
413
|
|
392
414
|
def self.nested_exposures_for(attribute)
|
393
|
-
|
415
|
+
nested_exposures[attribute] || {}
|
394
416
|
end
|
395
417
|
|
396
418
|
def value_for(attribute, options = {})
|
data/lib/grape_entity/version.rb
CHANGED
@@ -92,9 +92,9 @@ describe Grape::Entity do
|
|
92
92
|
|
93
93
|
subject.exposures.should == {
|
94
94
|
awesome: {},
|
95
|
-
awesome__nested: {},
|
96
|
-
awesome__nested__moar_nested: { as: 'weee' },
|
97
|
-
awesome__another_nested: { using: 'Awesome' }
|
95
|
+
awesome__nested: { nested: true },
|
96
|
+
awesome__nested__moar_nested: { as: 'weee', nested: true },
|
97
|
+
awesome__another_nested: { using: 'Awesome', nested: true }
|
98
98
|
}
|
99
99
|
end
|
100
100
|
|
@@ -110,6 +110,68 @@ describe Grape::Entity do
|
|
110
110
|
}
|
111
111
|
end
|
112
112
|
|
113
|
+
it 'does not represent attributes, declared inside nested exposure, outside of it' do
|
114
|
+
subject.expose :awesome do
|
115
|
+
subject.expose(:nested) { |_| "value" }
|
116
|
+
subject.expose(:another_nested) { |_| "value" }
|
117
|
+
subject.expose :second_level_nested do
|
118
|
+
subject.expose(:deeply_exposed_attr) { |_| "value" }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
subject.represent({}).serializable_hash.should == {
|
123
|
+
awesome: {
|
124
|
+
nested: "value",
|
125
|
+
another_nested: "value",
|
126
|
+
second_level_nested: {
|
127
|
+
deeply_exposed_attr: "value"
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
it "complex nested attributes" do
|
134
|
+
class ClassRoom < Grape::Entity
|
135
|
+
expose(:parents, using: 'Parent') { |_| [{}, {}] }
|
136
|
+
end
|
137
|
+
|
138
|
+
class Person < Grape::Entity
|
139
|
+
expose :user do
|
140
|
+
expose(:in_first) { |_| 'value' }
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class Student < Person
|
145
|
+
expose :user do
|
146
|
+
expose(:user_id) { |_| 'value' }
|
147
|
+
expose(:user_display_id, as: :display_id) { |_| 'value' }
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Parent < Person
|
152
|
+
expose(:children, using: 'Student') { |_| [{}, {}] }
|
153
|
+
end
|
154
|
+
|
155
|
+
ClassRoom.represent({}).serializable_hash.should == {
|
156
|
+
parents: [
|
157
|
+
{
|
158
|
+
user: { in_first: 'value' },
|
159
|
+
children: [
|
160
|
+
{ user: { in_first: 'value', user_id: "value", display_id: "value" } },
|
161
|
+
{ user: { in_first: 'value', user_id: "value", display_id: "value" } }
|
162
|
+
]
|
163
|
+
},
|
164
|
+
{
|
165
|
+
user: { in_first: 'value' },
|
166
|
+
children: [
|
167
|
+
{ user: { in_first: 'value', user_id: "value", display_id: "value" } },
|
168
|
+
{ user: { in_first: 'value', user_id: "value", display_id: "value" } }
|
169
|
+
]
|
170
|
+
}
|
171
|
+
]
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
113
175
|
it 'is safe if its nested exposures are safe' do
|
114
176
|
subject.with_options safe: true do
|
115
177
|
subject.expose :awesome do
|
@@ -121,6 +183,7 @@ describe Grape::Entity do
|
|
121
183
|
end
|
122
184
|
|
123
185
|
valid_keys = subject.represent({}).valid_exposures.keys
|
186
|
+
|
124
187
|
valid_keys.include?(:awesome).should == true && \
|
125
188
|
valid_keys.include?(:not_awesome).should == false
|
126
189
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-entity
|
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
|
- Michael Bleigh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|