tree-sitter-analyzer 0.2.0__py3-none-any.whl → 0.3.0__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 (78) hide show
  1. tree_sitter_analyzer/__init__.py +133 -121
  2. tree_sitter_analyzer/__main__.py +11 -12
  3. tree_sitter_analyzer/api.py +531 -539
  4. tree_sitter_analyzer/cli/__init__.py +39 -39
  5. tree_sitter_analyzer/cli/__main__.py +12 -13
  6. tree_sitter_analyzer/cli/commands/__init__.py +26 -27
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
  8. tree_sitter_analyzer/cli/commands/base_command.py +160 -155
  9. tree_sitter_analyzer/cli/commands/default_command.py +18 -19
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -133
  11. tree_sitter_analyzer/cli/commands/query_command.py +81 -82
  12. tree_sitter_analyzer/cli/commands/structure_command.py +138 -121
  13. tree_sitter_analyzer/cli/commands/summary_command.py +101 -93
  14. tree_sitter_analyzer/cli/commands/table_command.py +232 -233
  15. tree_sitter_analyzer/cli/info_commands.py +120 -121
  16. tree_sitter_analyzer/cli_main.py +277 -276
  17. tree_sitter_analyzer/core/__init__.py +15 -20
  18. tree_sitter_analyzer/core/analysis_engine.py +591 -574
  19. tree_sitter_analyzer/core/cache_service.py +320 -330
  20. tree_sitter_analyzer/core/engine.py +557 -560
  21. tree_sitter_analyzer/core/parser.py +293 -288
  22. tree_sitter_analyzer/core/query.py +494 -502
  23. tree_sitter_analyzer/encoding_utils.py +458 -460
  24. tree_sitter_analyzer/exceptions.py +337 -340
  25. tree_sitter_analyzer/file_handler.py +217 -222
  26. tree_sitter_analyzer/formatters/__init__.py +1 -1
  27. tree_sitter_analyzer/formatters/base_formatter.py +167 -168
  28. tree_sitter_analyzer/formatters/formatter_factory.py +78 -74
  29. tree_sitter_analyzer/formatters/java_formatter.py +287 -270
  30. tree_sitter_analyzer/formatters/python_formatter.py +255 -235
  31. tree_sitter_analyzer/interfaces/__init__.py +9 -10
  32. tree_sitter_analyzer/interfaces/cli.py +528 -557
  33. tree_sitter_analyzer/interfaces/cli_adapter.py +322 -319
  34. tree_sitter_analyzer/interfaces/mcp_adapter.py +180 -170
  35. tree_sitter_analyzer/interfaces/mcp_server.py +405 -416
  36. tree_sitter_analyzer/java_analyzer.py +218 -219
  37. tree_sitter_analyzer/language_detector.py +398 -400
  38. tree_sitter_analyzer/language_loader.py +224 -228
  39. tree_sitter_analyzer/languages/__init__.py +10 -11
  40. tree_sitter_analyzer/languages/java_plugin.py +1129 -1113
  41. tree_sitter_analyzer/languages/python_plugin.py +737 -712
  42. tree_sitter_analyzer/mcp/__init__.py +31 -32
  43. tree_sitter_analyzer/mcp/resources/__init__.py +44 -47
  44. tree_sitter_analyzer/mcp/resources/code_file_resource.py +212 -213
  45. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +560 -550
  46. tree_sitter_analyzer/mcp/server.py +333 -345
  47. tree_sitter_analyzer/mcp/tools/__init__.py +30 -31
  48. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +621 -557
  49. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +242 -245
  50. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -55
  51. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +300 -302
  52. tree_sitter_analyzer/mcp/tools/table_format_tool.py +362 -359
  53. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +543 -476
  54. tree_sitter_analyzer/mcp/utils/__init__.py +105 -106
  55. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
  56. tree_sitter_analyzer/models.py +470 -481
  57. tree_sitter_analyzer/output_manager.py +261 -264
  58. tree_sitter_analyzer/plugins/__init__.py +333 -334
  59. tree_sitter_analyzer/plugins/base.py +477 -446
  60. tree_sitter_analyzer/plugins/java_plugin.py +608 -625
  61. tree_sitter_analyzer/plugins/javascript_plugin.py +446 -439
  62. tree_sitter_analyzer/plugins/manager.py +362 -355
  63. tree_sitter_analyzer/plugins/plugin_loader.py +85 -83
  64. tree_sitter_analyzer/plugins/python_plugin.py +606 -598
  65. tree_sitter_analyzer/plugins/registry.py +374 -366
  66. tree_sitter_analyzer/queries/__init__.py +26 -27
  67. tree_sitter_analyzer/queries/java.py +391 -394
  68. tree_sitter_analyzer/queries/javascript.py +148 -149
  69. tree_sitter_analyzer/queries/python.py +285 -286
  70. tree_sitter_analyzer/queries/typescript.py +229 -230
  71. tree_sitter_analyzer/query_loader.py +254 -260
  72. tree_sitter_analyzer/table_formatter.py +468 -448
  73. tree_sitter_analyzer/utils.py +277 -277
  74. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/METADATA +21 -6
  75. tree_sitter_analyzer-0.3.0.dist-info/RECORD +77 -0
  76. tree_sitter_analyzer-0.2.0.dist-info/RECORD +0 -77
  77. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/WHEEL +0 -0
  78. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,264 +1,261 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Output Manager for CLI
