Gemini Code Assist でチェックするカスタムのベスト プラクティスや規約がある場合は、リポジトリの .gemini/
ルートフォルダに styleguide.md
ファイルを追加できます。このファイルは通常のテキスト ファイルとして扱われ、Gemini Code Assist が使用する標準プロンプトを拡張します。
標準的なコードレビュー パターン
カスタム スタイルガイドが指定されていない場合、Gemini Code Assist がコードレビューの対象とする主なカテゴリは次のとおりです。
正確性: コードが意図したとおりに機能し、エッジケースを処理することを確認します。論理エラー、競合状態、API の誤った使用がないかチェックします。
効率: 過剰なループ、メモリリーク、非効率的なデータ構造、冗長な計算、過剰なロギング、非効率的な文字列操作など、パフォーマンスのボトルネックや最適化の対象となる領域を特定します。
保守性: コードの読みやすさ、モジュール性、言語のイディオムとベスト プラクティスの遵守を評価します。変数、関数、クラスの命名が不適切である、コメントやドキュメントがない、コードが複雑である、コードが重複している、形式が統一されていない、マジック ナンバーがあるといった問題点を特定します。
セキュリティ: 機密データの安全でない保存、インジェクション攻撃、不十分なアクセス制御、クロスサイト リクエスト フォージェリ(CSRF)、安全でない直接オブジェクト参照(IDOR)など、データ処理や入力検証における潜在的な脆弱性を特定します。
その他: プルリクエストのレビュー時に、テスト、パフォーマンス、スケーラビリティ、モジュール性と再利用性、エラー ロギングとモニタリングなどの他のトピックが考慮されます。
構成ファイルを追加する
.gemini/
フォルダには、config.yaml
や styleguide.md
など、Gemini Code Assist 関連の構成ファイルが格納されます。
config.yaml
ファイルには、glob パターンを使用して無視するファイルを指定するなど、有効または無効にできるさまざまな構成可能な機能が含まれています。styleguide.md
テキスト ファイルはスタイルガイドです。このファイルには、コードレビューの実行時に Gemini Code Assist に従わせる特定のルールが記述されています。
これらの構成ファイルを追加するには、リポジトリの .gemini/
フォルダにファイルを作成し、次の表を参照してください。
デフォルト構成
次のコード スニペットは、デフォルト設定の config.yaml
ファイルの例です。特定の設定を指定しない場合、Gemini Code Assist はデフォルトの設定を使用します。このスニペットをテンプレートとして使用して、独自の config.yaml
ファイルを作成できます。
have_fun: false
code_review:
disable: false
comment_severity_threshold: MEDIUM
max_review_comments: -1
pull_request_opened:
help: false
summary: true
code_review: true
include_drafts: true
ignore_patterns: []
構成スキーマ
次のコード スニペットは、config.yaml
ファイルのスキーマです。可能なすべての構成オプションとその許容値を定義します。
$schema: "http://json-schema.org/draft-07/schema#"
title: RepoConfig
description: Configuration for Gemini Code Assist on a repository. All fields are optional and have default values.
type: object
properties:
have_fun:
type: boolean
description: Enables fun features such as a poem in the initial pull request summary. Default: false.
ignore_patterns:
type: array
items:
type: string
description: A list of glob patterns for files and directories that Gemini Code Assist should ignore. Files matching any pattern in this list will be skipped during interactions. Default: [].
code_review:
type: object
description: Configuration for code reviews. All fields are optional and have default values.
properties:
disable:
type: boolean
description: Disables Gemini from acting on pull requests. Default: false.
comment_severity_threshold:
type: string
enum:
- LOW
- MEDIUM
- HIGH
- CRITICAL
description: The minimum severity of review comments to consider. Default: MEDIUM.
max_review_comments:
type: integer
format: int64
description: The maximum number of review comments to consider. Use -1 for unlimited. Default: -1.
pull_request_opened:
type: object
description: Configuration for pull request opened events. All fields are optional and have default values.
properties:
help:
type: boolean
description: Posts a help message on pull request open. Default: false.
summary:
type: boolean
description: Posts a pull request summary on the pull request open. Default: true.
code_review:
type: boolean
description: Posts a code review on pull request open. Default: true.
include_drafts:
type: boolean
description: Enables agent functionality on draft pull requests. Default: true.
スタイルガイド
次のコード スニペットは、styleguide.md
ファイルの例を示しています。
# Company X Python Style Guide
# Introduction
This style guide outlines the coding conventions for Python code developed at Company X.
It's based on PEP 8, but with some modifications to address specific needs and
preferences within our organization.
# Key Principles
* **Readability:** Code should be easy to understand for all team members.
* **Maintainability:** Code should be easy to modify and extend.
* **Consistency:** Adhering to a consistent style across all projects improves
collaboration and reduces errors.
* **Performance:** While readability is paramount, code should be efficient.
# Deviations from PEP 8
## Line Length
* **Maximum line length:** 100 characters (instead of PEP 8's 79).
* Modern screens allow for wider lines, improving code readability in many cases.
* Many common patterns in our codebase, like long strings or URLs, often exceed 79 characters.
## Indentation
* **Use 4 spaces per indentation level.** (PEP 8 recommendation)
## Imports
* **Group imports:**
* Standard library imports
* Related third party imports
* Local application/library specific imports
* **Absolute imports:** Always use absolute imports for clarity.
* **Import order within groups:** Sort alphabetically.
## Naming Conventions
* **Variables:** Use lowercase with underscores (snake_case): `user_name`, `total_count`
* **Constants:** Use uppercase with underscores: `MAX_VALUE`, `DATABASE_NAME`
* **Functions:** Use lowercase with underscores (snake_case): `calculate_total()`, `process_data()`
* **Classes:** Use CapWords (CamelCase): `UserManager`, `PaymentProcessor`
* **Modules:** Use lowercase with underscores (snake_case): `user_utils`, `payment_gateway`
## Docstrings
* **Use triple double quotes (`"""Docstring goes here."""`) for all docstrings.**
* **First line:** Concise summary of the object's purpose.
* **For complex functions/classes:** Include detailed descriptions of parameters, return values,
attributes, and exceptions.
* **Use Google style docstrings:** This helps with automated documentation generation.
```python
def my_function(param1, param2):
"""Single-line summary.
More detailed description, if necessary.
Args:
param1 (int): The first parameter.
param2 (str): The second parameter.
Returns:
bool: The return value. True for success, False otherwise.
Raises:
ValueError: If `param2` is invalid.
"""
# function body here
```
## Type Hints
* **Use type hints:** Type hints improve code readability and help catch errors early.
* **Follow PEP 484:** Use the standard type hinting syntax.
## Comments
* **Write clear and concise comments:** Explain the "why" behind the code, not just the "what".
* **Comment sparingly:** Well-written code should be self-documenting where possible.
* **Use complete sentences:** Start comments with a capital letter and use proper punctuation.
## Logging
* **Use a standard logging framework:** Company X uses the built-in `logging` module.
* **Log at appropriate levels:** DEBUG, INFO, WARNING, ERROR, CRITICAL
* **Provide context:** Include relevant information in log messages to aid debugging.
## Error Handling
* **Use specific exceptions:** Avoid using broad exceptions like `Exception`.
* **Handle exceptions gracefully:** Provide informative error messages and avoid crashing the program.
* **Use `try...except` blocks:** Isolate code that might raise exceptions.
# Tooling
* **Code formatter:** [Specify formatter, e.g., Black] - Enforces consistent formatting automatically.
* **Linter:** [Specify linter, e.g., Flake8, Pylint] - Identifies potential issues and style violations.
# Example
```python
"""Module for user authentication."""
import hashlib
import logging
import os
from companyx.db import user_database
LOGGER = logging.getLogger(__name__)
def hash_password(password: str) -> str:
"""Hashes a password using SHA-256.
Args:
password (str): The password to hash.
Returns:
str: The hashed password.
"""
salt = os.urandom(16)
salted_password = salt + password.encode('utf-8')
hashed_password = hashlib.sha256(salted_password).hexdigest()
return f"{salt.hex()}:{hashed_password}"
def authenticate_user(username: str, password: str) -> bool:
"""Authenticates a user against the database.
Args:
username (str): The user's username.
password (str): The user's password.
Returns:
bool: True if the user is authenticated, False otherwise.
"""
try:
user = user_database.get_user(username)
if user is None:
LOGGER.warning("Authentication failed: User not found - %s", username)
return False
stored_hash = user.password_hash
salt, hashed_password = stored_hash.split(':')
salted_password = bytes.fromhex(salt) + password.encode('utf-8')
calculated_hash = hashlib.sha256(salted_password).hexdigest()
if calculated_hash == hashed_password:
LOGGER.info("User authenticated successfully - %s", username)
return True
else:
LOGGER.warning("Authentication failed: Incorrect password - %s", username)
return False
except Exception as e:
LOGGER.error("An error occurred during authentication: %s", e)
return False