From 2a38ee219324961fe2db5f2f059e01f9f7b5308a Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Fri, 22 Nov 2019 06:03:20 +0900 Subject: [PATCH] Keyword arguments have to be explicitly double-splatted in Ruby 2.7+ The Ruby core team decided to introduce a slight incompatibility to keyword arguments from Ruby 3.0, i.e. complete separation between keyword arguments literal and Hash literal. https://bugs.ruby-lang.org/issues/14183 https://github.com/ruby/ruby/pull/2395 With that, current Ruby master warns when a Hash object was passed in as keyword arguments: ``` $ ruby -ve 'def f(x: nil) p x; end; hash = {x: 1}; f(hash)' ruby 2.7.0dev (2019-09-02T05:20:05Z master 83498854eb) [x86_64-darwin18] warning: The last argument is used as the keyword parameter warning: for `f' defined here 1 ``` To eliminate this warning, we need to prefix a "double splat" (**) to avoid ambiguity: ``` $ ruby -ve 'def f(x: nil) p x;end; hash = {x: 1}; f(**hash)' ruby 2.7.0dev (2019-09-02T05:20:05Z master 83498854eb) [x86_64-darwin18] 1 ``` See also: * https://github.com/ruby-i18n/i18n/pull/486 * https://buildkite.com/rails/rails/builds/63974#7fb9ad05-a745-4022-b634-aa3eb9042b11/6-1865 ``` /usr/local/lib/ruby/gems/2.7.0/gems/mysql2-0.5.2/lib/mysql2/error.rb:55: warning: The last argument is used as the keyword parameter /usr/local/lib/ruby/gems/2.7.0/gems/mysql2-0.5.2/lib/mysql2/error.rb:94: warning: The last argument is used as the keyword parameter ``` --- lib/mysql2/error.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mysql2/error.rb b/lib/mysql2/error.rb index 758f01a98..3c182218d 100644 --- a/lib/mysql2/error.rb +++ b/lib/mysql2/error.rb @@ -52,7 +52,7 @@ class Error < StandardError def initialize(msg, server_version = nil, error_number = nil, sql_state = nil) @server_version = server_version @error_number = error_number - @sql_state = sql_state ? sql_state.encode(ENCODE_OPTS) : nil + @sql_state = sql_state ? sql_state.encode(**ENCODE_OPTS) : nil super(clean_message(msg)) end @@ -91,9 +91,9 @@ def self.new_with_args(msg, server_version, error_number, sql_state) # Returns a valid UTF-8 string. def clean_message(message) if @server_version && @server_version > 50500 - message.encode(ENCODE_OPTS) + message.encode(**ENCODE_OPTS) else - message.encode(Encoding::UTF_8, ENCODE_OPTS) + message.encode(Encoding::UTF_8, **ENCODE_OPTS) end end end