5
-
6
- Handles different types of outputs: user information, errors, and structured data.
7
- """
8
-
9
- import json
10
- import sys
11
- from typing import Any, Dict, List, Optional, Union
12
-
13
- from .utils import log_error, log_warning
14
-
15
-
16
- class OutputManager:
17
- """Manages different types of output for CLI"""
18
-
19
- def __init__(self, quiet: bool = False, json_output: bool = False):
20
- self.quiet = quiet
21
- self.json_output = json_output
22
-
23
- def info(self, message: str) -> None:
24
- """Output informational message to user"""
25
- if not self.quiet:
26
- print(message)
27
-
28
- def warning(self, message: str) -> None:
29
- """Output warning message"""
30
- if not self.quiet:
31
- print(f"WARNING: {message}", file=sys.stderr)
32
- log_warning(message)
33
-
34
- def error(self, message: str) -> None:
35
- """Output error message"""
36
- print(f"ERROR: {message}", file=sys.stderr)
37
- log_error(message)
38
-
39
- def success(self, message: str) -> None:
40
- """Output success message"""
41
- if not self.quiet:
42
- print(f"✓ {message}")
43
-
44
- def output_info(self, message: str) -> None:
45
- """Output info message (alias for info)"""
46
- self.info(message)
47
-
48
- def output_warning(self, message: str) -> None:
49
- """Output warning message (alias for warning)"""
50
- self.warning(message)
51
-
52
- def output_error(self, message: str) -> None:
53
- """Output error message (alias for error)"""
54
- self.error(message)
55
-
56
- def output_success(self, message: str) -> None:
57
- """Output success message (alias for success)"""
58
- self.success(message)
59
-
60
- def data(self, data: Any, format_type: str = "json") -> None:
61
- """Output structured data"""
62
- if self.json_output or format_type == "json":
63
- print(json.dumps(data, indent=2, ensure_ascii=False))
64
- else:
65
- self._format_data(data)
66
-
67
- def _format_data(self, data: Any) -> None:
68
- """Format data for human-readable output"""
69
- if isinstance(data, dict):
70
- for key, value in data.items():
71
- print(f"{key}: {value}")
72
- elif isinstance(data, list):
73
- for i, item in enumerate(data, 1):
74
- print(f"{i}. {item}")
75
- else:
76
- print(str(data))
77
-
78
- def results_header(self, title: str) -> None:
79
- """Output results section header"""
80
- if not self.quiet:
81
- print(f"\n--- {title} ---")
82
-
83
- def query_result(self, index: int, result: Dict[str, Any]) -> None:
84
- """Output query result in formatted way"""
85
- if not self.quiet:
86
- print(
87
- f"\n{index}. {result.get('capture_name', 'Unknown')} ({result.get('node_type', 'Unknown')})"
88
- )
89
- print(
90
- f" 位置: 行 {result.get('start_line', '?')}-{result.get('end_line', '?')}"
91
- )
92
- if "content" in result:
93
- print(f" 内容:\n{result['content']}")
94
-
95
- def analysis_summary(self, stats: Dict[str, Any]) -> None:
96
- """Output analysis summary"""
97
- if self.json_output:
98
- self.data(stats)
99
- else:
100
- self.results_header("統計情報")
101
- for key, value in stats.items():
102
- print(f"{key}: {value}")
103
-
104
- def language_list(
105
- self, languages: List[str], title: str = "サポートされている言語"
106
- ) -> None:
107
- """Output language list"""
108
- if not self.quiet:
109
- print(f"{title}:")
110
- for lang in languages:
111
- print(f" {lang}")
112
-
113
- def query_list(self, queries: Dict[str, str], language: str) -> None:
114
- """Output query list for a language"""
115
- if not self.quiet:
116
- print(f"利用可能なクエリキー ({language}):")
117
- for query_key, description in queries.items():
118
- print(f" {query_key:<20} - {description}")
119
-
120
- def extension_list(self, extensions: List[str]) -> None:
121
- """Output supported extensions"""
122
- if not self.quiet:
123
- print("サポートされている拡張子:")
124
- for i in range(0, len(extensions), 10):
125
- chunk = extensions[i : i + 10]
126
- print(f" {' '.join(chunk)}")
127
- print(f"合計 {len(extensions)} 個の拡張子をサポート")
128
-
129
- def output_json(self, data: Any) -> None:
130
- """Output JSON data"""
131
- print(json.dumps(data, indent=2, ensure_ascii=False))
132
-
133
- def output_list(
134
- self, items: Union[str, List[Any]], title: Optional[str] = None
135
- ) -> None:
136
- """Output a list of items"""
137
- if title and not self.quiet:
138
- print(f"{title}:")
139
- # 文字列が単一要素として渡された場合の処理
140
- if isinstance(items, str):
141
- items = [items]
142
- for item in items:
143
- if not self.quiet:
144
- print(f" {item}")
145
-
146
- def output_section(self, title: str) -> None:
147
- """Output a section header"""
148
- if not self.quiet:
149
- print(f"\n--- {title} ---")
150
-
151
- def output_query_results(self, results: Any) -> None:
152
- """Output query results"""
153
- self.data(results)
154
-
155
- def output_statistics(self, stats: Dict[str, Any]) -> None:
156
- """Output statistics"""
157
- self.analysis_summary(stats)
158
-
159
- def output_languages(self, languages: List[str]) -> None:
160
- """Output available languages"""
161
- self.language_list(languages)
162
-
163
- def output_queries(self, queries: List[str]) -> None:
164
- """Output available queries"""
165
- if isinstance(queries, list):
166
- query_dict = {q: f"Query {q}" for q in queries}
167
- self.query_list(query_dict, "All")
168
- else:
169
- self.query_list(queries, "All")
170
-
171
- def output_extensions(self, extensions: List[str]) -> None:
172
- """Output file extensions"""
173
- self.extension_list(extensions)
174
-
175
- def output_data(self, data: Any, format_type: str = "json") -> None:
176
- """Output data (alias for data)"""
177
- self.data(data, format_type)
178
-
179
-
180
- # Default instance for backward compatibility
181
- _output_manager = OutputManager()
182
-
183
-
184
- def set_output_mode(quiet: bool = False, json_output: bool = False) -> None:
185
- """Set global output mode"""
186
- global _output_manager
187
- _output_manager = OutputManager(quiet=quiet, json_output=json_output)
188
-
189
-
190
- def get_output_manager() -> OutputManager:
191
- """Get current output manager"""
192
- return _output_manager
193
-
194
-
195
- # Convenience functions
196
- def output_info(message: str) -> None:
197
- """Output info message"""
198
- _output_manager.info(message)
199
-
200
-
201
- def output_warning(message: str) -> None:
202
- """Output warning message"""
203
- _output_manager.warning(message)
204
-
205
-
206
- def output_error(message: str) -> None:
207
- """Output error message using the global output manager"""
208
- _output_manager.error(message)
209
-
210
-
211
- def output_success(message: str) -> None:
212
- """Output success message using the global output manager"""
213
- _output_manager.success(message)
214
-
215
-
216
- def output_json(data: Any) -> None:
217
- """Output JSON data using the global output manager"""
218
- _output_manager.output_json(data)
219
-
220
-
221
- def output_list(items: Union[str, List[Any]], title: Optional[str] = None) -> None:
222
- """Output a list of items"""
223
- _output_manager.output_list(items, title)
224
-
225
-
226
- def output_section(title: str) -> None:
227
- """Output a section header"""
228
- _output_manager.output_section(title)
229
-
230
-
231
- def output_query_results(results: Any) -> None:
232
- """Output query results"""
233
- _output_manager.output_query_results(results)
234
-
235
-
236
- def output_statistics(stats: Dict[str, Any]) -> None:
237
- """Output statistics"""
238
- _output_manager.output_statistics(stats)
239
-
240
-
241
- def output_languages(
242
- languages: List[str], title: str = "サポートされている言語"
243
- ) -> None:
244
- """Output available languages"""
245
- _output_manager.language_list(languages, title)
246
-
247
-
248
- def output_queries(queries: List[str], language: str = "All") -> None:
249
- """Output available queries"""
250
- if isinstance(queries, list):
251
- query_dict = {q: f"Query {q}" for q in queries}
252
- _output_manager.query_list(query_dict, language)
253
- else:
254
- _output_manager.query_list(queries, language)
255
-
256
-
257
- def output_extensions(extensions: List[str]) -> None:
258
- """Output file extensions"""
259
- _output_manager.output_extensions(extensions)
260
-
261
-
262
- def output_data(data: Any, format_type: str = "json") -> None:
263
- """Output structured data"""
264
- _output_manager.data(data, format_type)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Output Manager for CLI
4
+
5
+ Handles different types of outputs: user information, errors, and structured data.
6
+ """
7
+
8
+ import json
9
+ import sys
10
+ from typing import Any
11
+
12
+ from .utils import log_error, log_warning
13
+
14
+
15
+ class OutputManager:
16
+ """Manages different types of output for CLI"""
17
+
18
+ def __init__(self, quiet: bool = False, json_output: bool = False):
19
+ self.quiet = quiet
20
+ self.json_output = json_output
21
+
22
+ def info(self, message: str) -> None:
23
+ """Output informational message to user"""
24
+ if not self.quiet:
25
+ print(message)
26
+
27
+ def warning(self, message: str) -> None:
28
+ """Output warning message"""
29
+ if not self.quiet:
30
+ print(f"WARNING: {message}", file=sys.stderr)
31
+ log_warning(message)
32
+
33
+ def error(self, message: str) -> None:
34
+ """Output error message"""
35
+ print(f"ERROR: {message}", file=sys.stderr)
36
+ log_error(message)
37
+
38
+ def success(self, message: str) -> None:
39
+ """Output success message"""
40
+ if not self.quiet:
41
+ print(f"✓ {message}")
42
+
43
+ def output_info(self, message: str) -> None:
44
+ """Output info message (alias for info)"""
45
+ self.info(message)
46
+
47
+ def output_warning(self, message: str) -> None:
48
+ """Output warning message (alias for warning)"""
49
+ self.warning(message)
50
+
51
+ def output_error(self, message: str) -> None:
52
+ """Output error message (alias for error)"""
53
+ self.error(message)
54
+
55
+ def output_success(self, message: str) -> None:
56
+ """Output success message (alias for success)"""
57
+ self.success(message)
58
+
59
+ def data(self, data: Any, format_type: str = "json") -> None:
60
+ """Output structured data"""
61
+ if self.json_output or format_type == "json":
62
+ print(json.dumps(data, indent=2, ensure_ascii=False))
63
+ else:
64
+ self._format_data(data)
65
+
66
+ def _format_data(self, data: Any) -> None:
67
+ """Format data for human-readable output"""
68
+ if isinstance(data, dict):
69
+ for key, value in data.items():
70
+ print(f"{key}: {value}")
71
+ elif isinstance(data, list):
72
+ for i, item in enumerate(data, 1):
73
+ print(f"{i}. {item}")
74
+ else:
75
+ print(str(data))
76
+
77
+ def results_header(self, title: str) -> None:
78
+ """Output results section header"""
79
+ if not self.quiet:
80
+ print(f"\n--- {title} ---")
81
+
82
+ def query_result(self, index: int, result: dict[str, Any]) -> None:
83
+ """Output query result in formatted way"""
84
+ if not self.quiet:
85
+ print(
86
+ f"\n{index}. {result.get('capture_name', 'Unknown')} ({result.get('node_type', 'Unknown')})"
87
+ )
88
+ print(
89
+ f" 位置: 行 {result.get('start_line', '?')}-{result.get('end_line', '?')}"
90
+ )
91
+ if "content" in result:
92
+ print(f" 内容:\n{result['content']}")
93
+
94
+ def analysis_summary(self, stats: dict[str, Any]) -> None:
95
+ """Output analysis summary"""
96
+ if self.json_output:
97
+ self.data(stats)
98
+ else:
99
+ self.results_header("統計情報")
100
+ for key, value in stats.items():
101
+ print(f"{key}: {value}")
102
+
103
+ def language_list(
104
+ self, languages: list[str], title: str = "サポートされている言語"
105
+ ) -> None:
106
+ """Output language list"""
107
+ if not self.quiet:
108
+ print(f"{title}:")
109
+ for lang in languages:
110
+ print(f" {lang}")
111
+
112
+ def query_list(self, queries: dict[str, str], language: str) -> None:
113
+ """Output query list for a language"""
114
+ if not self.quiet:
115
+ print(f"利用可能なクエリキー ({language}):")
116
+ for query_key, description in queries.items():
117
+ print(f" {query_key:<20} - {description}")
118
+
119
+ def extension_list(self, extensions: list[str]) -> None:
120
+ """Output supported extensions"""
121
+ if not self.quiet:
122
+ print("サポートされている拡張子:")
123
+ for i in range(0, len(extensions), 10):
124
+ chunk = extensions[i : i + 10]
125
+ print(f" {' '.join(chunk)}")
126
+ print(f"合計 {len(extensions)} 個の拡張子をサポート")
127
+
128
+ def output_json(self, data: Any) -> None:
129
+ """Output JSON data"""
130
+ print(json.dumps(data, indent=2, ensure_ascii=False))
131
+
132
+ def output_list(self, items: str | list[Any], title: str | None = None) -> None:
133
+ """Output a list of items"""
134
+ if title and not self.quiet:
135
+ print(f"{title}:")
136
+ # 文字列が単一要素として渡された場合の処理
137
+ if isinstance(items, str):
138
+ items = [items]
139
+ for item in items:
140
+ if not self.quiet:
141
+ print(f" {item}")
142
+
143
+ def output_section(self, title: str) -> None:
144
+ """Output a section header"""
145
+ if not self.quiet:
146
+ print(f"\n--- {title} ---")
147
+
148
+ def output_query_results(self, results: Any) -> None:
149
+ """Output query results"""
150
+ self.data(results)
151
+
152
+ def output_statistics(self, stats: dict[str, Any]) -> None:
153
+ """Output statistics"""
154
+ self.analysis_summary(stats)
155
+
156
+ def output_languages(self, languages: list[str]) -> None:
157
+ """Output available languages"""
158
+ self.language_list(languages)
159
+
160
+ def output_queries(self, queries: list[str]) -> None:
161
+ """Output available queries"""
162
+ if isinstance(queries, list):
163
+ query_dict = {q: f"Query {q}" for q in queries}
164
+ self.query_list(query_dict, "All")
165
+ else:
166
+ self.query_list(queries, "All")
167
+
168
+ def output_extensions(self, extensions: list[str]) -> None:
169
+ """Output file extensions"""
170
+ self.extension_list(extensions)
171
+
172
+ def output_data(self, data: Any, format_type: str = "json") -> None:
173
+ """Output data (alias for data)"""
174
+ self.data(data, format_type)
175
+
176
+
177
+ # Default instance for backward compatibility
178
+ _output_manager = OutputManager()
179
+
180
+
181
+ def set_output_mode(quiet: bool = False, json_output: bool = False) -> None:
182
+ """Set global output mode"""
183
+ global _output_manager
184
+ _output_manager = OutputManager(quiet=quiet, json_output=json_output)
185
+
186
+
187
+ def get_output_manager() -> OutputManager:
188
+ """Get current output manager"""
189
+ return _output_manager
190
+
191
+
192
+ # Convenience functions
193
+ def output_info(message: str) -> None:
194
+ """Output info message"""
195
+ _output_manager.info(message)
196
+
197
+
198
+ def output_warning(message: str) -> None:
199
+ """Output warning message"""
200
+ _output_manager.warning(message)
201
+
202
+
203
+ def output_error(message: str) -> None:
204
+ """Output error message using the global output manager"""
205
+ _output_manager.error(message)
206
+
207
+
208
+ def output_success(message: str) -> None:
209
+ """Output success message using the global output manager"""
210
+ _output_manager.success(message)
211
+
212
+
213
+ def output_json(data: Any) -> None:
214
+ """Output JSON data using the global output manager"""
215
+ _output_manager.output_json(data)
216
+
217
+
218
+ def output_list(items: str | list[Any], title: str | None = None) -> None:
219
+ """Output a list of items"""
220
+ _output_manager.output_list(items, title)
221
+
222
+
223
+ def output_section(title: str) -> None:
224
+ """Output a section header"""
225
+ _output_manager.output_section(title)
226
+
227
+
228
+ def output_query_results(results: Any) -> None:
229
+ """Output query results"""
230
+ _output_manager.output_query_results(results)
231
+
232
+
233
+ def output_statistics(stats: dict[str, Any]) -> None:
234
+ """Output statistics"""
235
+ _output_manager.output_statistics(stats)
236
+
237
+
238
+ def output_languages(
239
+ languages: list[str], title: str = "サポートされている言語"
240
+ ) -> None:
241
+ """Output available languages"""
242
+ _output_manager.language_list(languages, title)
243
+
244
+
245
+ def output_queries(queries: list[str], language: str = "All") -> None:
246
+ """Output available queries"""
247
+ if isinstance(queries, list):
248
+ query_dict = {q: f"Query {q}" for q in queries}
249
+ _output_manager.query_list(query_dict, language)
250
+ else:
251
+ _output_manager.query_list(queries, language)
252
+
253
+
254
+ def output_extensions(extensions: list[str]) -> None:
255
+ """Output file extensions"""
256
+ _output_manager.output_extensions(extensions)
257
+
258
+
259
+ def output_data(data: Any, format_type: str = "json") -> None:
260
+ """Output structured data"""
261
+ _output_manager.data(data, format_type)