grape-entity 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bca27e644c8d862751cbb573d3da20ec58fa9a1a
4
+ data.tar.gz: 40aa499604d5a7941fc13016c58c9a2fda9de787
5
+ SHA512:
6
+ metadata.gz: b02bedc0adc756dec9fb93c0ae527eb4251e21882aedefb30f3f973fd867ee9589a61702d0464ae69366ea4fc27f5e42ce382ea9ec247b347ebeab2c3c817713
7
+ data.tar.gz: c175aad11e6c88bfbd10c551a3f1cd0381753b918bc901f9786676f03558dc6e75d369e25ebc3aad45ed780ecf4f78d2a3e3627aa519e0824b29e11ec248794f
@@ -4,7 +4,7 @@ cache: bundler
4
4
 
5
5
  rvm:
6
6
  - ruby-head
7
- - 2.1.1
7
+ - 2.1.2
8
8
  - 2.1.0
9
9
  - 2.0.0
10
10
  - 1.9.3
@@ -1,3 +1,9 @@
1
+ 0.4.4 (2014-08-17)
2
+ ==================
3
+
4
+ * [#85](https://github.com/intridea/grape-entity/pull/85): Added `present_collection` to indicate that an `Entity` presents an entire Collection - [@dspaeth-faber](https://github.com/dspaeth-faber).
5
+ * [#85](https://guthub.com/intridea/grape-entity/pull/85): Hashes can now be passed as object to be presented and the `Hash` keys can be referenced by expose - [@dspaeth-faber](https://github.com/dspaeth-faber).
6
+
1
7
  0.4.3 (2014-06-12)
2
8
  ==================
3
9
 
data/README.md CHANGED
@@ -63,6 +63,13 @@ Define a list of fields that will always be exposed.
63
63
  expose :user_name, :ip
64
64
  ```
65
65
 
66
+ The field lookup takes several steps
67
+
68
+ * first try `entity-instance.exposure`
69
+ * next try `object.exposure`
70
+ * next try `object.fetch(exposure)`
71
+ * last raise an Exception
72
+
66
73
  #### Exposing with a Presenter
67
74
 
68
75
  Don't derive your model classes from `Grape::Entity`, expose them using a presenter.
@@ -119,6 +126,20 @@ root 'users', 'user'
119
126
  expose :id, :name, ...
120
127
  ```
121
128
 
129
+ By default every object of a collection is wrapped into an instance of your `Entity` class.
130
+ You can override this behavior and wrapp the hole collection into one instance of your `Entity`
131
+ class.
132
+
133
+ As example:
134
+
135
+ ```ruby
136
+
137
+ present_collection true, :collection_name # `collection_name` is optional and defaults to `items`
138
+ expose :collection_name, using: API:Items
139
+
140
+
141
+ ```
142
+
122
143
  #### Runtime Exposure
123
144
 
124
145
  Use a block or a `Proc` to evaluate exposure at runtime. The supplied block or
@@ -151,6 +172,20 @@ private
151
172
  end
152
173
  ```
153
174
 
175
+ You have always access to the presented instance with `object`
176
+
177
+ ```ruby
178
+ class ExampleEntity < Grape::Entity
179
+ expose :formatted_value
180
+ # ...
181
+ private
182
+
183
+ def formatted_value
184
+ "+ X #{object.value}"
185
+ end
186
+ end
187
+ ```
188
+
154
189
  #### Aliases
155
190
 
156
191
  Expose under a different name with `:as`.
@@ -216,8 +251,7 @@ The above will automatically create a `Status::Entity` class and define properti
216
251
 
217
252
  ### Using Entities
218
253
 
219
- With Grape, once an entity is defined, it can be used within endpoints, by calling `present`. The `present` method accepts two arguments, the object to be presented and the options associated with it. The options hash must always include `:with`, which defines the entity to expose.
220
-
254
+ With Grape, once an entity is defined, it can be used within endpoints, by calling `present`. The `present` method accepts two arguments, the `object` to be presented and the `options` associated with it. The options hash must always include `:with`, which defines the entity to expose.
221
255
  If the entity includes documentation it can be included in an endpoint's description.
222
256
 
223
257
  ```ruby
@@ -329,6 +329,62 @@ module Grape
329
329
  @root = singular
330
330
  end
331
331
 
332
+ # This allows you to present a collection of objects.
333
+ #
334
+ # @param present_collection [true or false] when true all objects will be available as
335
+ # items in your presenter instead of wrapping each object in an instance of your presenter.
336
+ # When false (default) every object in a collection to present will be wrapped separately
337
+ # into an instance of your presenter.
338
+ # @param collection_name [Symbol] the name of the collection accessor in your entity object.
339
+ # Default :items
340
+ #
341
+ # @example Entity Definition
342
+ #
343
+ # module API
344
+ # module Entities
345
+ # class User < Grape::Entity
346
+ # expose :id
347
+ # end
348
+ #
349
+ # class Users < Grape::Entity
350
+ # present_collection true
351
+ # expose :items, as: 'users', using: API::Entities::Users
352
+ # expose :version, documentation: { type: 'string',
353
+ # desc: 'actual api version',
354
+ # required: true }
355
+ #
356
+ # def version
357
+ # options[:version]
358
+ # end
359
+ # end
360
+ # end
361
+ # end
362
+ #
363
+ # @example Usage in the API Layer
364
+ #
365
+ # module API
366
+ # class Users < Grape::API
367
+ # version 'v2'
368
+ #
369
+ # # this will render { "users" : [ { "id" : "1" }, { "id" : "2" } ], "version" : "v2" }
370
+ # get '/users' do
371
+ # @users = User.all
372
+ # present @users, with: API::Entities::Users
373
+ # end
374
+ #
375
+ # # this will render { "user" : { "id" : "1" } }
376
+ # get '/users/:id' do
377
+ # @user = User.find(params[:id])
378
+ # present @user, with: API::Entities::User
379
+ # end
380
+ # end
381
+ # end
382
+ #
383
+ def self.present_collection(present_collection = false, collection_name = :items)
384
+ @present_collection = present_collection
385
+ @collection_name = collection_name
386
+ end
387
+
332
388
  # This convenience method allows you to instantiate one or more entities by
333
389
  # passing either a singular or collection of objects. Each object will be
334
390
  # initialized with the same options. If an array of objects is passed in,
@@ -339,27 +395,34 @@ module Grape
339
395
  # @param options [Hash] Options that will be passed through to each entity
340
396
  # representation.
341
397
  #
342
- # @option options :root [String] override the default root name set for the entity.
398
+ # @option options :root [String or false] override the default root name set for the entity.
343
399
  # Pass nil or false to represent the object or objects with no root name
344
400
  # even if one is defined for the entity.
401
+ # @option options :serializable [true or false] when true a serializable Hash will be returned
402
+ #
345
403
  def self.represent(objects, options = {})
346
- if objects.respond_to?(:to_ary)
347
- inner = objects.to_ary.map { |object| new(object, { collection: true }.merge(options)) }
348
- inner = inner.map(&:serializable_hash) if options[:serializable]
404
+ if objects.respond_to?(:to_ary) && ! @present_collection
405
+ root_element = @collection_root
406
+ inner = objects.to_ary.map { |object| new(object, { collection: true }.merge(options)).presented }
349
407
  else
350
- inner = new(objects, options)
351
- inner = inner.serializable_hash if options[:serializable]
408
+ objects = { @collection_name => objects } if @present_collection
409
+ root_element = @root
410
+ inner = new(objects, options).presented
352
411
  end
353
412
 
354
- root_element = if options.key?(:root)
355
- options[:root]
356
- else
357
- objects.respond_to?(:to_ary) ? @collection_root : @root
358
- end
413
+ root_element = options[:root] if options.key?(:root)
359
414
 
360
415
  root_element ? { root_element => inner } : inner
361
416
  end
362
417
 
418
+ def presented
419
+ if options[:serializable]
420
+ serializable_hash
421
+ else
422
+ self
423
+ end
424
+ end
425
+
363
426
  def initialize(object, options = {})
364
427
  @object, @options = object, options
365
428
  end
@@ -486,7 +549,13 @@ module Grape
486
549
  if respond_to?(name, true)
487
550
  send(name)
488
551
  else
489
- object.send(name)
552
+ if object.respond_to?(name, true)
553
+ object.send(name)
554
+ elsif object.respond_to?(:fetch, true)
555
+ object.fetch(name)
556
+ else
557
+ raise ArgumentError
558
+ end
490
559
  end
491
560
  end
492
561
 
@@ -1,3 +1,3 @@
1
1
  module GrapeEntity
2
- VERSION = '0.4.3'
2
+ VERSION = '0.4.4'
3
3
  end
@@ -11,12 +11,12 @@ describe Grape::Entity do
11
11
  context 'multiple attributes' do
12
12
  it 'is able to add multiple exposed attributes with a single call' do
13
13
  subject.expose :name, :email, :location
14
- subject.exposures.size.should == 3
14
+ expect(subject.exposures.size).to eq 3
15
15
  end
16
16
 
17
17
  it 'sets the same options for all exposures passed' do
18
18
  subject.expose :name, :email, :location, documentation: true
19
- subject.exposures.values.each { |v| v.should == { documentation: true } }
19
+ subject.exposures.values.each { |v| expect(v).to eq(documentation: true) }
20
20
  end
21
21
  end
22
22
 
@@ -62,22 +62,22 @@ describe Grape::Entity do
62
62
 
63
63
  object = EntitySpec::SomeObject1.new
64
64
  value = subject.represent(object).send(:value_for, :bogus)
65
- value.should be_instance_of EntitySpec::BogusEntity
65
+ expect(value).to be_instance_of EntitySpec::BogusEntity
66
66
 
67
67
  prop1 = value.send(:value_for, :prop1)
68
- prop1.should == 'MODIFIED 2'
68
+ expect(prop1).to eq 'MODIFIED 2'
69
69
  end
70
70
 
71
71
  context 'with parameters passed to the block' do
72
72
  it 'sets the :proc option in the exposure options' do
73
73
  block = lambda { |_| true }
74
74
  subject.expose :name, using: 'Awesome', &block
75
- subject.exposures[:name].should == { proc: block, using: 'Awesome' }
75
+ expect(subject.exposures[:name]).to eq(proc: block, using: 'Awesome')
76
76
  end
77
77
 
78
78
  it 'references an instance of the entity without any options' do
79
79
  subject.expose(:size) { |_| self }
80
- subject.represent(Hash.new).send(:value_for, :size).should be_an_instance_of fresh_class
80
+ expect(subject.represent(Hash.new).send(:value_for, :size)).to be_an_instance_of fresh_class
81
81
  end
82
82
  end
83
83
 
@@ -90,12 +90,12 @@ describe Grape::Entity do
90
90
  subject.expose :another_nested, using: 'Awesome'
91
91
  end
92
92
 
93
- subject.exposures.should == {
94
- awesome: {},
95
- awesome__nested: { nested: true },
96
- awesome__nested__moar_nested: { as: 'weee', nested: true },
97
- awesome__another_nested: { using: 'Awesome', nested: true }
98
- }
93
+ expect(subject.exposures).to eq(
94
+ awesome: {},
95
+ awesome__nested: { nested: true },
96
+ awesome__nested__moar_nested: { as: 'weee', nested: true },
97
+ awesome__another_nested: { using: 'Awesome', nested: true }
98
+ )
99
99
  end
100
100
 
101
101
  it 'represents the exposure as a hash of its nested exposures' do
@@ -104,10 +104,10 @@ describe Grape::Entity do
104
104
  subject.expose(:another_nested) { |_| 'value' }
105
105
  end
106
106
 
107
- subject.represent({}).send(:value_for, :awesome).should == {
108
- nested: 'value',
109
- another_nested: 'value'
110
- }
107
+ expect(subject.represent({}).send(:value_for, :awesome)).to eq(
108
+ nested: 'value',
109
+ another_nested: 'value'
110
+ )
111
111
  end
112
112
 
113
113
  it 'does not represent attributes, declared inside nested exposure, outside of it' do
@@ -119,15 +119,15 @@ describe Grape::Entity do
119
119
  end
120
120
  end
121
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
- }
122
+ expect(subject.represent({}).serializable_hash).to eq(
123
+ awesome: {
124
+ nested: 'value',
125
+ another_nested: 'value',
126
+ second_level_nested: {
127
+ deeply_exposed_attr: 'value'
128
+ }
129
+ }
130
+ )
131
131
  end
132
132
 
133
133
  it 'complex nested attributes' do
@@ -152,24 +152,24 @@ describe Grape::Entity do
152
152
  expose(:children, using: 'Student') { |_| [{}, {}] }
153
153
  end
154
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
- }
155
+ expect(ClassRoom.represent({}).serializable_hash).to eq(
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
173
  end
174
174
 
175
175
  it 'is safe if its nested exposures are safe' do
@@ -184,8 +184,8 @@ describe Grape::Entity do
184
184
 
185
185
  valid_keys = subject.represent({}).valid_exposures.keys
186
186
 
187
- valid_keys.include?(:awesome).should == true && \
188
- valid_keys.include?(:not_awesome).should == false
187
+ expect(valid_keys.include?(:awesome)).to be true
188
+ expect(valid_keys.include?(:not_awesome)).to be false
189
189
  end
190
190
  end
191
191
  end
@@ -195,7 +195,7 @@ describe Grape::Entity do
195
195
  subject.expose :name, :email
196
196
  child_class = Class.new(subject)
197
197
 
198
- child_class.exposures.should eq(subject.exposures)
198
+ expect(child_class.exposures).to eq(subject.exposures)
199
199
  end
200
200
 
201
201
  it 'returns exposures from multiple ancestor' do
@@ -203,7 +203,7 @@ describe Grape::Entity do
203
203
  parent_class = Class.new(subject)
204
204
  child_class = Class.new(parent_class)
205
205
 
206
- child_class.exposures.should eq(subject.exposures)
206
+ expect(child_class.exposures).to eq(subject.exposures)
207
207
  end
208
208
 
209
209
  it 'returns descendant exposures as a priority' do
@@ -213,8 +213,8 @@ describe Grape::Entity do
213
213
  'foo'
214
214
  end
215
215
 
216
- subject.exposures[:name].should_not have_key :proc
217
- child_class.exposures[:name].should have_key :proc
216
+ expect(subject.exposures[:name]).not_to have_key :proc
217
+ expect(child_class.exposures[:name]).to have_key :proc
218
218
  end
219
219
  end
220
220
 
@@ -224,14 +224,14 @@ describe Grape::Entity do
224
224
  it 'registers a formatter' do
225
225
  subject.format_with :timestamp, &date_formatter
226
226
 
227
- subject.formatters[:timestamp].should_not be_nil
227
+ expect(subject.formatters[:timestamp]).not_to be_nil
228
228
  end
229
229
 
230
230
  it 'inherits formatters from ancestors' do
231
231
  subject.format_with :timestamp, &date_formatter
232
232
  child_class = Class.new(subject)
233
233
 
234
- child_class.formatters.should == subject.formatters
234
+ expect(child_class.formatters).to eq subject.formatters
235
235
  end
236
236
 
237
237
  it 'does not allow registering a formatter without a block' do
@@ -246,14 +246,14 @@ describe Grape::Entity do
246
246
  subject.expose :birthday, format_with: :timestamp
247
247
 
248
248
  model = { birthday: Time.gm(2012, 2, 27) }
249
- subject.new(double(model)).as_json[:birthday].should == '02/27/2012'
249
+ expect(subject.new(double(model)).as_json[:birthday]).to eq '02/27/2012'
250
250
  end
251
251
 
252
252
  it 'formats an exposure with a :format_with lambda that returns a value from the entity instance' do
253
253
  object = Hash.new
254
254
 
255
255
  subject.expose(:size, format_with: lambda { |_value| self.object.class.to_s })
256
- subject.represent(object).send(:value_for, :size).should == object.class.to_s
256
+ expect(subject.represent(object).send(:value_for, :size)).to eq object.class.to_s
257
257
  end
258
258
 
259
259
  it 'formats an exposure with a :format_with symbol that returns a value from the entity instance' do
@@ -264,7 +264,7 @@ describe Grape::Entity do
264
264
  object = Hash.new
265
265
 
266
266
  subject.expose(:size, format_with: :size_formatter)
267
- subject.represent(object).send(:value_for, :size).should == object.class.to_s
267
+ expect(subject.represent(object).send(:value_for, :size)).to eq object.class.to_s
268
268
  end
269
269
  end
270
270
  end
@@ -287,7 +287,7 @@ describe Grape::Entity do
287
287
  end
288
288
  end
289
289
 
290
- subject.exposures[:awesome_thing].should == { if: { awesome: true }, using: 'Awesome' }
290
+ expect(subject.exposures[:awesome_thing]).to eq(if: { awesome: true }, using: 'Awesome')
291
291
  end
292
292
 
293
293
  it 'allows for nested .with_options' do
@@ -299,7 +299,7 @@ describe Grape::Entity do
299
299
  end
300
300
  end
301
301
 
302
- subject.exposures[:awesome_thing].should == { if: { awesome: true }, using: 'Something' }
302
+ expect(subject.exposures[:awesome_thing]).to eq(if: { awesome: true }, using: 'Something')
303
303
  end
304
304
 
305
305
  it 'overrides nested :as option' do
@@ -309,7 +309,7 @@ describe Grape::Entity do
309
309
  end
310
310
  end
311
311
 
312
- subject.exposures[:awesome_thing].should == { as: :extra_smooth }
312
+ expect(subject.exposures[:awesome_thing]).to eq(as: :extra_smooth)
313
313
  end
314
314
 
315
315
  it 'merges nested :if option' do
@@ -331,10 +331,10 @@ describe Grape::Entity do
331
331
  end
332
332
  end
333
333
 
334
- subject.exposures[:awesome_thing].should == {
335
- if: { awesome: false, less_awesome: true },
336
- if_extras: [:awesome, match_proc]
337
- }
334
+ expect(subject.exposures[:awesome_thing]).to eq(
335
+ if: { awesome: false, less_awesome: true },
336
+ if_extras: [:awesome, match_proc]
337
+ )
338
338
  end
339
339
 
340
340
  it 'merges nested :unless option' do
@@ -356,10 +356,10 @@ describe Grape::Entity do
356
356
  end
357
357
  end
358
358
 
359
- subject.exposures[:awesome_thing].should == {
360
- unless: { awesome: false, less_awesome: true },
361
- unless_extras: [:awesome, match_proc]
362
- }
359
+ expect(subject.exposures[:awesome_thing]).to eq(
360
+ unless: { awesome: false, less_awesome: true },
361
+ unless_extras: [:awesome, match_proc]
362
+ )
363
363
  end
364
364
 
365
365
  it 'overrides nested :using option' do
@@ -369,7 +369,7 @@ describe Grape::Entity do
369
369
  end
370
370
  end
371
371
 
372
- subject.exposures[:awesome_thing].should == { using: 'SomethingElse' }
372
+ expect(subject.exposures[:awesome_thing]).to eq(using: 'SomethingElse')
373
373
  end
374
374
 
375
375
  it 'aliases :with option to :using option' do
@@ -378,7 +378,7 @@ describe Grape::Entity do
378
378
  expose :awesome_thing, with: 'SomethingElse'
379
379
  end
380
380
  end
381
- subject.exposures[:awesome_thing].should == { using: 'SomethingElse' }
381
+ expect(subject.exposures[:awesome_thing]).to eq(using: 'SomethingElse')
382
382
  end
383
383
 
384
384
  it 'overrides nested :proc option' do
@@ -390,7 +390,7 @@ describe Grape::Entity do
390
390
  end
391
391
  end
392
392
 
393
- subject.exposures[:awesome_thing].should == { proc: match_proc }
393
+ expect(subject.exposures[:awesome_thing]).to eq(proc: match_proc)
394
394
  end
395
395
 
396
396
  it 'overrides nested :documentation option' do
@@ -400,41 +400,72 @@ describe Grape::Entity do
400
400
  end
401
401
  end
402
402
 
403
- subject.exposures[:awesome_thing].should == { documentation: { desc: 'Other description.' } }
403
+ expect(subject.exposures[:awesome_thing]).to eq(documentation: { desc: 'Other description.' })
404
404
  end
405
405
  end
406
406
 
407
407
  describe '.represent' do
408
408
  it 'returns a single entity if called with one object' do
409
- subject.represent(Object.new).should be_kind_of(subject)
409
+ expect(subject.represent(Object.new)).to be_kind_of(subject)
410
410
  end
411
411
 
412
412
  it 'returns a single entity if called with a hash' do
413
- subject.represent(Hash.new).should be_kind_of(subject)
413
+ expect(subject.represent(Hash.new)).to be_kind_of(subject)
414
414
  end
415
415
 
416
416
  it 'returns multiple entities if called with a collection' do
417
417
  representation = subject.represent(4.times.map { Object.new })
418
- representation.should be_kind_of Array
419
- representation.size.should == 4
420
- representation.reject { |r| r.kind_of?(subject) }.should be_empty
418
+ expect(representation).to be_kind_of Array
419
+ expect(representation.size).to eq(4)
420
+ expect(representation.reject { |r| r.kind_of?(subject) }).to be_empty
421
421
  end
422
422
 
423
423
  it 'adds the collection: true option if called with a collection' do
424
424
  representation = subject.represent(4.times.map { Object.new })
425
- representation.each { |r| r.options[:collection].should be true }
425
+ representation.each { |r| expect(r.options[:collection]).to be true }
426
426
  end
427
427
 
428
428
  it 'returns a serialized hash of a single object if serializable: true' do
429
429
  subject.expose(:awesome) { |_| true }
430
430
  representation = subject.represent(Object.new, serializable: true)
431
- representation.should == { awesome: true }
431
+ expect(representation).to eq(awesome: true)
432
432
  end
433
433
 
434
434
  it 'returns a serialized array of hashes of multiple objects if serializable: true' do
435
435
  subject.expose(:awesome) { |_| true }
436
436
  representation = subject.represent(2.times.map { Object.new }, serializable: true)
437
- representation.should == [{ awesome: true }, { awesome: true }]
437
+ expect(representation).to eq([{ awesome: true }, { awesome: true }])
438
+ end
439
+
440
+ it 'returns a serialized hash of a hash' do
441
+ subject.expose(:awesome)
442
+ representation = subject.represent({ awesome: true }, serializable: true)
443
+ expect(representation).to eq(awesome: true)
444
+ end
445
+ end
446
+
447
+ describe '.present_collection' do
448
+ it 'make the objects accessible' do
449
+ subject.present_collection true
450
+ subject.expose :items
451
+
452
+ representation = subject.represent(4.times.map { Object.new })
453
+ expect(representation).to be_kind_of(subject)
454
+ expect(representation.object).to be_kind_of(Hash)
455
+ expect(representation.object).to have_key :items
456
+ expect(representation.object[:items]).to be_kind_of Array
457
+ expect(representation.object[:items].size).to be 4
458
+ end
459
+
460
+ it 'serializes items with my root name' do
461
+ subject.present_collection true, :my_items
462
+ subject.expose :my_items
463
+
464
+ representation = subject.represent(4.times.map { Object.new }, serializable: true)
465
+ expect(representation).to be_kind_of(Hash)
466
+ expect(representation).to have_key :my_items
467
+ expect(representation[:my_items]).to be_kind_of Array
468
+ expect(representation[:my_items].size).to be 4
438
469
  end
439
470
  end
440
471
 
@@ -447,37 +478,37 @@ describe Grape::Entity do
447
478
  context 'with a single object' do
448
479
  it 'allows a root element name to be specified' do
449
480
  representation = subject.represent(Object.new)
450
- representation.should be_kind_of Hash
451
- representation.should have_key 'thing'
452
- representation['thing'].should be_kind_of(subject)
481
+ expect(representation).to be_kind_of Hash
482
+ expect(representation).to have_key 'thing'
483
+ expect(representation['thing']).to be_kind_of(subject)
453
484
  end
454
485
  end
455
486
 
456
487
  context 'with an array of objects' do
457
488
  it 'allows a root element name to be specified' do
458
489
  representation = subject.represent(4.times.map { Object.new })
459
- representation.should be_kind_of Hash
460
- representation.should have_key 'things'
461
- representation['things'].should be_kind_of Array
462
- representation['things'].size.should == 4
463
- representation['things'].reject { |r| r.kind_of?(subject) }.should be_empty
490
+ expect(representation).to be_kind_of Hash
491
+ expect(representation).to have_key 'things'
492
+ expect(representation['things']).to be_kind_of Array
493
+ expect(representation['things'].size).to eq 4
494
+ expect(representation['things'].reject { |r| r.kind_of?(subject) }).to be_empty
464
495
  end
465
496
  end
466
497
 
467
498
  context 'it can be overridden' do
468
499
  it 'can be disabled' do
469
500
  representation = subject.represent(4.times.map { Object.new }, root: false)
470
- representation.should be_kind_of Array
471
- representation.size.should == 4
472
- representation.reject { |r| r.kind_of?(subject) }.should be_empty
501
+ expect(representation).to be_kind_of Array
502
+ expect(representation.size).to eq 4
503
+ expect(representation.reject { |r| r.kind_of?(subject) }).to be_empty
473
504
  end
474
505
  it 'can use a different name' do
475
506
  representation = subject.represent(4.times.map { Object.new }, root: 'others')
476
- representation.should be_kind_of Hash
477
- representation.should have_key 'others'
478
- representation['others'].should be_kind_of Array
479
- representation['others'].size.should == 4
480
- representation['others'].reject { |r| r.kind_of?(subject) }.should be_empty
507
+ expect(representation).to be_kind_of Hash
508
+ expect(representation).to have_key 'others'
509
+ expect(representation['others']).to be_kind_of Array
510
+ expect(representation['others'].size).to eq 4
511
+ expect(representation['others'].reject { |r| r.kind_of?(subject) }).to be_empty
481
512
  end
482
513
  end
483
514
  end
@@ -490,18 +521,18 @@ describe Grape::Entity do
490
521
  context 'with a single object' do
491
522
  it 'allows a root element name to be specified' do
492
523
  representation = subject.represent(Object.new)
493
- representation.should be_kind_of Hash
494
- representation.should have_key 'thing'
495
- representation['thing'].should be_kind_of(subject)
524
+ expect(representation).to be_kind_of Hash
525
+ expect(representation).to have_key 'thing'
526
+ expect(representation['thing']).to be_kind_of(subject)
496
527
  end
497
528
  end
498
529
 
499
530
  context 'with an array of objects' do
500
531
  it 'allows a root element name to be specified' do
501
532
  representation = subject.represent(4.times.map { Object.new })
502
- representation.should be_kind_of Array
503
- representation.size.should == 4
504
- representation.reject { |r| r.kind_of?(subject) }.should be_empty
533
+ expect(representation).to be_kind_of Array
534
+ expect(representation.size).to eq 4
535
+ expect(representation.reject { |r| r.kind_of?(subject) }).to be_empty
505
536
  end
506
537
  end
507
538
  end
@@ -513,18 +544,18 @@ describe Grape::Entity do
513
544
 
514
545
  context 'with a single object' do
515
546
  it 'allows a root element name to be specified' do
516
- subject.represent(Object.new).should be_kind_of(subject)
547
+ expect(subject.represent(Object.new)).to be_kind_of(subject)
517
548
  end
518
549
  end
519
550
 
520
551
  context 'with an array of objects' do
521
552
  it 'allows a root element name to be specified' do
522
553
  representation = subject.represent(4.times.map { Object.new })
523
- representation.should be_kind_of Hash
524
- representation.should have_key('things')
525
- representation['things'].should be_kind_of Array
526
- representation['things'].size.should == 4
527
- representation['things'].reject { |r| r.kind_of?(subject) }.should be_empty
554
+ expect(representation).to be_kind_of Hash
555
+ expect(representation).to have_key('things')
556
+ expect(representation['things']).to be_kind_of Array
557
+ expect(representation['things'].size).to eq 4
558
+ expect(representation['things'].reject { |r| r.kind_of?(subject) }).to be_empty
528
559
  end
529
560
  end
530
561
  end
@@ -539,8 +570,8 @@ describe Grape::Entity do
539
570
 
540
571
  it 'has attribute readers for the object and options' do
541
572
  entity = subject.new('abc', {})
542
- entity.object.should == 'abc'
543
- entity.options.should == {}
573
+ expect(entity.object).to eq 'abc'
574
+ expect(entity.options).to eq({})
544
575
  end
545
576
  end
546
577
 
@@ -585,9 +616,9 @@ describe Grape::Entity do
585
616
  fresh_class.expose :email, :nonexistent_attribute, :name, safe: true
586
617
 
587
618
  res = fresh_class.new(model).serializable_hash
588
- res.should have_key :email
589
- res.should_not have_key :nonexistent_attribute
590
- res.should have_key :name
619
+ expect(res).to have_key :email
620
+ expect(res).not_to have_key :nonexistent_attribute
621
+ expect(res).to have_key :name
591
622
  end
592
623
 
593
624
  it "does not expose attributes that don't exist on the object, even with criteria" do
@@ -596,9 +627,9 @@ describe Grape::Entity do
596
627
  fresh_class.expose :nonexistent_attribute2, safe: true, if: lambda { true }
597
628
 
598
629
  res = fresh_class.new(model).serializable_hash
599
- res.should have_key :email
600
- res.should_not have_key :nonexistent_attribute
601
- res.should_not have_key :nonexistent_attribute2
630
+ expect(res).to have_key :email
631
+ expect(res).not_to have_key :nonexistent_attribute
632
+ expect(res).not_to have_key :nonexistent_attribute2
602
633
  end
603
634
  end
604
635
 
@@ -613,7 +644,7 @@ describe Grape::Entity do
613
644
  'well, I do exist after all'
614
645
  end
615
646
  res = fresh_class.new(model).serializable_hash
616
- res.should have_key :nonexistent_attribute
647
+ expect(res).to have_key :nonexistent_attribute
617
648
  end
618
649
 
619
650
  it 'does not expose attributes that are generated by a block but have not passed criteria' do
@@ -621,7 +652,7 @@ describe Grape::Entity do
621
652
  'I exist, but it is not yet my time to shine'
622
653
  }, if: lambda { |_model, _opts| false }
