grape-entity 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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: