JA Development Guides Local Development - hiraishikentaro/rails-factorybot-jump GitHub Wiki

開発ガイド: ローカル開発

ローカル開発セットアップ

前提条件の確認

ローカル開発を始める前に、環境が要件を満たしていることを確認してください:

# Node.js バージョンをチェック(18.x 必須)
node --version

# npm バージョンをチェック
npm --version

# VSCode バージョンをチェック(1.85.0+ 必須)
code --version

# TypeScript インストールをチェック
npx tsc --version

プロジェクトセットアップ

1. クローンとインストール:

git clone https://github.com/hiraishikentaro/rails-factorybot-jump.git
cd rails-factorybot-jump
npm install

2. インストール確認:

# TypeScript をコンパイル
npm run compile

# リンティングを実行
npm run lint

# テストを実行
npm test

ソース: package.json#L68-L76

開発ワークフロー

1. 開発環境

VSCode 開発セットアップ:

# プロジェクトを VSCode で開く
code .

# 推奨拡張機能をインストール
# - TypeScript and JavaScript Language Features(組み込み)
# - ESLint
# - Mocha Test Explorer

開発モード:

# 自動コンパイル用のウォッチモード
npm run watch

# これにより:
# - TypeScript ファイルの変更を監視
# - out/ ディレクトリに自動再コンパイル
# - デバッグ用のソースマップを保持

2. Extension Development Host

開発環境の起動:

  1. プロジェクトを VSCode で開く
  2. F5 を押すか、実行 → デバッグの開始に移動
  3. これにより新しい "Extension Development Host" ウィンドウが起動
  4. 拡張機能がこのウィンドウに自動的にロード
  5. 開発ホストで変更をテスト

開発ホストの機能:

  • 拡張機能がロードされた完全な VSCode 環境
  • 再コンパイル時のリアルタイム更新
  • デバッグ用の Developer Tools アクセス
  • メイン VSCode インストールから分離

3. ホットリロード開発

自動再コンパイル:

# ターミナル 1: TypeScript コンパイル用ウォッチモード
npm run watch

# ターミナル 2: 必要に応じてテストのウォッチモード
npm run test:watch

拡張機能のリロード:

  • Extension Development Host で、Ctrl+R(Windows/Linux)または Cmd+R(Mac)を押す
  • これにより最新の変更で拡張機能がリロード
  • 開発ホスト全体を再起動する必要はない

ファイル構造と開発

ソースコード構成

src/
├── extension.ts              # メインエントリーポイント - ここから開始
├── providers/
│   └── factoryLinkProvider.ts # コアビジネスロジック
├── test/
│   ├── runTest.ts           # テスト設定
│   └── suite/
│       └── extension.test.ts # テストケース
└── utils/                   # 将来のユーティリティモジュール

主要な開発ファイル

メイン拡張機能エントリー (src/extension.ts):

  • 拡張機能のアクティベーションと非アクティベーション
  • VSCode へのプロバイダー登録
  • コマンド登録
  • ファイルシステムウォッチャーセットアップ

コアプロバイダー (src/providers/factoryLinkProvider.ts):

  • ファクトリー検出ロジック
  • キャッシュ管理
  • ドキュメントリンク生成
  • 設定処理

ソース: src/extension.ts, src/providers/factoryLinkProvider.ts

開発中のテスト

1. ユニットテスト開発

テストの実行:

# すべてのテストを実行
npm test

# 特定のテストスイートを実行
npm test -- --grep "ファクトリー検出"

# 詳細な出力でテストを実行
npm test -- --reporter spec

新しいテストの記述:

// src/test/suite/extension.test.ts にテストを追加
suite("新機能", () => {
  test("新しい機能を処理すべき", () => {
    // テスト実装
    assert.strictEqual(actual, expected);
  });
});

2. 手動テスト

ファクトリー検出のテスト:

  1. テスト Ruby ファイルを作成:
# test.rb
RSpec.describe User do
  it "creates user" do
    user = create(:user, :admin)
    expect(user).to be_valid
  end
end
  1. テストファクトリーファイルを作成:
# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { "Test User" }

    trait :admin do
      admin { true }
    end
  end
end
  1. Extension Development Host で test.rb を開く
  2. :user:admin にホバーしてリンクが表示されることを確認
  3. リンクをクリックしてナビゲーションが動作することを確認

3. インテグレーションテスト

設定変更のテスト:

  1. Extension Development Host で設定を開く
  2. rails-factorybot-jump.factoryPaths を変更
  3. 拡張機能がファクトリー検索パスを更新することを確認
  4. カスタムファクトリーディレクトリ構造でテスト

ファイル監視のテスト:

  1. Extension Development Host が開いている間にファクトリーファイルを変更
  2. キャッシュが自動的に更新されることを確認
  3. テストファイルでリンクが更新されることを確認

デバッグ技術

1. VSCode デバッグ

デバッガーセットアップ:

// .vscode/launch.json(すでに設定済み)
{
  "type": "extensionHost",
  "request": "launch",
  "name": "Extension",
  "runtimeExecutable": "${execPath}",
  "args": ["--extensionDevelopmentPath=${workspaceRoot}"]
}

デバッグワークフロー:

  1. TypeScript ソースファイルにブレークポイントを設定
  2. F5 を押してデバッグを開始
  3. Extension Development Host を使用してブレークポイントをトリガー
  4. 変数、コールスタック、実行フローを検査

2. コンソールログ

戦略的ログ:

// ファクトリー検出をデバッグ
console.log("ファクトリー検出正規表現結果:", matches);

// キャッシュ操作をデバッグ
console.log("ファクトリーキャッシュサイズ:", factoryCache.size);
console.log("ファクトリーキャッシュ内容:", Array.from(factoryCache.entries()));

// ファイル操作をデバッグ
console.log(
  "見つかったファクトリーファイル:",
  factoryFiles.map((f) => f.path)
);

VSCode Developer Tools:

  1. Extension Development Host で: Help → Toggle Developer Tools
  2. Console タブでデバッグ出力を確認
  3. Network タブでファイル操作を監視
  4. Sources タブでソースマップを使用したデバッグ

開発のベストプラクティス

1. コード構成

単一責任:

// 良い例: 各メソッドが一つの明確な目的を持つ
class FactoryLinkProvider {
  private async initializeFactoryFiles() {
    /* ... */
  }
  private async cacheFactoryDefinitions() {
    /* ... */
  }
  private createDocumentLink() {
    /* ... */
  }
}

明確なインターフェース:

// 良い例: 明確なデータ構造
interface FactoryDefinition {
  uri: vscode.Uri;
  lineNumber: number;
}

interface TraitDefinition extends FactoryDefinition {
  factory: string;
}

2. エラーハンドリング

グレースフル劣化:

// 良い例: 部分的な機能で継続
try {
  const factoryFiles = await vscode.workspace.findFiles(pattern);
  await this.processFactoryFiles(factoryFiles);
} catch (error) {
  console.warn("一部のファクトリーファイルの読み込みに失敗、継続:", error);
  // 利用可能なファイルで継続
}

この包括的なローカル開発ガイドは、Rails FactoryBot Jump 拡張機能に効果的に貢献するために必要なすべてを提供します。