623
654
  res = fresh_class.new(model).serializable_hash
624
- res.should_not have_key :nonexistent_attribute
655
+ expect(res).not_to have_key :nonexistent_attribute
625
656
  end
626
657
  end
627
658
 
@@ -635,7 +666,7 @@ describe Grape::Entity do
635
666
  'well, I do exist after all'
636
667
  end
637
668
  res = fresh_class.new(model).serializable_hash
638
- res.should have_key :nonexistent_attribute
669
+ expect(res).to have_key :nonexistent_attribute
639
670
  end
640
671
 
641
672
  it 'does not expose attributes that are generated by a block but have not passed criteria' do
@@ -643,7 +674,7 @@ describe Grape::Entity do
643
674
  'I exist, but it is not yet my time to shine'
644
675
  }, if: lambda { |_, _| false }
645
676
  res = fresh_class.new(model).serializable_hash
646
- res.should_not have_key :nonexistent_attribute
677
+ expect(res).not_to have_key :nonexistent_attribute
647
678
  end
648
679
 
649
680
  context '#serializable_hash' do
@@ -688,19 +719,19 @@ describe Grape::Entity do
688
719
  it 'serializes embedded objects which respond to #serializable_hash' do
689
720
  fresh_class.expose :name, :embedded
690
721
  presenter = fresh_class.new(EntitySpec::EmbeddedExampleWithOne.new)
