Add #except under Ruby 3

Ruby 3 adds the Hash#except method, which should return the correct
Hashie object instance when called on a Mash or object using the
Hashie::Extensions::IndifferentAccess mixin.
This commit is contained in:
Jack Jennings 2021-04-06 17:45:02 -07:00
parent 16eb591205
commit 9ba96e03a8
5 changed files with 40 additions and 0 deletions

View File

@ -54,6 +54,7 @@ Any violations of this scheme are considered to be bugs.
### Added
* [#545](https://github.com/hashie/hashie/pull/545): Add `Hashie::Mash#except` and `Hashie::Extensions::IndifferentAccess#except` when running under Ruby 3 to match newly added Ruby stdlib method - [@jackjennings](https://github.com/jackjennings).
* [#499](https://github.com/hashie/hashie/pull/499): Add `Hashie::Extensions::Mash::PermissiveRespondTo` to make specific subclasses of Mash fully respond to messages for use with `SimpleDelegator` - [@michaelherold](https://github.com/michaelherold).
### Changed

View File

@ -162,6 +162,13 @@ module Hashie
end
end
with_minimum_ruby('3.0.0') do
def except(*keys)
string_keys = keys.map { |key| convert_key(key) }
super(*string_keys)
end
end
protected
def hash_lacking_indifference?(other)

View File

@ -351,6 +351,13 @@ module Hashie
end
end
with_minimum_ruby('3.0.0') do
def except(*keys)
string_keys = keys.map { |key| convert_key(key) }
self.class.new(super(*string_keys))
end
end
protected
def method_name_and_suffix(method_name)

View File

@ -357,6 +357,18 @@ describe Hashie::Extensions::IndifferentAccess do
end
end
end
with_minimum_ruby('3.0.0') do
describe '#except' do
let(:h) { subject.build(foo: 'bar', baz: 'qux') }
it 'indifferently excepts keys from the hash' do
sliced_h = { 'baz' => 'qux' }
expect(h.except('foo')).to eq sliced_h
expect(h.except(:foo)).to eq sliced_h
end
end
end
end
describe 'with merge initializer' do

View File

@ -1097,4 +1097,17 @@ describe Hashie::Mash do
end
end
end
with_minimum_ruby('3.0.0') do
context '#except' do
subject(:mash) { described_class.new(a: 'A', b: 'B') }
it 'return a Hashie::Mash' do
expect(mash.except(:b)).to be_kind_of(described_class)
end
it 'excludes keys' do
expect(mash.except(:b)).to eq('a' => 'A')
end
end
end
end