From 301e24a843d2116cf3b54bdb1a7a63ad99b8f40c Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 29 Jan 2026 22:28:06 +0000 Subject: [PATCH] Initial upload: TermDiagram v0.1.0 --- src/termdiagram/ui/fuzzy_search.py | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/termdiagram/ui/fuzzy_search.py diff --git a/src/termdiagram/ui/fuzzy_search.py b/src/termdiagram/ui/fuzzy_search.py new file mode 100644 index 0000000..144ae71 --- /dev/null +++ b/src/termdiagram/ui/fuzzy_search.py @@ -0,0 +1,55 @@ +from typing import List, Optional +from rapidfuzz import fuzz +from ..models import Module, ClassSymbol, FunctionSymbol, SymbolType + + +class SearchResult: + def __init__(self, name: str, symbol_type: str, path: str, line_number: int, score: float): + self.name = name + self.symbol_type = symbol_type + self.path = path + self.line_number = line_number + self.score = score + + +class FuzzySearcher: + def __init__(self): + self.symbols: List = [] + + def build_index(self, symbols: List): + self.symbols = symbols + + def search(self, query: str, limit: int = 10) -> List[SearchResult]: + results = [] + + for symbol in self.symbols: + score = fuzz.ratio(query.lower(), symbol.name.lower()) + if score > 50: + symbol_type = self._get_symbol_type(symbol) + path = getattr(symbol, "path", "") + line_number = getattr(symbol, "line_number", 0) + results.append( + SearchResult( + name=symbol.name, + symbol_type=symbol_type, + path=path, + line_number=line_number, + score=score, + ) + ) + + results.sort(key=lambda x: x.score, reverse=True) + return results[:limit] + + def _get_symbol_type(self, symbol) -> str: + if isinstance(symbol, Module): + return "module" + elif isinstance(symbol, ClassSymbol): + return "class" + elif isinstance(symbol, FunctionSymbol): + return "function" + else: + return "unknown" + + def get_symbol_count(self) -> int: + return len(self.symbols)