tree-sitter-analyzer 1.6.1.2__py3-none-any.whl → 1.6.1.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of tree-sitter-analyzer might be problematic. Click here for more details.
- tree_sitter_analyzer/__init__.py +1 -1
- tree_sitter_analyzer/core/query.py +11 -9
- tree_sitter_analyzer/core/query_service.py +10 -13
- tree_sitter_analyzer/encoding_utils.py +55 -0
- tree_sitter_analyzer/file_handler.py +43 -27
- tree_sitter_analyzer/languages/python_plugin.py +51 -27
- tree_sitter_analyzer/logging_manager.py +361 -0
- tree_sitter_analyzer/mcp/server.py +1 -1
- tree_sitter_analyzer/mcp/tools/output_format_validator.py +147 -0
- tree_sitter_analyzer/mcp/tools/search_content_tool.py +41 -8
- tree_sitter_analyzer/mcp/utils/file_output_manager.py +74 -1
- tree_sitter_analyzer/mcp/utils/search_cache.py +9 -0
- tree_sitter_analyzer/utils.py +38 -203
- {tree_sitter_analyzer-1.6.1.2.dist-info → tree_sitter_analyzer-1.6.1.4.dist-info}/METADATA +7 -7
- {tree_sitter_analyzer-1.6.1.2.dist-info → tree_sitter_analyzer-1.6.1.4.dist-info}/RECORD +17 -15
- {tree_sitter_analyzer-1.6.1.2.dist-info → tree_sitter_analyzer-1.6.1.4.dist-info}/WHEEL +0 -0
- {tree_sitter_analyzer-1.6.1.2.dist-info → tree_sitter_analyzer-1.6.1.4.dist-info}/entry_points.txt +0 -0
|
@@ -8,6 +8,9 @@ appropriate extensions based on content type, with security validation.
|
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
10
|
import os
|
|
11
|
+
import tempfile
|
|
12
|
+
import threading
|
|
13
|
+
import time
|
|
11
14
|
from pathlib import Path
|
|
12
15
|
from typing import Any
|
|
13
16
|
|
|
@@ -22,6 +25,72 @@ class FileOutputManager:
|
|
|
22
25
|
Manages file output for analysis results with automatic extension detection
|
|
23
26
|
and security validation.
|
|
24
27
|
"""
|
|
28
|
+
|
|
29
|
+
# クラス変数で警告メッセージの重複を防ぐ(プロセス内のみ)
|
|
30
|
+
_warning_messages_shown = set()
|
|
31
|
+
# スレッド間の排他制御用ロック
|
|
32
|
+
_warning_lock = threading.Lock()
|
|
33
|
+
|
|
34
|
+
# プロセス間共有用のファイルベース重複防止
|
|
35
|
+
@staticmethod
|
|
36
|
+
def _get_warning_lock_file(warning_key: str) -> Path:
|
|
37
|
+
"""警告メッセージ用のロックファイルパスを取得"""
|
|
38
|
+
temp_dir = Path(tempfile.gettempdir())
|
|
39
|
+
safe_key = warning_key.replace("/", "_").replace(":", "_").replace("\\", "_")
|
|
40
|
+
return temp_dir / f"tree_sitter_analyzer_warning_{safe_key}.lock"
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def _should_show_warning(warning_key: str, max_age_seconds: int = 300) -> bool:
|
|
44
|
+
"""
|
|
45
|
+
プロセス間で警告表示の可否を判定
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
warning_key: 警告キー
|
|
49
|
+
max_age_seconds: ロックファイルの有効期間(秒)
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
警告を表示すべきかどうか
|
|
53
|
+
"""
|
|
54
|
+
# スレッド間の排他制御
|
|
55
|
+
with FileOutputManager._warning_lock:
|
|
56
|
+
# プロセス内での重複チェック
|
|
57
|
+
if warning_key in FileOutputManager._warning_messages_shown:
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
# プロセス間での重複チェック
|
|
61
|
+
lock_file = FileOutputManager._get_warning_lock_file(warning_key)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# ロックファイルが存在し、有効期間内なら警告をスキップ
|
|
65
|
+
if lock_file.exists():
|
|
66
|
+
mtime = lock_file.stat().st_mtime
|
|
67
|
+
if time.time() - mtime < max_age_seconds:
|
|
68
|
+
FileOutputManager._warning_messages_shown.add(warning_key)
|
|
69
|
+
return False
|
|
70
|
+
else:
|
|
71
|
+
# 期限切れのロックファイルを削除
|
|
72
|
+
try:
|
|
73
|
+
lock_file.unlink()
|
|
74
|
+
except (OSError, FileNotFoundError):
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
# ロックファイルを排他的に作成して警告表示権を獲得
|
|
78
|
+
# 'x'モードは、ファイルが既に存在する場合FileExistsErrorを発生させる
|
|
79
|
+
try:
|
|
80
|
+
with open(lock_file, 'x') as f:
|
|
81
|
+
f.write(str(time.time()))
|
|
82
|
+
FileOutputManager._warning_messages_shown.add(warning_key)
|
|
83
|
+
return True
|
|
84
|
+
except FileExistsError:
|
|
85
|
+
# 別のプロセスが先にロックを獲得した
|
|
86
|
+
FileOutputManager._warning_messages_shown.add(warning_key)
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
except (OSError, IOError):
|
|
90
|
+
# ファイル操作に失敗した場合はフォールバック
|
|
91
|
+
# プロセス内のみの重複防止に戻る
|
|
92
|
+
FileOutputManager._warning_messages_shown.add(warning_key)
|
|
93
|
+
return True
|
|
25
94
|
|
|
26
95
|
def __init__(self, project_root: str | None = None):
|
|
27
96
|
"""
|
|
@@ -51,7 +120,11 @@ class FileOutputManager:
|
|
|
51
120
|
|
|
52
121
|
# Priority 3: Current working directory as fallback
|
|
53
122
|
self._output_path = str(Path.cwd())
|
|
54
|
-
|
|
123
|
+
|
|
124
|
+
# プロセス間で重複警告を防ぐ
|
|
125
|
+
warning_key = f"fallback_path:{self._output_path}"
|
|
126
|
+
if self._should_show_warning(warning_key):
|
|
127
|
+
logger.warning(f"Using current directory as output path: {self._output_path}")
|
|
55
128
|
|
|
56
129
|
def get_output_path(self) -> str:
|
|
57
130
|
"""
|
|
@@ -308,6 +308,15 @@ class SearchCache:
|
|
|
308
308
|
"word": params.get("word", False),
|
|
309
309
|
"multiline": params.get("multiline", False),
|
|
310
310
|
"max_filesize": params.get("max_filesize", ""),
|
|
311
|
+
# Include output format parameters in cache key
|
|
312
|
+
"total_only": params.get("total_only", False),
|
|
313
|
+
"count_only_matches": params.get("count_only_matches", False),
|
|
314
|
+
"summary_only": params.get("summary_only", False),
|
|
315
|
+
"group_by_file": params.get("group_by_file", False),
|
|
316
|
+
"optimize_paths": params.get("optimize_paths", False),
|
|
317
|
+
"max_count": params.get("max_count", None),
|
|
318
|
+
"context_before": params.get("context_before", None),
|
|
319
|
+
"context_after": params.get("context_after", None),
|
|
311
320
|
}
|
|
312
321
|
|
|
313
322
|
# Create deterministic key
|
tree_sitter_analyzer/utils.py
CHANGED
|
@@ -14,191 +14,29 @@ from functools import wraps
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
|
+
# Import the new unified logging manager
|
|
18
|
+
from .logging_manager import get_logger_manager, SafeStreamHandler
|
|
19
|
+
|
|
17
20
|
|
|
18
|
-
# Configure global logger
|
|
19
21
|
def setup_logger(
|
|
20
22
|
name: str = "tree_sitter_analyzer", level: int | str = logging.WARNING
|
|
21
23
|
) -> logging.Logger:
|
|
22
|
-
"""Setup unified logger for the project"""
|
|
23
|
-
# Handle string level parameter
|
|
24
|
-
if isinstance(level, str):
|
|
25
|
-
level_upper = level.upper()
|
|
26
|
-
if level_upper == "DEBUG":
|
|
27
|
-
level = logging.DEBUG
|
|
28
|
-
elif level_upper == "INFO":
|
|
29
|
-
level = logging.INFO
|
|
30
|
-
elif level_upper == "WARNING":
|
|
31
|
-
level = logging.WARNING
|
|
32
|
-
elif level_upper == "ERROR":
|
|
33
|
-
level = logging.ERROR
|
|
34
|
-
else:
|
|
35
|
-
level = logging.WARNING # Default fallback
|
|
36
|
-
|
|
37
|
-
# Get log level from environment variable (only if set and not empty)
|
|
38
|
-
env_level = os.environ.get("LOG_LEVEL", "").upper()
|
|
39
|
-
if env_level and env_level in ["DEBUG", "INFO", "WARNING", "ERROR"]:
|
|
40
|
-
if env_level == "DEBUG":
|
|
41
|
-
level = logging.DEBUG
|
|
42
|
-
elif env_level == "INFO":
|
|
43
|
-
level = logging.INFO
|
|
44
|
-
elif env_level == "WARNING":
|
|
45
|
-
level = logging.WARNING
|
|
46
|
-
elif env_level == "ERROR":
|
|
47
|
-
level = logging.ERROR
|
|
48
|
-
# If env_level is empty or not recognized, use the passed level parameter
|
|
49
|
-
|
|
50
|
-
logger = logging.getLogger(name)
|
|
51
|
-
|
|
52
|
-
# Clear existing handlers if this is a test logger to ensure clean state
|
|
53
|
-
if name.startswith("test_"):
|
|
54
|
-
logger.handlers.clear()
|
|
55
|
-
|
|
56
|
-
# Initialize file logging variables at function scope
|
|
57
|
-
enable_file_log = (
|
|
58
|
-
os.environ.get("TREE_SITTER_ANALYZER_ENABLE_FILE_LOG", "").lower() == "true"
|
|
59
|
-
)
|
|
60
|
-
file_log_level = level # Default to main logger level
|
|
61
|
-
|
|
62
|
-
if not logger.handlers: # Avoid duplicate handlers
|
|
63
|
-
# Create a safe handler that writes to stderr to avoid breaking MCP stdio
|
|
64
|
-
handler = SafeStreamHandler()
|
|
65
|
-
formatter = logging.Formatter(
|
|
66
|
-
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
67
|
-
)
|
|
68
|
-
handler.setFormatter(formatter)
|
|
69
|
-
logger.addHandler(handler)
|
|
70
|
-
|
|
71
|
-
# Optional file logging for debugging when launched by clients (e.g., Cursor)
|
|
72
|
-
# This helps diagnose cases where stdio is captured by the client and logs are hidden.
|
|
73
|
-
# Only enabled when TREE_SITTER_ANALYZER_ENABLE_FILE_LOG is set to 'true'
|
|
74
|
-
if enable_file_log:
|
|
75
|
-
try:
|
|
76
|
-
# Determine log directory
|
|
77
|
-
log_dir = os.environ.get("TREE_SITTER_ANALYZER_LOG_DIR")
|
|
78
|
-
if log_dir:
|
|
79
|
-
# Use specified directory
|
|
80
|
-
log_path = Path(log_dir) / "tree_sitter_analyzer.log"
|
|
81
|
-
# Ensure directory exists
|
|
82
|
-
Path(log_dir).mkdir(parents=True, exist_ok=True)
|
|
83
|
-
else:
|
|
84
|
-
# Use system temporary directory
|
|
85
|
-
temp_dir = tempfile.gettempdir()
|
|
86
|
-
log_path = Path(temp_dir) / "tree_sitter_analyzer.log"
|
|
87
|
-
|
|
88
|
-
# Determine file log level
|
|
89
|
-
file_log_level_str = os.environ.get(
|
|
90
|
-
"TREE_SITTER_ANALYZER_FILE_LOG_LEVEL", ""
|
|
91
|
-
).upper()
|
|
92
|
-
if file_log_level_str and file_log_level_str in [
|
|
93
|
-
"DEBUG",
|
|
94
|
-
"INFO",
|
|
95
|
-
"WARNING",
|
|
96
|
-
"ERROR",
|
|
97
|
-
]:
|
|
98
|
-
if file_log_level_str == "DEBUG":
|
|
99
|
-
file_log_level = logging.DEBUG
|
|
100
|
-
elif file_log_level_str == "INFO":
|
|
101
|
-
file_log_level = logging.INFO
|
|
102
|
-
elif file_log_level_str == "WARNING":
|
|
103
|
-
file_log_level = logging.WARNING
|
|
104
|
-
elif file_log_level_str == "ERROR":
|
|
105
|
-
file_log_level = logging.ERROR
|
|
106
|
-
else:
|
|
107
|
-
# Use same level as main logger
|
|
108
|
-
file_log_level = level
|
|
109
|
-
|
|
110
|
-
file_handler = logging.FileHandler(str(log_path), encoding="utf-8")
|
|
111
|
-
file_handler.setFormatter(formatter)
|
|
112
|
-
file_handler.setLevel(file_log_level)
|
|
113
|
-
logger.addHandler(file_handler)
|
|
114
|
-
|
|
115
|
-
# Log the file location for debugging purposes
|
|
116
|
-
if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
|
|
117
|
-
try:
|
|
118
|
-
sys.stderr.write(
|
|
119
|
-
f"[logging_setup] File logging enabled: {log_path}\n"
|
|
120
|
-
)
|
|
121
|
-
except Exception:
|
|
122
|
-
...
|
|
123
|
-
|
|
124
|
-
except Exception as e:
|
|
125
|
-
# Never let logging configuration break runtime behavior; log to stderr if possible
|
|
126
|
-
if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
|
|
127
|
-
try:
|
|
128
|
-
sys.stderr.write(
|
|
129
|
-
f"[logging_setup] file handler init skipped: {e}\n"
|
|
130
|
-
)
|
|
131
|
-
except Exception:
|
|
132
|
-
...
|
|
133
|
-
|
|
134
|
-
# Set the logger level to the minimum of main level and file log level
|
|
135
|
-
# This ensures that all messages that should go to any handler are processed
|
|
136
|
-
final_level = level
|
|
137
|
-
if enable_file_log:
|
|
138
|
-
# Use the minimum level to ensure all messages reach their intended handlers
|
|
139
|
-
final_level = min(level, file_log_level)
|
|
140
|
-
|
|
141
|
-
logger.setLevel(final_level)
|
|
142
|
-
|
|
143
|
-
# For test loggers, ensure they don't inherit from parent and force level
|
|
144
|
-
if logger.name.startswith("test_"):
|
|
145
|
-
logger.propagate = False
|
|
146
|
-
# Force the level setting for test loggers
|
|
147
|
-
logger.level = level
|
|
148
|
-
|
|
149
|
-
return logger
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
class SafeStreamHandler(logging.StreamHandler):
|
|
153
24
|
"""
|
|
154
|
-
|
|
25
|
+
Setup unified logger for the project using LoggerManager
|
|
26
|
+
|
|
27
|
+
This function now delegates to the LoggerManager for unified logging
|
|
28
|
+
while maintaining backward compatibility with the existing API.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
name: Logger name
|
|
32
|
+
level: Log level (string or int)
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Configured logger instance
|
|
155
36
|
"""
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
super().__init__(stream if stream is not None else sys.stderr)
|
|
160
|
-
|
|
161
|
-
def emit(self, record: Any) -> None:
|
|
162
|
-
"""
|
|
163
|
-
Emit a record, safely handling closed streams and pytest capture
|
|
164
|
-
"""
|
|
165
|
-
try:
|
|
166
|
-
# Check if stream is closed before writing
|
|
167
|
-
if hasattr(self.stream, "closed") and self.stream.closed:
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
# Check if we can write to the stream
|
|
171
|
-
if not hasattr(self.stream, "write"):
|
|
172
|
-
return
|
|
173
|
-
|
|
174
|
-
# Special handling for pytest capture scenarios
|
|
175
|
-
# Check if this is a pytest capture stream that might be problematic
|
|
176
|
-
stream_name = getattr(self.stream, "name", "")
|
|
177
|
-
if stream_name is None or "pytest" in str(type(self.stream)).lower():
|
|
178
|
-
# For pytest streams, be extra cautious
|
|
179
|
-
try:
|
|
180
|
-
# Just try to emit without any pre-checks
|
|
181
|
-
super().emit(record)
|
|
182
|
-
return
|
|
183
|
-
except (ValueError, OSError, AttributeError, UnicodeError):
|
|
184
|
-
return
|
|
185
|
-
|
|
186
|
-
# Additional safety checks for stream validity for non-pytest streams
|
|
187
|
-
try:
|
|
188
|
-
# Test if we can actually write to the stream without flushing
|
|
189
|
-
# Avoid flush() as it can cause "I/O operation on closed file" in pytest
|
|
190
|
-
if hasattr(self.stream, "writable") and not self.stream.writable():
|
|
191
|
-
return
|
|
192
|
-
except (ValueError, OSError, AttributeError, UnicodeError):
|
|
193
|
-
return
|
|
194
|
-
|
|
195
|
-
super().emit(record)
|
|
196
|
-
except (ValueError, OSError, AttributeError, UnicodeError):
|
|
197
|
-
# Silently ignore I/O errors during shutdown or pytest capture
|
|
198
|
-
pass
|
|
199
|
-
except Exception:
|
|
200
|
-
# For any other unexpected errors, silently ignore to prevent test failures
|
|
201
|
-
pass
|
|
37
|
+
# Use the unified logger manager
|
|
38
|
+
logger_manager = get_logger_manager()
|
|
39
|
+
return logger_manager.get_logger(name, level)
|
|
202
40
|
|
|
203
41
|
|
|
204
42
|
def setup_safe_logging_shutdown() -> None:
|
|
@@ -369,17 +207,18 @@ def safe_print(message: str | None, level: str = "info", quiet: bool = False) ->
|
|
|
369
207
|
|
|
370
208
|
|
|
371
209
|
def create_performance_logger(name: str) -> logging.Logger:
|
|
372
|
-
"""
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
210
|
+
"""
|
|
211
|
+
Create performance-focused logger using unified LoggerManager
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
name: Base name for the performance logger
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Configured performance logger
|
|
218
|
+
"""
|
|
219
|
+
logger_manager = get_logger_manager()
|
|
220
|
+
perf_logger_name = f"{name}.performance"
|
|
221
|
+
return logger_manager.get_logger(perf_logger_name, logging.DEBUG)
|
|
383
222
|
|
|
384
223
|
|
|
385
224
|
# Performance logger instance
|
|
@@ -402,7 +241,7 @@ def log_performance(
|
|
|
402
241
|
else:
|
|
403
242
|
detail_str = str(details)
|
|
404
243
|
message += f" - {detail_str}"
|
|
405
|
-
perf_logger.debug(message)
|
|
244
|
+
perf_logger.debug(message)
|
|
406
245
|
except (ValueError, OSError) as e:
|
|
407
246
|
if hasattr(sys, "stderr") and hasattr(sys.stderr, "write"):
|
|
408
247
|
try:
|
|
@@ -412,18 +251,14 @@ def log_performance(
|
|
|
412
251
|
|
|
413
252
|
|
|
414
253
|
def setup_performance_logger() -> logging.Logger:
|
|
415
|
-
"""
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
perf_logger.addHandler(handler)
|
|
424
|
-
perf_logger.setLevel(logging.INFO)
|
|
425
|
-
|
|
426
|
-
return perf_logger
|
|
254
|
+
"""
|
|
255
|
+
Set up performance logging (unified with create_performance_logger)
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
Performance logger instance
|
|
259
|
+
"""
|
|
260
|
+
# Delegate to the unified create_performance_logger
|
|
261
|
+
return create_performance_logger("performance")
|
|
427
262
|
|
|
428
263
|
|
|
429
264
|
class LoggingContext:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tree-sitter-analyzer
|
|
3
|
-
Version: 1.6.1.
|
|
3
|
+
Version: 1.6.1.4
|
|
4
4
|
Summary: Extensible multi-language code analyzer framework using Tree-sitter with dynamic plugin architecture
|
|
5
5
|
Project-URL: Homepage, https://github.com/aimasteracc/tree-sitter-analyzer
|
|
6
6
|
Project-URL: Documentation, https://github.com/aimasteracc/tree-sitter-analyzer#readme
|
|
@@ -38,7 +38,7 @@ Requires-Dist: tree-sitter-cpp<0.25.0,>=0.23.4
|
|
|
38
38
|
Requires-Dist: tree-sitter-java<0.25.0,>=0.23.5
|
|
39
39
|
Requires-Dist: tree-sitter-javascript<0.25.0,>=0.23.1
|
|
40
40
|
Requires-Dist: tree-sitter-python<0.25.0,>=0.23.6
|
|
41
|
-
Requires-Dist: tree-sitter
|
|
41
|
+
Requires-Dist: tree-sitter>=0.25.0
|
|
42
42
|
Provides-Extra: all
|
|
43
43
|
Requires-Dist: anyio>=4.0.0; extra == 'all'
|
|
44
44
|
Requires-Dist: black>=24.0.0; extra == 'all'
|
|
@@ -165,11 +165,11 @@ Description-Content-Type: text/markdown
|
|
|
165
165
|
|
|
166
166
|
[](https://python.org)
|
|
167
167
|
[](LICENSE)
|
|
168
|
-
[](#quality-assurance)
|
|
169
169
|
[](#quality-assurance)
|
|
170
170
|
[](#quality-assurance)
|
|
171
171
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
172
|
-
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
173
173
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
174
174
|
|
|
175
175
|
## 🚀 Enterprise-Grade Code Analysis Tool for the AI Era
|
|
@@ -224,7 +224,7 @@ Tree-sitter Analyzer is an enterprise-grade code analysis tool designed for the
|
|
|
224
224
|
- **More Languages** - Basic support for C/C++, Rust, Go
|
|
225
225
|
|
|
226
226
|
### 🏆 Production Ready
|
|
227
|
-
- **
|
|
227
|
+
- **1980 Tests** - Comprehensive test coverage, enterprise-grade quality assurance
|
|
228
228
|
- **71.48% Coverage** - Comprehensive test suite
|
|
229
229
|
- **Cross-Platform Support** - Full compatibility with Windows, macOS, Linux
|
|
230
230
|
- **Continuous Maintenance** - Active development and community support
|
|
@@ -731,7 +731,7 @@ Powerful file discovery and content search based on fd and ripgrep:
|
|
|
731
731
|
## 🏆 Quality Assurance
|
|
732
732
|
|
|
733
733
|
### 📊 Quality Metrics
|
|
734
|
-
- **
|
|
734
|
+
- **1980 Tests** - Comprehensive test coverage ✅
|
|
735
735
|
- **71.48% Code Coverage** - Comprehensive test suite
|
|
736
736
|
- **Zero Test Failures** - Production ready
|
|
737
737
|
- **Cross-Platform Support** - Windows, macOS, Linux
|
|
@@ -784,7 +784,7 @@ uv run pytest tests/test_mcp_server_initialization.py -v
|
|
|
784
784
|
**Verification Environment:**
|
|
785
785
|
- Operating Systems: Windows 10, macOS, Linux
|
|
786
786
|
- Python Version: 3.10+
|
|
787
|
-
- Project Version: tree-sitter-analyzer v1.6.1.
|
|
787
|
+
- Project Version: tree-sitter-analyzer v1.6.1.4
|
|
788
788
|
- Test Files: BigService.java (1419 lines), sample.py (256 lines), MultiClass.java (54 lines)
|
|
789
789
|
|
|
790
790
|
---
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
tree_sitter_analyzer/__init__.py,sha256=
|
|
1
|
+
tree_sitter_analyzer/__init__.py,sha256=uQLp3KXeuJDq1B5eHowray1HngjGdDoPOJu3Qf3gmiM,3069
|
|
2
2
|
tree_sitter_analyzer/__main__.py,sha256=Zl79tpe4UaMu-7yeztc06tgP0CVMRnvGgas4ZQP5SCs,228
|
|
3
3
|
tree_sitter_analyzer/api.py,sha256=jzwID6fJNdhQkJP3D0lzBVPhOnGIN4tyyMtmRYdK9zI,22753
|
|
4
4
|
tree_sitter_analyzer/cli_main.py,sha256=BuaM-L-Jx3G49qvAUOQVsw0wEM-X0UzPaRszRZBist4,10374
|
|
5
5
|
tree_sitter_analyzer/constants.py,sha256=7w3sLFt_6vPaKsxzrc21K1rOKpLGMyyA1203nu3pDOQ,1889
|
|
6
|
-
tree_sitter_analyzer/encoding_utils.py,sha256=
|
|
6
|
+
tree_sitter_analyzer/encoding_utils.py,sha256=hPPoRzMHHYZ2hLREjp3OHWkmmVmjC6H0TX3SxyBXcGg,16704
|
|
7
7
|
tree_sitter_analyzer/exceptions.py,sha256=AZryCQyKXekAg8lQZd3zqULnjhCKovBNNpnUlNGDhcI,11615
|
|
8
|
-
tree_sitter_analyzer/file_handler.py,sha256=
|
|
8
|
+
tree_sitter_analyzer/file_handler.py,sha256=f89N0CcnxfZxphu4QDpormc5AXoUko132EYK-kFoTx0,7753
|
|
9
9
|
tree_sitter_analyzer/language_detector.py,sha256=pn3nQClo8b_Ar8dS5X3hq9_t5IIlIcizIC0twMaowU4,11693
|
|
10
10
|
tree_sitter_analyzer/language_loader.py,sha256=gBUXGPTv91bRNs_urH23wzNKgh7ki6KkvpQ7iNPe3Rw,8922
|
|
11
|
+
tree_sitter_analyzer/logging_manager.py,sha256=pQYQAQi1RheWokGsokNuF9Ik466jQK5UQC8PSVOxpEU,12669
|
|
11
12
|
tree_sitter_analyzer/models.py,sha256=eZSVTl4s0rnqG21nyCTaJhyhDw1HZkkpMRKCi2QRkL0,20404
|
|
12
13
|
tree_sitter_analyzer/output_manager.py,sha256=tMEyjGeczqphcLoHdqxgyW8KaG8w6JF-fhsIibNQiCU,8260
|
|
13
14
|
tree_sitter_analyzer/project_detector.py,sha256=10-aaIvgQSOkoR-1cWAyWVHAdEnJUEv0yOdxzN_VEv0,9463
|
|
14
15
|
tree_sitter_analyzer/query_loader.py,sha256=jcJc6_kIMeZINfTVGuiEmDii9LViP_pbJfg4A9phJY4,9863
|
|
15
16
|
tree_sitter_analyzer/table_formatter.py,sha256=tPKw77LLlQ7k5MMs9_Ez7qsSroNaSzZPoplyPtKHLhA,28577
|
|
16
|
-
tree_sitter_analyzer/utils.py,sha256=
|
|
17
|
+
tree_sitter_analyzer/utils.py,sha256=HB1gtN0gBwGqS92r6fNRpoHuIAOJtAEtd68P_TI30G0,9015
|
|
17
18
|
tree_sitter_analyzer/cli/__init__.py,sha256=O_3URpbdu5Ilb2-r48LjbZuWtOWQu_BhL3pa6C0G3Bk,871
|
|
18
19
|
tree_sitter_analyzer/cli/__main__.py,sha256=Xq8o8-0dPnMDU9WZqmqhzr98rx8rvoffTUHAkAwl-L8,218
|
|
19
20
|
tree_sitter_analyzer/cli/info_commands.py,sha256=thWCLZ4iGVmqxuQfUz3t-uNRv9X3lgtWnsUJm6mbJ7o,4432
|
|
@@ -34,9 +35,9 @@ tree_sitter_analyzer/core/analysis_engine.py,sha256=IHE4ZQDGI4uu2Eh0QYX1bPsDBhtE
|
|
|
34
35
|
tree_sitter_analyzer/core/cache_service.py,sha256=0oZGuTpeHBKYNdnqAOVi6VlQukYMIHncz2pbVfNpSqE,9762
|
|
35
36
|
tree_sitter_analyzer/core/engine.py,sha256=5CheLzsxrApY6o2uM8sdYdzK4HkQypxlsYEFpUdai28,18357
|
|
36
37
|
tree_sitter_analyzer/core/parser.py,sha256=qT3yIlTRdod4tf_2o1hU_B-GYGukyM2BtaFxzSoxois,9293
|
|
37
|
-
tree_sitter_analyzer/core/query.py,sha256=
|
|
38
|
+
tree_sitter_analyzer/core/query.py,sha256=vwFBCfKoSizqMpbILFGyOXkMIFAZ4irzlrILR0NDzfM,16630
|
|
38
39
|
tree_sitter_analyzer/core/query_filter.py,sha256=PvGztAZFooFNZe6iHNmbg6RUNtMvq6f6hBZFzllig6Y,6591
|
|
39
|
-
tree_sitter_analyzer/core/query_service.py,sha256=
|
|
40
|
+
tree_sitter_analyzer/core/query_service.py,sha256=9wmmva4t0GV_KXZ7oHy0gBKacxrjh3WzzriN9Ht5fA4,5435
|
|
40
41
|
tree_sitter_analyzer/formatters/__init__.py,sha256=yVb4HF_4EEPRwTf3y3-vM2NllrhykG3zlvQhN-6dB4c,31
|
|
41
42
|
tree_sitter_analyzer/formatters/base_formatter.py,sha256=XZwZ0klyCnmNkpWnMP7dy0XGaHForjE-BnBt1XZoQE8,5901
|
|
42
43
|
tree_sitter_analyzer/formatters/formatter_factory.py,sha256=-yUeMiwg0eVyMtPsZjGNAUftfTVz4hoTj_9gOj5cefI,2225
|
|
@@ -51,9 +52,9 @@ tree_sitter_analyzer/interfaces/mcp_server.py,sha256=dUFn1CyO2jLa_y5gGOGE-f0sLGA
|
|
|
51
52
|
tree_sitter_analyzer/languages/__init__.py,sha256=VTXxJgVjHJAciLhX0zzXOS4EygZMtebeYUbi_0z6fGw,340
|
|
52
53
|
tree_sitter_analyzer/languages/java_plugin.py,sha256=G90_LlKdHtZNOPYu8MGBbgw6qkTiwd_QJu0xID3LMPc,50509
|
|
53
54
|
tree_sitter_analyzer/languages/javascript_plugin.py,sha256=569WaMXOsR1M-_Eta32mdS4GBS_Qp43tqofKlOGWz7Y,55040
|
|
54
|
-
tree_sitter_analyzer/languages/python_plugin.py,sha256=
|
|
55
|
+
tree_sitter_analyzer/languages/python_plugin.py,sha256=RdDSxURvGsive72Zg4ZkymG4qh8zWC9MlfnsWhioobs,47347
|
|
55
56
|
tree_sitter_analyzer/mcp/__init__.py,sha256=8tC54ZYcZBcFEio-aDet7evzis50zV5gbHuvn_7K514,944
|
|
56
|
-
tree_sitter_analyzer/mcp/server.py,sha256=
|
|
57
|
+
tree_sitter_analyzer/mcp/server.py,sha256=2zAmcmd1ofCycW43EfAfbPt5AxB1Hgnbt4sjuu6_H4A,32962
|
|
57
58
|
tree_sitter_analyzer/mcp/resources/__init__.py,sha256=D46ZDhPQaCrQze8dHmijMg1QZQ4ABRIjG532sFpuGPo,1367
|
|
58
59
|
tree_sitter_analyzer/mcp/resources/code_file_resource.py,sha256=ZX5ZYSJfylBedpL80kTDlco2YZqgRMb5f3OW0VvOVRM,6166
|
|
59
60
|
tree_sitter_analyzer/mcp/resources/project_stats_resource.py,sha256=r2owXkWrZ-Ee9hLGpt-SSNOxzrzuNVgNXcwxQghCcrM,20057
|
|
@@ -64,17 +65,18 @@ tree_sitter_analyzer/mcp/tools/base_tool.py,sha256=qf2My325azlnKOugNVMN_R1jtZcjX
|
|
|
64
65
|
tree_sitter_analyzer/mcp/tools/fd_rg_utils.py,sha256=R1ICH40vkWO3OdKZjxok9ptQZpZ6-tM5SkLHHOC4-BE,17749
|
|
65
66
|
tree_sitter_analyzer/mcp/tools/find_and_grep_tool.py,sha256=G-aExFZUvpJtitmEfYAClsHmQ1p3HqsT4IkOlym9R_o,22100
|
|
66
67
|
tree_sitter_analyzer/mcp/tools/list_files_tool.py,sha256=TA1BRQtb-D5x1pD-IcRJYnP0WnnFfl9q7skI25MOdHk,12873
|
|
68
|
+
tree_sitter_analyzer/mcp/tools/output_format_validator.py,sha256=Kx-qSfLTQkYnLJed-4CUJmVuLJxSe6Djm0QnhGFZIrY,5252
|
|
67
69
|
tree_sitter_analyzer/mcp/tools/query_tool.py,sha256=1xY1ONNY2sIFJxoILlnNzBnwGVgzEF7vVJ2ccqR9auA,10879
|
|
68
70
|
tree_sitter_analyzer/mcp/tools/read_partial_tool.py,sha256=BMAJF205hTIrYTQJG6N1-vVuKSby2CSm9nWzSMMWceI,11339
|
|
69
|
-
tree_sitter_analyzer/mcp/tools/search_content_tool.py,sha256=
|
|
71
|
+
tree_sitter_analyzer/mcp/tools/search_content_tool.py,sha256=VqG_GHAE6dSyr1B80YK-I2sMssINnuH9i7WCdtYPSiA,24905
|
|
70
72
|
tree_sitter_analyzer/mcp/tools/table_format_tool.py,sha256=8_yTYv7j7gFoQxsduJgWO_aKzRP9TsITYqx8cxyj4wo,20148
|
|
71
73
|
tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py,sha256=-zZnqN9WcoyRTKM_16ADH859LSebzi34BGYwQL2zCOs,25084
|
|
72
74
|
tree_sitter_analyzer/mcp/utils/__init__.py,sha256=TgTTKsRJAqF95g1fAp5SR_zQVDkImpc_5R0Dw529UUw,3126
|
|
73
75
|
tree_sitter_analyzer/mcp/utils/error_handler.py,sha256=msrQHX67K3vhJsEc3OPRz5mmWU_yoHz55Lnxy0IZuy4,18404
|
|
74
|
-
tree_sitter_analyzer/mcp/utils/file_output_manager.py,sha256=
|
|
76
|
+
tree_sitter_analyzer/mcp/utils/file_output_manager.py,sha256=oDjAoAFydHD02DfnkUsry7H9r2q7i_oqzbdPWjYw4Xc,12059
|
|
75
77
|
tree_sitter_analyzer/mcp/utils/gitignore_detector.py,sha256=VmO35Xj1fWiKVs4Y9aiD1gILm_8Kf1R8mhvtiF-wcfg,11027
|
|
76
78
|
tree_sitter_analyzer/mcp/utils/path_resolver.py,sha256=77BmbyEuJCuDPNH9POcTOS4tYBorPu-IXFGpBC1DxOk,15006
|
|
77
|
-
tree_sitter_analyzer/mcp/utils/search_cache.py,sha256=
|
|
79
|
+
tree_sitter_analyzer/mcp/utils/search_cache.py,sha256=5iXlDpmJFBDW9njFZh_Dd9io-bz6-gD-1SFwjiYTga8,13566
|
|
78
80
|
tree_sitter_analyzer/plugins/__init__.py,sha256=ITE9bTz7NO4axnn8g5Z-1_ydhSLT0RnY6Y1J9OhUP3E,10326
|
|
79
81
|
tree_sitter_analyzer/plugins/base.py,sha256=FMRAOtjtDutNV8RnB6cmFgdvcjxKRAbrrzqldBBT1yk,17167
|
|
80
82
|
tree_sitter_analyzer/plugins/manager.py,sha256=PyEY3jeuCBpDVqguWhaAu7nzUZM17_pI6wml2e0Hamo,12535
|
|
@@ -87,7 +89,7 @@ tree_sitter_analyzer/security/__init__.py,sha256=ZTqTt24hsljCpTXAZpJC57L7MU5lJLT
|
|
|
87
89
|
tree_sitter_analyzer/security/boundary_manager.py,sha256=3eeENRKWtz2pyZHzd8DiVaq8fdeC6s1eVOuBylSmQPg,9347
|
|
88
90
|
tree_sitter_analyzer/security/regex_checker.py,sha256=jWK6H8PTPgzbwRPfK_RZ8bBTS6rtEbgjY5vr3YWjQ_U,9616
|
|
89
91
|
tree_sitter_analyzer/security/validator.py,sha256=yR4qTWEcXpR--bSFwtWvSgY0AzqujOFAqlc1Z7dlTdk,9809
|
|
90
|
-
tree_sitter_analyzer-1.6.1.
|
|
91
|
-
tree_sitter_analyzer-1.6.1.
|
|
92
|
-
tree_sitter_analyzer-1.6.1.
|
|
93
|
-
tree_sitter_analyzer-1.6.1.
|
|
92
|
+
tree_sitter_analyzer-1.6.1.4.dist-info/METADATA,sha256=pjEnX5EfNgtmFlaQeQLjR_KUYp1olwOZHHAK32S49MQ,32236
|
|
93
|
+
tree_sitter_analyzer-1.6.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
94
|
+
tree_sitter_analyzer-1.6.1.4.dist-info/entry_points.txt,sha256=dEQkGMGmGGBzssEKlXW9F0-VlO3XJW2fJUv9i7898Ho,701
|
|
95
|
+
tree_sitter_analyzer-1.6.1.4.dist-info/RECORD,,
|
|
File without changes
|
{tree_sitter_analyzer-1.6.1.2.dist-info → tree_sitter_analyzer-1.6.1.4.dist-info}/entry_points.txt
RENAMED
|
File without changes
|