tree-sitter-analyzer 0.7.0__py3-none-any.whl → 0.8.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 (69) 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 +160 -160
  9. tree_sitter_analyzer/cli/commands/default_command.py +18 -18
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -141
  11. tree_sitter_analyzer/cli/commands/query_command.py +81 -81
  12. tree_sitter_analyzer/cli/commands/structure_command.py +138 -138
  13. tree_sitter_analyzer/cli/commands/summary_command.py +101 -101
  14. tree_sitter_analyzer/cli/commands/table_command.py +235 -235
  15. tree_sitter_analyzer/cli/info_commands.py +121 -121
  16. tree_sitter_analyzer/cli_main.py +297 -297
  17. tree_sitter_analyzer/core/__init__.py +15 -15
  18. tree_sitter_analyzer/core/analysis_engine.py +555 -555
  19. tree_sitter_analyzer/core/cache_service.py +320 -320
  20. tree_sitter_analyzer/core/engine.py +566 -566
  21. tree_sitter_analyzer/core/parser.py +293 -293
  22. tree_sitter_analyzer/encoding_utils.py +459 -459
  23. tree_sitter_analyzer/exceptions.py +406 -337
  24. tree_sitter_analyzer/file_handler.py +210 -210
  25. tree_sitter_analyzer/formatters/__init__.py +1 -1
  26. tree_sitter_analyzer/formatters/base_formatter.py +167 -167
  27. tree_sitter_analyzer/formatters/formatter_factory.py +78 -78
  28. tree_sitter_analyzer/interfaces/__init__.py +9 -9
  29. tree_sitter_analyzer/interfaces/cli.py +528 -528
  30. tree_sitter_analyzer/interfaces/cli_adapter.py +343 -343
  31. tree_sitter_analyzer/interfaces/mcp_adapter.py +206 -206
  32. tree_sitter_analyzer/interfaces/mcp_server.py +425 -405
  33. tree_sitter_analyzer/languages/__init__.py +10 -10
  34. tree_sitter_analyzer/languages/javascript_plugin.py +446 -446
  35. tree_sitter_analyzer/languages/python_plugin.py +755 -755
  36. tree_sitter_analyzer/mcp/__init__.py +31 -31
  37. tree_sitter_analyzer/mcp/resources/__init__.py +44 -44
  38. tree_sitter_analyzer/mcp/resources/code_file_resource.py +209 -209
  39. tree_sitter_analyzer/mcp/server.py +346 -333
  40. tree_sitter_analyzer/mcp/tools/__init__.py +30 -30
  41. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +654 -654
  42. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +247 -247
  43. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -54
  44. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +300 -300
  45. tree_sitter_analyzer/mcp/tools/table_format_tool.py +362 -362
  46. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +543 -543
  47. tree_sitter_analyzer/mcp/utils/__init__.py +107 -107
  48. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
  49. tree_sitter_analyzer/output_manager.py +253 -253
  50. tree_sitter_analyzer/plugins/__init__.py +280 -280
  51. tree_sitter_analyzer/plugins/base.py +529 -529
  52. tree_sitter_analyzer/plugins/manager.py +379 -379
  53. tree_sitter_analyzer/queries/__init__.py +26 -26
  54. tree_sitter_analyzer/queries/java.py +391 -391
  55. tree_sitter_analyzer/queries/javascript.py +148 -148
  56. tree_sitter_analyzer/queries/python.py +285 -285
  57. tree_sitter_analyzer/queries/typescript.py +229 -229
  58. tree_sitter_analyzer/query_loader.py +257 -257
  59. tree_sitter_analyzer/security/__init__.py +22 -0
  60. tree_sitter_analyzer/security/boundary_manager.py +237 -0
  61. tree_sitter_analyzer/security/regex_checker.py +292 -0
  62. tree_sitter_analyzer/security/validator.py +224 -0
  63. tree_sitter_analyzer/table_formatter.py +652 -589
  64. tree_sitter_analyzer/utils.py +277 -277
  65. {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/METADATA +4 -1
  66. tree_sitter_analyzer-0.8.0.dist-info/RECORD +76 -0
  67. tree_sitter_analyzer-0.7.0.dist-info/RECORD +0 -72
  68. {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/WHEEL +0 -0
  69. {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -1,138 +1,138 @@
1
- #!/usr/bin/env python3
2
- """
3
- Structure Command
4
-
5
- Handles structure analysis functionality with appropriate Japanese output.
6
- """
7
-
8
- from typing import TYPE_CHECKING
9
-
10
- from ...output_manager import output_data, output_json, output_section
11
- from .base_command import BaseCommand
12
-
13
- if TYPE_CHECKING:
14
- from ...models import AnalysisResult
15
-
16
-
17
- class StructureCommand(BaseCommand):
18
- """Command for structure analysis with Japanese output."""
19
-
20
- async def execute_async(self, language: str) -> int:
21
- analysis_result = await self.analyze_file(language)
22
- if not analysis_result:
23
- return 1
24
-
25
- self._output_structure_analysis(analysis_result)
26
- return 0
27
-
28
- def _output_structure_analysis(self, analysis_result: "AnalysisResult") -> None:
29
- """Output structure analysis results with appropriate Japanese header."""
30
- output_section("Structure Analysis Results")
31
-
32
- # Convert to legacy structure format expected by tests
33
- structure_dict = self._convert_to_legacy_format(analysis_result)
34
-
35
- if self.args.output_format == "json":
36
- output_json(structure_dict)
37
- else:
38
- self._output_text_format(structure_dict)
39
-
40
- def _convert_to_legacy_format(self, analysis_result: "AnalysisResult") -> dict:
41
- """Convert AnalysisResult to legacy structure format expected by tests."""
42
- import time
43
-
44
- # Extract elements by type
45
- classes = [
46
- e for e in analysis_result.elements if e.__class__.__name__ == "Class"
47
- ]
48
- methods = [
49
- e for e in analysis_result.elements if e.__class__.__name__ == "Function"
50
- ]
51
- fields = [
52
- e for e in analysis_result.elements if e.__class__.__name__ == "Variable"
53
- ]
54
- imports = [
55
- e for e in analysis_result.elements if e.__class__.__name__ == "Import"
56
- ]
57
- packages = [
58
- e for e in analysis_result.elements if e.__class__.__name__ == "Package"
59
- ]
60
-
61
- return {
62
- "file_path": analysis_result.file_path,
63
- "language": analysis_result.language,
64
- "package": (
65
- {
66
- "name": packages[0].name,
67
- "line_range": {
68
- "start": packages[0].start_line,
69
- "end": packages[0].end_line,
70
- },
71
- }
72
- if packages
73
- else None
74
- ),
75
- "classes": [{"name": getattr(c, "name", "unknown")} for c in classes],
76
- "methods": [{"name": getattr(m, "name", "unknown")} for m in methods],
77
- "fields": [{"name": getattr(f, "name", "unknown")} for f in fields],
78
- "imports": [
79
- {
80
- "name": getattr(i, "name", "unknown"),
81
- "is_static": getattr(i, "is_static", False),
82
- "is_wildcard": getattr(i, "is_wildcard", False),
83
- "statement": getattr(i, "import_statement", ""),
84
- "line_range": {
85
- "start": getattr(i, "start_line", 0),
86
- "end": getattr(i, "end_line", 0),
87
- },
88
- }
89
- for i in imports
90
- ],
91
- "annotations": [],
92
- "statistics": {
93
- "class_count": len(classes),
94
- "method_count": len(methods),
95
- "field_count": len(fields),
96
- "import_count": len(imports),
97
- "total_lines": analysis_result.line_count,
98
- "annotation_count": 0,
99
- },
100
- "analysis_metadata": {
101
- "analysis_time": getattr(analysis_result, "analysis_time", 0.0),
102
- "language": analysis_result.language,
103
- "file_path": analysis_result.file_path,
104
- "analyzer_version": "2.0.0",
105
- "timestamp": time.time(),
106
- },
107
- }
108
-
109
- def _output_text_format(self, structure_dict: dict) -> None:
110
- """Output structure analysis in human-readable text format."""
111
- output_data(f"File: {structure_dict['file_path']}")
112
- output_data(f"Language: {structure_dict['language']}")
113
-
114
- if structure_dict["package"]:
115
- output_data(f"Package: {structure_dict['package']['name']}")
116
-
117
- stats = structure_dict["statistics"]
118
- output_data("Statistics:")
119
- output_data(f" Classes: {stats['class_count']}")
120
- output_data(f" Methods: {stats['method_count']}")
121
- output_data(f" Fields: {stats['field_count']}")
122
- output_data(f" Imports: {stats['import_count']}")
123
- output_data(f" Total lines: {stats['total_lines']}")
124
-
125
- if structure_dict["classes"]:
126
- output_data("Classes:")
127
- for cls in structure_dict["classes"]:
128
- output_data(f" - {cls['name']}")
129
-
130
- if structure_dict["methods"]:
131
- output_data("Methods:")
132
- for method in structure_dict["methods"]:
133
- output_data(f" - {method['name']}")
134
-
135
- if structure_dict["fields"]:
136
- output_data("Fields:")
137
- for field in structure_dict["fields"]:
138
- output_data(f" - {field['name']}")
1
+ #!/usr/bin/env python3
2
+ """
3
+ Structure Command
4
+
5
+ Handles structure analysis functionality with appropriate Japanese output.
6
+ """
7
+
8
+ from typing import TYPE_CHECKING
9
+
10
+ from ...output_manager import output_data, output_json, output_section
11
+ from .base_command import BaseCommand
12
+
13
+ if TYPE_CHECKING:
14
+ from ...models import AnalysisResult
15
+
16
+
17
+ class StructureCommand(BaseCommand):
18
+ """Command for structure analysis with Japanese output."""
19
+
20
+ async def execute_async(self, language: str) -> int:
21
+ analysis_result = await self.analyze_file(language)
22
+ if not analysis_result:
23
+ return 1
24
+
25
+ self._output_structure_analysis(analysis_result)
26
+ return 0
27
+
28
+ def _output_structure_analysis(self, analysis_result: "AnalysisResult") -> None:
29
+ """Output structure analysis results with appropriate Japanese header."""
30
+ output_section("Structure Analysis Results")
31
+
32
+ # Convert to legacy structure format expected by tests
33
+ structure_dict = self._convert_to_legacy_format(analysis_result)
34
+
35
+ if self.args.output_format == "json":
36
+ output_json(structure_dict)
37
+ else:
38
+ self._output_text_format(structure_dict)
39
+
40
+ def _convert_to_legacy_format(self, analysis_result: "AnalysisResult") -> dict:
41
+ """Convert AnalysisResult to legacy structure format expected by tests."""
42
+ import time
43
+
44
+ # Extract elements by type
45
+ classes = [
46
+ e for e in analysis_result.elements if e.__class__.__name__ == "Class"
47
+ ]
48
+ methods = [
49
+ e for e in analysis_result.elements if e.__class__.__name__ == "Function"
50
+ ]
51
+ fields = [
52
+ e for e in analysis_result.elements if e.__class__.__name__ == "Variable"
53
+ ]
54
+ imports = [
55
+ e for e in analysis_result.elements if e.__class__.__name__ == "Import"
56
+ ]
57
+ packages = [
58
+ e for e in analysis_result.elements if e.__class__.__name__ == "Package"
59
+ ]
60
+
61
+ return {
62
+ "file_path": analysis_result.file_path,
63
+ "language": analysis_result.language,
64
+ "package": (
65
+ {
66
+ "name": packages[0].name,
67
+ "line_range": {
68
+ "start": packages[0].start_line,
69
+ "end": packages[0].end_line,
70
+ },
71
+ }
72
+ if packages
73
+ else None
74
+ ),
75
+ "classes": [{"name": getattr(c, "name", "unknown")} for c in classes],
76
+ "methods": [{"name": getattr(m, "name", "unknown")} for m in methods],
77
+ "fields": [{"name": getattr(f, "name", "unknown")} for f in fields],
78
+ "imports": [
79
+ {
80
+ "name": getattr(i, "name", "unknown"),
81
+ "is_static": getattr(i, "is_static", False),
82
+ "is_wildcard": getattr(i, "is_wildcard", False),
83
+ "statement": getattr(i, "import_statement", ""),
84
+ "line_range": {
85
+ "start": getattr(i, "start_line", 0),
86
+ "end": getattr(i, "end_line", 0),
87
+ },
88
+ }
89
+ for i in imports
90
+ ],
91
+ "annotations": [],
92
+ "statistics": {
93
+ "class_count": len(classes),
94
+ "method_count": len(methods),
95
+ "field_count": len(fields),
96
+ "import_count": len(imports),
97
+ "total_lines": analysis_result.line_count,
98
+ "annotation_count": 0,
99
+ },
100
+ "analysis_metadata": {
101
+ "analysis_time": getattr(analysis_result, "analysis_time", 0.0),
102
+ "language": analysis_result.language,
103
+ "file_path": analysis_result.file_path,
104
+ "analyzer_version": "2.0.0",
105
+ "timestamp": time.time(),
106
+ },
107
+ }
108
+
109
+ def _output_text_format(self, structure_dict: dict) -> None:
110
+ """Output structure analysis in human-readable text format."""
111
+ output_data(f"File: {structure_dict['file_path']}")
112
+ output_data(f"Language: {structure_dict['language']}")
113
+
114
+ if structure_dict["package"]:
115
+ output_data(f"Package: {structure_dict['package']['name']}")
116
+
117
+ stats = structure_dict["statistics"]
118
+ output_data("Statistics:")
119
+ output_data(f" Classes: {stats['class_count']}")
120
+ output_data(f" Methods: {stats['method_count']}")
121
+ output_data(f" Fields: {stats['field_count']}")
122
+ output_data(f" Imports: {stats['import_count']}")
123
+ output_data(f" Total lines: {stats['total_lines']}")
124
+
125
+ if structure_dict["classes"]:
126
+ output_data("Classes:")
127
+ for cls in structure_dict["classes"]:
128
+ output_data(f" - {cls['name']}")
129
+
130
+ if structure_dict["methods"]:
131
+ output_data("Methods:")
132
+ for method in structure_dict["methods"]:
133
+ output_data(f" - {method['name']}")
134
+
135
+ if structure_dict["fields"]:
136
+ output_data("Fields:")
137
+ for field in structure_dict["fields"]:
138
+ output_data(f" - {field['name']}")
@@ -1,101 +1,101 @@
1
- #!/usr/bin/env python3
2
- """
3
- Summary Command
4
-
5
- Handles summary functionality with specified element types.
6
- """
7
-
8
- from typing import TYPE_CHECKING, Any
9
-
10
- from ...output_manager import output_data, output_json, output_section
11
- from .base_command import BaseCommand
12
-
13
- if TYPE_CHECKING:
14
- from ...models import AnalysisResult
15
-
16
-
17
- class SummaryCommand(BaseCommand):
18
- """Command for summary analysis with specified element types."""
19
-
20
- async def execute_async(self, language: str) -> int:
21
- analysis_result = await self.analyze_file(language)
22
- if not analysis_result:
23
- return 1
24
-
25
- self._output_summary_analysis(analysis_result)
26
- return 0
27
-
28
- def _output_summary_analysis(self, analysis_result: "AnalysisResult") -> None:
29
- """Output summary analysis results."""
30
- output_section("Summary Results")
31
-
32
- # Get summary types from args (default: classes,methods)
33
- summary_types = getattr(self.args, "summary", "classes,methods")
34
- if summary_types:
35
- requested_types = [t.strip() for t in summary_types.split(",")]
36
- else:
37
- requested_types = ["classes", "methods"]
38
-
39
- # Extract elements by type
40
- classes = [
41
- e for e in analysis_result.elements if e.__class__.__name__ == "Class"
42
- ]
43
- methods = [
44
- e for e in analysis_result.elements if e.__class__.__name__ == "Function"
45
- ]
46
- fields = [
47
- e for e in analysis_result.elements if e.__class__.__name__ == "Variable"
48
- ]
49
- imports = [
50
- e for e in analysis_result.elements if e.__class__.__name__ == "Import"
51
- ]
52
-
53
- summary_data: dict[str, Any] = {
54
- "file_path": analysis_result.file_path,
55
- "language": analysis_result.language,
56
- "summary": {},
57
- }
58
-
59
- if "classes" in requested_types:
60
- summary_data["summary"]["classes"] = [
61
- {"name": getattr(c, "name", "unknown")} for c in classes
62
- ]
63
-
64
- if "methods" in requested_types:
65
- summary_data["summary"]["methods"] = [
66
- {"name": getattr(m, "name", "unknown")} for m in methods
67
- ]
68
-
69
- if "fields" in requested_types:
70
- summary_data["summary"]["fields"] = [
71
- {"name": getattr(f, "name", "unknown")} for f in fields
72
- ]
73
-
74
- if "imports" in requested_types:
75
- summary_data["summary"]["imports"] = [
76
- {"name": getattr(i, "name", "unknown")} for i in imports
77
- ]
78
-
79
- if self.args.output_format == "json":
80
- output_json(summary_data)
81
- else:
82
- self._output_text_format(summary_data, requested_types)
83
-
84
- def _output_text_format(self, summary_data: dict, requested_types: list) -> None:
85
- """Output summary in human-readable text format."""
86
- output_data(f"File: {summary_data['file_path']}")
87
- output_data(f"Language: {summary_data['language']}")
88
-
89
- for element_type in requested_types:
90
- if element_type in summary_data["summary"]:
91
- elements = summary_data["summary"][element_type]
92
- type_name_map = {
93
- "classes": "Classes",
94
- "methods": "Methods",
95
- "fields": "Fields",
96
- "imports": "Imports",
97
- }
98
- type_name = type_name_map.get(element_type, element_type)
99
- output_data(f"\n{type_name} ({len(elements)} items):")
100
- for element in elements:
101
- output_data(f" - {element['name']}")
1
+ #!/usr/bin/env python3
2
+ """
3
+ Summary Command
4
+
5
+ Handles summary functionality with specified element types.
6
+ """
7
+
8
+ from typing import TYPE_CHECKING, Any
9
+
10
+ from ...output_manager import output_data, output_json, output_section
11
+ from .base_command import BaseCommand
12
+
13
+ if TYPE_CHECKING:
14
+ from ...models import AnalysisResult
15
+
16
+
17
+ class SummaryCommand(BaseCommand):
18
+ """Command for summary analysis with specified element types."""
19
+
20
+ async def execute_async(self, language: str) -> int:
21
+ analysis_result = await self.analyze_file(language)
22
+ if not analysis_result:
23
+ return 1
24
+
25
+ self._output_summary_analysis(analysis_result)
26
+ return 0
27
+
28
+ def _output_summary_analysis(self, analysis_result: "AnalysisResult") -> None:
29
+ """Output summary analysis results."""
30
+ output_section("Summary Results")
31
+
32
+ # Get summary types from args (default: classes,methods)
33
+ summary_types = getattr(self.args, "summary", "classes,methods")
34
+ if summary_types:
35
+ requested_types = [t.strip() for t in summary_types.split(",")]
36
+ else:
37
+ requested_types = ["classes", "methods"]
38
+
39
+ # Extract elements by type
40
+ classes = [
41
+ e for e in analysis_result.elements if e.__class__.__name__ == "Class"
42
+ ]
43
+ methods = [
44
+ e for e in analysis_result.elements if e.__class__.__name__ == "Function"
45
+ ]
46
+ fields = [
47
+ e for e in analysis_result.elements if e.__class__.__name__ == "Variable"
48
+ ]
49
+ imports = [
50
+ e for e in analysis_result.elements if e.__class__.__name__ == "Import"
51
+ ]
52
+
53
+ summary_data: dict[str, Any] = {
54
+ "file_path": analysis_result.file_path,
55
+ "language": analysis_result.language,
56
+ "summary": {},
57
+ }
58
+
59
+ if "classes" in requested_types:
60
+ summary_data["summary"]["classes"] = [
61
+ {"name": getattr(c, "name", "unknown")} for c in classes
62
+ ]
63
+
64
+ if "methods" in requested_types:
65
+ summary_data["summary"]["methods"] = [
66
+ {"name": getattr(m, "name", "unknown")} for m in methods
67
+ ]
68
+
69
+ if "fields" in requested_types:
70
+ summary_data["summary"]["fields"] = [
71
+ {"name": getattr(f, "name", "unknown")} for f in fields
72
+ ]
73
+
74
+ if "imports" in requested_types:
75
+ summary_data["summary"]["imports"] = [
76
+ {"name": getattr(i, "name", "unknown")} for i in imports
77
+ ]
78
+
79
+ if self.args.output_format == "json":
80
+ output_json(summary_data)
81
+ else:
82
+ self._output_text_format(summary_data, requested_types)
83
+
84
+ def _output_text_format(self, summary_data: dict, requested_types: list) -> None:
85
+ """Output summary in human-readable text format."""
86
+ output_data(f"File: {summary_data['file_path']}")
87
+ output_data(f"Language: {summary_data['language']}")
88
+
89
+ for element_type in requested_types:
90
+ if element_type in summary_data["summary"]:
91
+ elements = summary_data["summary"][element_type]
92
+ type_name_map = {
93
+ "classes": "Classes",
94
+ "methods": "Methods",
95
+ "fields": "Fields",
96
+ "imports": "Imports",
97
+ }
98
+ type_name = type_name_map.get(element_type, element_type)
99
+ output_data(f"\n{type_name} ({len(elements)} items):")
100
+ for element in elements:
101
+ output_data(f" - {element['name']}")