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_rubocopSlack チャンネルで 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を定義します。