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.

Files changed (155) hide show
  1. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/MCP_USAGE_GUIDE.md +0 -18
  2. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/PKG-INFO +1 -1
  3. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/pyproject.toml +5 -5
  4. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/cli.py +1 -1
  5. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/server.py +45 -8
  6. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/utils.py +98 -22
  7. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/uv.lock +1 -1
  8. tree_sitter_analyzer-0.1.0/WINDOWS_UPLOAD_GUIDE.md +0 -114
  9. tree_sitter_analyzer-0.1.0/upload_to_pypi_windows_fix.py +0 -185
  10. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/.gitignore +0 -0
  11. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/DEPLOYMENT_GUIDE.md +0 -0
  12. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/README.md +0 -0
  13. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/build_standalone.py +0 -0
  14. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.java +0 -0
  15. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.json +0 -0
  16. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/BigService.summary.json +0 -0
  17. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/JavaDocTest.java +0 -0
  18. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/MultiClass.java +0 -0
  19. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/Sample.java +0 -0
  20. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/calculate_token_comparison.py +0 -0
  21. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/examples/sample.py +0 -0
  22. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/pytest.ini +0 -0
  23. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/__init__.py +0 -0
  24. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/conftest.py +0 -0
  25. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/__init__.py +0 -0
  26. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_integration.py +0 -0
  27. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/__init__.py +0 -0
  28. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_code_file_resource.py +0 -0
  29. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_project_stats_resource.py +0 -0
  30. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_resources/test_resource_integration.py +0 -0
  31. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_server.py +0 -0
  32. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/__init__.py +0 -0
  33. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_analyze_scale_tool.py +0 -0
  34. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_get_positions_tool.py +0 -0
  35. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_read_partial_tool.py +0 -0
  36. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/mcp/test_tools/test_table_format_tool.py +0 -0
  37. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_analyze_scale_tool_cli_compatible.py +0 -0
  38. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_api.py +0 -0
  39. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_cli.py +0 -0
  40. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_cli_comprehensive.py +0 -0
  41. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_analysis_engine.py +0 -0
  42. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_cache_service.py +0 -0
  43. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_engine.py +0 -0
  44. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_parser.py +0 -0
  45. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_core/test_query.py +0 -0
  46. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_encoding_cache.py +0 -0
  47. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_encoding_utils.py +0 -0
  48. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_engine.py +0 -0
  49. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_exceptions.py +0 -0
  50. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces/test_cli_adapter.py +0 -0
  51. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces/test_mcp_adapter.py +0 -0
  52. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces_cli.py +0 -0
  53. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_interfaces_mcp_server.py +0 -0
  54. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_intermediate_files_management.py +0 -0
  55. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_analyzer.py +0 -0
  56. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_analyzer_extended.py +0 -0
  57. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_plugin_coverage.py +0 -0
  58. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_java_structure_analyzer.py +0 -0
  59. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_javascript_plugin_extended.py +0 -0
  60. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_detector.py +0 -0
  61. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_detector_extended.py +0 -0
  62. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_language_loader.py +0 -0
  63. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_languages/test_java_plugin.py +0 -0
  64. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_languages/test_python_plugin.py +0 -0
  65. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_main_entry.py +0 -0
  66. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_mcp_server.py +0 -0
  67. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_output_manager.py +0 -0
  68. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_partial_reading.py +0 -0
  69. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins/test_manager.py +0 -0
  70. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins/test_registry.py +0 -0
  71. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins.py +0 -0
  72. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_base.py +0 -0
  73. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_coverage.py +0 -0
  74. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_plugins_fixed.py +0 -0
  75. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_python_plugin_comprehensive.py +0 -0
  76. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_python_plugin_coverage.py +0 -0
  77. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_java.py +0 -0
  78. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_javascript.py +0 -0
  79. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_queries_python.py +0 -0
  80. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_query_library_coverage.py +0 -0
  81. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_query_loader.py +0 -0
  82. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_table_formatter.py +0 -0
  83. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tests/test_utils.py +0 -0
  84. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/__init__.py +0 -0
  85. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/__main__.py +0 -0
  86. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/api.py +0 -0
  87. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/__init__.py +0 -0
  88. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/__main__.py +0 -0
  89. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/__init__.py +0 -0
  90. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/advanced_command.py +0 -0
  91. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/base_command.py +0 -0
  92. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/default_command.py +0 -0
  93. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/partial_read_command.py +0 -0
  94. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/query_command.py +0 -0
  95. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/structure_command.py +0 -0
  96. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/summary_command.py +0 -0
  97. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/commands/table_command.py +0 -0
  98. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli/info_commands.py +0 -0
  99. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/cli_main.py +0 -0
  100. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/__init__.py +0 -0
  101. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/analysis_engine.py +0 -0
  102. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/cache_service.py +0 -0
  103. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/engine.py +0 -0
  104. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/parser.py +0 -0
  105. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/core/query.py +0 -0
  106. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/encoding_utils.py +0 -0
  107. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/exceptions.py +0 -0
  108. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/file_handler.py +0 -0
  109. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/__init__.py +0 -0
  110. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/base_formatter.py +0 -0
  111. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/formatter_factory.py +0 -0
  112. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/java_formatter.py +0 -0
  113. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/formatters/python_formatter.py +0 -0
  114. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/__init__.py +0 -0
  115. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/cli_adapter.py +0 -0
  116. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/mcp_adapter.py +0 -0
  117. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/interfaces/mcp_server.py +0 -0
  118. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/java_analyzer.py +0 -0
  119. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/language_detector.py +0 -0
  120. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/language_loader.py +0 -0
  121. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/__init__.py +0 -0
  122. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/java_plugin.py +0 -0
  123. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/languages/python_plugin.py +0 -0
  124. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/__init__.py +0 -0
  125. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/__init__.py +0 -0
  126. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -0
  127. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -0
  128. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/__init__.py +0 -0
  129. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +0 -0
  130. {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
  131. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/base_tool.py +0 -0
  132. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/get_positions_tool.py +0 -0
  133. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/read_partial_tool.py +0 -0
  134. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/table_format_tool.py +0 -0
  135. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +0 -0
  136. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/utils/__init__.py +0 -0
  137. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/mcp/utils/error_handler.py +0 -0
  138. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/models.py +0 -0
  139. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/output_manager.py +0 -0
  140. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/__init__.py +0 -0
  141. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/base.py +0 -0
  142. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/java_plugin.py +0 -0
  143. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/javascript_plugin.py +0 -0
  144. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/manager.py +0 -0
  145. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/plugin_loader.py +0 -0
  146. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/python_plugin.py +0 -0
  147. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/plugins/registry.py +0 -0
  148. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/__init__.py +0 -0
  149. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/java.py +0 -0
  150. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/javascript.py +0 -0
  151. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/python.py +0 -0
  152. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/queries/typescript.py +0 -0
  153. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/query_loader.py +0 -0
  154. {tree_sitter_analyzer-0.1.0 → tree_sitter_analyzer-0.1.1}/tree_sitter_analyzer/table_formatter.py +0 -0
  155. {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.0
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.0"
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.interfaces.cli:main"
115
+ tree-sitter-analyzer = "tree_sitter_analyzer.cli_main:main"
116
116
  # Legacy aliases for backward compatibility
117
- code-analyzer = "tree_sitter_analyzer.interfaces.cli:main"
118
- java-analyzer = "tree_sitter_analyzer.interfaces.cli:main"
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.0"
235
+ server_version = "0.1.1"
236
236
  description = "Tree-sitter based code analysis MCP server"
237
237
 
238
238
  [project.urls]
@@ -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/tree-sitter-analyzer/tree-sitter-analyzer
54
+ For more information, visit: https://github.com/aimasteracc/tree-sitter-analyzer
55
55
  """
56
56
  )
57
57
 
@@ -209,7 +209,10 @@ class TreeSitterAnalyzerMCPServer:
209
209
  raise ValueError(f"Unknown tool: {name}")
210
210
 
211
211
  except Exception as e:
212
- logger.error(f"Tool call error for {name}: {e}")
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
- logger.error(f"Resource read error for {uri}: {e}")
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
- logger.info("MCP server created successfully")
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
- logger.info(f"Set project path to: {project_path}")
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
- logger.info(f"Starting MCP server: {self.name} v{self.version}")
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
- logger.error(f"Server error: {e}")
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
- logger.info("Server stopped by user")
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
- logger.error(f"Server failed: {e}")
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 = logging.StreamHandler(sys.stdout)
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
- logger.info(message, *args, **kwargs)
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
- logger.warning(message, *args, **kwargs)
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
- logger.error(message, *args, **kwargs)
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
- logger.debug(message, *args, **kwargs)
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
- sys.stdout.close()
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 = logging.StreamHandler()
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
- message = f"{operation}"
156
- if execution_time is not None:
157
- message += f": {execution_time:.4f}s"
158
- if details:
159
- if isinstance(details, dict):
160
- detail_str = ", ".join([f"{k}: {v}" for k, v in details.items()])
161
- else:
162
- detail_str = str(details)
163
- message += f" - {detail_str}"
164
- perf_logger.info(message)
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 = logging.StreamHandler()
249
+ handler = SafeStreamHandler()
174
250
  formatter = logging.Formatter("%(asctime)s - Performance - %(message)s")
175
251
  handler.setFormatter(formatter)
176
252
  perf_logger.addHandler(handler)
@@ -954,7 +954,7 @@ wheels = [
954
954
 
955
955
  [[package]]
956
956
  name = "tree-sitter-analyzer"
957
- version = "0.0.1"
957
+ version = "0.1.0"
958
958
  source = { editable = "." }
959
959
  dependencies = [
960
960
  { name = "cachetools" },
@@ -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()