691
- presenter.serializable_hash.should == { name: 'abc', embedded: { abc: 'def' } }
722
+ expect(presenter.serializable_hash).to eq(name: 'abc', embedded: { abc: 'def' })
692
723
  end
693
724
 
694
725
  it 'serializes embedded arrays of objects which respond to #serializable_hash' do
695
726
  fresh_class.expose :name, :embedded
696
727
  presenter = fresh_class.new(EntitySpec::EmbeddedExampleWithMany.new)
697
- presenter.serializable_hash.should == { name: 'abc', embedded: [{ abc: 'def' }, { abc: 'def' }] }
728
+ expect(presenter.serializable_hash).to eq(name: 'abc', embedded: [{ abc: 'def' }, { abc: 'def' }])
698
729
  end
699
730
 
700
731
  it 'serializes embedded hashes of objects which respond to #serializable_hash' do
701
732
  fresh_class.expose :name, :embedded
702
733
  presenter = fresh_class.new(EntitySpec::EmbeddedExampleWithHash.new)
703
- presenter.serializable_hash.should == { name: 'abc', embedded: { a: nil, b: { abc: 'def' } } }
734
+ expect(presenter.serializable_hash).to eq(name: 'abc', embedded: { a: nil, b: { abc: 'def' } })
704
735
  end
