Ruby: RubocopとRufoを最小限に共存させてみた

しばらく使っていなかったrufoフォーマッタを久しぶりに設定してみました。

しかしrufoはデフォルトで引用符をダブルクォート"に揃える方針で、RuboCopはデフォルトではシングルクォート'に揃える方針になっている部分が真っ向からぶつかっています。

以下のCHANGELOGを見ると、Rufo 0.3.0からダブルクォートがデフォルトになっています。

最小限の共存

プロジェクトの現状に応じて、以下のいずれかの設定にすることで、引用符に関してはぶつからなくなります(他の設定の共存についてはここでは考えません)。なお自分はRufoに寄せました。

1. RuboCopに寄せる場合

# .rufo
quote_style :single

この場合式展開#{}を含む引用符はダブルクォート"が保たれます。また、%q()%Q()、エスケープされた引用符を含む文字列リテラル、ヒアドキュメントの中の引用符はquote_styleの影響を受けません。

2. Rufoに寄せる場合

# .rubocop.yml
Style/StringLiterals:
  EnforcedStyle: double_quotes

なお、以下のrubocop-config-rufo gemを使う手もあるようですが、試していません。

おまけ: Rufo 0.7.0の設定一覧

Rufoのsettings.mdが2年前から更新されておらず、不便です😢。

現在のmasterブランチで用意されている設定をlib/rufo/settings.rbから拾いました。0.7.0ではどれも効くことを確認しました。後でsettings.mdを更新するプルリク投げてみようかと思います(投げました: #189)。

# rufo/lib/rufo/settings.rb より
    parens_in_def: [:yes, :dynamic],
    align_case_when: [false, true],
    align_chained_calls: [false, true],
    trailing_commas: [true, false],
    quote_style: [:double, :single],

おまけ: Rufoはどこを目指すか

settings.mdの冒頭には「この設定オプションはいずれ消える」という記述があります。今もそのつもりなのかどうかはよくわかりませんが、RufoのReadmeにも、Go言語のgofmtなどのような「唯一の正しいスタイル」に揃えたいという意向も示されていますし、CHANGELOGでも早い段階で多くのオプション設定が削除されているので、いつになるかはわかりませんが、いずれ設定オプションはなくなってデフォルト設定のみになるだろうと推測しています。

議論の流れ次第ですが、Rufoの引用符はこのままダブルクォートに統一されそうな予感がします。個人的には、シングルクォートにはアポストロフィとしての用途もあるので、ダブルクォート統一に賛成したいです。

Rufoのごく初期からあるissue #2↑を見ると、RuboCop作者の@bbatsovさんも議論に参加していますね。

関連記事

RuboCop作者がRubyコードフォーマッタを比較してみた: 前編(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