MCP Source Relation Server

by owayo
Verified
import re from pathlib import Path from typing import Set from ..utils.path import search_in_path from .base import BaseAnalyzer class RubyAnalyzer(BaseAnalyzer): """Ruby用アナライザー""" def __init__(self, base_dir: Path): super().__init__(base_dir) # Ruby標準ライブラリやGemのパスは除外 self.search_paths = [ self.base_dir / "lib", self.base_dir / "app", self.base_dir, ] @property def file_extensions(self) -> list[str]: return [".rb"] def analyze_imports(self, content: str, file_path: Path) -> Set[str]: imports = set() patterns = [ r'require\s+[\'"](.+?)[\'"]', r'require_relative\s+[\'"](.+?)[\'"]', ] for pattern in patterns: for match in re.finditer(pattern, content): path = match.group(1) resolved_path = None if pattern.startswith("require_relative"): # require_relativeは現在のファイルからの相対パス resolved_path = self.resolve_relative_path( path, file_path, allow_index=False ) else: # requireはライブラリパスから探索 # 拡張子がない場合は.rbを補完 if "." not in path: path = f"{path}.rb" resolved_path = search_in_path( path, self.search_paths, self.file_extensions, allow_index=False, ) if resolved_path: normalized_path = self.normalize_path(resolved_path) imports.add(normalized_path) return imports