705
736
  end
706
737
  end
@@ -725,14 +756,14 @@ describe Grape::Entity do
725
756
  end
726
757
 
727
758
  it 'passes through bare expose attributes' do
728
- subject.send(:value_for, :name).should == attributes[:name]
759
+ expect(subject.send(:value_for, :name)).to eq attributes[:name]
729
760
  end
730
761
 
731
762
  it 'instantiates a representation if that is called for' do
732
763
  rep = subject.send(:value_for, :friends)
733
- rep.reject { |r| r.is_a?(fresh_class) }.should be_empty
734
- rep.first.serializable_hash[:name].should == 'Friend 1'
735
- rep.last.serializable_hash[:name].should == 'Friend 2'
764
+ expect(rep.reject { |r| r.is_a?(fresh_class) }).to be_empty
765
+ expect(rep.first.serializable_hash[:name]).to eq 'Friend 1'
766
+ expect(rep.last.serializable_hash[:name]).to eq 'Friend 2'
736
767
  end
737
768
 
738
769
  context 'child representations' do
@@ -749,10 +780,10 @@ describe Grape::Entity do
749
780
  end
750
781
 
751
782
  rep = subject.send(:value_for, :friends)
752
- rep.should be_kind_of Array
753
- rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }.should be_empty
754
- rep.first.serializable_hash[:name].should == 'Friend 1'
755
- rep.last.serializable_hash[:name].should == 'Friend 2'
783
+ expect(rep).to be_kind_of Array
784
+ expect(rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }).to be_empty
785
+ expect(rep.first.serializable_hash[:name]).to eq 'Friend 1'
786
+ expect(rep.last.serializable_hash[:name]).to eq 'Friend 2'
756
787
  end
