grape-entity 0.5.1 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6316984d3c73b100e20294679aa32bf4a9fccffd
4
- data.tar.gz: 8f687c1d19b89540afb58a9a5c83b4b4a51e0fb1
3
+ metadata.gz: 37f12961d0bb27814ea3e9276b02b41ea1ed798b
4
+ data.tar.gz: 00a68c4665543223ecbd8e3d11f901981ef3960a
5
5
  SHA512:
6
- metadata.gz: 0639798ea31a230451bc8480cf6bd97818d703d3b978c204d519237ef9accf2aff1834335d749a018a9f476c927355b5e804043680b2237aa11495cdead86bcf
7
- data.tar.gz: daff836f74b47ad4b321b647387100bced7b484d734dfa7c2627f5b1d487b4307ed5cdbf4cd0c02018e2b3be3decea9d66d2dd8c08585c2f5bc1355e42aee71d
6
+ metadata.gz: b034eb40a7a12229251c4d87e31cf365c7282d4b7016859baa8ca3409cb308191594d59ddb838b6ab2f1607cdb1d3e6478267eb735c41d3c63d3a612a4cf6418
7
+ data.tar.gz: 8c2d400de75c142e64d1bce531d0433c19f1312700893a49a5ff893888221ec73d0d00b193374b3f03d374cfa4af6424ab5af0fb7985cbd2f4dcf677fdba72f8
@@ -4,18 +4,23 @@ language: ruby
4
4
 
5
5
  cache: bundler
6
6
 
7
+ bundler_args: --without development
8
+
7
9
  rvm:
8
- - ruby-head
10
+ - 2.3.1
9
11
  - 2.3.0
10
12
  - 2.2
11
13
  - 2.1
12
14
  - 2.0.0
13
- - 1.9.3
14
- - jruby-19mode
15
+ - ruby-head
15
16
  - jruby-head
16
17
  - rbx-2
17
18
 
18
19
  matrix:
20
+ include:
21
+ - rvm: 2.3.1
22
+ script:
23
+ - bundle exec danger
19
24
  allow_failures:
20
25
  - rvm: ruby-head
21
26
  - rvm: jruby-head
