tree-sitter-analyzer 0.1.0__tar.gz → 0.1.1__tar.gz
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-0.1.0 → tree_sitter_analyzer-0.1.1}/MCP_USAGE_GUIDE.md +0 -18
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/PKG-INFO +1 -1
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/pyproject.toml +5 -5
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/cli.py +1 -1
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/server.py +45 -8
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/utils.py +98 -22
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/uv.lock +1 -1
- tree_sitter_analyzer-0.1.0/WINDOWS_UPLOAD_GUIDE.md +0 -114
- tree_sitter_analyzer-0.1.0/upload_to_pypi_windows_fix.py +0 -185
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/.gitignore +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/DEPLOYMENT_GUIDE.md +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/README.md +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/build_standalone.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.java +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.json +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.summary.json +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/JavaDocTest.java +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/MultiClass.java +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/Sample.java +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/calculate_token_comparison.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/sample.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/pytest.ini +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/conftest.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_integration.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_code_file_resource.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_project_stats_resource.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_resource_integration.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_server.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_analyze_scale_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_get_positions_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_read_partial_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_table_format_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_analyze_scale_tool_cli_compatible.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_api.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_cli.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_cli_comprehensive.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_analysis_engine.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_cache_service.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_engine.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_parser.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_query.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_encoding_cache.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_encoding_utils.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_engine.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_exceptions.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces/test_cli_adapter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces/test_mcp_adapter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces_cli.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces_mcp_server.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_intermediate_files_management.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_analyzer.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_analyzer_extended.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_plugin_coverage.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_structure_analyzer.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_javascript_plugin_extended.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_detector.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_detector_extended.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_loader.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_languages/test_java_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_languages/test_python_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_main_entry.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_mcp_server.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_output_manager.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_partial_reading.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins/test_manager.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins/test_registry.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_base.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_coverage.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_fixed.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_python_plugin_comprehensive.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_python_plugin_coverage.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_java.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_javascript.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_python.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_query_library_coverage.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_query_loader.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_table_formatter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_utils.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/__main__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/api.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/__main__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/advanced_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/base_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/default_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/partial_read_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/query_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/structure_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/summary_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/table_command.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/info_commands.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli_main.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/analysis_engine.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/cache_service.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/engine.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/parser.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/query.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/encoding_utils.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/exceptions.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/file_handler.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/base_formatter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/formatter_factory.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/java_formatter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/python_formatter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/cli_adapter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/mcp_adapter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/mcp_server.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/java_analyzer.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/language_detector.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/language_loader.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/java_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/python_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/base_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/get_positions_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/read_partial_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/table_format_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/utils/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/utils/error_handler.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/models.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/output_manager.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/base.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/java_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/javascript_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/manager.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/plugin_loader.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/python_plugin.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/registry.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/__init__.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/java.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/javascript.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/python.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/typescript.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/query_loader.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/table_formatter.py +0 -0
- {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/upload_to_pypi.py +0 -0
|
@@ -156,24 +156,6 @@ MCPツール呼び出し:
|
|
|
156
156
|
}
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
### 4. コード要素の位置情報取得
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
examples/Sample.java のメソッドとクラスの位置情報を取得してください
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
MCPツール呼び出し:
|
|
166
|
-
```json
|
|
167
|
-
{
|
|
168
|
-
"tool": "get_code_positions",
|
|
169
|
-
"arguments": {
|
|
170
|
-
"file_path": "examples/Sample.java",
|
|
171
|
-
"element_types": ["methods", "classes"],
|
|
172
|
-
"include_details": true
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
159
|
## 対応言語
|
|
178
160
|
|
|
179
161
|
- **Java** - 完全サポート
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tree-sitter-analyzer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tree-sitter-analyzer"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "Extensible multi-language code analyzer framework using Tree-sitter with dynamic plugin architecture"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
long_description_content_type = "text/markdown"
|
|
@@ -112,10 +112,10 @@ test = [
|
|
|
112
112
|
|
|
113
113
|
[project.scripts]
|
|
114
114
|
# Main CLI entry point
|
|
115
|
-
tree-sitter-analyzer = "tree_sitter_analyzer.
|
|
115
|
+
tree-sitter-analyzer = "tree_sitter_analyzer.cli_main:main"
|
|
116
116
|
# Legacy aliases for backward compatibility
|
|
117
|
-
code-analyzer = "tree_sitter_analyzer.
|
|
118
|
-
java-analyzer = "tree_sitter_analyzer.
|
|
117
|
+
code-analyzer = "tree_sitter_analyzer.cli_main:main"
|
|
118
|
+
java-analyzer = "tree_sitter_analyzer.cli_main:main"
|
|
119
119
|
|
|
120
120
|
[project.entry-points."tree_sitter_analyzer.plugins"]
|
|
121
121
|
# Core language plugins (automatically discovered)
|
|
@@ -232,7 +232,7 @@ dev = [
|
|
|
232
232
|
# MCP server configuration
|
|
233
233
|
[tool.mcp]
|
|
234
234
|
server_name = "tree-sitter-analyzer"
|
|
235
|
-
server_version = "0.1.
|
|
235
|
+
server_version = "0.1.1"
|
|
236
236
|
description = "Tree-sitter based code analysis MCP server"
|
|
237
237
|
|
|
238
238
|
[project.urls]
|
{tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/cli.py
RENAMED
|
@@ -51,7 +51,7 @@ Examples:
|
|
|
51
51
|
# Get framework information
|
|
52
52
|
tree-sitter-analyzer info
|
|
53
53
|
|
|
54
|
-
For more information, visit: https://github.com/
|
|
54
|
+
For more information, visit: https://github.com/aimasteracc/tree-sitter-analyzer
|
|
55
55
|
"""
|
|
56
56
|
)
|
|
57
57
|
|
{tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/server.py
RENAMED
|
@@ -209,7 +209,10 @@ class TreeSitterAnalyzerMCPServer:
|
|
|
209
209
|
raise ValueError(f"Unknown tool: {name}")
|
|
210
210
|
|
|
211
211
|
except Exception as e:
|
|
212
|
-
|
|
212
|
+
try:
|
|
213
|
+
logger.error(f"Tool call error for {name}: {e}")
|
|
214
|
+
except (ValueError, OSError):
|
|
215
|
+
pass # Silently ignore logging errors during shutdown
|
|
213
216
|
return [
|
|
214
217
|
TextContent(
|
|
215
218
|
type="text",
|
|
@@ -258,11 +261,17 @@ class TreeSitterAnalyzerMCPServer:
|
|
|
258
261
|
raise ValueError(f"Resource not found: {uri}")
|
|
259
262
|
|
|
260
263
|
except Exception as e:
|
|
261
|
-
|
|
264
|
+
try:
|
|
265
|
+
logger.error(f"Resource read error for {uri}: {e}")
|
|
266
|
+
except (ValueError, OSError):
|
|
267
|
+
pass # Silently ignore logging errors during shutdown
|
|
262
268
|
raise
|
|
263
269
|
|
|
264
270
|
self.server = server
|
|
265
|
-
|
|
271
|
+
try:
|
|
272
|
+
logger.info("MCP server created successfully")
|
|
273
|
+
except (ValueError, OSError):
|
|
274
|
+
pass # Silently ignore logging errors during shutdown
|
|
266
275
|
return server
|
|
267
276
|
|
|
268
277
|
def set_project_path(self, project_path: str) -> None:
|
|
@@ -273,7 +282,10 @@ class TreeSitterAnalyzerMCPServer:
|
|
|
273
282
|
project_path: Path to the project directory
|
|
274
283
|
"""
|
|
275
284
|
self.project_stats_resource.set_project_path(project_path)
|
|
276
|
-
|
|
285
|
+
try:
|
|
286
|
+
logger.info(f"Set project path to: {project_path}")
|
|
287
|
+
except (ValueError, OSError):
|
|
288
|
+
pass # Silently ignore logging errors during shutdown
|
|
277
289
|
|
|
278
290
|
async def run(self) -> None:
|
|
279
291
|
"""
|
|
@@ -293,14 +305,27 @@ class TreeSitterAnalyzerMCPServer:
|
|
|
293
305
|
capabilities=MCP_INFO["capabilities"],
|
|
294
306
|
)
|
|
295
307
|
|
|
296
|
-
|
|
308
|
+
try:
|
|
309
|
+
logger.info(f"Starting MCP server: {self.name} v{self.version}")
|
|
310
|
+
except (ValueError, OSError):
|
|
311
|
+
pass # Silently ignore logging errors during shutdown
|
|
297
312
|
|
|
298
313
|
try:
|
|
299
314
|
async with stdio_server() as (read_stream, write_stream):
|
|
300
315
|
await server.run(read_stream, write_stream, options)
|
|
301
316
|
except Exception as e:
|
|
302
|
-
|
|
317
|
+
# Use safe logging to avoid I/O errors during shutdown
|
|
318
|
+
try:
|
|
319
|
+
logger.error(f"Server error: {e}")
|
|
320
|
+
except (ValueError, OSError):
|
|
321
|
+
pass # Silently ignore logging errors during shutdown
|
|
303
322
|
raise
|
|
323
|
+
finally:
|
|
324
|
+
# Safe cleanup
|
|
325
|
+
try:
|
|
326
|
+
logger.info("MCP server shutting down")
|
|
327
|
+
except (ValueError, OSError):
|
|
328
|
+
pass # Silently ignore logging errors during shutdown
|
|
304
329
|
|
|
305
330
|
|
|
306
331
|
async def main() -> None:
|
|
@@ -309,10 +334,22 @@ async def main() -> None:
|
|
|
309
334
|
server = TreeSitterAnalyzerMCPServer()
|
|
310
335
|
await server.run()
|
|
311
336
|
except KeyboardInterrupt:
|
|
312
|
-
|
|
337
|
+
try:
|
|
338
|
+
logger.info("Server stopped by user")
|
|
339
|
+
except (ValueError, OSError):
|
|
340
|
+
pass # Silently ignore logging errors during shutdown
|
|
313
341
|
except Exception as e:
|
|
314
|
-
|
|
342
|
+
try:
|
|
343
|
+
logger.error(f"Server failed: {e}")
|
|
344
|
+
except (ValueError, OSError):
|
|
345
|
+
pass # Silently ignore logging errors during shutdown
|
|
315
346
|
sys.exit(1)
|
|
347
|
+
finally:
|
|
348
|
+
# Ensure clean shutdown
|
|
349
|
+
try:
|
|
350
|
+
logger.info("MCP server shutdown complete")
|
|
351
|
+
except (ValueError, OSError):
|
|
352
|
+
pass # Silently ignore logging errors during shutdown
|
|
316
353
|
|
|
317
354
|
|
|
318
355
|
if __name__ == "__main__":
|
|
@@ -8,6 +8,7 @@ Provides logging, debugging, and common utility functions.
|
|
|
8
8
|
|
|
9
9
|
import logging
|
|
10
10
|
import sys
|
|
11
|
+
import atexit
|
|
11
12
|
from functools import wraps
|
|
12
13
|
from typing import Any, Optional
|
|
13
14
|
|
|
@@ -33,7 +34,8 @@ def setup_logger(
|
|
|
33
34
|
logger = logging.getLogger(name)
|
|
34
35
|
|
|
35
36
|
if not logger.handlers: # Avoid duplicate handlers
|
|
36
|
-
handler
|
|
37
|
+
# Create a safe handler that won't fail on closed streams
|
|
38
|
+
handler = SafeStreamHandler(sys.stdout)
|
|
37
39
|
formatter = logging.Formatter(
|
|
38
40
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
39
41
|
)
|
|
@@ -44,28 +46,97 @@ def setup_logger(
|
|
|
44
46
|
return logger
|
|
45
47
|
|
|
46
48
|
|
|
49
|
+
class SafeStreamHandler(logging.StreamHandler):
|
|
50
|
+
"""
|
|
51
|
+
A StreamHandler that safely handles closed streams
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def emit(self, record):
|
|
55
|
+
"""
|
|
56
|
+
Emit a record, safely handling closed streams
|
|
57
|
+
"""
|
|
58
|
+
try:
|
|
59
|
+
# Check if stream is closed before writing
|
|
60
|
+
if hasattr(self.stream, 'closed') and self.stream.closed:
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
# Check if we can write to the stream
|
|
64
|
+
if not hasattr(self.stream, 'write'):
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
super().emit(record)
|
|
68
|
+
except (ValueError, OSError, AttributeError):
|
|
69
|
+
# Silently ignore I/O errors during shutdown
|
|
70
|
+
pass
|
|
71
|
+
except Exception:
|
|
72
|
+
# For any other unexpected errors, use handleError
|
|
73
|
+
self.handleError(record)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def setup_safe_logging_shutdown():
|
|
77
|
+
"""
|
|
78
|
+
Setup safe logging shutdown to prevent I/O errors
|
|
79
|
+
"""
|
|
80
|
+
def cleanup_logging():
|
|
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:
|
|
94
|
+
pass
|
|
95
|
+
except:
|
|
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
|
+
|
|
47
106
|
# Global logger instance
|
|
48
107
|
logger = setup_logger()
|
|
49
108
|
|
|
50
109
|
|
|
51
110
|
def log_info(message: str, *args: Any, **kwargs: Any) -> None:
|
|
52
111
|
"""Log info message"""
|
|
53
|
-
|
|
112
|
+
try:
|
|
113
|
+
logger.info(message, *args, **kwargs)
|
|
114
|
+
except (ValueError, OSError):
|
|
115
|
+
pass # Silently ignore I/O errors
|
|
54
116
|
|
|
55
117
|
|
|
56
118
|
def log_warning(message: str, *args: Any, **kwargs: Any) -> None:
|
|
57
119
|
"""Log warning message"""
|
|
58
|
-
|
|
120
|
+
try:
|
|
121
|
+
logger.warning(message, *args, **kwargs)
|
|
122
|
+
except (ValueError, OSError):
|
|
123
|
+
pass # Silently ignore I/O errors
|
|
59
124
|
|
|
60
125
|
|
|
61
126
|
def log_error(message: str, *args: Any, **kwargs: Any) -> None:
|
|
62
127
|
"""Log error message"""
|
|
63
|
-
|
|
128
|
+
try:
|
|
129
|
+
logger.error(message, *args, **kwargs)
|
|
130
|
+
except (ValueError, OSError):
|
|
131
|
+
pass # Silently ignore I/O errors
|
|
64
132
|
|
|
65
133
|
|
|
66
134
|
def log_debug(message: str, *args: Any, **kwargs: Any) -> None:
|
|
67
135
|
"""Log debug message"""
|
|
68
|
-
|
|
136
|
+
try:
|
|
137
|
+
logger.debug(message, *args, **kwargs)
|
|
138
|
+
except (ValueError, OSError):
|
|
139
|
+
pass # Silently ignore I/O errors
|
|
69
140
|
|
|
70
141
|
|
|
71
142
|
def suppress_output(func: Any) -> Any:
|
|
@@ -79,14 +150,16 @@ def suppress_output(func: Any) -> Any:
|
|
|
79
150
|
|
|
80
151
|
# Redirect stdout to suppress prints
|
|
81
152
|
old_stdout = sys.stdout
|
|
82
|
-
sys.stdout = (
|
|
83
|
-
open("/dev/null", "w") if sys.platform != "win32" else open("nul", "w")
|
|
84
|
-
)
|
|
85
|
-
|
|
86
153
|
try:
|
|
154
|
+
sys.stdout = (
|
|
155
|
+
open("/dev/null", "w") if sys.platform != "win32" else open("nul", "w")
|
|
156
|
+
)
|
|
87
157
|
result = func(*args, **kwargs)
|
|
88
158
|
finally:
|
|
89
|
-
|
|
159
|
+
try:
|
|
160
|
+
sys.stdout.close()
|
|
161
|
+
except:
|
|
162
|
+
pass
|
|
90
163
|
sys.stdout = old_stdout
|
|
91
164
|
|
|
92
165
|
return result
|
|
@@ -133,7 +206,7 @@ def create_performance_logger(name: str) -> logging.Logger:
|
|
|
133
206
|
perf_logger = logging.getLogger(f"{name}.performance")
|
|
134
207
|
|
|
135
208
|
if not perf_logger.handlers:
|
|
136
|
-
handler =
|
|
209
|
+
handler = SafeStreamHandler()
|
|
137
210
|
formatter = logging.Formatter("%(asctime)s - PERF - %(message)s")
|
|
138
211
|
handler.setFormatter(formatter)
|
|
139
212
|
perf_logger.addHandler(handler)
|
|
@@ -152,16 +225,19 @@ def log_performance(
|
|
|
152
225
|
details: Optional[dict] = None,
|
|
153
226
|
) -> None:
|
|
154
227
|
"""Log performance metrics"""
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
165
241
|
|
|
166
242
|
|
|
167
243
|
def setup_performance_logger() -> logging.Logger:
|
|
@@ -170,7 +246,7 @@ def setup_performance_logger() -> logging.Logger:
|
|
|
170
246
|
|
|
171
247
|
# Add handler if not already configured
|
|
172
248
|
if not perf_logger.handlers:
|
|
173
|
-
handler =
|
|
249
|
+
handler = SafeStreamHandler()
|
|
174
250
|
formatter = logging.Formatter("%(asctime)s - Performance - %(message)s")
|
|
175
251
|
handler.setFormatter(formatter)
|
|
176
252
|
perf_logger.addHandler(handler)
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
# Windows環境でのPyPIアップロードガイド
|
|
2
|
-
|
|
3
|
-
Windows環境でのエンコーディング問題を解決してPyPIにアップロードする方法
|
|
4
|
-
|
|
5
|
-
## 問題の概要
|
|
6
|
-
|
|
7
|
-
Windows環境で`python -m twine upload dist/*`を実行すると、以下のエラーが発生することがあります:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
UnicodeDecodeError: 'cp932' codec can't decode byte 0x85 in position 13: illegal multibyte sequence
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
これは`.pypirc`ファイルの文字エンコーディングが原因です。
|
|
14
|
-
|
|
15
|
-
## 解決方法
|
|
16
|
-
|
|
17
|
-
### 方法1: 環境変数を使用(推奨)
|
|
18
|
-
|
|
19
|
-
```cmd
|
|
20
|
-
# TestPyPI用の環境変数設定
|
|
21
|
-
set TWINE_USERNAME=__token__
|
|
22
|
-
set TWINE_PASSWORD=your-testpypi-api-token
|
|
23
|
-
|
|
24
|
-
# TestPyPIにアップロード
|
|
25
|
-
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
|
26
|
-
|
|
27
|
-
# 本番PyPI用の環境変数設定
|
|
28
|
-
set TWINE_USERNAME=__token__
|
|
29
|
-
set TWINE_PASSWORD=your-pypi-api-token
|
|
30
|
-
|
|
31
|
-
# 本番PyPIにアップロード
|
|
32
|
-
python -m twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### 方法2: Windows対応スクリプトを使用
|
|
36
|
-
|
|
37
|
-
```cmd
|
|
38
|
-
python upload_to_pypi_windows_fix.py
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
このスクリプトは以下の機能を提供します:
|
|
42
|
-
- 環境変数の設定ガイド
|
|
43
|
-
- 対話的アップロード
|
|
44
|
-
- エラーハンドリング
|
|
45
|
-
|
|
46
|
-
### 方法3: 対話的アップロード
|
|
47
|
-
|
|
48
|
-
```cmd
|
|
49
|
-
# 認証情報を手動で入力
|
|
50
|
-
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
実行時にユーザー名とパスワードの入力を求められます。
|
|
54
|
-
|
|
55
|
-
## API トークンの取得
|
|
56
|
-
|
|
57
|
-
### TestPyPI
|
|
58
|
-
1. [TestPyPI](https://test.pypi.org/account/register/) でアカウント作成
|
|
59
|
-
2. Account settings → API tokens → Add API token
|
|
60
|
-
3. トークンをコピーして環境変数に設定
|
|
61
|
-
|
|
62
|
-
### 本番PyPI
|
|
63
|
-
1. [PyPI](https://pypi.org/account/register/) でアカウント作成
|
|
64
|
-
2. Account settings → API tokens → Add API token
|
|
65
|
-
3. トークンをコピーして環境変数に設定
|
|
66
|
-
|
|
67
|
-
## 完全なアップロード手順
|
|
68
|
-
|
|
69
|
-
```cmd
|
|
70
|
-
# 1. パッケージをビルド
|
|
71
|
-
python -m build
|
|
72
|
-
|
|
73
|
-
# 2. パッケージをチェック
|
|
74
|
-
python -m twine check dist/*
|
|
75
|
-
|
|
76
|
-
# 3. 環境変数を設定
|
|
77
|
-
set TWINE_USERNAME=__token__
|
|
78
|
-
set TWINE_PASSWORD=your-api-token
|
|
79
|
-
|
|
80
|
-
# 4. TestPyPIにアップロード(テスト)
|
|
81
|
-
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
|
82
|
-
|
|
83
|
-
# 5. TestPyPIからインストールテスト
|
|
84
|
-
pip install --index-url https://test.pypi.org/simple/ tree-sitter-analyzer
|
|
85
|
-
|
|
86
|
-
# 6. 本番PyPIにアップロード
|
|
87
|
-
python -m twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## 確認
|
|
91
|
-
|
|
92
|
-
アップロード後、以下でインストールできることを確認:
|
|
93
|
-
|
|
94
|
-
```cmd
|
|
95
|
-
# TestPyPIから
|
|
96
|
-
pip install --index-url https://test.pypi.org/simple/ tree-sitter-analyzer
|
|
97
|
-
|
|
98
|
-
# 本番PyPIから
|
|
99
|
-
pip install tree-sitter-analyzer
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## トラブルシューティング
|
|
103
|
-
|
|
104
|
-
### 認証エラー
|
|
105
|
-
- API トークンが正しいか確認
|
|
106
|
-
- 環境変数が正しく設定されているか確認
|
|
107
|
-
|
|
108
|
-
### ネットワークエラー
|
|
109
|
-
- インターネット接続を確認
|
|
110
|
-
- プロキシ設定が必要な場合は設定
|
|
111
|
-
|
|
112
|
-
### パッケージエラー
|
|
113
|
-
- `python -m twine check dist/*` でパッケージの整合性を確認
|
|
114
|
-
- `pyproject.toml` の設定を確認
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
PyPIアップロード用スクリプト(Windows環境対応版)
|
|
4
|
-
Windows環境でのエンコーディング問題を回避するバージョン
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
import sys
|
|
9
|
-
import subprocess
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
|
|
12
|
-
def check_requirements():
|
|
13
|
-
"""必要なツールがインストールされているかチェック"""
|
|
14
|
-
required_tools = ['twine', 'build']
|
|
15
|
-
missing_tools = []
|
|
16
|
-
|
|
17
|
-
for tool in required_tools:
|
|
18
|
-
try:
|
|
19
|
-
subprocess.check_call([sys.executable, "-m", tool, "--help"],
|
|
20
|
-
stdout=subprocess.DEVNULL,
|
|
21
|
-
stderr=subprocess.DEVNULL)
|
|
22
|
-
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
23
|
-
missing_tools.append(tool)
|
|
24
|
-
|
|
25
|
-
if missing_tools:
|
|
26
|
-
print(f"Missing required tools: {', '.join(missing_tools)}")
|
|
27
|
-
print("Installing missing tools...")
|
|
28
|
-
for tool in missing_tools:
|
|
29
|
-
subprocess.check_call([sys.executable, "-m", "pip", "install", tool])
|
|
30
|
-
print("✓ All required tools installed")
|
|
31
|
-
else:
|
|
32
|
-
print("✓ All required tools are available")
|
|
33
|
-
|
|
34
|
-
def clean_dist():
|
|
35
|
-
"""distフォルダをクリーンアップ"""
|
|
36
|
-
dist_path = Path("dist")
|
|
37
|
-
if dist_path.exists():
|
|
38
|
-
import shutil
|
|
39
|
-
shutil.rmtree(dist_path)
|
|
40
|
-
print("✓ Cleaned dist directory")
|
|
41
|
-
|
|
42
|
-
def build_package():
|
|
43
|
-
"""パッケージをビルド"""
|
|
44
|
-
print("Building package...")
|
|
45
|
-
try:
|
|
46
|
-
subprocess.check_call([sys.executable, "-m", "build"])
|
|
47
|
-
print("✓ Package built successfully")
|
|
48
|
-
return True
|
|
49
|
-
except subprocess.CalledProcessError as e:
|
|
50
|
-
print(f"❌ Build failed: {e}")
|
|
51
|
-
return False
|
|
52
|
-
|
|
53
|
-
def check_package():
|
|
54
|
-
"""パッケージの整合性をチェック"""
|
|
55
|
-
print("Checking package integrity...")
|
|
56
|
-
try:
|
|
57
|
-
subprocess.check_call([sys.executable, "-m", "twine", "check", "dist/*"])
|
|
58
|
-
print("✓ Package integrity check passed")
|
|
59
|
-
return True
|
|
60
|
-
except subprocess.CalledProcessError as e:
|
|
61
|
-
print(f"❌ Package check failed: {e}")
|
|
62
|
-
return False
|
|
63
|
-
|
|
64
|
-
def setup_environment_variables():
|
|
65
|
-
"""環境変数の設定をガイド"""
|
|
66
|
-
print("\n=== Windows環境でのエンコーディング問題対策 ===")
|
|
67
|
-
print("以下の環境変数を設定してください:")
|
|
68
|
-
print()
|
|
69
|
-
print("TestPyPI用:")
|
|
70
|
-
print(" set TWINE_USERNAME=__token__")
|
|
71
|
-
print(" set TWINE_PASSWORD=your-testpypi-api-token")
|
|
72
|
-
print(" set TWINE_REPOSITORY_URL=https://test.pypi.org/legacy/")
|
|
73
|
-
print()
|
|
74
|
-
print("本番PyPI用:")
|
|
75
|
-
print(" set TWINE_USERNAME=__token__")
|
|
76
|
-
print(" set TWINE_PASSWORD=your-pypi-api-token")
|
|
77
|
-
print(" set TWINE_REPOSITORY_URL=https://upload.pypi.org/legacy/")
|
|
78
|
-
print()
|
|
79
|
-
|
|
80
|
-
choice = input("環境変数を設定しましたか? (y/n): ")
|
|
81
|
-
return choice.lower() == 'y'
|
|
82
|
-
|
|
83
|
-
def upload_with_env_vars(repository_url, repository_name):
|
|
84
|
-
"""環境変数を使用してアップロード"""
|
|
85
|
-
print(f"Uploading to {repository_name}...")
|
|
86
|
-
|
|
87
|
-
# 環境変数の確認
|
|
88
|
-
username = os.environ.get('TWINE_USERNAME')
|
|
89
|
-
password = os.environ.get('TWINE_PASSWORD')
|
|
90
|
-
repo_url = os.environ.get('TWINE_REPOSITORY_URL', repository_url)
|
|
91
|
-
|
|
92
|
-
if not username or not password:
|
|
93
|
-
print("❌ TWINE_USERNAME または TWINE_PASSWORD が設定されていません")
|
|
94
|
-
return False
|
|
95
|
-
|
|
96
|
-
try:
|
|
97
|
-
# 環境変数を使用してアップロード
|
|
98
|
-
env = os.environ.copy()
|
|
99
|
-
env['TWINE_USERNAME'] = username
|
|
100
|
-
env['TWINE_PASSWORD'] = password
|
|
101
|
-
|
|
102
|
-
subprocess.check_call([
|
|
103
|
-
sys.executable, "-m", "twine", "upload",
|
|
104
|
-
"--repository-url", repo_url,
|
|
105
|
-
"dist/*"
|
|
106
|
-
], env=env)
|
|
107
|
-
|
|
108
|
-
print(f"✓ Successfully uploaded to {repository_name}")
|
|
109
|
-
return True
|
|
110
|
-
|
|
111
|
-
except subprocess.CalledProcessError as e:
|
|
112
|
-
print(f"❌ Upload to {repository_name} failed: {e}")
|
|
113
|
-
return False
|
|
114
|
-
|
|
115
|
-
def upload_interactive():
|
|
116
|
-
"""対話的アップロード(認証情報を手動入力)"""
|
|
117
|
-
print("\n=== 対話的アップロード ===")
|
|
118
|
-
print("ユーザー名とパスワードを手動で入力します")
|
|
119
|
-
|
|
120
|
-
repository = input("Repository URL (TestPyPI: https://test.pypi.org/legacy/, PyPI: https://upload.pypi.org/legacy/): ")
|
|
121
|
-
if not repository:
|
|
122
|
-
repository = "https://test.pypi.org/legacy/"
|
|
123
|
-
|
|
124
|
-
try:
|
|
125
|
-
subprocess.check_call([
|
|
126
|
-
sys.executable, "-m", "twine", "upload",
|
|
127
|
-
"--repository-url", repository,
|
|
128
|
-
"dist/*"
|
|
129
|
-
])
|
|
130
|
-
print("✓ Successfully uploaded")
|
|
131
|
-
return True
|
|
132
|
-
except subprocess.CalledProcessError as e:
|
|
133
|
-
print(f"❌ Upload failed: {e}")
|
|
134
|
-
return False
|
|
135
|
-
|
|
136
|
-
def main():
|
|
137
|
-
"""メイン処理"""
|
|
138
|
-
print("=== PyPI Upload Tool for tree-sitter-analyzer (Windows対応版) ===")
|
|
139
|
-
|
|
140
|
-
# 必要なツールをチェック
|
|
141
|
-
check_requirements()
|
|
142
|
-
|
|
143
|
-
# distフォルダをクリーンアップ
|
|
144
|
-
clean_dist()
|
|
145
|
-
|
|
146
|
-
# パッケージをビルド
|
|
147
|
-
if not build_package():
|
|
148
|
-
sys.exit(1)
|
|
149
|
-
|
|
150
|
-
# パッケージの整合性をチェック
|
|
151
|
-
if not check_package():
|
|
152
|
-
sys.exit(1)
|
|
153
|
-
|
|
154
|
-
print("\n=== アップロード方法の選択 ===")
|
|
155
|
-
print("1. 環境変数を使用してTestPyPIにアップロード")
|
|
156
|
-
print("2. 環境変数を使用して本番PyPIにアップロード")
|
|
157
|
-
print("3. 対話的アップロード(手動入力)")
|
|
158
|
-
print("4. 終了")
|
|
159
|
-
|
|
160
|
-
choice = input("選択してください (1-4): ")
|
|
161
|
-
|
|
162
|
-
if choice == "1":
|
|
163
|
-
if setup_environment_variables():
|
|
164
|
-
upload_with_env_vars("https://test.pypi.org/legacy/", "TestPyPI")
|
|
165
|
-
else:
|
|
166
|
-
print("環境変数を設定してから再実行してください")
|
|
167
|
-
elif choice == "2":
|
|
168
|
-
if setup_environment_variables():
|
|
169
|
-
confirm = input("本番PyPIにアップロードしますか? (yes/no): ")
|
|
170
|
-
if confirm.lower() == 'yes':
|
|
171
|
-
upload_with_env_vars("https://upload.pypi.org/legacy/", "PyPI")
|
|
172
|
-
else:
|
|
173
|
-
print("アップロードをキャンセルしました")
|
|
174
|
-
else:
|
|
175
|
-
print("環境変数を設定してから再実行してください")
|
|
176
|
-
elif choice == "3":
|
|
177
|
-
upload_interactive()
|
|
178
|
-
elif choice == "4":
|
|
179
|
-
print("終了します...")
|
|
180
|
-
else:
|
|
181
|
-
print("無効な選択です")
|
|
182
|
-
sys.exit(1)
|
|
183
|
-
|
|
184
|
-
if __name__ == "__main__":
|
|
185
|
-
main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|