Skip to content

Commit

Permalink
Ensure keyword arguments for Concurrent::*Struct behave similarly to …
Browse files Browse the repository at this point in the history
…Std-lib Struct
  • Loading branch information
numeraltwo committed Jul 7, 2018
1 parent 42453ac commit 67c3c5a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
10 changes: 8 additions & 2 deletions lib/concurrent/synchronization/abstract_struct.rb
Expand Up @@ -142,8 +142,14 @@ def self.define_struct_class(parent, base, name, members, kw_args, &block)
self.const_set(:MEMBERS, members.collect{|member| member.to_s.to_sym}.freeze)
self.const_set(:KEYWORD_INIT, !!kw_args[:keyword_init])
def ns_initialize(*values, **kw_values)
raise ArgumentError.new('struct size differs') if values.length > length || kw_values.length > length
@values = keyword_init? ? members.map{ |val| kw_values.fetch(val, nil) } : values.fill(nil, values.length..length-1)
@values = if keyword_init?
key_diff = kw_values.keys - members
raise ArgumentError.new("unknown keywords: #{key_diff.join(',')}") unless key_diff.empty?
members.map {|val| kw_values.fetch(val, nil)}
else
raise ArgumentError.new('struct size differs') if values.length > length
values.fill(nil, values.length..length-1)
end
end
end
unless name.nil?
Expand Down
9 changes: 7 additions & 2 deletions spec/concurrent/struct_shared.rb
Expand Up @@ -101,8 +101,13 @@ def baz(foo, bar) foo + bar; end

it 'raises an exception when extra members are given' do
classes.each do |clazz|
extra_values = values << 'forty two'
expect{ clazz.new(*extra_values) }.to raise_error(ArgumentError)
if clazz::KEYWORD_INIT
extra_values = kw_values.merge({FortyTwo: 'forty two'})
expect{ clazz.new(**extra_values) }.to raise_error(ArgumentError)
else
extra_values = values << 'forty two'
expect{ clazz.new(*extra_values) }.to raise_error(ArgumentError)
end
end
end
end
Expand Down

0 comments on commit 67c3c5a

Please sign in to comment.