Skip to content

Commit

Permalink
When creating a Rash, one can specify the preferred format of certain…
Browse files Browse the repository at this point in the history
… keys
  • Loading branch information
nicholaides committed Nov 12, 2014
1 parent 30c03e4 commit 5d53e48
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
27 changes: 25 additions & 2 deletions lib/stacker_bee/rash.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ class Rash
:flatten, :invert, :keys, :key, :merge, :rassoc, :to_a, :to_h, :to_hash
]

def initialize(hash = {})
def initialize(hash = {}, preferred_keys = [])
@hash = {}

save_preferred_keys preferred_keys

hash.each_pair do |key, value|
@hash[convert_key(key)] = convert_value(value)
end
Expand Down Expand Up @@ -78,7 +81,27 @@ def self.deep_dup(hash)
end

def convert_key(key)
key.is_a?(Numeric) ? key : uncase(key)
if key.is_a?(Numeric)
key
elsif preferred_key_format?(key)
preferred_key_format(key)
else
uncase(key)
end
end

def save_preferred_keys(keys)
@preferred_keys = keys.each_with_object({}) do |key, mapping|
mapping[uncase(key)] = key
end
end

def preferred_key_format?(key)
@preferred_keys.key?(uncase(key))
end

def preferred_key_format(key)
@preferred_keys[uncase(key)]
end

def convert_value(value)
Expand Down
20 changes: 18 additions & 2 deletions spec/units/stacker_bee/rash_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
end

describe StackerBee::Rash do
subject { rash }
subject(:rash) { described_class.new(hash) }

let(:wiz) { [{ 'aB_C' => 'abc' }, { 'X_yZ' => 'xyz' }] }
let(:ziz) do
Expand All @@ -28,7 +28,6 @@
end
end
let(:dissimilar_hash) { hash.dup.tap { |loud| loud.delete 'foo' } }
let(:rash) { described_class.new(hash) }

it { is_expected.to include 'FOO' }

Expand Down Expand Up @@ -82,4 +81,21 @@
subject { rash.values_at 'FOO', 'WIZ', 'WRONG' }
it { is_expected.to eq ['foo', wiz, nil] }
end

describe 'with preferred keys' do
subject { described_class.new(hash, preferred_keys) }
let(:preferred_keys) { [:foo, 'BAR', :b_a_z] }
let(:hash) do
{
f_o_o: 'foo',
ba_r: 'bar',
baz: 'baz',
Ot_her: 'other'
}
end

it 'is stored as preferred if mentioned, otherwise as uncased' do
expect(subject.keys).to match_array [:foo, 'BAR', :b_a_z, 'other']
end
end
end

0 comments on commit 5d53e48

Please sign in to comment.