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 週間警告がなければ、安全に解除できます。

新しい警官の有効化

  1. .rubocop.yml で新しい警官を有効にします(gitlab-styles でまだ有効になっていない場合)。
  2. 新しい警官のTODOを生成してください。
  3. 新しい警官をgrace period に設定します。
  4. TODOを修正するイシューを作成し、(~"quick win "および/または~"Seeking community contributions "を使って)コミュニティに貢献することを奨励してください。いくつかの例をご覧ください。
  5. #f_rubocop Slack チャンネルで 2 週間沈黙した後、grace period を削除するイシューを作成してください。例をご覧ください。

沈黙した違反

猶予期間中に警官の違反が黙殺されると、#f_rubocop Slackチャンネルに2時間ごとに通知メッセージが届きます。

このイシューを修正するには

  1. リンクされたCIジョブでサイレンス犯罪の警官を検索します。
  2. これらの警官の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_TODO1に設定します。

これにより、日々の作業サイクルの中で既存の RuboCop 例外を明らかにし、途中で修正することができます。

note
.rubocop_todo/**/*.ymlの代わりに.rubocop.yml で永続的なExcludeを定義します。