diff --git a/CHANGELOG.md b/CHANGELOG.md index c2b5e3ad..15d29965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ #### Features +* [#277](https://github.com/ruby-grape/grape-entity/pull/277): Provide grape::entity::options#dig - [@kachick](https://github.com/kachick). * [#265](https://github.com/ruby-grape/grape-entity/pull/265): Adds ability to provide a proc to as: - [@james2m](https://github.com/james2m). * [#264](https://github.com/ruby-grape/grape-entity/pull/264): Adds Rubocop config and todo list - [@james2m](https://github.com/james2m). * [#255](https://github.com/ruby-grape/grape-entity/pull/255): Adds code coverage w/ coveralls - [@LeFnord](https://github.com/LeFnord). diff --git a/Gemfile b/Gemfile index 754f1e49..666431d8 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,10 @@ source 'http://rubygems.org' gemspec +group :development, :test do + gem 'rubocop', '~> 0.48.0', require: false +end + group :test do gem 'coveralls', require: false gem 'growl' diff --git a/grape-entity.gemspec b/grape-entity.gemspec index 0a212ca3..560759c2 100644 --- a/grape-entity.gemspec +++ b/grape-entity.gemspec @@ -23,7 +23,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'bundler' s.add_development_dependency 'rake' - s.add_development_dependency 'rubocop', '~> 0.48' s.add_development_dependency 'rspec', '~> 3.0' s.add_development_dependency 'rack-test' s.add_development_dependency 'maruku' diff --git a/lib/grape_entity/options.rb b/lib/grape_entity/options.rb index 2bbbf219..92896214 100644 --- a/lib/grape_entity/options.rb +++ b/lib/grape_entity/options.rb @@ -25,6 +25,10 @@ def key?(key) @opts_hash.key? key end + def dig(*keys) + @opts_hash.dig(*keys) + end + def merge(new_opts) if new_opts.empty? self diff --git a/spec/grape_entity/entity_spec.rb b/spec/grape_entity/entity_spec.rb index 3f0d109c..d622fd8a 100644 --- a/spec/grape_entity/entity_spec.rb +++ b/spec/grape_entity/entity_spec.rb @@ -1771,17 +1771,19 @@ class UserEntity < Grape::Entity describe Grape::Entity::Options do module EntitySpec class Crystalline - attr_accessor :prop1, :prop2 + attr_accessor :prop1, :prop2, :prop3 def initialize @prop1 = 'value1' @prop2 = 'value2' + @prop3 = 'value3' end end class CrystallineEntity < Grape::Entity expose :prop1, if: ->(_, options) { options.fetch(:signal) } expose :prop2, if: ->(_, options) { options.fetch(:beam, 'destructive') == 'destructive' } + expose :prop3, if: ->(_, options) { options.dig(:first, :second) == :nested } end end @@ -1800,6 +1802,18 @@ class CrystallineEntity < Grape::Entity expect(crystalline_entity.as_json).to eq(prop1: 'value1') end end + + context '#dig' do + it 'without passing in a expected option hide the value' do + crystalline_entity = EntitySpec::CrystallineEntity.represent(EntitySpec::Crystalline.new, signal: true, first: { invalid: :nested }) + expect(crystalline_entity.as_json).to eq(prop1: 'value1', prop2: 'value2') + end + + it 'passing in a expected option will expose the values' do + crystalline_entity = EntitySpec::CrystallineEntity.represent(EntitySpec::Crystalline.new, signal: true, first: { second: :nested }) + expect(crystalline_entity.as_json).to eq(prop1: 'value1', prop2: 'value2', prop3: 'value3') + end + end end end end