@@ -1,38 +1,74 @@
1
- 0.5.1 (2016-4-4)
2
- ================
1
+ ### Next
2
+
3
+ #### Features
4
+
5
+ * Your contribution here.
6
+
7
+ #### Fixes
8
+
9
+ * Your contribution here.
10
+
11
+ ### 0.5.2 (2016-11-14)
12
+
13
+ #### Features
14
+
15
+ * [#226](https://github.com/ruby-grape/grape-entity/pull/226): Added `fetch` from `opts_hash` - [@alanjcfs](https://github.com/alanjcfs).
16
+ * [#232](https://github.com/ruby-grape/grape-entity/pull/232), [#213](https://github.com/ruby-grape/grape-entity/issues/213): Added `#kind_of?` and `#is_a?` to `OutputBuilder` to get an exact class of an `output` object - [@avyy](https://github.com/avyy).
17
+ * [#234](https://github.com/ruby-grape/grape-entity/pull/234), [#233](https://github.com/ruby-grape/grape-entity/issues/233): Added ruby version checking in `Gemfile` to install needed gems versions for supporting old rubies too - [@avyy](https://github.com/avyy).
18
+ * [#237](https://github.com/ruby-grape/grape-entity/pull/237): Added Danger, PR linter - [@dblock](https://github.com/dblock).
19
+
20
+ #### Fixes
21
+
22
+ * [#215](https://github.com/ruby-grape/grape-entity/pull/217): `#delegate_attribute` no longer delegates to methods included with `Kernel` - [@maltoe](https://github.com/maltoe).
23
+ * [#219](https://github.com/ruby-grape/grape-entity/pull/219): Double pass options in `serializable_hash` - [@sbatykov](https://github.com/sbatykov).
24
+ * [#231](https://github.com/ruby-grape/grape-entity/pull/231), [#215](https://github.com/ruby-grape/grape-entity/issues/215): Allow `delegate_attribute` for derived entity - [@sbatykov](https://github.com/sbatykov).
25
+
26
+ ### 0.5.1 (2016-4-4)
27
+
28
+ #### Features
3
29
 
4
- * [#202](https://github.com/ruby-grape/grape-entity/pull/202): Fix: Reset `@using_class` memoization on `.setup` - [@rngtng](https://github.com/rngtng).
5
30
  * [#203](https://github.com/ruby-grape/grape-entity/pull/203): `Grape::Entity::Exposure::NestingExposure::NestedExposures.delete_if` always returns exposures - [@rngtng](https://github.com/rngtng).
6
31
  * [#204](https://github.com/ruby-grape/grape-entity/pull/204), [#138](https://github.com/ruby-grape/grape-entity/issues/138): Added ability to merge fields into hashes/root (`:merge` option for `.expose`) - [@avyy](https://github.com/avyy).
7
32
 
8
- 0.5.0 (2015-12-07)
9
- ==================
33
+ #### Fixes
34
+
35
+ * [#202](https://github.com/ruby-grape/grape-entity/pull/202): Reset `@using_class` memoization on `.setup` - [@rngtng](https://github.com/rngtng).
36
+
37
+ ### 0.5.0 (2015-12-07)
38
+
39
+ #### Features
10
40
 
11
41
  * [#139](https://github.com/ruby-grape/grape-entity/pull/139): Keep a track of attribute nesting path during condition check or runtime exposure - [@calfzhou](https://github.com/calfzhou).
12
42
  * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `.exposures` is removed and substituted with `.root_exposures` array - [@marshall-lee](https://github.com/marshall-lee).
13
43
  * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `.nested_exposures` is removed too - [@marshall-lee](https://github.com/marshall-lee).
14
44
  * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `#should_return_attribute?`, `#only_fields` and `#except_fields` are moved to other classes - [@marshall-lee](https://github.com/marshall-lee).
15
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: double exposures with conditions does not rewrite previously defined now: [#56](https://github.com/ruby-grape/grape-entity/issues/56) - [@marshall-lee](https://github.com/marshall-lee).
16
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: nested exposures were flattened in `.documentation`: [#112](https://github.com/ruby-grape/grape-entity/issues/112) - [@marshall-lee](https://github.com/marshall-lee).
17
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: `@only_fields` and `@except_fields` memoization: [#149](https://github.com/ruby-grape/grape-entity/issues/149) - [@marshall-lee](https://github.com/marshall-lee).
18
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: `:unless` condition with `Hash` argument logic: [#150](https://github.com/ruby-grape/grape-entity/issues/150) - [@marshall-lee](https://github.com/marshall-lee).
19
45
  * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Nested `unexpose` now raises an exception: [#152](https://github.com/ruby-grape/grape-entity/issues/152) - [@marshall-lee](https://github.com/marshall-lee).
20
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: `@documentation` memoization: [#153](https://github.com/ruby-grape/grape-entity/issues/153) - [@marshall-lee](https://github.com/marshall-lee).
21
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: serializing of deeply nested presenter exposures: [#155](https://github.com/ruby-grape/grape-entity/issues/155) - [@marshall-lee](https://github.com/marshall-lee).
22
- * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Fix: deep projections (`:only`, `:except`) were unaware of nesting: [#156](https://github.com/ruby-grape/grape-entity/issues/156) - [@marshall-lee](https://github.com/marshall-lee).
23
46
 
24
- 0.4.8 (2015-08-10)
25
- ==================
47
+ #### Fixes
48
+
49
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Double exposures with conditions does not rewrite previously defined now: [#56](https://github.com/ruby-grape/grape-entity/issues/56) - [@marshall-lee](https://github.com/marshall-lee).
50
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Nested exposures were flattened in `.documentation`: [#112](https://github.com/ruby-grape/grape-entity/issues/112) - [@marshall-lee](https://github.com/marshall-lee).
51
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `@only_fields` and `@except_fields` memoization: [#149](https://github.com/ruby-grape/grape-entity/issues/149) - [@marshall-lee](https://github.com/marshall-lee).
52
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `:unless` condition with `Hash` argument logic: [#150](https://github.com/ruby-grape/grape-entity/issues/150) - [@marshall-lee](https://github.com/marshall-lee).
53
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): `@documentation` memoization: [#153](https://github.com/ruby-grape/grape-entity/issues/153) - [@marshall-lee](https://github.com/marshall-lee).
54
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Serializing of deeply nested presenter exposures: [#155](https://github.com/ruby-grape/grape-entity/issues/155) - [@marshall-lee](https://github.com/marshall-lee).
55
+ * [#151](https://github.com/ruby-grape/grape-entity/pull/151): Deep projections (`:only`, `:except`) were unaware of nesting: [#156](https://github.com/ruby-grape/grape-entity/issues/156) - [@marshall-lee](https://github.com/marshall-lee).
56
+
57
+ ### 0.4.8 (2015-08-10)
58
+
59
+ #### Features
26
60
 
27
- * [#167](https://github.com/ruby-grape/grape-entity/pull/167): Regression: global settings (exposures, formatters) on `Grape::Entity` should work: [#166](https://github.com/ruby-grape/grape-entity/issues/166) - [@marshall-lee](http://github.com/marshall-lee).
61
+ * [#167](https://github.com/ruby-grape/grape-entity/pull/167), [#166](https://github.com/ruby-grape/grape-entity/issues/166): Regression with global settings (exposures, formatters) on `Grape::Entity` - [@marshall-lee](https://github.com/marshall-lee).
28
62
 
29
- 0.4.7 (2015-08-03)
30
- ==================
63
+ ### 0.4.7 (2015-08-03)
31
64
 
32
- * [#164](https://github.com/ruby-grape/grape-entity/pull/164): Regression: entity instance methods were exposed with `NoMethodError`: [#163](https://github.com/ruby-grape/grape-entity/issues/163) - [@marshall-lee](http://github.com/marshall-lee).
65
+ #### Features
33
66
 
34
- 0.4.6 (2015-07-27)
35
- ==================
67
+ * [#164](https://github.com/ruby-grape/grape-entity/pull/164): Regression: entity instance methods were exposed with `NoMethodError`: [#163](https://github.com/ruby-grape/grape-entity/issues/163) - [@marshall-lee](https://github.com/marshall-lee).
68
+
69
+ ### 0.4.6 (2015-07-27)
70
+
71
+ #### Features
36
72
 
37
73
  * [#114](https://github.com/ruby-grape/grape-entity/pull/114): Added 'only' option that selects which attributes should be returned - [@estevaoam](https://github.com/estevaoam).
38
74
  * [#115](https://github.com/ruby-grape/grape-entity/pull/115): Allowing 'root' to be inherited from parent to child entities - [@guidoprincess](https://github.com/guidoprincess).
@@ -40,46 +76,61 @@
40
76
  * [#134](https://github.com/ruby-grape/grape-entity/pull/134): Subclasses no longer affected in all cases by `unexpose` in parent - [@etehtsea](https://github.com/etehtsea).
41
77
  * [#135](https://github.com/ruby-grape/grape-entity/pull/135): Added `except` option - [@dan-corneanu](https://github.com/dan-corneanu).
42
78
  * [#136](https://github.com/ruby-grape/grape-entity/pull/136): Allow for strings in `only` and `except` options - [@bswinnerton](https://github.com/bswinnerton).
43
- * [#147](https://github.com/ruby-grape/grape-entity/pull/147): Expose `safe` attributes as `nil` if they cannot be evaluated: [#140](https://github.com/ruby-grape/grape-entity/issues/140) - [@marshall-lee](http://github.com/marshall-lee).
44
- * [#147](https://github.com/ruby-grape/grape-entity/pull/147): Fix: private method values were not exposed with `safe` option: [#142](https://github.com/ruby-grape/grape-entity/pull/142) - [@marshall-lee](http://github.com/marshall-lee).
45
- * [#147](https://github.com/ruby-grape/grape-entity/pull/147): Remove catching of `NoMethodError` because it can occur deep inside in a method call so this exception does not mean that attribute not exist - [@marshall-lee](http://github.com/marshall-lee).
46
- * [#147](https://github.com/ruby-grape/grape-entity/pull/147): `valid_exposures` is removed - [@marshall-lee](http://github.com/marshall-lee).
79
+ * [#147](https://github.com/ruby-grape/grape-entity/pull/147), [#140](https://github.com/ruby-grape/grape-entity/issues/140): Expose `safe` attributes as `nil` if they cannot be evaluated - [@marshall-lee](https://github.com/marshall-lee).
80
+ * [#147](https://github.com/ruby-grape/grape-entity/pull/147): Remove catching of `NoMethodError` because it can occur deep inside in a method call so this exception does not mean that attribute not exist - [@marshall-lee](https://github.com/marshall-lee).
81
+ * [#147](https://github.com/ruby-grape/grape-entity/pull/147): The `valid_exposures` method was removed - [@marshall-lee](https://github.com/marshall-lee).
82
+
83
+ #### Fixes
84
+
85
+ * [#147](https://github.com/ruby-grape/grape-entity/pull/147), [#142](https://github.com/ruby-grape/grape-entity/pull/142): Private method values were not exposed with `safe` option - [@marshall-lee](https://github.com/marshall-lee).
47
86
 
48
- 0.4.5 (2015-03-10)
49
- ==================
87
+ ### 0.4.5 (2015-03-10)
88
+
89
+ #### Features
50
90
 
51
91
  * [#109](https://github.com/ruby-grape/grape-entity/pull/109): Added `unexpose` method - [@jonmchan](https://github.com/jonmchan).
52
92
  * [#98](https://github.com/ruby-grape/grape-entity/pull/98): Added nested conditionals - [@zbelzer](https://github.com/zbelzer).
53
93
  * [#105](https://github.com/ruby-grape/grape-entity/pull/105): Specify which attribute is missing in which Entity - [@jhollinger](https://github.com/jhollinger).
54
- * [#111](https://github.com/ruby-grape/grape-entity/pull/111): Fix: allow usage of attributes with name 'key' if `Hash` objects are used - [@croeck](https://github.com/croeck).
55
- * [#110](https://github.com/ruby-grape/grape-entity/pull/110): Fix: safe exposure when using `Hash` models - [@croeck](https://github.com/croeck).
56
- * [#91](https://github.com/ruby-grape/grape-entity/pull/91): Fix: OpenStruct serializing - [@etehtsea](https://github.com/etehtsea).
57
94
 
58
- 0.4.4 (2014-08-17)
59
- ==================
95
+ #### Fixes
96
+
97
+ * [#111](https://github.com/ruby-grape/grape-entity/pull/111): Allow usage of attributes with name 'key' if `Hash` objects are used - [@croeck](https://github.com/croeck).
98
+ * [#110](https://github.com/ruby-grape/grape-entity/pull/110): Safe exposure when using `Hash` models - [@croeck](https://github.com/croeck).
99
+ * [#91](https://github.com/ruby-grape/grape-entity/pull/91): OpenStruct serializing - [@etehtsea](https://github.com/etehtsea).
100
+
101
+ ### 0.4.4 (2014-08-17)
102
+
103
+ #### Features
60
104
 
61
105
  * [#85](https://github.com/ruby-grape/grape-entity/pull/85): Added `present_collection` to indicate that an `Entity` presents an entire Collection - [@dspaeth-faber](https://github.com/dspaeth-faber).
62
- * [#85](https://guthub.com/ruby-grape/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).
106
+ * [#85](https://github.com/ruby-grape/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).
63
107
 
64
- 0.4.3 (2014-06-12)
65
- ==================
108
+ ### 0.4.3 (2014-06-12)
66
109
 
67
- * [#77](https://github.com/ruby-grape/grape-entity/pull/77): Fix: compatibility with Rspec 3 - [@justfalter](https://github.com/justfalter).
68
- * [#76](https://github.com/ruby-grape/grape-entity/pull/76): Improve performance of entity serialization - [@justfalter](https://github.com/justfalter)
110
+ #### Features
69
111
 
70
- 0.4.2 (2014-04-03)
71
- ==================
112
+ * [#76](https://github.com/ruby-grape/grape-entity/pull/76): Improve performance of entity serialization - [@justfalter](https://github.com/justfalter).
113
+
114
+ #### Fixes
115
+
116
+ * [#77](https://github.com/ruby-grape/grape-entity/pull/77): Compatibility with Rspec 3 - [@justfalter](https://github.com/justfalter).
117
+
118
+ ### 0.4.2 (2014-04-03)
119
+
120
+ #### Features
72
121
 
73
122
  * [#60](https://github.com/ruby-grape/grape-entity/issues/59): Performance issues introduced by nested exposures - [@AlexYankee](https://github.com/AlexYankee).
74
123
  * [#60](https://github.com/ruby-grape/grape-entity/issues/57): Nested exposure double-exposes a field - [@AlexYankee](https://github.com/AlexYankee).
75
124
 
76
- 0.4.1 (2014-02-13)
77
- ==================
125
+ ### 0.4.1 (2014-02-13)
126
+
127
+ #### Fixes
78
128
 
79
129
  * [#54](https://github.com/ruby-grape/grape-entity/issues/54): Fix: undefined method `to_set` - [@aj0strow](https://github.com/aj0strow).
80
130
 
81
- 0.4.0 (2014-01-27)
82
- ==================
131
+ ### 0.4.0 (2014-01-27)
132
+
133
+ #### Features
83
134
 
84
135
  * Ruby 1.8.x is no longer supported - [@dblock](https://github.com/dblock).
85
136
  * [#36](https://github.com/ruby-grape/grape-entity/pull/36): Enforcing Ruby style guidelines via Rubocop - [@dblock](https://github.com/dblock).
@@ -96,19 +147,20 @@
96
147
  * [#51](https://github.com/ruby-grape/grape-entity/pull/51): Raise `ArgumentError` if an unknown option is used with `expose` - [@aj0strow](https://github.com/aj0strow).
97
148
  * [#51](https://github.com/ruby-grape/grape-entity/pull/51): Alias `:with` to `:using`, consistently with the Grape api endpoints - [@aj0strow](https://github.com/aj0strow).
98
149
 
99
- 0.3.0 (2013-03-29)
100
- ==================
150
+ ### 0.3.0 (2013-03-29)
151
+
152
+ #### Features
101
153
 
102
154
  * [#9](https://github.com/ruby-grape/grape-entity/pull/9): Added `with_options` for block-level exposure setting - [@SegFaultAX](https://github.com/SegFaultAX).
103
155
  * The `instance.entity` method now optionally accepts `options` - [@mbleigh](https://github.com/mbleigh).
104
156
  * You can pass symbols to `:if` and `:unless` to simply check for truthiness/falsiness of the specified options key - [@mbleigh](https://github.com/mbleigh).
105
157
 
106
- 0.2.0 (2013-01-11)
107
- ==================
158
+ ### 0.2.0 (2013-01-11)
159
+
160
+ #### Features
108
161
 
109
162
  * Moved the namespace back to `Grape::Entity` to preserve compatibility with Grape - [@dblock](https://github.com/dblock).
110
163
 
111
- 0.1.0 (2013-01-11)
112
- ==================
164
+ ### 0.1.0 (2013-01-11)
113
165
 
114
166
  * Initial public release - [@agileanimal](https://github.com/agileanimal).
@@ -0,0 +1 @@
1
+ danger.import_dangerfile(gem: 'ruby-grape-danger')
data/Gemfile CHANGED
@@ -2,15 +2,34 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- group :development, :test do
5
+ current_ruby_version = Gem::Version.new(RUBY_VERSION)
6
+
7
+ if Gem::Requirement.new('>= 2.2.2').satisfied_by? current_ruby_version
8
+ gem 'activesupport', '~> 5.0'
9
+ gem 'rack', '~> 2.0', group: [:development, :test]
10
+ else
11
+ gem 'activesupport', '~> 4.0'
12
+ gem 'rack', '< 2', group: [:development, :test]
13
+ end
14
+
15
+ gem 'json', '< 2', group: [:development, :test]
16
+
17
+ group :development do
6
18
  gem 'pry'
7
19
  gem 'guard'
8
20
  gem 'guard-rspec'
9
21
  gem 'guard-bundler'
10
22
  gem 'rb-fsevent'
11
23
  gem 'growl'
12
- gem 'json'
24
+ end
25
+
26
+ group :development, :test do
27
+ gem 'rake'
13
28
  gem 'rspec'
14
29
  gem 'rack-test', '~> 0.6.2', require: 'rack/test'
15
30
  gem 'rubocop', '0.31.0'
16
31
  end
32
+
33
+ group :test do
34
+ gem 'ruby-grape-danger', '~> 0.1.0', require: false
35
+ end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Michael Bleigh and Intridea, Inc.
1
+ Copyright (c) 2010-2016 Michael Bleigh, Intridea, Inc., ruby-grape and Contributors.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -212,7 +212,7 @@ on the object the entity wraps.
212
212
  class ExampleEntity < Grape::Entity
213
213
  expose :attr_not_on_wrapped_object
214
214
  # ...
215
- private
215
+ private
216
216
 
217
217
  def attr_not_on_wrapped_object
218
218
  42
@@ -226,7 +226,7 @@ You have always access to the presented instance with `object`
226
226
  class ExampleEntity < Grape::Entity
227
227
  expose :formatted_value
228
228
  # ...
229
- private
229
+ private
230
230
 
231
231
  def formatted_value
232
232
  "+ X #{object.value}"
@@ -311,10 +311,41 @@ expose :replies, using: API::Entities::Status, as: :responses
311
311
  Apply a formatter before exposing a value.
312
312
 
313
313
  ```ruby
314
- format_with(:iso_timestamp) { |dt| dt.iso8601 }
315
- with_options(format_with: :iso_timestamp) do
316
- expose :created_at
317
- expose :updated_at
314
+ module Entities
315
+ class MyModel < Grape::Entity
316
+ format_with(:iso_timestamp) do |date|
317
+ date.iso8601
318
+ end
319
+
320
+ with_options(format_with: :iso_timestamp) do
321
+ expose :created_at
322
+ expose :updated_at
323
+ end
324
+ end
325
+ end
326
+ ```
327
+
328
+ Defining a reusable formatter between multiples entities:
329
+
330
+ ```ruby
331
+ module ApiHelpers
332
+ extend Grape::API::Helpers
333
+
334
+ Grape::Entity.format_with :utc do |date|
335
+ date.utc if date
336
+ end
337
+ end
338
+ ```
339
+
340
+ ```ruby
341
+ module Entities
342
+ class MyModel < Grape::Entity
343
+ expose :updated_at, format_with: :utc
344
+ end
345
+
346
+ class AnotherModel < Grape::Entity
347
+ expose :created_at, format_with: :utc
348
+ end
318
349
  end
319
350
  ```
320
351
 
@@ -413,7 +444,7 @@ The above will automatically create a `Status::Entity` class and define properti
413
444
 
414
445
  ### Using Entities
415
446
 
416
- 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.
447
+ 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 (unless namespaced entity classes are used, see [next section](#entity-organization)).
417
448
  If the entity includes documentation it can be included in an endpoint's description.
418
449
 
419
450
  ```ruby
@@ -516,4 +547,4 @@ MIT License. See [LICENSE](LICENSE) for details.
516
547
 
517
548
  ## Copyright
518
549
 
519
- Copyright (c) 2010-2014 Michael Bleigh, Intridea, Inc., and contributors.
550
+ Copyright (c) 2010-2016 Michael Bleigh, Intridea, Inc., ruby-grape and Contributors.
@@ -14,10 +14,8 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.rubyforge_project = 'grape-entity'
16
16
 
17
- s.add_runtime_dependency 'activesupport'
18
17
  s.add_runtime_dependency 'multi_json', '>= 1.3.2'
19
18
 
20
- s.add_development_dependency 'rake'
21
19
  s.add_development_dependency 'maruku'
22
20
  s.add_development_dependency 'yard'
23
21
  s.add_development_dependency 'rspec', '~> 2.9'
@@ -478,7 +478,7 @@ module Grape
478
478
  end
479
479
 
480
480
  def delegate_attribute(attribute)
481
- if respond_to?(attribute, true)
481
+ if respond_to?(attribute, true) && Grape::Entity > method(attribute).owner
482
482
  send(attribute)
483
483
  else
484
484
  delegator.delegate(attribute)
@@ -63,7 +63,7 @@ module Grape
63
63
  partial_output = valid_value(entity, options)
64
64
 
65
65
  if partial_output.respond_to?(:serializable_hash)
66
- partial_output.serializable_hash(options)
66
+ partial_output.serializable_hash
67
67
  elsif partial_output.is_a?(Array) && partial_output.all? { |o| o.respond_to?(:serializable_hash) }
68
68
  partial_output.map(&:serializable_hash)
69
69
  elsif partial_output.is_a?(Hash)
@@ -25,6 +25,11 @@ module Grape
25
25
  end
26
26
  end
27
27
 
28
+ def kind_of?(klass)
29
+ klass == output.class || super
30
+ end
31
+ alias_method :is_a?, :kind_of?
32
+
28
33
  def __getobj__
29
34
  output
30
35
  end
@@ -15,6 +15,10 @@ module Grape
15
15
  @opts_hash[key]
16
16
  end
17
17
 
18
+ def fetch(*args)
19
+ @opts_hash.fetch(*args)
20
+ end
21
+
18
22
  def key?(key)
19
23
  @opts_hash.key? key
20
24
  end
@@ -1,3 +1,3 @@
1
1
  module GrapeEntity
2
- VERSION = '0.5.1'
2
+ VERSION = '0.5.2'.freeze
3
3
  end
@@ -905,6 +905,7 @@ describe Grape::Entity do
905
905
 
906
906
  representation = subject.represent(4.times.map { Object.new }, serializable: true)
907
907
  expect(representation).to be_kind_of(Grape::Entity::Exposure::NestingExposure::OutputBuilder)
908
+ expect(representation).to be_kind_of(Hash)
908
909
  expect(representation).to have_key :my_items
909
910
  expect(representation[:my_items]).to be_kind_of Array
910
911
  expect(representation[:my_items].size).to be 4
@@ -1523,12 +1524,13 @@ describe Grape::Entity do
1523
1524
  expect(subject.value_for(:fantasies)).to eq ['Nessy', 'Double Rainbows', 'Unicorns']
1524
1525
  end
1525
1526
 
1526
- it 'tries instance methods on the entity first' do
1527
+ context 'delegate_attribute' do
1527
1528
  module EntitySpec
1528
1529
  class DelegatingEntity < Grape::Entity
1529
1530
  root 'friends', 'friend'
1530
1531
  expose :name
1531
1532
  expose :email
1533
+ expose :system
1532
1534
 
1533
1535
  private
1534
1536
 
@@ -1538,14 +1540,33 @@ describe Grape::Entity do
1538
1540
  end
1539
1541
  end
1540
1542
 
1541
- friend = double('Friend', name: 'joe', email: 'joe@example.com')
1542
- rep = EntitySpec::DelegatingEntity.new(friend)
1543
- expect(rep.value_for(:name)).to eq 'cooler name'
1544
- expect(rep.value_for(:email)).to eq 'joe@example.com'
1543
+ it 'tries instance methods on the entity first' do
1544
+ friend = double('Friend', name: 'joe', email: 'joe@example.com')
1545
+ rep = EntitySpec::DelegatingEntity.new(friend)
1546
+ expect(rep.value_for(:name)).to eq 'cooler name'
1547
+ expect(rep.value_for(:email)).to eq 'joe@example.com'
1545
1548
 
1546
- another_friend = double('Friend', email: 'joe@example.com')
1547
- rep = EntitySpec::DelegatingEntity.new(another_friend)
1548
- expect(rep.value_for(:name)).to eq 'cooler name'
1549
+ another_friend = double('Friend', email: 'joe@example.com')
1550
+ rep = EntitySpec::DelegatingEntity.new(another_friend)
1551
+ expect(rep.value_for(:name)).to eq 'cooler name'
1552
+ end
1553
+
1554
+ it 'does not delegate Kernel methods' do
1555
+ foo = double 'Foo', system: 'System'
1556
+ rep = EntitySpec::DelegatingEntity.new foo
1557
+ expect(rep.value_for(:system)).to eq 'System'
1558
+ end
1559
+
1560
+ module EntitySpec
1561
+ class DerivedEntity < DelegatingEntity
1562
+ end
1563
+ end
1564
+
1565
+ it 'derived entity get methods from base entity' do
1566
+ foo = double 'Foo', name: 'joe'
1567
+ rep = EntitySpec::DerivedEntity.new foo
1568
+ expect(rep.value_for(:name)).to eq 'cooler name'
1569
+ end
1549
1570
  end
1550
1571
 
1551
1572
  context 'using' do
@@ -1717,5 +1738,39 @@ describe Grape::Entity do
1717
1738
  end
1718
1739
  end
1719
1740
  end
1741
+
1742
+ describe Grape::Entity::Options do
1743
+ module EntitySpec
1744
+ class Crystalline
1745
+ attr_accessor :prop1, :prop2
1746
+
1747
+ def initialize
1748
+ @prop1 = 'value1'
1749
+ @prop2 = 'value2'
1750
+ end
1751
+ end
1752
+
1753
+ class CrystallineEntity < Grape::Entity
1754
+ expose :prop1, if: ->(_, options) { options.fetch(:signal) }
1755
+ expose :prop2, if: ->(_, options) { options.fetch(:beam, 'destructive') == 'destructive' }
1756
+ end
1757
+ end
1758
+
1759
+ context '#fetch' do
1760
+ it 'without passing in a required option raises KeyError' do
1761
+ expect { EntitySpec::CrystallineEntity.represent(EntitySpec::Crystalline.new).as_json }.to raise_error KeyError
1762
+ end
1763
+
1764
+ it 'passing in a required option will expose the values' do
1765
+ crystalline_entity = EntitySpec::CrystallineEntity.represent(EntitySpec::Crystalline.new, signal: true)
1766
+ expect(crystalline_entity.as_json).to eq(prop1: 'value1', prop2: 'value2')
1767
+ end
1768
+
1769
+ it 'with an option that is not default will not expose that value' do
1770
+ crystalline_entity = EntitySpec::CrystallineEntity.represent(EntitySpec::Crystalline.new, signal: true, beam: 'intermittent')
1771
+ expect(crystalline_entity.as_json).to eq(prop1: 'value1')
1772
+ end
1773
+ end
1774
+ end
1720
1775
  end
1721
1776
  end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Grape::Entity do
4
+ it 'except option for nested entity' do
5
+ module EntitySpec
6
+ class Address < Grape::Entity
7
+ expose :post, if: :full
8
+ expose :city
9
+ expose :street
10
+ expose :house
11
+ end
12
+
13
+ class Company < Grape::Entity
14
+ expose :full_name, if: :full
15
+ expose :name
16
+ expose :address do |c, o|
17
+ Address.represent c[:address], Grape::Entity::Options.new(o.opts_hash.except(:full))
18
+ end
19
+ end
20
+ end
21
+
22
+ company = {
23
+ full_name: 'full_name',
24
+ name: 'name',
25
+ address: {
26
+ post: '123456',
27
+ city: 'city',
28
+ street: 'street',
29
+ house: 'house',
30
+ something_else: 'something_else'
31
+ }
32
+ }
33
+
34
+ expect(EntitySpec::Company.represent(company).serializable_hash).to eq \
35
+ company.slice(:name).merge(address: company[:address].slice(:city, :street, :house))
36
+
37
+ expect(EntitySpec::Company.represent(company, full: true).serializable_hash).to eq \
38
+ company.slice(:full_name, :name).merge(address: company[:address].slice(:city, :street, :house))
39
+ end
40
+ end
@@ -7,6 +7,4 @@ require 'bundler'
7
7
 
8
8
  Bundler.require :default, :test
9
9
 
10
- require 'pry'
11
-
12
10
  RSpec.configure(&:raise_errors_for_deprecations!)
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-entity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.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: 2016-04-04 00:00:00.000000000 Z
11
+ date: 2016-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: multi_json
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +24,6 @@ dependencies:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
26
  version: 1.3.2
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: maruku
57
29
  requirement: !ruby/object:Gem::Requirement
@@ -124,6 +96,7 @@ files:
124
96
  - ".yardopts"
125
97
  - CHANGELOG.md
126
98
  - CONTRIBUTING.md
99
+ - Dangerfile
127
100
  - Gemfile
128
101
  - Guardfile
129
102
  - LICENSE
@@ -163,6 +136,7 @@ files:
163
136
  - spec/grape_entity/exposure/nesting_exposure/nested_exposures_spec.rb
164
137
  - spec/grape_entity/exposure/represent_exposure_spec.rb
165
138
  - spec/grape_entity/exposure_spec.rb
139
+ - spec/grape_entity/hash_spec.rb
166
140
  - spec/spec_helper.rb
167
141
  homepage: https://github.com/ruby-grape/grape-entity
168
142
  licenses:
@@ -184,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
158
  version: '0'
185
159
  requirements: []
186
160
  rubyforge_project: grape-entity
187
- rubygems_version: 2.4.8
161
+ rubygems_version: 2.6.7
188
162
  signing_key:
189
163
  specification_version: 4
190
164
  summary: A simple facade for managing the relationship between your model and API.
@@ -193,5 +167,5 @@ test_files:
193
167
  - spec/grape_entity/exposure/nesting_exposure/nested_exposures_spec.rb
194
168
  - spec/grape_entity/exposure/represent_exposure_spec.rb
195
169
  - spec/grape_entity/exposure_spec.rb
170
+ - spec/grape_entity/hash_spec.rb
196
171
  - spec/spec_helper.rb
197
- has_rdoc: