Source code for analyzer.cli.module_search
import difflib
import inspect
from rich.table import Table
from rich.console import Console
from analyzer.core.analysis_modules import AnalyzerModule
import analyzer.modules # noqa
[docs]
def searchModules(query: str):
console = Console()
def getSubclasses(cls):
return set(cls.__subclasses__()).union(
[s for c in cls.__subclasses__() for s in getSubclasses(c)]
)
modules = getSubclasses(AnalyzerModule)
results = []
query = query.lower()
for mod in modules:
name = mod.name()
doc = inspect.getdoc(mod) or ""
score = 0
matches = []
if query == name.lower():
score += 100
matches.append("Exact Name")
elif query in name.lower():
score += 50
matches.append("Partial Name")
name_ratio = difflib.SequenceMatcher(None, query, name.lower()).ratio()
if name_ratio > 0.6:
score += int(name_ratio * 40)
matches.append(f"Fuzzy Name ({int(name_ratio * 100)}%)")
if query in doc.lower():
score += 30
matches.append("Docstring")
if score > 0:
results.append(
{
"name": name,
"score": score,
"matches": ", ".join(matches),
"doc": doc.split("\n")[0] if doc else "",
}
)
results.sort(key=lambda x: x["score"], reverse=True)
if not results:
console.print(f"[yellow]No modules found matching '{query}'[/yellow]")
return
table = Table(title=f"Search Results for '{query}'")
table.add_column("Module Name", style="cyan", no_wrap=True)
table.add_column("Match Type", style="magenta")
table.add_column("Description", style="green")
for res in results:
table.add_row(res["name"], res["matches"], res["doc"])
console.print(table)