757
788
 
758
789
  it 'passes through the proc which returns an array of objects with custom options(:using)' do
@@ -770,10 +801,10 @@ describe Grape::Entity do
770
801
  end
771
802
 
772
803
  rep = subject.send(:value_for, :custom_friends)
773
- rep.should be_kind_of Array
774
- rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }.should be_empty
775
- rep.first.serializable_hash.should == { name: 'Friend 1', email: 'friend1@example.com' }
776
- rep.last.serializable_hash.should == { name: 'Friend 2', email: 'friend2@example.com' }
804
+ expect(rep).to be_kind_of Array
805
+ expect(rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }).to be_empty
806
+ expect(rep.first.serializable_hash).to eq(name: 'Friend 1', email: 'friend1@example.com')
807
+ expect(rep.last.serializable_hash).to eq(name: 'Friend 2', email: 'friend2@example.com')
777
808
  end
778
809
 
779
810
  it 'passes through the proc which returns single object with custom options(:using)' do
@@ -791,8 +822,8 @@ describe Grape::Entity do
791
822
  end
792
823
 
793
824
  rep = subject.send(:value_for, :first_friend)
794
- rep.should be_kind_of EntitySpec::FriendEntity
795
- rep.serializable_hash.should == { name: 'Friend 1', email: 'friend1@example.com' }
825
+ expect(rep).to be_kind_of EntitySpec::FriendEntity
826
+ expect(rep.serializable_hash).to eq(name: 'Friend 1', email: 'friend1@example.com')
796
827
  end
