tree-sitter-analyzer 0.9.1__py3-none-any.whl → 0.9.3__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.

Files changed (64) hide show
  1. tree_sitter_analyzer/__init__.py +132 -132
  2. tree_sitter_analyzer/__main__.py +11 -11
  3. tree_sitter_analyzer/api.py +533 -533
  4. tree_sitter_analyzer/cli/__init__.py +39 -39
  5. tree_sitter_analyzer/cli/__main__.py +12 -12
  6. tree_sitter_analyzer/cli/commands/__init__.py +26 -26
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
  8. tree_sitter_analyzer/cli/commands/base_command.py +181 -178
  9. tree_sitter_analyzer/cli/commands/structure_command.py +138 -138
  10. tree_sitter_analyzer/cli/commands/summary_command.py +101 -101
  11. tree_sitter_analyzer/cli_main.py +7 -3
  12. tree_sitter_analyzer/core/__init__.py +15 -15
  13. tree_sitter_analyzer/core/analysis_engine.py +91 -87
  14. tree_sitter_analyzer/core/cache_service.py +320 -320
  15. tree_sitter_analyzer/core/engine.py +566 -566
  16. tree_sitter_analyzer/core/parser.py +293 -293
  17. tree_sitter_analyzer/encoding_utils.py +459 -459
  18. tree_sitter_analyzer/file_handler.py +210 -210
  19. tree_sitter_analyzer/formatters/__init__.py +1 -1
  20. tree_sitter_analyzer/formatters/base_formatter.py +167 -167
  21. tree_sitter_analyzer/formatters/formatter_factory.py +78 -78
  22. tree_sitter_analyzer/formatters/java_formatter.py +18 -18
  23. tree_sitter_analyzer/formatters/python_formatter.py +19 -19
  24. tree_sitter_analyzer/interfaces/__init__.py +9 -9
  25. tree_sitter_analyzer/interfaces/cli.py +528 -528
  26. tree_sitter_analyzer/interfaces/cli_adapter.py +344 -343
  27. tree_sitter_analyzer/interfaces/mcp_adapter.py +206 -206
  28. tree_sitter_analyzer/language_detector.py +53 -53
  29. tree_sitter_analyzer/languages/__init__.py +10 -10
  30. tree_sitter_analyzer/languages/java_plugin.py +1 -1
  31. tree_sitter_analyzer/languages/javascript_plugin.py +446 -446
  32. tree_sitter_analyzer/languages/python_plugin.py +755 -755
  33. tree_sitter_analyzer/mcp/__init__.py +34 -45
  34. tree_sitter_analyzer/mcp/resources/__init__.py +44 -44
  35. tree_sitter_analyzer/mcp/resources/code_file_resource.py +209 -209
  36. tree_sitter_analyzer/mcp/server.py +623 -568
  37. tree_sitter_analyzer/mcp/tools/__init__.py +30 -30
  38. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +681 -673
  39. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +247 -247
  40. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -54
  41. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +310 -308
  42. tree_sitter_analyzer/mcp/tools/table_format_tool.py +386 -379
  43. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +563 -559
  44. tree_sitter_analyzer/mcp/utils/__init__.py +107 -107
  45. tree_sitter_analyzer/models.py +10 -10
  46. tree_sitter_analyzer/output_manager.py +253 -253
  47. tree_sitter_analyzer/plugins/__init__.py +280 -280
  48. tree_sitter_analyzer/plugins/base.py +529 -529
  49. tree_sitter_analyzer/plugins/manager.py +379 -379
  50. tree_sitter_analyzer/project_detector.py +330 -317
  51. tree_sitter_analyzer/queries/__init__.py +26 -26
  52. tree_sitter_analyzer/queries/java.py +391 -391
  53. tree_sitter_analyzer/queries/javascript.py +148 -148
  54. tree_sitter_analyzer/queries/python.py +285 -285
  55. tree_sitter_analyzer/queries/typescript.py +229 -229
  56. tree_sitter_analyzer/query_loader.py +257 -257
  57. tree_sitter_analyzer/security/boundary_manager.py +57 -51
  58. tree_sitter_analyzer/security/validator.py +246 -241
  59. tree_sitter_analyzer/utils.py +294 -277
  60. {tree_sitter_analyzer-0.9.1.dist-info → tree_sitter_analyzer-0.9.3.dist-info}/METADATA +13 -13
  61. tree_sitter_analyzer-0.9.3.dist-info/RECORD +77 -0
  62. {tree_sitter_analyzer-0.9.1.dist-info → tree_sitter_analyzer-0.9.3.dist-info}/entry_points.txt +1 -0
  63. tree_sitter_analyzer-0.9.1.dist-info/RECORD +0 -77
  64. {tree_sitter_analyzer-0.9.1.dist-info → tree_sitter_analyzer-0.9.3.dist-info}/WHEEL +0 -0
