Merge PR #671: tree-sitter version mismatch hint
This commit is contained in:
@@ -1028,6 +1028,15 @@ def _extract_generic(path: Path, config: LanguageConfig) -> dict:
|
||||
language = Language(lang_fn())
|
||||
except ImportError:
|
||||
return {"nodes": [], "edges": [], "error": f"{config.ts_module} not installed"}
|
||||
except TypeError as e:
|
||||
# tree-sitter version mismatch: old Language() expects (lib_path),
|
||||
# new Language() expects (language_capsule, name). Surface a hint
|
||||
# so users see the upgrade path instead of a bare TypeError.
|
||||
hint = (
|
||||
f"tree-sitter version mismatch for {config.ts_module}: {e}. "
|
||||
"Try: pip install --upgrade tree-sitter tree-sitter-languages"
|
||||
)
|
||||
return {"nodes": [], "edges": [], "error": hint}
|
||||
except Exception as e:
|
||||
return {"nodes": [], "edges": [], "error": str(e)}
|
||||
|
||||
|
||||
@@ -194,3 +194,35 @@ def test_cross_file_calls_skip_ambiguous_duplicate_labels(tmp_path):
|
||||
nodes[e["source"]]["label"] == "run()" and nodes[e["target"]]["label"] == "log()"
|
||||
for e in calls
|
||||
)
|
||||
|
||||
|
||||
def test_extract_generic_surfaces_tree_sitter_version_mismatch_hint(monkeypatch):
|
||||
"""When Language() raises TypeError (e.g. old tree-sitter binding meets a
|
||||
new tree-sitter API), the error message should point users at the upgrade
|
||||
path instead of leaving a bare 'missing 1 required positional argument'.
|
||||
"""
|
||||
import sys
|
||||
import types
|
||||
from graphify.extract import _extract_generic, LanguageConfig
|
||||
|
||||
# Build a fake tree_sitter module whose Language() raises TypeError -
|
||||
# this is exactly what users see when an older tree-sitter is paired
|
||||
# with a newer language binding.
|
||||
fake_ts = types.ModuleType("tree_sitter")
|
||||
def _raise(*args, **kwargs):
|
||||
raise TypeError("missing 1 required positional argument: 'name'")
|
||||
fake_ts.Language = _raise
|
||||
fake_ts.Parser = None
|
||||
monkeypatch.setitem(sys.modules, "tree_sitter", fake_ts)
|
||||
|
||||
# Stub the language module so import_module returns something with .language
|
||||
fake_lang_mod = types.ModuleType("fake_ts_lang")
|
||||
fake_lang_mod.language = lambda: object()
|
||||
monkeypatch.setitem(sys.modules, "fake_ts_lang", fake_lang_mod)
|
||||
|
||||
config = LanguageConfig(ts_module="fake_ts_lang", ts_language_fn="language")
|
||||
result = _extract_generic(Path("dummy.txt"), config)
|
||||
|
||||
assert "error" in result
|
||||
assert "tree-sitter version mismatch" in result["error"]
|
||||
assert "pip install --upgrade" in result["error"]
|
||||
|
||||
Reference in New Issue
Block a user