797
828
 
798
829
  it 'passes through the proc which returns empty with custom options(:using)' do
@@ -809,8 +840,8 @@ describe Grape::Entity do
809
840
  end
810
841
 
811
842
  rep = subject.send(:value_for, :first_friend)
812
- rep.should be_kind_of EntitySpec::FriendEntity
813
- rep.serializable_hash.should be_nil
843
+ expect(rep).to be_kind_of EntitySpec::FriendEntity
844
+ expect(rep.serializable_hash).to be_nil
814
845
  end
815
846
 
816
847
  it 'passes through custom options' do
@@ -827,16 +858,16 @@ describe Grape::Entity do
827
858
  end
828
859
 
829
860
  rep = subject.send(:value_for, :friends)
830
- rep.should be_kind_of Array
831
- rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }.should be_empty
832
- rep.first.serializable_hash[:email].should be_nil
833
- rep.last.serializable_hash[:email].should be_nil
861
+ expect(rep).to be_kind_of Array
862
+ expect(rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }).to be_empty
863
+ expect(rep.first.serializable_hash[:email]).to be_nil
864
+ expect(rep.last.serializable_hash[:email]).to be_nil
834
865
 
835
866
  rep = subject.send(:value_for, :friends, user_type: :admin)
836
- rep.should be_kind_of Array
837
- rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }.should be_empty
838
- rep.first.serializable_hash[:email].should == 'friend1@example.com'
839
- rep.last.serializable_hash[:email].should == 'friend2@example.com'
867
+ expect(rep).to be_kind_of Array
868
+ expect(rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }).to be_empty
869
+ expect(rep.first.serializable_hash[:email]).to eq 'friend1@example.com'
870
+ expect(rep.last.serializable_hash[:email]).to eq 'friend2@example.com'
840
871
  end