@@ -1,277 +1,294 @@
1
- #!/usr/bin/env python3
2
- """
3
- Utilities for Tree-sitter Analyzer
4
-
5
- Provides logging, debugging, and common utility functions.
6
- """
7
-
8
- import atexit
9
- import logging
10
- import sys
11
- from functools import wraps
12
- from typing import Any
13
-
14
-
15
- # Configure global logger
16
- def setup_logger(
17
- name: str = "tree_sitter_analyzer", level: int = logging.INFO
18
- ) -> logging.Logger:
19
- """Setup unified logger for the project"""
20
- import os
21
-
22
- # Get log level from environment variable
23
- env_level = os.environ.get("LOG_LEVEL", "").upper()
24
- if env_level == "DEBUG":
25
- level = logging.DEBUG
26
- elif env_level == "INFO":
27
- level = logging.INFO
28
- elif env_level == "WARNING":
29
- level = logging.WARNING
30
- elif env_level == "ERROR":
31
- level = logging.ERROR
32
-
33
- logger = logging.getLogger(name)
34
-
35
- if not logger.handlers: # Avoid duplicate handlers
36
- # Create a safe handler that won't fail on closed streams
37
- handler = SafeStreamHandler(sys.stdout)
38
- formatter = logging.Formatter(
39
- "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
40
- )
41
- handler.setFormatter(formatter)
42
- logger.addHandler(handler)
43
- logger.setLevel(level)
44
-
45
- return logger
46
-
47
-
48
- class SafeStreamHandler(logging.StreamHandler):
49
- """
50
- A StreamHandler that safely handles closed streams
51
- """
52
-
53
- def emit(self, record: Any) -> None:
54
- """
55
- Emit a record, safely handling closed streams
56
- """
57
- try:
58
- # Check if stream is closed before writing
59
- if hasattr(self.stream, "closed") and self.stream.closed:
60
- return
61
-
62
- # Check if we can write to the stream
63
- if not hasattr(self.stream, "write"):
64
- return
65
-
66
- super().emit(record)
67
- except (ValueError, OSError, AttributeError):
68
- # Silently ignore I/O errors during shutdown
69
- pass
70
- except Exception:
71
- # For any other unexpected errors, use handleError
72
- self.handleError(record)
73
-
74
-
75
- def setup_safe_logging_shutdown() -> None:
76
- """
77
- Setup safe logging shutdown to prevent I/O errors
78
- """
79
-
80
- def cleanup_logging() -> None:
81
- """Clean up logging handlers safely"""
82
- try:
83
- # Get all loggers
84
- loggers = [logging.getLogger()] + [
85
- logging.getLogger(name) for name in logging.Logger.manager.loggerDict
86
- ]
87
-
88
- for logger in loggers:
89
- for handler in logger.handlers[:]:
90
- try:
91
- handler.close()
92
- logger.removeHandler(handler)
93
- except Exception:
94
- pass
95
- except Exception:
96
- pass
97
-
98
- # Register cleanup function
99
- atexit.register(cleanup_logging)
100
-
101
-
102
- # Setup safe shutdown on import
103
- setup_safe_logging_shutdown()
104
-
105
-
106
- # Global logger instance
107
- logger = setup_logger()
108
-
109
-
110
- def log_info(message: str, *args: Any, **kwargs: Any) -> None:
111
- """Log info message"""
112
- try:
113
- logger.info(message, *args, **kwargs)
114
- except (ValueError, OSError):
115
- pass # Silently ignore I/O errors
116
-
117
-
118
- def log_warning(message: str, *args: Any, **kwargs: Any) -> None:
119
- """Log warning message"""
120
- try:
121
- logger.warning(message, *args, **kwargs)
122
- except (ValueError, OSError):
123
- pass # Silently ignore I/O errors
124
-
125
-
126
- def log_error(message: str, *args: Any, **kwargs: Any) -> None:
127
- """Log error message"""
128
- try:
129
- logger.error(message, *args, **kwargs)
130
- except (ValueError, OSError):
131
- pass # Silently ignore I/O errors
132
-
133
-
134
- def log_debug(message: str, *args: Any, **kwargs: Any) -> None:
135
- """Log debug message"""
136
- try:
137
- logger.debug(message, *args, **kwargs)
138
- except (ValueError, OSError):
139
- pass # Silently ignore I/O errors
140
-
141
-
142
- def suppress_output(func: Any) -> Any:
143
- """Decorator to suppress print statements in production"""
144
-
145
- @wraps(func)
146
- def wrapper(*args: Any, **kwargs: Any) -> Any:
147
- # Check if we're in test/debug mode
148
- if getattr(sys, "_testing", False):
149
- return func(*args, **kwargs)
150
-
151
- # Redirect stdout to suppress prints
152
- old_stdout = sys.stdout
153
- try:
154
- sys.stdout = (
155
- open("/dev/null", "w") if sys.platform != "win32" else open("nul", "w")
156
- )
157
- result = func(*args, **kwargs)
158
- finally:
159
- try:
160
- sys.stdout.close()
161
- except Exception:
162
- pass
163
- sys.stdout = old_stdout
164
-
165
- return result
166
-
167
- return wrapper
168
-
169
-
170
- class QuietMode:
171
- """Context manager for quiet execution"""
172
-
173
- def __init__(self, enabled: bool = True):
174
- self.enabled = enabled
175
- self.old_level: int | None = None
176
-
177
- def __enter__(self) -> "QuietMode":
178
- if self.enabled:
179
- self.old_level = logger.level
180
- logger.setLevel(logging.ERROR)
181
- return self
182
-
183
- def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
184
- if self.enabled and self.old_level is not None:
185
- logger.setLevel(self.old_level)
186
-
187
-
188
- def safe_print(message: str, level: str = "info", quiet: bool = False) -> None:
189
- """Safe print function that can be controlled"""
190
- if quiet:
191
- return
192
-
193
- level_map = {
194
- "info": log_info,
195
- "warning": log_warning,
196
- "error": log_error,
197
- "debug": log_debug,
198
- }
199
-
200
- log_func = level_map.get(level.lower(), log_info)
201
- log_func(message)
202
-
203
-
204
- def create_performance_logger(name: str) -> logging.Logger:
205
- """Create performance-focused logger"""
206
- perf_logger = logging.getLogger(f"{name}.performance")
207
-
208
- if not perf_logger.handlers:
209
- handler = SafeStreamHandler()
210
- formatter = logging.Formatter("%(asctime)s - PERF - %(message)s")
211
- handler.setFormatter(formatter)
212
- perf_logger.addHandler(handler)
213
- perf_logger.setLevel(logging.INFO)
214
-
215
- return perf_logger
216
-
217
-
218
- # Performance logger instance
219
- perf_logger = create_performance_logger("tree_sitter_analyzer")
220
-
221
-
222
- def log_performance(
223
- operation: str,
224
- execution_time: float | None = None,
225
- details: dict[Any, Any] | str | None = None,
226
- ) -> None:
227
- """Log performance metrics"""
228
- try:
229
- message = f"{operation}"
230
- if execution_time is not None:
231
- message += f": {execution_time:.4f}s"
232
- if details:
233
- if isinstance(details, dict):
234
- detail_str = ", ".join([f"{k}: {v}" for k, v in details.items()])
235
- else:
236
- detail_str = str(details)
237
- message += f" - {detail_str}"
238
- perf_logger.info(message)
239
- except (ValueError, OSError):
240
- pass # Silently ignore I/O errors
241
-
242
-
243
- def setup_performance_logger() -> logging.Logger:
244
- """Set up performance logging"""
245
- perf_logger = logging.getLogger("performance")
246
-
247
- # Add handler if not already configured
248
- if not perf_logger.handlers:
249
- handler = SafeStreamHandler()
250
- formatter = logging.Formatter("%(asctime)s - Performance - %(message)s")
251
- handler.setFormatter(formatter)
252
- perf_logger.addHandler(handler)
253
- perf_logger.setLevel(logging.INFO)
254
-
255
- return perf_logger
256
-
257
-
258
- class LoggingContext:
259
- """Context manager for controlling logging behavior"""
260
-
261
- def __init__(self, enabled: bool = True, level: int | None = None):
262
- self.enabled = enabled
263
- self.level = level
264
- self.old_level: int | None = None
265
- self.target_logger = (
266
- logging.getLogger()
267
- ) # Use root logger for compatibility with tests
268
-
269
- def __enter__(self) -> "LoggingContext":
270
- if self.enabled and self.level is not None:
271
- self.old_level = self.target_logger.level
272
- self.target_logger.setLevel(self.level)
273
- return self
274
-
275
- def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
276
- if self.enabled and self.old_level is not None:
277
- self.target_logger.setLevel(self.old_level)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Utilities for Tree-sitter Analyzer
4
+
5
+ Provides logging, debugging, and common utility functions.
6
+ """
7
+
8
+ import atexit
9
+ import logging
10
+ import sys
11
+ from functools import wraps
12
+ from typing import Any
13
+
14
+
15
+ # Configure global logger
16
+ def setup_logger(
17
+ name: str = "tree_sitter_analyzer", level: int = logging.WARNING
18
+ ) -> logging.Logger:
19
+ """Setup unified logger for the project"""
20
+ import os
21
+
22
+ # Get log level from environment variable
23
+ env_level = os.environ.get("LOG_LEVEL", "").upper()
24
+ if env_level == "DEBUG":
25
+ level = logging.DEBUG
26
+ elif env_level == "INFO":
27
+ level = logging.INFO
28
+ elif env_level == "WARNING":
29
+ level = logging.WARNING
30
+ elif env_level == "ERROR":
31
+ level = logging.ERROR
32
+
33
+ logger = logging.getLogger(name)
34
+
35
+ if not logger.handlers: # Avoid duplicate handlers
36
+ # Create a safe handler that writes to stderr to avoid breaking MCP stdio
37
+ handler = SafeStreamHandler()
38
+ formatter = logging.Formatter(
39
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
40
+ )
41
+ handler.setFormatter(formatter)
42
+ logger.addHandler(handler)
43
+
44
+ # Also log to a local file for debugging when launched by clients (e.g., Cursor)
45
+ # This helps diagnose cases where stdio is captured by the client and logs are hidden.
46
+ try:
47
+ file_handler = logging.FileHandler(
48
+ "cursor_mcp_server.log", encoding="utf-8"
49
+ )
50
+ file_handler.setFormatter(formatter)
51
+ logger.addHandler(file_handler)
52
+ except Exception:
53
+ # Never let logging configuration break runtime behavior
54
+ pass
55
+
56
+ logger.setLevel(level)
57
+
58
+ return logger
59
+
60
+
61
+ class SafeStreamHandler(logging.StreamHandler):
62
+ """
63
+ A StreamHandler that safely handles closed streams
64
+ """
65
+
66
+ def __init__(self, stream=None):
67
+ # Default to sys.stderr to keep stdout clean for MCP stdio
68
+ super().__init__(stream if stream is not None else sys.stderr)
69
+
70
+ def emit(self, record: Any) -> None:
71
+ """
72
+ Emit a record, safely handling closed streams
73
+ """
74
+ try:
75
+ # Check if stream is closed before writing
76
+ if hasattr(self.stream, "closed") and self.stream.closed:
77
+ return
78
+
79
+ # Check if we can write to the stream
80
+ if not hasattr(self.stream, "write"):
81
+ return
82
+
83
+ super().emit(record)
84
+ except (ValueError, OSError, AttributeError):
85
+ # Silently ignore I/O errors during shutdown
86
+ pass
87
+ except Exception:
88
+ # For any other unexpected errors, use handleError
89
+ self.handleError(record)
90
+
91
+
92
+ def setup_safe_logging_shutdown() -> None:
93
+ """
94
+ Setup safe logging shutdown to prevent I/O errors
95
+ """
96
+
97
+ def cleanup_logging() -> None:
98
+ """Clean up logging handlers safely"""
99
+ try:
100
+ # Get all loggers
101
+ loggers = [logging.getLogger()] + [
102
+ logging.getLogger(name) for name in logging.Logger.manager.loggerDict
103
+ ]
104
+
105
+ for logger in loggers:
106
+ for handler in logger.handlers[:]:
107
+ try:
108
+ handler.close()
109
+ logger.removeHandler(handler)
110
+ except Exception:
111
+ pass
112
+ except Exception:
113
+ pass
114
+
115
+ # Register cleanup function
116
+ atexit.register(cleanup_logging)
117
+
118
+
119
+ # Setup safe shutdown on import
120
+ setup_safe_logging_shutdown()
121
+
122
+
123
+ # Global logger instance
124
+ logger = setup_logger()
125
+
126
+
127
+ def log_info(message: str, *args: Any, **kwargs: Any) -> None:
128
+ """Log info message"""
129
+ try:
130
+ logger.info(message, *args, **kwargs)
131
+ except (ValueError, OSError):
132
+ pass # Silently ignore I/O errors
133
+
134
+
135
+ def log_warning(message: str, *args: Any, **kwargs: Any) -> None:
136
+ """Log warning message"""
137
+ try:
138
+ logger.warning(message, *args, **kwargs)
139
+ except (ValueError, OSError):
140
+ pass # Silently ignore I/O errors
141
+
142
+
143
+ def log_error(message: str, *args: Any, **kwargs: Any) -> None:
144
+ """Log error message"""
145
+ try:
146
+ logger.error(message, *args, **kwargs)
147
+ except (ValueError, OSError):
148
+ pass # Silently ignore I/O errors
149
+
150
+
151
+ def log_debug(message: str, *args: Any, **kwargs: Any) -> None:
152
+ """Log debug message"""
153
+ try:
154
+ logger.debug(message, *args, **kwargs)
155
+ except (ValueError, OSError):
156
+ pass # Silently ignore I/O errors
157
+
158
+
159
+ def suppress_output(func: Any) -> Any:
160
+ """Decorator to suppress print statements in production"""
161
+
162
+ @wraps(func)
163
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
164
+ # Check if we're in test/debug mode
165
+ if getattr(sys, "_testing", False):
166
+ return func(*args, **kwargs)
167
+
168
+ # Redirect stdout to suppress prints
169
+ old_stdout = sys.stdout
170
+ try:
171
+ sys.stdout = (
172
+ open("/dev/null", "w") if sys.platform != "win32" else open("nul", "w")
173
+ )
174
+ result = func(*args, **kwargs)
175
+ finally:
176
+ try:
177
+ sys.stdout.close()
178
+ except Exception:
179
+ pass
180
+ sys.stdout = old_stdout
181
+
182
+ return result
183
+
184
+ return wrapper
185
+
186
+
187
+ class QuietMode:
188
+ """Context manager for quiet execution"""
189
+
190
+ def __init__(self, enabled: bool = True):
191
+ self.enabled = enabled
192
+ self.old_level: int | None = None
193
+
194
+ def __enter__(self) -> "QuietMode":
195
+ if self.enabled:
196
+ self.old_level = logger.level
197
+ logger.setLevel(logging.ERROR)
198
+ return self
199
+
200
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
201
+ if self.enabled and self.old_level is not None:
202
+ logger.setLevel(self.old_level)
203
+
204
+
205
+ def safe_print(message: str, level: str = "info", quiet: bool = False) -> None:
206
+ """Safe print function that can be controlled"""
207
+ if quiet:
208
+ return
209
+
210
+ level_map = {
211
+ "info": log_info,
212
+ "warning": log_warning,
213
+ "error": log_error,
214
+ "debug": log_debug,
215
+ }
216
+
217
+ log_func = level_map.get(level.lower(), log_info)
218
+ log_func(message)
219
+
220
+
221
+ def create_performance_logger(name: str) -> logging.Logger:
222
+ """Create performance-focused logger"""
223
+ perf_logger = logging.getLogger(f"{name}.performance")
224
+
225
+ if not perf_logger.handlers:
226
+ handler = SafeStreamHandler()
227
+ formatter = logging.Formatter("%(asctime)s - PERF - %(message)s")
228
+ handler.setFormatter(formatter)
229
+ perf_logger.addHandler(handler)
230
+ perf_logger.setLevel(logging.DEBUG) # Change to DEBUG level
231
+
232
+ return perf_logger
233
+
234
+
235
+ # Performance logger instance
236
+ perf_logger = create_performance_logger("tree_sitter_analyzer")
237
+
238
+
239
+ def log_performance(
240
+ operation: str,
241
+ execution_time: float | None = None,
242
+ details: dict[Any, Any] | str | None = None,
243
+ ) -> None:
244
+ """Log performance metrics"""
245
+ try:
246
+ message = f"{operation}"
247
+ if execution_time is not None:
248
+ message += f": {execution_time:.4f}s"
249
+ if details:
250
+ if isinstance(details, dict):
251
+ detail_str = ", ".join([f"{k}: {v}" for k, v in details.items()])
252
+ else:
253
+ detail_str = str(details)
254
+ message += f" - {detail_str}"
255
+ perf_logger.debug(message) # Change to DEBUG level
256
+ except (ValueError, OSError):
257
+ pass # Silently ignore I/O errors
258
+
259
+
260
+ def setup_performance_logger() -> logging.Logger:
261
+ """Set up performance logging"""
262
+ perf_logger = logging.getLogger("performance")
263
+
264
+ # Add handler if not already configured
265
+ if not perf_logger.handlers:
266
+ handler = SafeStreamHandler()
267
+ formatter = logging.Formatter("%(asctime)s - Performance - %(message)s")
268
+ handler.setFormatter(formatter)
269
+ perf_logger.addHandler(handler)
270
+ perf_logger.setLevel(logging.INFO)
271
+
272
+ return perf_logger
273
+
274
+
275
+ class LoggingContext:
276
+ """Context manager for controlling logging behavior"""
277
+
278
+ def __init__(self, enabled: bool = True, level: int | None = None):
279
+ self.enabled = enabled
280
+ self.level = level
281
+ self.old_level: int | None = None
282
+ self.target_logger = (
283
+ logging.getLogger()
284
+ ) # Use root logger for compatibility with tests
285
+
286
+ def __enter__(self) -> "LoggingContext":
287
+ if self.enabled and self.level is not None:
288
+ self.old_level = self.target_logger.level
289
+ self.target_logger.setLevel(self.level)
290
+ return self
291
+
292
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
293
+ if self.enabled and self.old_level is not None:
294
+ self.target_logger.setLevel(self.old_level)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tree-sitter-analyzer
3
- Version: 0.9.1
3
+ Version: 0.9.3
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
@@ -58,30 +58,30 @@ Requires-Dist: isort>=5.13.0; extra == 'dev'
58
58
  Requires-Dist: memory-profiler>=0.61.0; extra == 'dev'
59
59
  Requires-Dist: mypy>=1.17.0; extra == 'dev'
60
60
  Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
61
- Requires-Dist: psutil>=7.0.0; extra == 'dev'
61
+ Requires-Dist: psutil<6,>=5.9.6; extra == 'dev'
62
62
  Requires-Dist: pytest-asyncio>=1.1.0; extra == 'dev'
63
63
  Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
64
64
  Requires-Dist: pytest-mock>=3.14.1; extra == 'dev'
65
65
  Requires-Dist: pytest>=8.4.1; extra == 'dev'
66
- Requires-Dist: ruff>=0.1.0; extra == 'dev'
66
+ Requires-Dist: ruff>=0.5.0; extra == 'dev'
67
67
  Requires-Dist: types-psutil>=5.9.0; extra == 'dev'
68
68
  Provides-Extra: full
69
- Requires-Dist: anyio>=4.9.0; extra == 'full'
69
+ Requires-Dist: anyio>=4.0.0; extra == 'full'
70
70
  Requires-Dist: black>=24.0.0; extra == 'full'
71
- Requires-Dist: httpx>=0.28.1; extra == 'full'
71
+ Requires-Dist: httpx<1.0.0,>=0.27.0; extra == 'full'
72
72
  Requires-Dist: isort>=5.13.0; extra == 'full'
73
73
  Requires-Dist: mcp>=1.12.2; extra == 'full'
74
74
  Requires-Dist: memory-profiler>=0.61.0; extra == 'full'
75
75
  Requires-Dist: mypy>=1.17.0; extra == 'full'
76
76
  Requires-Dist: pre-commit>=3.0.0; extra == 'full'
77
- Requires-Dist: psutil>=7.0.0; extra == 'full'
78
- Requires-Dist: pydantic-settings>=2.10.1; extra == 'full'
79
- Requires-Dist: pydantic>=2.11.7; extra == 'full'
77
+ Requires-Dist: psutil<6,>=5.9.6; extra == 'full'
78
+ Requires-Dist: pydantic-settings>=2.2.1; extra == 'full'
79
+ Requires-Dist: pydantic>=2.5.0; extra == 'full'
80
80
  Requires-Dist: pytest-asyncio>=1.1.0; extra == 'full'
81
81
  Requires-Dist: pytest-cov>=4.0.0; extra == 'full'
82
82
  Requires-Dist: pytest-mock>=3.14.1; extra == 'full'
83
83
  Requires-Dist: pytest>=8.4.1; extra == 'full'
84
- Requires-Dist: ruff>=0.1.0; extra == 'full'
84
+ Requires-Dist: ruff>=0.5.0; extra == 'full'
85
85
  Requires-Dist: tree-sitter-c>=0.20.0; extra == 'full'
86
86
  Requires-Dist: tree-sitter-cpp>=0.23.4; extra == 'full'
87
87
  Requires-Dist: tree-sitter-go>=0.20.0; extra == 'full'
@@ -98,11 +98,11 @@ Requires-Dist: tree-sitter-java>=0.23.5; extra == 'java'
98
98
  Provides-Extra: javascript
99
99
  Requires-Dist: tree-sitter-javascript>=0.23.1; extra == 'javascript'
100
100
  Provides-Extra: mcp
101
- Requires-Dist: anyio>=4.9.0; extra == 'mcp'
102
- Requires-Dist: httpx>=0.28.1; extra == 'mcp'
101
+ Requires-Dist: anyio>=4.0.0; extra == 'mcp'
102
+ Requires-Dist: httpx<1.0.0,>=0.27.0; extra == 'mcp'
103
103
  Requires-Dist: mcp>=1.12.2; extra == 'mcp'
104
- Requires-Dist: pydantic-settings>=2.10.1; extra == 'mcp'
105
- Requires-Dist: pydantic>=2.11.7; extra == 'mcp'
104
+ Requires-Dist: pydantic-settings>=2.2.1; extra == 'mcp'
105
+ Requires-Dist: pydantic>=2.5.0; extra == 'mcp'
106
106
  Provides-Extra: popular
107
107
  Requires-Dist: tree-sitter-java>=0.23.5; extra == 'popular'
108
108
  Requires-Dist: tree-sitter-javascript>=0.23.1; extra == 'popular'