grape-entity 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.coveralls.yml +1 -0
- data/.gitignore +5 -1
- data/.rubocop.yml +31 -0
- data/.rubocop_todo.yml +29 -16
- data/.travis.yml +15 -10
- data/CHANGELOG.md +18 -0
- data/Dangerfile +2 -0
- data/Gemfile +6 -1
- data/README.md +82 -1
- data/Rakefile +2 -2
- data/bench/serializing.rb +2 -0
- data/grape-entity.gemspec +9 -7
- data/lib/grape-entity.rb +2 -0
- data/lib/grape_entity.rb +2 -0
- data/lib/grape_entity/condition.rb +20 -11
- data/lib/grape_entity/condition/base.rb +2 -0
- data/lib/grape_entity/condition/block_condition.rb +3 -1
- data/lib/grape_entity/condition/hash_condition.rb +2 -0
- data/lib/grape_entity/condition/symbol_condition.rb +2 -0
- data/lib/grape_entity/delegator.rb +10 -9
- data/lib/grape_entity/delegator/base.rb +2 -0
- data/lib/grape_entity/delegator/fetchable_object.rb +2 -0
- data/lib/grape_entity/delegator/hash_object.rb +2 -0
- data/lib/grape_entity/delegator/openstruct_object.rb +2 -0
- data/lib/grape_entity/delegator/plain_object.rb +2 -0
- data/lib/grape_entity/entity.rb +49 -29
- data/lib/grape_entity/exposure.rb +58 -41
- data/lib/grape_entity/exposure/base.rb +14 -3
- data/lib/grape_entity/exposure/block_exposure.rb +2 -0
- data/lib/grape_entity/exposure/delegator_exposure.rb +2 -0
- data/lib/grape_entity/exposure/formatter_block_exposure.rb +2 -0
- data/lib/grape_entity/exposure/formatter_exposure.rb +2 -0
- data/lib/grape_entity/exposure/nesting_exposure.rb +34 -30
- data/lib/grape_entity/exposure/nesting_exposure/nested_exposures.rb +23 -14
- data/lib/grape_entity/exposure/nesting_exposure/output_builder.rb +5 -2
- data/lib/grape_entity/exposure/represent_exposure.rb +3 -1
- data/lib/grape_entity/options.rb +41 -56
- data/lib/grape_entity/version.rb +3 -1
- data/spec/grape_entity/entity_spec.rb +202 -47
- data/spec/grape_entity/exposure/nesting_exposure/nested_exposures_spec.rb +6 -4
- data/spec/grape_entity/exposure/represent_exposure_spec.rb +2 -0
- data/spec/grape_entity/exposure_spec.rb +14 -2
- data/spec/grape_entity/hash_spec.rb +2 -0
- data/spec/grape_entity/options_spec.rb +66 -0
- data/spec/spec_helper.rb +11 -0
- metadata +28 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ecd89442adb3e014be540761d005b20920e8aa847691a69a6c4e166d1ed63f21
|
4
|
+
data.tar.gz: c556531fdea49f03dfea0ce4d1388016736c7d3987db0957be30b27a82e21e40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a48af786a0d681229aecd0765eccfafb9f28f6178dc5ade649d54b255df13e82f24f4f5243de7cdff9d45a423d101b851137ffb7920e3853529d88fbe23f67b
|
7
|
+
data.tar.gz: b9b89ee602c3804470c57e6519244e59b78fa5b10470fb2a5d0f1581e821847ab8a6f66145fcf57445090d654c442d33cfc6fa94c6eaea9e36f15ce1038eb362
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,6 +1,37 @@
|
|
1
1
|
AllCops:
|
2
|
+
TargetRubyVersion: 2.4
|
3
|
+
Include:
|
4
|
+
- Dangerfile
|
5
|
+
|
2
6
|
Exclude:
|
3
7
|
- vendor/**/*
|
8
|
+
- bin/**/*
|
4
9
|
- Guardfile
|
5
10
|
|
6
11
|
inherit_from: .rubocop_todo.yml
|
12
|
+
|
13
|
+
Gemspec/RequiredRubyVersion:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Naming/FileName:
|
17
|
+
Exclude:
|
18
|
+
- 'Gemfile'
|
19
|
+
- 'Rakefile'
|
20
|
+
- 'grape-entity.gemspec'
|
21
|
+
- 'lib/grape-entity.rb'
|
22
|
+
|
23
|
+
Style/Documentation:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Style/MultilineIfModifier:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Style/RaiseArgs:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Lint/BooleanSymbol:
|
33
|
+
Exclude:
|
34
|
+
- 'spec/grape_entity/exposure_spec.rb'
|
35
|
+
|
36
|
+
Lint/UnneededDisable:
|
37
|
+
Enabled: false
|
data/.rubocop_todo.yml
CHANGED
@@ -1,31 +1,35 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2018-01-11 18:20:10 +0100 using RuboCop version 0.52.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
+
# Offense count: 1
|
10
|
+
Lint/AmbiguousBlockAssociation:
|
11
|
+
Exclude:
|
12
|
+
- 'spec/grape_entity/exposure/represent_exposure_spec.rb'
|
13
|
+
|
9
14
|
# Offense count: 6
|
10
15
|
Metrics/AbcSize:
|
11
16
|
Max: 32
|
12
17
|
|
18
|
+
# Offense count: 35
|
19
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
20
|
+
Metrics/BlockLength:
|
21
|
+
Max: 1625
|
22
|
+
|
13
23
|
# Offense count: 2
|
14
24
|
# Configuration parameters: CountComments.
|
15
25
|
Metrics/ClassLength:
|
16
|
-
Max:
|
26
|
+
Max: 210
|
17
27
|
|
18
|
-
# Offense count:
|
28
|
+
# Offense count: 2
|
19
29
|
Metrics/CyclomaticComplexity:
|
20
30
|
Max: 11
|
21
31
|
|
22
|
-
# Offense count:
|
23
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives.
|
24
|
-
# URISchemes: http, https
|
25
|
-
Metrics/LineLength:
|
26
|
-
Max: 146
|
27
|
-
|
28
|
-
# Offense count: 6
|
32
|
+
# Offense count: 7
|
29
33
|
# Configuration parameters: CountComments.
|
30
34
|
Metrics/MethodLength:
|
31
35
|
Max: 28
|
@@ -34,12 +38,21 @@ Metrics/MethodLength:
|
|
34
38
|
Metrics/PerceivedComplexity:
|
35
39
|
Max: 13
|
36
40
|
|
37
|
-
# Offense count:
|
38
|
-
Style/
|
39
|
-
|
41
|
+
# Offense count: 1
|
42
|
+
Style/EvalWithLocation:
|
43
|
+
Exclude:
|
44
|
+
- 'lib/grape_entity/exposure/nesting_exposure/nested_exposures.rb'
|
40
45
|
|
41
46
|
# Offense count: 1
|
42
|
-
#
|
43
|
-
|
47
|
+
# Cop supports --auto-correct.
|
48
|
+
# Configuration parameters: IgnoredMethods.
|
49
|
+
# IgnoredMethods: respond_to, define_method
|
50
|
+
Style/SymbolProc:
|
44
51
|
Exclude:
|
45
|
-
- '
|
52
|
+
- 'spec/grape_entity/entity_spec.rb'
|
53
|
+
|
54
|
+
# Offense count: 250
|
55
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
56
|
+
# URISchemes: http, https
|
57
|
+
Metrics/LineLength:
|
58
|
+
Max: 146
|
data/.travis.yml
CHANGED
@@ -2,24 +2,29 @@ sudo: false
|
|
2
2
|
|
3
3
|
language: ruby
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
before_install:
|
6
|
+
- gem update --system
|
7
|
+
- gem install bundler
|
8
|
+
|
9
|
+
after_success:
|
10
|
+
- coveralls
|
11
|
+
- bundle exec danger
|
12
|
+
|
13
|
+
rvm:
|
14
|
+
- 2.5.0
|
15
|
+
- 2.4.3
|
7
16
|
|
8
17
|
matrix:
|
18
|
+
fast_finish: true
|
19
|
+
|
9
20
|
include:
|
10
|
-
- rvm: 2.
|
11
|
-
script:
|
12
|
-
- bundle exec danger
|
13
|
-
- rvm: 2.4.0
|
14
|
-
- rvm: 2.3.3
|
15
|
-
- rvm: 2.2.6
|
21
|
+
- rvm: 2.3.6
|
16
22
|
- rvm: ruby-head
|
17
|
-
- rvm: jruby-9.1.6.0
|
18
23
|
- rvm: jruby-head
|
19
24
|
- rvm: rbx-2
|
20
25
|
|
21
26
|
allow_failures:
|
27
|
+
- rvm: 2.3.6
|
22
28
|
- rvm: ruby-head
|
23
|
-
- rvm: jruby-9.1.6.0
|
24
29
|
- rvm: jruby-head
|
25
30
|
- rvm: rbx-2
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,24 @@
|
|
8
8
|
|
9
9
|
* Your contribution here.
|
10
10
|
|
11
|
+
### 0.7.0 (2018-01-25)
|
12
|
+
|
13
|
+
#### Features
|
14
|
+
|
15
|
+
* [#287](https://github.com/ruby-grape/grape-entity/pull/287): Adds ruby 2.5, drops ruby 2.2 support - [@LeFnord](https://github.com/LeFnord).
|
16
|
+
* [#277](https://github.com/ruby-grape/grape-entity/pull/277): Provide grape::entity::options#dig - [@kachick](https://github.com/kachick).
|
17
|
+
* [#265](https://github.com/ruby-grape/grape-entity/pull/265): Adds ability to provide a proc to as: - [@james2m](https://github.com/james2m).
|
18
|
+
* [#264](https://github.com/ruby-grape/grape-entity/pull/264): Adds Rubocop config and todo list - [@james2m](https://github.com/james2m).
|
19
|
+
* [#255](https://github.com/ruby-grape/grape-entity/pull/255): Adds code coverage w/ coveralls - [@LeFnord](https://github.com/LeFnord).
|
20
|
+
* [#268](https://github.com/ruby-grape/grape-entity/pull/268): Loosens the version dependency for activesupport - [@anakinj](https://github.com/anakinj).
|
21
|
+
* [#293](https://github.com/ruby-grape/grape-entity/pull/293): Adds expose_nil option - [@b-boogaard](https://github.com/b-boogaard).
|
22
|
+
|
23
|
+
#### Fixes
|
24
|
+
|
25
|
+
* [#288](https://github.com/ruby-grape/grape-entity/pull/288): Fix wrong argument exception when `&:block` passed to the expose method - [@DmitryTsepelev](https://github.com/DmitryTsepelev).
|
26
|
+
* [#291](https://github.com/ruby-grape/grape-entity/pull/291): Refactor and simplify various classes and modules - [@DmitryTsepelev](https://github.com/DmitryTsepelev).
|
27
|
+
* [#292](https://github.com/ruby-grape/grape-entity/pull/292): Allow replace non-conditional non-nesting exposures in child classes (fixes [#286](https://github.com/ruby-grape/grape-entity/issues/286)) - [@DmitryTsepelev](https://github.com/DmitryTsepelev).
|
28
|
+
|
11
29
|
### 0.6.1 (2017-01-09)
|
12
30
|
|
13
31
|
#### Features
|
data/Dangerfile
CHANGED
data/Gemfile
CHANGED
@@ -1,15 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'http://rubygems.org'
|
2
4
|
|
3
5
|
gemspec
|
4
6
|
|
5
7
|
group :development, :test do
|
6
|
-
gem '
|
8
|
+
gem 'rubocop', '~> 0.51', require: false
|
7
9
|
end
|
8
10
|
|
9
11
|
group :test do
|
12
|
+
gem 'coveralls', require: false
|
10
13
|
gem 'growl'
|
11
14
|
gem 'guard'
|
12
15
|
gem 'guard-bundler'
|
13
16
|
gem 'guard-rspec'
|
14
17
|
gem 'rb-fsevent'
|
18
|
+
gem 'ruby-grape-danger', '~> 0.1.1', require: false
|
19
|
+
gem 'simplecov', require: false
|
15
20
|
end
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/grape-entity)
|
4
4
|
[](https://travis-ci.org/ruby-grape/grape-entity)
|
5
|
+
[](https://coveralls.io/github/ruby-grape/grape-entity?branch=master)
|
5
6
|
[](https://gemnasium.com/ruby-grape/grape-entity)
|
6
7
|
[](https://codeclimate.com/github/ruby-grape/grape-entity)
|
7
8
|
|
@@ -320,7 +321,7 @@ module Entities
|
|
320
321
|
with_options(format_with: :iso_timestamp) do
|
321
322
|
expose :created_at
|
322
323
|
expose :updated_at
|
323
|
-
end
|
324
|
+
end
|
324
325
|
end
|
325
326
|
end
|
326
327
|
```
|
@@ -349,6 +350,86 @@ module Entities
|
|
349
350
|
end
|
350
351
|
```
|
351
352
|
|
353
|
+
#### Expose Nil
|
354
|
+
|
355
|
+
By default, exposures that contain `nil` values will be represented in the resulting JSON as `null`.
|
356
|
+
|
357
|
+
As an example, a hash with the following values:
|
358
|
+
|
359
|
+
```ruby
|
360
|
+
{
|
361
|
+
name: nil,
|
362
|
+
age: 100
|
363
|
+
}
|
364
|
+
```
|
365
|
+
|
366
|
+
will result in a JSON object that looks like:
|
367
|
+
|
368
|
+
```javascript
|
369
|
+
{
|
370
|
+
"name": null,
|
371
|
+
"age": 100
|
372
|
+
}
|
373
|
+
```
|
374
|
+
|
375
|
+
There are also times when, rather than displaying an attribute with a `null` value, it is more desirable to not display the attribute at all. Using the hash from above the desired JSON would look like:
|
376
|
+
|
377
|
+
```javascript
|
378
|
+
{
|
379
|
+
"age": 100
|
380
|
+
}
|
381
|
+
```
|
382
|
+
|
383
|
+
In order to turn on this behavior for an as-exposure basis, the option `expose_nil` can be used. By default, `expose_nil` is considered to be `true`, meaning that `nil` values will be represented in JSON as `null`. If `false` is provided, then attributes with `nil` values will be omitted from the resulting JSON completely.
|
384
|
+
|
385
|
+
```ruby
|
386
|
+
module Entities
|
387
|
+
class MyModel < Grape::Entity
|
388
|
+
expose :name, expose_nil: false
|
389
|
+
expose :age, expose_nil: false
|
390
|
+
end
|
391
|
+
end
|
392
|
+
```
|
393
|
+
|
394
|
+
`expose_nil` is per exposure, so you can suppress exposures from resulting in `null` or express `null` values on a per exposure basis as you need:
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
module Entities
|
398
|
+
class MyModel < Grape::Entity
|
399
|
+
expose :name, expose_nil: false
|
400
|
+
expose :age # since expose_nil is omitted nil values will be rendered as null
|
401
|
+
end
|
402
|
+
end
|
403
|
+
```
|
404
|
+
|
405
|
+
It is also possible to use `expose_nil` with `with_options` if you want to add the configuration to multiple exposures at once.
|
406
|
+
|
407
|
+
```ruby
|
408
|
+
module Entities
|
409
|
+
class MyModel < Grape::Entity
|
410
|
+
# None of the exposures in the with_options block will render nil values as null
|
411
|
+
with_options(expose_nil: false) do
|
412
|
+
expose :name
|
413
|
+
expose :age
|
414
|
+
end
|
415
|
+
end
|
416
|
+
end
|
417
|
+
```
|
418
|
+
|
419
|
+
When using `with_options`, it is possible to again override which exposures will render `nil` as `null` by adding the option on a specific exposure.
|
420
|
+
|
421
|
+
```ruby
|
422
|
+
module Entities
|
423
|
+
class MyModel < Grape::Entity
|
424
|
+
# None of the exposures in the with_options block will render nil values as null
|
425
|
+
with_options(expose_nil: false) do
|
426
|
+
expose :name
|
427
|
+
expose :age, expose_nil: true # nil values would be rendered as null in the JSON
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
```
|
432
|
+
|
352
433
|
#### Documentation
|
353
434
|
|
354
435
|
Expose documentation with the field. Gets bubbled up when used with Grape and various API documentation systems.
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler'
|
@@ -17,4 +17,4 @@ RSpec::Core::RakeTask.new(:spec)
|
|
17
17
|
require 'rubocop/rake_task'
|
18
18
|
RuboCop::RakeTask.new(:rubocop)
|
19
19
|
|
20
|
-
task default: [
|
20
|
+
task default: %i[spec rubocop]
|
data/bench/serializing.rb
CHANGED
data/grape-entity.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
2
4
|
require 'grape_entity/version'
|
3
5
|
|
@@ -12,22 +14,22 @@ Gem::Specification.new do |s|
|
|
12
14
|
s.description = 'Extracted from Grape, A Ruby framework for rapid API development with great conventions.'
|
13
15
|
s.license = 'MIT'
|
14
16
|
|
15
|
-
s.required_ruby_version = '>= 2.
|
17
|
+
s.required_ruby_version = '>= 2.3'
|
16
18
|
|
17
19
|
s.rubyforge_project = 'grape-entity'
|
18
20
|
|
21
|
+
s.add_runtime_dependency 'activesupport', '>=4.0'
|
22
|
+
# FIXME: remove dependecy
|
19
23
|
s.add_runtime_dependency 'multi_json', '>= 1.3.2'
|
20
|
-
s.add_runtime_dependency 'activesupport', '>= 5.0.0'
|
21
24
|
|
22
25
|
s.add_development_dependency 'bundler'
|
23
|
-
s.add_development_dependency 'rake'
|
24
|
-
s.add_development_dependency 'rubocop', '~> 0.40'
|
25
|
-
s.add_development_dependency 'rspec', '~> 3.0'
|
26
|
-
s.add_development_dependency 'rack-test'
|
27
26
|
s.add_development_dependency 'maruku'
|
28
|
-
s.add_development_dependency 'yard'
|
29
27
|
s.add_development_dependency 'pry' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
|
30
28
|
s.add_development_dependency 'pry-byebug' unless RUBY_PLATFORM.eql?('java') || RUBY_ENGINE.eql?('rbx')
|
29
|
+
s.add_development_dependency 'rack-test'
|
30
|
+
s.add_development_dependency 'rake'
|
31
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
32
|
+
s.add_development_dependency 'yard'
|
31
33
|
|
32
34
|
s.files = `git ls-files`.split("\n")
|
33
35
|
s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
|
data/lib/grape-entity.rb
CHANGED
data/lib/grape_entity.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'grape_entity/condition/base'
|
2
4
|
require 'grape_entity/condition/block_condition'
|
3
5
|
require 'grape_entity/condition/hash_condition'
|
@@ -6,19 +8,26 @@ require 'grape_entity/condition/symbol_condition'
|
|
6
8
|
module Grape
|
7
9
|
class Entity
|
8
10
|
module Condition
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
when Proc then BlockCondition.new false, &arg
|
13
|
-
when Symbol then SymbolCondition.new false, arg
|
11
|
+
class << self
|
12
|
+
def new_if(arg)
|
13
|
+
condition(false, arg)
|
14
14
|
end
|
15
|
-
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
def new_unless(arg)
|
17
|
+
condition(true, arg)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def condition(inverse, arg)
|
23
|
+
condition_klass =
|
24
|
+
case arg
|
25
|
+
when Hash then HashCondition
|
26
|
+
when Proc then BlockCondition
|
27
|
+
when Symbol then SymbolCondition
|
28
|
+
end
|
29
|
+
|
30
|
+
condition_klass.new(inverse, arg)
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|