841
872
 
842
873
  it 'ignores the :collection parameter in the source options' do
@@ -853,23 +884,23 @@ describe Grape::Entity do
853
884
  end
854
885
 
855
886
  rep = subject.send(:value_for, :friends, collection: false)
856
- rep.should be_kind_of Array
857
- rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }.should be_empty
858
- rep.first.serializable_hash[:email].should == 'friend1@example.com'
859
- rep.last.serializable_hash[:email].should == 'friend2@example.com'
887
+ expect(rep).to be_kind_of Array
888
+ expect(rep.reject { |r| r.is_a?(EntitySpec::FriendEntity) }).to be_empty
889
+ expect(rep.first.serializable_hash[:email]).to eq 'friend1@example.com'
890
+ expect(rep.last.serializable_hash[:email]).to eq 'friend2@example.com'
860
891
  end
861
892
  end
862
893
 
863
894
  it 'calls through to the proc if there is one' do
864
- subject.send(:value_for, :computed, awesome: 123).should == 123
895
+ expect(subject.send(:value_for, :computed, awesome: 123)).to eq 123
865
896
  end
866
897
 
867
898
  it 'returns a formatted value if format_with is passed' do
868
- subject.send(:value_for, :birthday).should == '02/27/2012'
899
+ expect(subject.send(:value_for, :birthday)).to eq '02/27/2012'
869
900
  end
870
901
 
871
902
  it 'returns a formatted value if format_with is passed a lambda' do
872
- subject.send(:value_for, :fantasies).should == ['Nessy', 'Double Rainbows', 'Unicorns']
903
+ expect(subject.send(:value_for, :fantasies)).to eq ['Nessy', 'Double Rainbows', 'Unicorns']
873
904
  end
874
905
 
875
906
  it 'tries instance methods on the entity first' do
@@ -889,8 +920,8 @@ describe Grape::Entity do
889
920
 
890
921
  friend = double('Friend', name: 'joe', email: 'joe@example.com')
891
922
  rep = EntitySpec::DelegatingEntity.new(friend)
892
- rep.send(:value_for, :name).should == 'cooler name'
893
- rep.send(:value_for, :email).should == 'joe@example.com'
923
+ expect(rep.send(:value_for, :name)).to eq 'cooler name'
924
+ expect(rep.send(:value_for, :email)).to eq 'joe@example.com'
894
925
  end
895
926
 
896
927
  context 'using' do
@@ -907,9 +938,9 @@ describe Grape::Entity do
907
938
  end
908
939
 
909
940
  rep = subject.send(:value_for, :friends)
910
- rep.should be_kind_of Array
911
- rep.size.should == 2
912
- rep.all? { |r| r.is_a?(EntitySpec::UserEntity) }.should be true
941
+ expect(rep).to be_kind_of Array
942
+ expect(rep.size).to eq 2
943
+ expect(rep.all? { |r| r.is_a?(EntitySpec::UserEntity) }).to be true
913
944
  end
914
945
 
915
946
  it 'class' do
@@ -918,9 +949,9 @@ describe Grape::Entity do
918
949
  end
919
950
 
920
951
  rep = subject.send(:value_for, :friends)
921
- rep.should be_kind_of Array
922
- rep.size.should == 2
923
- rep.all? { |r| r.is_a?(EntitySpec::UserEntity) }.should be true
952
+ expect(rep).to be_kind_of Array
953
+ expect(rep.size).to eq 2
954
+ expect(rep.all? { |r| r.is_a?(EntitySpec::UserEntity) }).to be true
924
955
  end
925
956
  end
926
957
  end
@@ -929,7 +960,7 @@ describe Grape::Entity do
929
960
  it 'returns an empty hash is no documentation is provided' do
930
961
  fresh_class.expose :name
931
962
 
932
- subject.documentation.should == {}
963
+ expect(subject.documentation).to eq({})
933
964
  end
934
965
 
935
966
  it 'returns each defined documentation hash' do
@@ -938,7 +969,7 @@ describe Grape::Entity do
938
969
  fresh_class.expose :email, documentation: doc
939
970
  fresh_class.expose :birthday
940
971
 
941
- subject.documentation.should == { name: doc, email: doc }
972
+ expect(subject.documentation).to eq(name: doc, email: doc)
942
973
  end
943
974
 
944
975
  it 'returns each defined documentation hash with :as param considering' do
@@ -947,24 +978,24 @@ describe Grape::Entity do
947
978
  fresh_class.expose :email, documentation: doc
948
979
  fresh_class.expose :birthday
949
980
 
950
- subject.documentation.should == { label: doc, email: doc }
981
+ expect(subject.documentation).to eq(label: doc, email: doc)
951
982
  end
952
983
  end
953
984
 
954
985
  describe '#key_for' do
955
986
  it 'returns the attribute if no :as is set' do
956
987
  fresh_class.expose :name
957
- subject.class.send(:key_for, :name).should == :name
988
+ expect(subject.class.send(:key_for, :name)).to eq :name
958
989
  end
959
990
 
960
991
  it 'returns a symbolized version of the attribute' do
961
992
  fresh_class.expose :name
962
- subject.class.send(:key_for, 'name').should == :name
993
+ expect(subject.class.send(:key_for, 'name')).to eq :name
963
994
  end
964
995
 
965
996
  it 'returns the :as alias if one exists' do
966
997
  fresh_class.expose :name, as: :nombre
967
- subject.class.send(:key_for, 'name').should == :nombre
998
+ expect(subject.class.send(:key_for, 'name')).to eq :nombre
968
999
  end
969
1000
  end
970
1001
 
@@ -972,54 +1003,54 @@ describe Grape::Entity do
972
1003
  it 'only passes through hash :if exposure if all attributes match' do
973
1004
  exposure_options = { if: { condition1: true, condition2: true } }
974
1005
 
975
- subject.send(:conditions_met?, exposure_options, {}).should be false
976
- subject.send(:conditions_met?, exposure_options, condition1: true).should be false
977
- subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true).should be true
978
- subject.send(:conditions_met?, exposure_options, condition1: false, condition2: true).should be false
979
- subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true, other: true).should be true
1006
+ expect(subject.send(:conditions_met?, exposure_options, {})).to be false
1007
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true)).to be false
1008
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true)).to be true
1009
+ expect(subject.send(:conditions_met?, exposure_options, condition1: false, condition2: true)).to be false
1010
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true, other: true)).to be true
980
1011
  end
981
1012
 
982
1013
  it 'looks for presence/truthiness if a symbol is passed' do
983
1014
  exposure_options = { if: :condition1 }
984
1015
 
985
- subject.send(:conditions_met?, exposure_options, {}).should be false
986
- subject.send(:conditions_met?, exposure_options, condition1: true).should be true
987
- subject.send(:conditions_met?, exposure_options, condition1: false).should be false
988
- subject.send(:conditions_met?, exposure_options, condition1: nil).should be false
1016
+ expect(subject.send(:conditions_met?, exposure_options, {})).to be false
1017
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true)).to be true
1018
+ expect(subject.send(:conditions_met?, exposure_options, condition1: false)).to be false
1019
+ expect(subject.send(:conditions_met?, exposure_options, condition1: nil)).to be false
989
1020
  end
990
1021
 
991
1022
  it 'looks for absence/falsiness if a symbol is passed' do
992
1023
  exposure_options = { unless: :condition1 }
993
1024
 
994
- subject.send(:conditions_met?, exposure_options, {}).should be true
995
- subject.send(:conditions_met?, exposure_options, condition1: true).should be false
996
- subject.send(:conditions_met?, exposure_options, condition1: false).should be true
997
- subject.send(:conditions_met?, exposure_options, condition1: nil).should be true
1025
+ expect(subject.send(:conditions_met?, exposure_options, {})).to be true
1026
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true)).to be false
1027
+ expect(subject.send(:conditions_met?, exposure_options, condition1: false)).to be true
1028
+ expect(subject.send(:conditions_met?, exposure_options, condition1: nil)).to be true
998
1029
  end
999
1030
 
1000
1031
  it 'only passes through proc :if exposure if it returns truthy value' do
1001
1032
  exposure_options = { if: lambda { |_, opts| opts[:true] } }
1002
1033
 
1003
- subject.send(:conditions_met?, exposure_options, true: false).should be false
1004
- subject.send(:conditions_met?, exposure_options, true: true).should be true
1034
+ expect(subject.send(:conditions_met?, exposure_options, true: false)).to be false
1035
+ expect(subject.send(:conditions_met?, exposure_options, true: true)).to be true
1005
1036
  end
1006
1037
 
1007
1038
  it 'only passes through hash :unless exposure if any attributes do not match' do
1008
1039
  exposure_options = { unless: { condition1: true, condition2: true } }
1009
1040
 
1010
- subject.send(:conditions_met?, exposure_options, {}).should be true
1011
- subject.send(:conditions_met?, exposure_options, condition1: true).should be false
1012
- subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true).should be false
1013
- subject.send(:conditions_met?, exposure_options, condition1: false, condition2: true).should be false
1014
- subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true, other: true).should be false
1015
- subject.send(:conditions_met?, exposure_options, condition1: false, condition2: false).should be true
1041
+ expect(subject.send(:conditions_met?, exposure_options, {})).to be true
1042
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true)).to be false
1043
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true)).to be false
1044
+ expect(subject.send(:conditions_met?, exposure_options, condition1: false, condition2: true)).to be false
1045
+ expect(subject.send(:conditions_met?, exposure_options, condition1: true, condition2: true, other: true)).to be false
1046
+ expect(subject.send(:conditions_met?, exposure_options, condition1: false, condition2: false)).to be true
1016
1047
  end
1017
1048
 
1018
1049
  it 'only passes through proc :unless exposure if it returns falsy value' do
1019
1050
  exposure_options = { unless: lambda { |_, options| options[:true] == true } }
1020
1051
 
1021
- subject.send(:conditions_met?, exposure_options, true: false).should be true
1022
- subject.send(:conditions_met?, exposure_options, true: true).should be false
1052
+ expect(subject.send(:conditions_met?, exposure_options, true: false)).to be true
1053
+ expect(subject.send(:conditions_met?, exposure_options, true: true)).to be false
1023
1054
  end
1024
1055
  end
1025
1056
 
@@ -1027,9 +1058,9 @@ describe Grape::Entity do
1027
1058
  subject { Class.new }
1028
1059
 
1029
1060
  it 'creates an Entity class when called' do
1030
- subject.should_not be_const_defined :Entity
1061
+ expect(subject).not_to be_const_defined :Entity
1031
1062
  subject.send(:include, Grape::Entity::DSL)
1032
- subject.should be_const_defined :Entity
1063
+ expect(subject).to be_const_defined :Entity
1033
1064
  end
1034
1065
 
1035
1066
  context 'pre-mixed' do
@@ -1040,19 +1071,19 @@ describe Grape::Entity do
1040
1071
  expose :name
1041
1072
  end
1042
1073
 
1043
- subject.entity_class.exposures.should_not be_empty
1074
+ expect(subject.entity_class.exposures).not_to be_empty
1044
1075
  end
1045
1076
 
1046
1077
  it 'is able to expose straight from the class' do
1047
1078
  subject.entity :name, :email
1048
- subject.entity_class.exposures.size.should == 2
1079
+ expect(subject.entity_class.exposures.size).to eq 2
1049
1080
  end
1050
1081
 
1051
1082
  it 'is able to mix field and advanced exposures' do
1052
1083
  subject.entity :name, :email do
1053
1084
  expose :third
1054
1085
  end
1055
- subject.entity_class.exposures.size.should == 3
1086
+ expect(subject.entity_class.exposures.size).to eq 3
1056
1087
  end
1057
1088
 
1058
1089
  context 'instance' do
@@ -1060,15 +1091,15 @@ describe Grape::Entity do
1060
1091
 
1061
1092
  describe '#entity' do
1062
1093
  it 'is an instance of the entity class' do
1063
- instance.entity.should be_kind_of(subject.entity_class)
1094
+ expect(instance.entity).to be_kind_of(subject.entity_class)
1064
1095
  end
1065
1096
 
1066
1097
  it 'has an object of itself' do
1067
- instance.entity.object.should == instance
1098
+ expect(instance.entity.object).to eq instance
1068
1099
  end
1069
1100
 
1070
1101
  it 'instantiates with options if provided' do
1071
- instance.entity(awesome: true).options.should == { awesome: true }
1102
+ expect(instance.entity(awesome: true).options).to eq(awesome: true)
1072
1103
  end
1073
1104
  end
1074
1105
  end