RuboCopルール開発ガイドライン
RuboCop のコードベーススタイルはRuboCop によって定義され、運用されています。
bundle exec rubocop --parallel
を使って、内部で違反がないかチェックできます。CI上では、static-analysis
のジョブによって自動的にチェックされます。
さらに、Solargraphgemを使って、サポートされているIDEにRuboCopをインテグレーションできます。
RuboCop のルールでまだ決定していないものについては、Ruby スタイルガイドに従って慣用的な Ruby を記述してください。
レビュアー/メンテナーは寛容であるべきであり、スタイルについてあまり衒学的であってはなりません。
RuboCop のルールには無効なものもあり、その場合、レビュアー/メンテナーは作成者にどちらかのスタイルを使うように求めてはいけません。これは理想的な状況ではありません。理想的には、スタイルに関連した議論や小言、レビューでの行き違いを避けるために、すべてのRuboCopルールを有効にすべきです。GitLab Rubyスタイルガイドには、レビュアーがよく使うスタイルで強制されないもののリストがあります。
デフォルトでは、RuboCopルールをインラインで無効にすべきではありません。ルールがコードベースに適用しようとしている、合意されたコード標準を否定することになるからです。
どうしてもインラインで無効にしたい場合は、マージする前に MR にその理由を記述し、レビュアーが同意するようにしてください。
さらに、テスト専用のスタイルガイドとベストプラクティスがあります。
新しい RuboCop コップの作成
一般的に、lintルールはプログラムによって実行された方が、前述のようなバイクシェッディングを減らすことができます。
そのため、コードベースで新しい RuboCop ルールを作成することを推奨します。
あるスタイルを強制するために新しい警官を追加する前に、必ずチームと話し合ってください。
私たちはいくつかの Ruby コードベースにわたって cop をメンテナーしており、そのすべてが GitLab アプリケーションに特有というわけではありません。複数のアプリケーションに適用できるような新しい cop を作成する場合は、gitlab-styles
gem に追加することをお勧めします。メインのGitLabアプリケーションにのみ適用されるルールを対象とする場合は、代わりにGitLabに追加する必要があります。
コップの猶予期間
コップが有効で、TODO YAML設定にDetails: grace period
。
デフォルトブランチでは、猶予期間中の警官からの違反は RuboCop CI ジョブに失敗しません。代わりに、ジョブは#f_rubocop
Slack チャンネルに通知します。しかし、他のブランチでは RuboCop ジョブは失敗します。
猶予期間は、Slack の#f_rubocop
チャンネルで 2 週間警告がなければ、安全に解除できます。
新しい警官の有効化
-
.rubocop.yml
で新しい警官を有効にします(gitlab-styles
でまだ有効になっていない場合)。 - 新しい警官のTODOを生成してください。
-
新しい警官を
grace period
に設定します。 - TODOを修正するイシューを作成し、(~"quick win "および/または~"Seeking community contributions "を使って)コミュニティに貢献することを奨励してください。いくつかの例をご覧ください。
-
#f_rubocop
Slack チャンネルで 2 週間沈黙した後、grace period
を削除するイシューを作成してください。例をご覧ください。
沈黙した違反
猶予期間中に警官の違反が黙殺されると、#f_rubocop
Slackチャンネルに2時間ごとに通知メッセージが届きます。
このイシューを修正するには
- リンクされたCIジョブでサイレンス犯罪の警官を検索します。
- これらの警官のTODOを生成します。
RuboCop ノードパターン
RubyのASTにマッチするノードパターンを作成する場合、scripts/rubocop-parse
。これはRuby式のASTを表示し、マッチャを作成するのに役立ちます。97024も参照してください。
RuboCop の例外の解決
RuboCop の例外の数がデフォルトのexclude-limit
(15) を超えると、複数のコミットで例外を解決したくなることがあります。混乱を最小限に抑えるため、例外リストを通して進捗を追跡する必要があります。
初期リストや特定の RuboCop ルールのリストを生成する方法として推奨されるのは、Rake タスクrubocop:todo:generate
を実行することです:
# Initial list
bundle exec rake rubocop:todo:generate
# List for specific RuboCop rules
bundle exec rake 'rubocop:todo:generate[Gitlab/NamespacedClass,Lint/Syntax]'
この Rake タスクは、.rubocop_todo/
にある例外リストを作成または更新します。たとえば、RuboCop ルールGitlab/NamespacedClass
の設定は.rubocop_todo/gitlab/namespaced_class.yml
にあります。
Rake タスクを実行した後、.rubocop_todo/
の変更を必ずコミットしてください。
既存の RuboCop 例外を明らかにします。
.rubocop_todo.yml
および.rubocop_todo/**/*.yml
によって除外されたコード内の既存の RuboCop 例外を明らかにするには、環境変数REVEAL_RUBOCOP_TODO
を1
に設定します。
これにより、日々の作業サイクルの中で既存の RuboCop 例外を明らかにし、途中で修正することができます。
.rubocop_todo/**/*.yml
の代わりに.rubocop.yml
で永続的なExclude
を定義します。