soranoriの畑

ゆるく

Ruby2.5.1からRuby2.7.2アップデートで遭遇したエラー

運用しているシステムのRubyバージョンを2.5.1から2.7.2に上げようとしたらCSV周りでエラーに遭遇した。

根本的な原因はわからなかったが、一応動くようにはしたので対応内容をメモしておく。

遭遇したエラーの内容

Failure/Error:
            CSV.foreach(csv_path, encoding: 'sjis:utf-8', converters: TEST_COMVERTER) do |row|

    NoMethodError:
      undefined method `close' for "hoge,fuga\n":String
      Did you mean?  clone
    # ./lib/tasks/hoge.rake:45:in `block (3 levels) in <main>'
    # ./spec/lib/tasks/hoge_spec.rb:114:in `block (4 levels) in <top (required)>'
    # ------------------
    # --- Caused by: ---
    # ArgumentError:
    #   unknown encoding name - sjis:utf-8
    #   ./lib/tasks/hoge.rake:45:in `block (3 levels) in <main>'

調べたこと

  • : で分割できなくなった?と思って調べた
    • 2.7.2のドキュメント 見てもそんな変更はされておらず次の通りの記述があるので問題なさそう

      You may provide a second Encoding to have the data transcoded as it is read. For example, encoding: "UTF-32BE:UTF-8" would read UTF-32BE data from the file but transcode it to UTF-8 before CSV parses it.

  • Rubyのバグかとも思ったが特に周辺の処理は変更されていなかった

最終的な対処

似たような事例のissue発見。

github.com

同様に external_encodinginternal_encoding を使用してエンコーディングを指定することでエラーは解消。
根本原因は不明なままだが一旦採用した。

謎すぎる。