# target_version: # rubocop v0.40.0 # 自動生成されるものはチェック対象から除外する AllCops: Exclude: - "vendor/**/*" # rubocop config/default.yml - "db/schema.rb" DisplayCopNames: true ##################### Style ################################## # レキシカルスコープの扱いが alias_method の方が自然。 # https://ernie.io/2014/10/23/in-defense-of-alias/ のように # 問題になる場合は自分で緩める。 Style/Alias: EnforcedStyle: prefer_alias_method # redirect_to xxx and return のイディオムを維持したい Style/AndOr: EnforcedStyle: conditionals # 日本語のコメントを許可する Style/AsciiComments: Enabled: false # do .. end から更にメソッドチェーンすると見づらいので # auto-correct せず、自分で修正する # spec 内は見た目が綺麗になるので許可 Style/BlockDelimiters: AutoCorrect: false Exclude: - "spec/**/*" # option 等、明示的にハッシュにした方が分かりやすい場合もある Style/BracesAroundHashParameters: Enabled: false # scope が違うとか親 module の存在確認が必要とかデメリットはあるが、 # namespace 付きのクラスはかなり頻繁に作るので簡単に書きたい。 Style/ClassAndModuleChildren: Enabled: false # Style/CollectionMethods 自体は無効になっているのだが、 # https://github.com/bbatsov/rubocop/issues/1084 # https://github.com/bbatsov/rubocop/issues/1334 # Performance/Detect がこの設定値を見るので PreferredMethods だけ変更しておく。 # # デフォルト値から変えたのは # find -> detect # ActiveRecord の find と間違えやすいため # reduce -> inject # detect, reject, select と並べたときに韻を踏んでいるため。 # collect -> map を維持しているのは文字数が圧倒的に少ないため。 Style/CollectionMethods: PreferredMethods: detect: "detect" find: "detect" inject: "inject" reduce: "inject" # Hash#has_key? は許可したい Style/DeprecatedHashMethods: Enabled: false # ドキュメントの無い public class を許可する Style/Documentation: Enabled: false # !! のイディオムは積極的に使う Style/DoubleNegation: Enabled: false # メソッドチェーンの改行は末尾に . を入れる # REPL に貼り付けた際の暴発を防ぐため Style/DotPosition: EnforcedStyle: trailing # case # when ios? # when android? # end # のようなものは case の方が網羅の表現力が高い Style/EmptyCaseCondition: Enabled: false # 明示的に else で nil を返すのは分かりやすいので許可する Style/EmptyElse: EnforcedStyle: empty # 桁揃えが綺麗にならないことが多いので migration は除外 Style/ExtraSpacing: Exclude: - "db/migrate/*.rb" # いずれかに揃えるのならば `sprintf` や `format` より String#% が好きです Style/FormatString: EnforcedStyle: percent # まだ対応するには早い Style/FrozenStringLiteralComment: Enabled: false # if 文の中に 3 行程度のブロックを書くぐらいは許容した方が現実的 # NOTE: https://github.com/bbatsov/rubocop/commit/29945958034db13af9e8ff385ec58cb9eb464596 # の影響で、if 文の中身が 1 行の場合に警告されるようになっている。 # Style/IfUnlessModifier の設定見てくれないかなぁ? (v0.36.0) Style/GuardClause: MinBodyLength: 5 # rake タスクの順序の hash は rocket を許可する Style/HashSyntax: Exclude: - "**/*.rake" - "Rakefile" # 平たくしてしまうと条件のグルーピングが脳内モデルとズレやすい Style/IfInsideElse: Enabled: false # 条件式の方を意識させたい場合には後置の if/unless を使わない方が分かりやすい Style/IfUnlessModifier: Enabled: false # special_inside_parentheses (default) と比べて # * 横に長くなりづらい # * メソッド名の長さが変わったときに diff が少ない Style/IndentArray: EnforcedStyle: consistent # ({ と hash を開始した場合に ( の位置にインデントさせる # そもそも {} が必要ない可能性が高いが Style/BracesAroundHashParameters はチェックしないことにしたので Style/IndentHash: EnforcedStyle: consistent # private/protected は一段深くインデントする Style/IndentationConsistency: EnforcedStyle: rails # scope 等は複数行でも lambda ではなく ->{} で揃えた方が見た目が綺麗 Style/Lambda: EnforcedStyle: literal # 1_000_000 と区切り文字が 2 個以上必要になる場合のみ _ 区切りを必須にする Style/NumericLiterals: MinDigits: 7 # 正規表現にマッチさせた時の特殊変数の置き換えは Regex.last_match ではなく # 名前付きキャプチャを使って参照したいので auto-correct しない Style/PerlBackrefs: AutoCorrect: false # has_ から始まるメソッドは許可する Style/PredicateName: NamePrefixBlacklist: - "is_" - "have_" NamePrefix: - "is_" - "have_" # 特に model 内において、ローカル変数とメソッド呼び出しの区別をつけた方が分かりやすい場合が多い Style/RedundantSelf: Enabled: false # 受け取り側で multiple assignment しろというのを明示 Style/RedundantReturn: AllowMultipleReturnValues: true # spec 内は見た目が綺麗になるので許可 Style/Semicolon: Exclude: - "spec/**/*" # * 式展開したい場合に書き換えるのが面倒 # * 文章ではダブルクォートよりもシングルクォートの方が頻出する # ことから EnforcedStyle: double_quotes 推奨 Style/StringLiterals: EnforcedStyle: double_quotes # auto-correct 時に Style/StringLiterals とカニバって無限ループになる (v0.28.0) Style/StringLiteralsInInterpolation: Enabled: false # いくらなんでも inject { |a, e| } は短すぎるので分かりやすい名前をつけたい Style/SingleLineBlockParams: Enabled: false # 複数行の場合はケツカンマを入れる Style/TrailingCommaInLiteral: EnforcedStyleForMultiline: comma ##################### Lint ################################## # * 同名のメソッドがある場合にローカル変数に `_` を付ける # * 一時変数として `_` を付ける # というテクニックは頻出する Lint/UnderscorePrefixedVariableName: Enabled: false # 子クラスで実装させるつもりのメソッドで引っかかるので Lint/UnusedMethodArgument: Enabled: false ##################### Metrics ################################## # 30 まではギリギリ許せる範囲だった Metrics/AbcSize: Max: 30 # 6 は強すぎるので緩める Metrics/CyclomaticComplexity: Max: 10 # * 警告 120文字 # * 禁止 160文字 # のイメージ Metrics/LineLength: Max: 160 Exclude: - "db/migrate/*.rb" # 20 行超えるのは migration ファイル以外滅多に無い Metrics/MethodLength: Max: 20 Exclude: - "db/migrate/*.rb" # 分岐の数。ガード句を多用しているとデフォルト 7 だと厳しい Metrics/PerceivedComplexity: Max: 8