tree-sitter-analyzer 0.6.2__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 -473
  64. tree_sitter_analyzer/utils.py +277 -277
  65. {tree_sitter_analyzer-0.6.2.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.6.2.dist-info/RECORD +0 -72
  68. {tree_sitter_analyzer-0.6.2.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/WHEEL +0 -0
  69. {tree_sitter_analyzer-0.6.2.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -1,121 +1,121 @@
1
- #!/usr/bin/env python3
2
- """
3
- Information Commands for CLI
4
-
5
- Commands that display information without requiring file analysis.
6
- """
7
-
8
- from abc import ABC, abstractmethod
9
- from argparse import Namespace
10
-
11
- from ..language_detector import detect_language_from_file, detector
12
- from ..output_manager import output_data, output_error, output_info, output_list
13
- from ..query_loader import query_loader
14
-
15
-
16
- class InfoCommand(ABC):
17
- """Base class for information commands that don't require file analysis."""
18
-
19
- def __init__(self, args: Namespace):
20
- self.args = args
21
-
22
- @abstractmethod
23
- def execute(self) -> int:
24
- """Execute the information command."""
25
- pass
26
-
27
-
28
- class ListQueriesCommand(InfoCommand):
29
- """Command to list available queries."""
30
-
31
- def execute(self) -> int:
32
- if self.args.language:
33
- language = self.args.language
34
- elif hasattr(self.args, "file_path") and self.args.file_path:
35
- language = detect_language_from_file(self.args.file_path)
36
- else:
37
- output_list("Supported languages:")
38
- for lang in query_loader.list_supported_languages():
39
- output_list(f" {lang}")
40
- queries = query_loader.list_queries_for_language(lang)
41
- for query_key in queries:
42
- description = (
43
- query_loader.get_query_description(lang, query_key)
44
- or "No description"
45
- )
46
- output_list(f" {query_key:<20} - {description}")
47
- return 0
48
-
49
- output_list(f"Available query keys ({language}):")
50
- for query_key in query_loader.list_queries_for_language(language):
51
- description = (
52
- query_loader.get_query_description(language, query_key)
53
- or "No description"
54
- )
55
- output_list(f" {query_key:<20} - {description}")
56
- return 0
57
-
58
-
59
- class DescribeQueryCommand(InfoCommand):
60
- """Command to describe a specific query."""
61
-
62
- def execute(self) -> int:
63
- if self.args.language:
64
- language = self.args.language
65
- elif hasattr(self.args, "file_path") and self.args.file_path:
66
- language = detect_language_from_file(self.args.file_path)
67
- else:
68
- output_error(
69
- "ERROR: Query description display requires --language or target file specification"
70
- )
71
- return 1
72
-
73
- try:
74
- query_description = query_loader.get_query_description(
75
- language, self.args.describe_query
76
- )
77
- query_content = query_loader.get_query(language, self.args.describe_query)
78
-
79
- if query_description is None or query_content is None:
80
- output_error(
81
- f"ERROR: Query '{self.args.describe_query}' not found for language '{language}'"
82
- )
83
- return 1
84
-
85
- output_info(
86
- f"Query key '{self.args.describe_query}' ({language}): {query_description}"
87
- )
88
- output_data(f"Query content:\n{query_content}")
89
- except ValueError as e:
90
- output_error(f"ERROR: {e}")
91
- return 1
92
- return 0
93
-
94
-
95
- class ShowLanguagesCommand(InfoCommand):
96
- """Command to show supported languages."""
97
-
98
- def execute(self) -> int:
99
- output_list("Supported languages:")
100
- for language in detector.get_supported_languages():
101
- info = detector.get_language_info(language)
102
- extensions = ", ".join(info["extensions"][:5])
103
- if len(info["extensions"]) > 5:
104
- extensions += f", ... ({len(info['extensions'])-5} more)"
105
- output_list(f" {language:<12} - Extensions: {extensions}")
106
- return 0
107
-
108
-
109
- class ShowExtensionsCommand(InfoCommand):
110
- """Command to show supported extensions."""
111
-
112
- def execute(self) -> int:
113
- output_list("Supported file extensions:")
114
- supported_extensions = detector.get_supported_extensions()
115
- for i in range(0, len(supported_extensions), 8):
116
- line = " " + " ".join(
117
- f"{ext:<6}" for ext in supported_extensions[i : i + 8]
118
- )
119
- output_list(line)
120
- output_info(f"\nTotal {len(supported_extensions)} extensions supported")
121
- return 0
1
+ #!/usr/bin/env python3
2
+ """
3
+ Information Commands for CLI
4
+
5
+ Commands that display information without requiring file analysis.
6
+ """
7
+
8
+ from abc import ABC, abstractmethod
9
+ from argparse import Namespace
10
+
11
+ from ..language_detector import detect_language_from_file, detector
12
+ from ..output_manager import output_data, output_error, output_info, output_list
13
+ from ..query_loader import query_loader
14
+
15
+
16
+ class InfoCommand(ABC):
17
+ """Base class for information commands that don't require file analysis."""
18
+
19
+ def __init__(self, args: Namespace):
20
+ self.args = args
21
+
22
+ @abstractmethod
23
+ def execute(self) -> int:
24
+ """Execute the information command."""
25
+ pass
26
+
27
+
28
+ class ListQueriesCommand(InfoCommand):
29
+ """Command to list available queries."""
30
+
31
+ def execute(self) -> int:
32
+ if self.args.language:
33
+ language = self.args.language
34
+ elif hasattr(self.args, "file_path") and self.args.file_path:
35
+ language = detect_language_from_file(self.args.file_path)
36
+ else:
37
+ output_list("Supported languages:")
38
+ for lang in query_loader.list_supported_languages():
39
+ output_list(f" {lang}")
40
+ queries = query_loader.list_queries_for_language(lang)
41
+ for query_key in queries:
42
+ description = (
43
+ query_loader.get_query_description(lang, query_key)
44
+ or "No description"
45
+ )
46
+ output_list(f" {query_key:<20} - {description}")
47
+ return 0
48
+
49
+ output_list(f"Available query keys ({language}):")
50
+ for query_key in query_loader.list_queries_for_language(language):
51
+ description = (
52
+ query_loader.get_query_description(language, query_key)
53
+ or "No description"
54
+ )
55
+ output_list(f" {query_key:<20} - {description}")
56
+ return 0
57
+
58
+
59
+ class DescribeQueryCommand(InfoCommand):
60
+ """Command to describe a specific query."""
61
+
62
+ def execute(self) -> int:
63
+ if self.args.language:
64
+ language = self.args.language
65
+ elif hasattr(self.args, "file_path") and self.args.file_path:
66
+ language = detect_language_from_file(self.args.file_path)
67
+ else:
68
+ output_error(
69
+ "ERROR: Query description display requires --language or target file specification"
70
+ )
71
+ return 1
72
+
73
+ try:
74
+ query_description = query_loader.get_query_description(
75
+ language, self.args.describe_query
76
+ )
77
+ query_content = query_loader.get_query(language, self.args.describe_query)
78
+
79
+ if query_description is None or query_content is None:
80
+ output_error(
81
+ f"ERROR: Query '{self.args.describe_query}' not found for language '{language}'"
82
+ )
83
+ return 1
84
+
85
+ output_info(
86
+ f"Query key '{self.args.describe_query}' ({language}): {query_description}"
87
+ )
88
+ output_data(f"Query content:\n{query_content}")
89
+ except ValueError as e:
90
+ output_error(f"ERROR: {e}")
91
+ return 1
92
+ return 0
93
+
94
+
95
+ class ShowLanguagesCommand(InfoCommand):
96
+ """Command to show supported languages."""
97
+
98
+ def execute(self) -> int:
99
+ output_list("Supported languages:")
100
+ for language in detector.get_supported_languages():
101
+ info = detector.get_language_info(language)
102
+ extensions = ", ".join(info["extensions"][:5])
103
+ if len(info["extensions"]) > 5:
104
+ extensions += f", ... ({len(info['extensions'])-5} more)"
105
+ output_list(f" {language:<12} - Extensions: {extensions}")
106
+ return 0
107
+
108
+
109
+ class ShowExtensionsCommand(InfoCommand):
110
+ """Command to show supported extensions."""
111
+
112
+ def execute(self) -> int:
113
+ output_list("Supported file extensions:")
114
+ supported_extensions = detector.get_supported_extensions()
115
+ for i in range(0, len(supported_extensions), 8):
116
+ line = " " + " ".join(
117
+ f"{ext:<6}" for ext in supported_extensions[i : i + 8]
118
+ )
119
+ output_list(line)
120
+ output_info(f"\nTotal {len(supported_extensions)} extensions supported")
121
+ return 0