Skip to content

Commit dd0f100

Browse files
jddunnclaude
andcommitted
fix(summarizer): gracefully handle missing scikit-learn for TextRank
TextRank strategy initialization now catches ImportError when scikit-learn is not installed, allowing the summarizer to fall back to extractive/compressive strategies. Previously, `tenets distill` would crash with "TextRank requires scikit-learn" even though sklearn is an optional dependency in [mcp] extras. - Wrap TextRankStrategy() init in try/except in Summarizer.__init__ - Add test for graceful degradation when sklearn unavailable - Bump version to v0.9.2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent a1c9cc5 commit dd0f100

4 files changed

Lines changed: 22 additions & 3 deletions

File tree

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[project]
44
name = "tenets"
5-
version = "0.9.1"
5+
version = "0.9.2"
66
description = "MCP server for AI coding assistants — intelligent code context via Model Context Protocol"
77
authors = [{name = "Tenets Team", email = "team@tenets.dev"}]
88
readme = {file = "README.md", content-type = "text/markdown"}

‎tenets/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
from __future__ import annotations
2525

26-
__version__ = "0.9.1"
26+
__version__ = "0.9.2"
2727
__author__ = "Johnny Dunn"
2828
__license__ = "MIT"
2929

‎tenets/core/summarizer/summarizer.py‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,14 @@ def __init__(
162162
self.strategies: Dict[SummarizationMode, SummarizationStrategy] = {
163163
SummarizationMode.EXTRACTIVE: ExtractiveStrategy(),
164164
SummarizationMode.COMPRESSIVE: CompressiveStrategy(),
165-
SummarizationMode.TEXTRANK: TextRankStrategy(),
166165
}
167166

167+
# Try to initialize TextRank (requires scikit-learn)
168+
try:
169+
self.strategies[SummarizationMode.TEXTRANK] = TextRankStrategy()
170+
except ImportError:
171+
self.logger.debug("TextRank unavailable (scikit-learn not installed)")
172+
168173
# Try to initialize ML strategies
169174
self._init_ml_strategies()
170175

‎tests/core/summarizer/test_summarizer.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,20 @@ def test_initialization(self, config):
125125
assert SummarizationMode.EXTRACTIVE in summarizer.strategies
126126
assert SummarizationMode.COMPRESSIVE in summarizer.strategies
127127

128+
@patch("tenets.core.summarizer.summarizer.TextRankStrategy")
129+
def test_initialization_without_sklearn(self, mock_textrank, config):
130+
"""Test summarizer gracefully handles missing sklearn for TextRank."""
131+
# Simulate sklearn not installed
132+
mock_textrank.side_effect = ImportError("No module named 'sklearn'")
133+
134+
summarizer = Summarizer(config=config)
135+
136+
# Core strategies should still be available
137+
assert SummarizationMode.EXTRACTIVE in summarizer.strategies
138+
assert SummarizationMode.COMPRESSIVE in summarizer.strategies
139+
# TextRank should not be available
140+
assert SummarizationMode.TEXTRANK not in summarizer.strategies
141+
128142
def test_summarize_empty_text(self, summarizer):
129143
"""Test summarizing empty text."""
130144
result = summarizer.summarize("")

0 commit comments

Comments
 (0)