tree-sitter-analyzer 1.1.1__tar.gz → 1.1.2__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-1.1.1 → tree_sitter_analyzer-1.1.2}/.pre-commit-hooks.yaml +4 -4
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/AI_COLLABORATION_GUIDE.md +2 -2
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/CHANGELOG.md +22 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/CONTRIBUTING.md +1 -1
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/DEPLOYMENT_GUIDE.md +1 -1
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/LLM_CODING_GUIDELINES.md +1 -1
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/MCP_SETUP_DEVELOPERS.md +1 -1
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/PKG-INFO +5 -5
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/README.md +4 -4
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/README_ja.md +3 -3
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/README_zh.md +3 -3
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/pyproject.toml +1 -1
- tree_sitter_analyzer-1.1.2/scripts/README.md +117 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/scripts/readme_config.py +17 -2
- tree_sitter_analyzer-1.1.2/scripts/sync_version.py +194 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/uv.lock +1 -1
- tree_sitter_analyzer-1.1.1/scripts/automated_release.py +0 -251
- tree_sitter_analyzer-1.1.1/scripts/quick_fix_readme.py +0 -206
- tree_sitter_analyzer-1.1.1/scripts/sync_version.py +0 -148
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/.gitignore +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/.kiro/steering/product.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/.kiro/steering/structure.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/.kiro/steering/tech.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/.pre-commit-config.yaml +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/CODE_STYLE_GUIDE.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/GITFLOW.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/GITFLOW_ja.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/GITFLOW_zh.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/LANGUAGE_GUIDELINES.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/MCP_SETUP_USERS.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/PROJECT_ROOT_CONFIG.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/PYPI_RELEASE_GUIDE.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/build_standalone.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/check_quality.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/docs/GITFLOW_BEST_PRACTICES.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/docs/RELEASE_EXECUTION_GUIDE.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/docs/api.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/BigService.java +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/BigService.json +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/BigService.summary.json +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/JavaDocTest.java +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/MultiClass.java +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/Sample.java +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/calculate_token_comparison.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/project_root_demo.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/sample.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/security_demo.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/examples/security_integration_demo.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/llm_code_checker.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/pypirc_example.txt +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/pytest.ini +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/scripts/gitflow_helper.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/scripts/gitflow_release_automation.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/scripts/improved_readme_updater.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/scripts/sync_version_minimal.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/start_mcp_server.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/01_onboarding.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/02_architecture_map.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/03_cli_cheatsheet.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/04_mcp_cheatsheet.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/05_plugin_tutorial.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/06_quality_workflow.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/07_troubleshooting.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/08_prompt_library.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/09_tasks.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/10_glossary.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/11_takeover_plan.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/CLI_COMMAND_CORRECTIONS.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/IMPROVEMENT_SUMMARY.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/training/README.md +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/__main__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/api.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/__main__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/advanced_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/base_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/default_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/partial_read_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/query_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/structure_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/summary_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/commands/table_command.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli/info_commands.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/cli_main.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/analysis_engine.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/cache_service.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/engine.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/parser.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/query.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/query_filter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/core/query_service.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/encoding_utils.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/exceptions.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/file_handler.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/formatters/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/formatters/base_formatter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/formatters/formatter_factory.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/formatters/java_formatter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/formatters/python_formatter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/interfaces/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/interfaces/cli.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/interfaces/cli_adapter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/interfaces/mcp_adapter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/interfaces/mcp_server.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/language_detector.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/language_loader.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/languages/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/languages/java_plugin.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/languages/javascript_plugin.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/languages/python_plugin.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/resources/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/resources/project_stats_resource.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/server.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/base_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/query_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/read_partial_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/table_format_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/utils/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/utils/error_handler.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/mcp/utils/path_resolver.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/models.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/output_manager.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/plugins/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/plugins/base.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/plugins/manager.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/project_detector.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/queries/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/queries/java.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/queries/javascript.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/queries/python.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/queries/typescript.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/query_loader.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/security/__init__.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/security/boundary_manager.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/security/regex_checker.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/security/validator.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/table_formatter.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/tree_sitter_analyzer/utils.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/upload_interactive.py +0 -0
- {tree_sitter_analyzer-1.1.1 → tree_sitter_analyzer-1.1.2}/upload_to_pypi.py +0 -0
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
# Version consistency check
|
|
5
5
|
- id: check-version-consistency
|
|
6
6
|
name: Check version consistency across all files
|
|
7
|
-
entry: python scripts/sync_version.py --check
|
|
8
|
-
language:
|
|
9
|
-
files: ^(pyproject\.toml|
|
|
7
|
+
entry: uv run python scripts/sync_version.py --check
|
|
8
|
+
language: system
|
|
9
|
+
files: ^(pyproject\.toml|README.*\.md)$
|
|
10
10
|
pass_filenames: false
|
|
11
11
|
always_run: true
|
|
12
12
|
stages: [commit, push]
|
|
13
|
-
description: "Ensure version numbers are consistent across
|
|
13
|
+
description: "Ensure version numbers are consistent across pyproject.toml and README files"
|
|
@@ -16,7 +16,7 @@ uv run python check_quality.py --new-code-only
|
|
|
16
16
|
uv run python llm_code_checker.py --check-all
|
|
17
17
|
|
|
18
18
|
# 3. Review test coverage
|
|
19
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=term-missing
|
|
19
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=term-missing --cov-report=html
|
|
20
20
|
|
|
21
21
|
# 4. Check current project structure
|
|
22
22
|
find tree_sitter_analyzer -name "*.py" | head -20
|
|
@@ -206,7 +206,7 @@ AI-generated code should achieve:
|
|
|
206
206
|
|
|
207
207
|
| Metric | Target | Command |
|
|
208
208
|
|--------|--------|---------|
|
|
209
|
-
| Test Coverage | ≥
|
|
209
|
+
| Test Coverage | ≥74% | `uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=term-missing` |
|
|
210
210
|
| Type Coverage | 100% | `uv run mypy tree_sitter_analyzer/` |
|
|
211
211
|
| Linting Score | 0 errors | `uv run ruff check .` |
|
|
212
212
|
| Security Score | 0 issues | `bandit -r tree_sitter_analyzer/` |
|
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.1.2] - 2025-08-24
|
|
4
|
+
|
|
5
|
+
### Release: v1.1.2
|
|
6
|
+
|
|
7
|
+
#### 🔧 Coverage Calculation Unification
|
|
8
|
+
- **Standardized coverage commands**: Unified pytest coverage commands across all documentation and CI workflows
|
|
9
|
+
- **Increased tolerance**: Set coverage tolerance to 0.5% to prevent CI failures from minor variations
|
|
10
|
+
- **Simplified configuration**: Streamlined coverage command in readme_config.py to avoid timeouts
|
|
11
|
+
- **Consistent reporting**: All environments now use `--cov-report=term-missing` for consistent output
|
|
12
|
+
|
|
13
|
+
#### 🧹 Branch Management
|
|
14
|
+
- **Cleaned up merged branches**: Removed obsolete feature and release branches following GitFlow best practices
|
|
15
|
+
- **Branch consistency**: Ensured all local branches align with GitFlow strategy
|
|
16
|
+
- **Documentation alignment**: Updated workflows to match current branch structure
|
|
17
|
+
|
|
18
|
+
#### 📚 Documentation Updates
|
|
19
|
+
- **Updated all README files**: Consistent coverage commands in README.md, README_zh.md, README_ja.md
|
|
20
|
+
- **CI workflow improvements**: Enhanced GitHub Actions workflows for better reliability
|
|
21
|
+
- **Developer guides**: Updated CONTRIBUTING.md, DEPLOYMENT_GUIDE.md, and MCP_SETUP_DEVELOPERS.md
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
3
25
|
## [1.1.1] - 2025-08-24
|
|
4
26
|
|
|
5
27
|
### Release: v1.1.1
|
|
@@ -27,7 +27,7 @@ uv run python -c "import tree_sitter_analyzer; print('Setup OK')"
|
|
|
27
27
|
uv run pytest tests/ -v
|
|
28
28
|
|
|
29
29
|
# Run with coverage
|
|
30
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer
|
|
30
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=term-missing
|
|
31
31
|
|
|
32
32
|
# Run specific test file
|
|
33
33
|
uv run pytest tests/test_mcp_tools.py -v
|
|
@@ -166,7 +166,7 @@ Before each release:
|
|
|
166
166
|
2. **Quality Checks**
|
|
167
167
|
- [ ] Run full test suite: `uv run pytest tests/ -v`
|
|
168
168
|
- [ ] Check code quality: `uv run python check_quality.py`
|
|
169
|
-
- [ ] Verify coverage: `uv run pytest tests/ --cov=tree_sitter_analyzer`
|
|
169
|
+
- [ ] Verify coverage: `uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=term-missing`
|
|
170
170
|
|
|
171
171
|
3. **Build and Test**
|
|
172
172
|
- [ ] Test build: `uv build`
|
|
@@ -558,7 +558,7 @@ uv run mypy tree_sitter_analyzer/
|
|
|
558
558
|
uv run pytest tests/ -v
|
|
559
559
|
|
|
560
560
|
# 5. Check coverage
|
|
561
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html
|
|
561
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html --cov-report=term-missing
|
|
562
562
|
|
|
563
563
|
# 6. Security scan
|
|
564
564
|
uv run bandit -r tree_sitter_analyzer/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tree-sitter-analyzer
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.2
|
|
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
|
|
@@ -167,7 +167,7 @@ Description-Content-Type: text/markdown
|
|
|
167
167
|
[](#quality-assurance)
|
|
168
168
|
[](#quality-assurance)
|
|
169
169
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
170
|
-
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
171
171
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
172
172
|
|
|
173
173
|
## 🚀 Break Through LLM Token Limits, Let AI Understand Code Files of Any Size
|
|
@@ -582,12 +582,12 @@ Tree-sitter Analyzer automatically detects and protects project boundaries:
|
|
|
582
582
|
## 🏆 Quality Assurance
|
|
583
583
|
|
|
584
584
|
### 📊 **Quality Metrics**
|
|
585
|
-
- **1,
|
|
585
|
+
- **1,504** - 100% pass rate ✅
|
|
586
586
|
- **74.44% Code Coverage** - Industry-leading level
|
|
587
587
|
- **Zero Test Failures** - Complete CI/CD ready
|
|
588
588
|
- **Cross-platform Compatible** - Windows, macOS, Linux
|
|
589
589
|
|
|
590
|
-
### ⚡ **Latest Quality Achievements (v1.
|
|
590
|
+
### ⚡ **Latest Quality Achievements (v1.1.2)**
|
|
591
591
|
- ✅ **Cross-Platform Path Compatibility** - Fixed Windows short path names and macOS symlink differences
|
|
592
592
|
- ✅ **Windows Environment** - Implemented robust path normalization using Windows API
|
|
593
593
|
- ✅ **macOS Environment** - Fixed `/var` vs `/private/var` symlink differences
|
|
@@ -600,7 +600,7 @@ Tree-sitter Analyzer automatically detects and protects project boundaries:
|
|
|
600
600
|
uv run pytest tests/ -v
|
|
601
601
|
|
|
602
602
|
# Generate coverage report
|
|
603
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html
|
|
603
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html --cov-report=term-missing
|
|
604
604
|
|
|
605
605
|
# Run specific tests
|
|
606
606
|
uv run pytest tests/test_mcp_server_initialization.py -v
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](#quality-assurance)
|
|
7
7
|
[](#quality-assurance)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
-
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
10
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
11
11
|
|
|
12
12
|
## 🚀 Break Through LLM Token Limits, Let AI Understand Code Files of Any Size
|
|
@@ -421,12 +421,12 @@ Tree-sitter Analyzer automatically detects and protects project boundaries:
|
|
|
421
421
|
## 🏆 Quality Assurance
|
|
422
422
|
|
|
423
423
|
### 📊 **Quality Metrics**
|
|
424
|
-
- **1,
|
|
424
|
+
- **1,504** - 100% pass rate ✅
|
|
425
425
|
- **74.44% Code Coverage** - Industry-leading level
|
|
426
426
|
- **Zero Test Failures** - Complete CI/CD ready
|
|
427
427
|
- **Cross-platform Compatible** - Windows, macOS, Linux
|
|
428
428
|
|
|
429
|
-
### ⚡ **Latest Quality Achievements (v1.
|
|
429
|
+
### ⚡ **Latest Quality Achievements (v1.1.2)**
|
|
430
430
|
- ✅ **Cross-Platform Path Compatibility** - Fixed Windows short path names and macOS symlink differences
|
|
431
431
|
- ✅ **Windows Environment** - Implemented robust path normalization using Windows API
|
|
432
432
|
- ✅ **macOS Environment** - Fixed `/var` vs `/private/var` symlink differences
|
|
@@ -439,7 +439,7 @@ Tree-sitter Analyzer automatically detects and protects project boundaries:
|
|
|
439
439
|
uv run pytest tests/ -v
|
|
440
440
|
|
|
441
441
|
# Generate coverage report
|
|
442
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html
|
|
442
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html --cov-report=term-missing
|
|
443
443
|
|
|
444
444
|
# Run specific tests
|
|
445
445
|
uv run pytest tests/test_mcp_server_initialization.py -v
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](#品質保証)
|
|
7
7
|
[](#品質保証)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
-
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
10
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
11
11
|
|
|
12
12
|
## 🚀 LLMトークン制限を突破し、AIにあらゆるサイズのコードファイルを理解させる
|
|
@@ -426,7 +426,7 @@ Tree-sitter Analyzerは自動的にプロジェクト境界を検出・保護:
|
|
|
426
426
|
- **ゼロテスト失敗** - 完全なCI/CD対応
|
|
427
427
|
- **クロスプラットフォーム対応** - Windows、macOS、Linux
|
|
428
428
|
|
|
429
|
-
### ⚡ **最新の品質成果(v1.
|
|
429
|
+
### ⚡ **最新の品質成果(v1.1.2)**
|
|
430
430
|
- ✅ **クロスプラットフォームパス互換性** - Windows短パス名とmacOSシンボリックリンクの違いを修正
|
|
431
431
|
- ✅ **Windows環境** - Windows APIを使用した堅牢なパス正規化を実装
|
|
432
432
|
- ✅ **macOS環境** - `/var`と`/private/var`シンボリックリンクの違いを修正
|
|
@@ -439,7 +439,7 @@ Tree-sitter Analyzerは自動的にプロジェクト境界を検出・保護:
|
|
|
439
439
|
uv run pytest tests/ -v
|
|
440
440
|
|
|
441
441
|
# カバレッジレポート生成
|
|
442
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html
|
|
442
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html --cov-report=term-missing
|
|
443
443
|
|
|
444
444
|
# 特定のテストを実行
|
|
445
445
|
uv run pytest tests/test_mcp_server_initialization.py -v
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](#质量保证)
|
|
7
7
|
[](#质量保证)
|
|
8
8
|
[](https://pypi.org/project/tree-sitter-analyzer/)
|
|
9
|
-
[](https://github.com/aimasteracc/tree-sitter-analyzer/releases)
|
|
10
10
|
[](https://github.com/aimasteracc/tree-sitter-analyzer)
|
|
11
11
|
|
|
12
12
|
## 🚀 突破LLM token限制,让AI理解任意大小的代码文件
|
|
@@ -426,7 +426,7 @@ Tree-sitter Analyzer自动检测和保护项目边界:
|
|
|
426
426
|
- **零测试失败** - 完全CI/CD就绪
|
|
427
427
|
- **跨平台兼容** - Windows、macOS、Linux
|
|
428
428
|
|
|
429
|
-
### ⚡ **最新质量成就(v1.
|
|
429
|
+
### ⚡ **最新质量成就(v1.1.2)**
|
|
430
430
|
- ✅ **跨平台路径兼容性** - 修复Windows短路径名称和macOS符号链接差异
|
|
431
431
|
- ✅ **Windows环境** - 使用Windows API实现稳健的路径标准化
|
|
432
432
|
- ✅ **macOS环境** - 修复`/var`与`/private/var`符号链接差异
|
|
@@ -439,7 +439,7 @@ Tree-sitter Analyzer自动检测和保护项目边界:
|
|
|
439
439
|
uv run pytest tests/ -v
|
|
440
440
|
|
|
441
441
|
# 生成覆盖率报告
|
|
442
|
-
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html
|
|
442
|
+
uv run pytest tests/ --cov=tree_sitter_analyzer --cov-report=html --cov-report=term-missing
|
|
443
443
|
|
|
444
444
|
# 运行特定测试
|
|
445
445
|
uv run pytest tests/test_mcp_server_initialization.py -v
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tree-sitter-analyzer"
|
|
7
|
-
version = "1.1.
|
|
7
|
+
version = "1.1.2"
|
|
8
8
|
description = "Extensible multi-language code analyzer framework using Tree-sitter with dynamic plugin architecture"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Scripts 管理策略
|
|
2
|
+
|
|
3
|
+
## 🎯 **原则**
|
|
4
|
+
|
|
5
|
+
**不要为每个版本创建新脚本!** 这会导致项目难以维护。脚本应该是通用的、可重用的工具。
|
|
6
|
+
|
|
7
|
+
## 📁 **当前脚本清单**
|
|
8
|
+
|
|
9
|
+
### 🔧 **核心工具(保留)**
|
|
10
|
+
|
|
11
|
+
#### 1. `improved_readme_updater.py` - README统计同步工具
|
|
12
|
+
- **用途**: 自动同步所有README文件中的测试数量、覆盖率等统计信息
|
|
13
|
+
- **何时使用**:
|
|
14
|
+
- 发布新版本前
|
|
15
|
+
- 测试数量发生变化后
|
|
16
|
+
- 需要手动同步README时
|
|
17
|
+
- **命令**: `uv run python scripts/improved_readme_updater.py`
|
|
18
|
+
|
|
19
|
+
#### 2. `readme_config.py` - README配置管理
|
|
20
|
+
- **用途**: 管理README更新的配置和模板
|
|
21
|
+
- **何时使用**: 需要修改README更新策略时
|
|
22
|
+
- **注意**: 这是配置文件,不是执行脚本
|
|
23
|
+
|
|
24
|
+
#### 3. `sync_version_minimal.py` - 版本同步工具
|
|
25
|
+
- **用途**: 同步核心文件中的版本号(pyproject.toml → __init__.py)
|
|
26
|
+
- **何时使用**:
|
|
27
|
+
- 发布新版本前
|
|
28
|
+
- 版本号不一致时
|
|
29
|
+
- **命令**: `uv run python scripts/sync_version_minimal.py`
|
|
30
|
+
|
|
31
|
+
### 🚀 **GitFlow自动化(保留)**
|
|
32
|
+
|
|
33
|
+
#### 4. `gitflow_release_automation.py` - GitFlow发布自动化
|
|
34
|
+
- **用途**: 完整的GitFlow发布流程自动化
|
|
35
|
+
- **何时使用**:
|
|
36
|
+
- 从develop分支创建release分支
|
|
37
|
+
- 自动化发布流程
|
|
38
|
+
- **命令**: `uv run python scripts/gitflow_release_automation.py --version v1.1.2`
|
|
39
|
+
|
|
40
|
+
#### 5. `gitflow_helper.py` - GitFlow辅助工具
|
|
41
|
+
- **用途**: GitFlow工作流的辅助功能
|
|
42
|
+
- **何时使用**: 需要GitFlow相关辅助操作时
|
|
43
|
+
|
|
44
|
+
## ❌ **已删除的重复脚本**
|
|
45
|
+
|
|
46
|
+
- `quick_fix_v1_1_1.py` - 特定版本脚本,不应该存在
|
|
47
|
+
- `version_1_1_2_release_prep.py` - 特定版本脚本,不应该存在
|
|
48
|
+
- `sync_version.py` - 与sync_version_minimal.py重复
|
|
49
|
+
- `quick_fix_readme.py` - 与improved_readme_updater.py重复
|
|
50
|
+
- `automated_release.py` - 与gitflow_release_automation.py重复
|
|
51
|
+
|
|
52
|
+
## 🎯 **最佳实践**
|
|
53
|
+
|
|
54
|
+
### 1. **脚本通用性**
|
|
55
|
+
- 脚本应该支持任意版本号,而不是硬编码特定版本
|
|
56
|
+
- 使用命令行参数传递版本号:`--version v1.1.2`
|
|
57
|
+
|
|
58
|
+
### 2. **功能分离**
|
|
59
|
+
- 每个脚本只负责一个明确的功能
|
|
60
|
+
- 避免功能重复的脚本
|
|
61
|
+
|
|
62
|
+
### 3. **命名规范**
|
|
63
|
+
- 使用描述性名称,说明脚本的用途
|
|
64
|
+
- 避免包含版本号的脚本名称
|
|
65
|
+
|
|
66
|
+
### 4. **维护策略**
|
|
67
|
+
- 定期审查脚本,删除不再需要的
|
|
68
|
+
- 合并功能相似的脚本
|
|
69
|
+
- 保持脚本数量最少
|
|
70
|
+
|
|
71
|
+
## 🚀 **标准工作流程**
|
|
72
|
+
|
|
73
|
+
### 发布新版本时:
|
|
74
|
+
|
|
75
|
+
1. **同步README统计**:
|
|
76
|
+
```bash
|
|
77
|
+
uv run python scripts/improved_readme_updater.py
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
2. **同步版本号**:
|
|
81
|
+
```bash
|
|
82
|
+
uv run python scripts/sync_version_minimal.py
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
3. **自动化GitFlow发布**:
|
|
86
|
+
```bash
|
|
87
|
+
uv run python scripts/gitflow_release_automation.py --version v1.1.2
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 📝 **添加新脚本的规则**
|
|
91
|
+
|
|
92
|
+
在添加新脚本之前,请确认:
|
|
93
|
+
|
|
94
|
+
1. **是否真的需要新脚本?**
|
|
95
|
+
- 现有脚本无法完成这个任务吗?
|
|
96
|
+
- 可以扩展现有脚本吗?
|
|
97
|
+
|
|
98
|
+
2. **脚本是否通用?**
|
|
99
|
+
- 支持任意版本号吗?
|
|
100
|
+
- 可以在不同场景下重用吗?
|
|
101
|
+
|
|
102
|
+
3. **功能是否明确?**
|
|
103
|
+
- 脚本有单一、明确的职责吗?
|
|
104
|
+
- 不会与现有脚本功能重复吗?
|
|
105
|
+
|
|
106
|
+
## 🔍 **定期清理**
|
|
107
|
+
|
|
108
|
+
建议每月审查一次scripts目录:
|
|
109
|
+
|
|
110
|
+
- 删除不再使用的脚本
|
|
111
|
+
- 合并功能相似的脚本
|
|
112
|
+
- 更新过时的脚本
|
|
113
|
+
- 确保所有脚本都有明确的用途
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
**记住:脚本越少,维护越容易!**
|
|
@@ -29,10 +29,11 @@ class ReadmeConfig:
|
|
|
29
29
|
# Tolerance ranges for statistics updates (avoid unnecessary updates for minor differences)
|
|
30
30
|
tolerance_ranges = {
|
|
31
31
|
"test_count": 0, # Test count must be exact - no tolerance
|
|
32
|
-
"coverage": 0.
|
|
32
|
+
"coverage": 0.5, # Coverage tolerance: 0.5% to avoid CI failures due to minor variations
|
|
33
33
|
"bigservice_lines": 0, # Line count must be exact - no tolerance
|
|
34
34
|
"bigservice_methods": 0, # Method count must be exact - no tolerance
|
|
35
35
|
"bigservice_fields": 0, # Field count must be exact - no tolerance
|
|
36
|
+
"version_in_content": 0, # Version must be exact - no tolerance
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
# Statistics patterns to update
|
|
@@ -87,6 +88,17 @@ class ReadmeConfig:
|
|
|
87
88
|
format_template="{value}",
|
|
88
89
|
description="Fields in BigService.java example",
|
|
89
90
|
),
|
|
91
|
+
StatisticPattern(
|
|
92
|
+
name="version_in_content",
|
|
93
|
+
patterns=[
|
|
94
|
+
r"Latest Quality Achievements \(v(\d+\.\d+\.\d+)\)",
|
|
95
|
+
r"最新质量成就(v(\d+\.\d+\.\d+))",
|
|
96
|
+
r"最新の品質成果(v(\d+\.\d+\.\d+))",
|
|
97
|
+
r"version-(\d+\.\d+\.\d+)-blue\.svg",
|
|
98
|
+
],
|
|
99
|
+
format_template="{value}",
|
|
100
|
+
description="Version numbers in README content",
|
|
101
|
+
),
|
|
90
102
|
]
|
|
91
103
|
|
|
92
104
|
# Validation patterns - what must be present in README files
|
|
@@ -106,7 +118,10 @@ class ReadmeConfig:
|
|
|
106
118
|
"pytest",
|
|
107
119
|
"tests/",
|
|
108
120
|
"--cov=tree_sitter_analyzer",
|
|
109
|
-
"--cov-report=term
|
|
121
|
+
"--cov-report=term",
|
|
122
|
+
"--tb=no",
|
|
123
|
+
"-q",
|
|
124
|
+
"--maxfail=1",
|
|
110
125
|
],
|
|
111
126
|
"bigservice_analysis": [
|
|
112
127
|
"uv",
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Version Synchronization Script
|
|
4
|
+
|
|
5
|
+
This script ensures all version numbers across the project are consistent.
|
|
6
|
+
It reads the version from pyproject.toml and updates all other locations.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class VersionSynchronizer:
|
|
15
|
+
def __init__(self):
|
|
16
|
+
self.project_root = Path(__file__).parent.parent
|
|
17
|
+
self.version_patterns = {
|
|
18
|
+
"pyproject.toml": [
|
|
19
|
+
(r'version = "(\d+\.\d+\.\d+)"', 'version = "{version}"'),
|
|
20
|
+
],
|
|
21
|
+
"README.md": [
|
|
22
|
+
(r"version-(\d+\.\d+\.\d+)-blue\.svg", "version-{version}-blue.svg"),
|
|
23
|
+
(
|
|
24
|
+
r"Latest Quality Achievements \(v(\d+\.\d+\.\d+)\)",
|
|
25
|
+
"Latest Quality Achievements (v{version})",
|
|
26
|
+
),
|
|
27
|
+
],
|
|
28
|
+
"README_zh.md": [
|
|
29
|
+
(r"version-(\d+\.\d+\.\d+)-blue\.svg", "version-{version}-blue.svg"),
|
|
30
|
+
(r"最新质量成就(v(\d+\.\d+\.\d+))", "最新质量成就(v{version})"),
|
|
31
|
+
],
|
|
32
|
+
"README_ja.md": [
|
|
33
|
+
(r"version-(\d+\.\d+\.\d+)-blue\.svg", "version-{version}-blue.svg"),
|
|
34
|
+
(r"最新の品質成果(v(\d+\.\d+\.\d+))", "最新の品質成果(v{version})"),
|
|
35
|
+
],
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
def get_current_version(self) -> str:
|
|
39
|
+
"""Get the current version from pyproject.toml"""
|
|
40
|
+
pyproject_path = self.project_root / "pyproject.toml"
|
|
41
|
+
|
|
42
|
+
if not pyproject_path.exists():
|
|
43
|
+
raise FileNotFoundError("pyproject.toml not found")
|
|
44
|
+
|
|
45
|
+
content = pyproject_path.read_text(encoding="utf-8")
|
|
46
|
+
match = re.search(r'version = "(\d+\.\d+\.\d+)"', content)
|
|
47
|
+
|
|
48
|
+
if not match:
|
|
49
|
+
raise ValueError("Version not found in pyproject.toml")
|
|
50
|
+
|
|
51
|
+
return match.group(1)
|
|
52
|
+
|
|
53
|
+
def update_file_versions(
|
|
54
|
+
self, file_path: Path, patterns: list[tuple[str, str]], target_version: str
|
|
55
|
+
) -> bool:
|
|
56
|
+
"""Update version numbers in a specific file"""
|
|
57
|
+
if not file_path.exists():
|
|
58
|
+
print(f"Warning: {file_path} not found, skipping...")
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
content = file_path.read_text(encoding="utf-8")
|
|
62
|
+
updated = False
|
|
63
|
+
|
|
64
|
+
for pattern, replacement in patterns:
|
|
65
|
+
# Find all matches first to report what we're updating
|
|
66
|
+
matches = re.findall(pattern, content)
|
|
67
|
+
if matches:
|
|
68
|
+
for match in matches:
|
|
69
|
+
current_version = (
|
|
70
|
+
match
|
|
71
|
+
if isinstance(match, str)
|
|
72
|
+
else match[0]
|
|
73
|
+
if isinstance(match, tuple)
|
|
74
|
+
else str(match)
|
|
75
|
+
)
|
|
76
|
+
if current_version != target_version:
|
|
77
|
+
print(
|
|
78
|
+
f" Updating {file_path.name}: {current_version} -> {target_version}"
|
|
79
|
+
)
|
|
80
|
+
updated = True
|
|
81
|
+
|
|
82
|
+
# Perform the replacement
|
|
83
|
+
content = re.sub(
|
|
84
|
+
pattern, replacement.format(version=target_version), content
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
if updated:
|
|
88
|
+
file_path.write_text(content, encoding="utf-8")
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
def sync_all_versions(self, target_version: str = None) -> bool:
|
|
94
|
+
"""Synchronize all version numbers across the project"""
|
|
95
|
+
if target_version is None:
|
|
96
|
+
target_version = self.get_current_version()
|
|
97
|
+
|
|
98
|
+
print(f"Synchronizing all versions to: {target_version}")
|
|
99
|
+
|
|
100
|
+
updated_files = []
|
|
101
|
+
|
|
102
|
+
for file_name, patterns in self.version_patterns.items():
|
|
103
|
+
file_path = self.project_root / file_name
|
|
104
|
+
if self.update_file_versions(file_path, patterns, target_version):
|
|
105
|
+
updated_files.append(file_name)
|
|
106
|
+
|
|
107
|
+
if updated_files:
|
|
108
|
+
print(f"\nUpdated files: {', '.join(updated_files)}")
|
|
109
|
+
return True
|
|
110
|
+
else:
|
|
111
|
+
print("\nAll versions are already synchronized!")
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
def check_version_consistency(self) -> bool:
|
|
115
|
+
"""Check if all versions are consistent"""
|
|
116
|
+
current_version = self.get_current_version()
|
|
117
|
+
print(f"Checking version consistency (reference: {current_version})")
|
|
118
|
+
|
|
119
|
+
inconsistent_files = []
|
|
120
|
+
|
|
121
|
+
for file_name, patterns in self.version_patterns.items():
|
|
122
|
+
if file_name == "pyproject.toml": # Skip the reference file
|
|
123
|
+
continue
|
|
124
|
+
|
|
125
|
+
file_path = self.project_root / file_name
|
|
126
|
+
if not file_path.exists():
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
content = file_path.read_text(encoding="utf-8")
|
|
130
|
+
|
|
131
|
+
for pattern, _ in patterns:
|
|
132
|
+
matches = re.findall(pattern, content)
|
|
133
|
+
for match in matches:
|
|
134
|
+
found_version = (
|
|
135
|
+
match
|
|
136
|
+
if isinstance(match, str)
|
|
137
|
+
else match[0]
|
|
138
|
+
if isinstance(match, tuple)
|
|
139
|
+
else str(match)
|
|
140
|
+
)
|
|
141
|
+
if found_version != current_version:
|
|
142
|
+
print(
|
|
143
|
+
f" ❌ {file_name}: found {found_version}, expected {current_version}"
|
|
144
|
+
)
|
|
145
|
+
inconsistent_files.append(file_name)
|
|
146
|
+
break
|
|
147
|
+
|
|
148
|
+
if inconsistent_files:
|
|
149
|
+
print(
|
|
150
|
+
f"\n❌ Version inconsistency found in: {', '.join(set(inconsistent_files))}"
|
|
151
|
+
)
|
|
152
|
+
return False
|
|
153
|
+
else:
|
|
154
|
+
print("\n✅ All versions are consistent!")
|
|
155
|
+
return True
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def main():
|
|
159
|
+
import argparse
|
|
160
|
+
|
|
161
|
+
parser = argparse.ArgumentParser(
|
|
162
|
+
description="Synchronize version numbers across the project"
|
|
163
|
+
)
|
|
164
|
+
parser.add_argument(
|
|
165
|
+
"--check",
|
|
166
|
+
action="store_true",
|
|
167
|
+
help="Check version consistency without updating",
|
|
168
|
+
)
|
|
169
|
+
parser.add_argument(
|
|
170
|
+
"--version",
|
|
171
|
+
help="Target version to sync to (default: read from pyproject.toml)",
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
args = parser.parse_args()
|
|
175
|
+
|
|
176
|
+
synchronizer = VersionSynchronizer()
|
|
177
|
+
|
|
178
|
+
try:
|
|
179
|
+
if args.check:
|
|
180
|
+
consistent = synchronizer.check_version_consistency()
|
|
181
|
+
sys.exit(0 if consistent else 1)
|
|
182
|
+
else:
|
|
183
|
+
updated = synchronizer.sync_all_versions(args.version)
|
|
184
|
+
if updated:
|
|
185
|
+
print("\n✅ Version synchronization completed!")
|
|
186
|
+
sys.exit(0)
|
|
187
|
+
|
|
188
|
+
except Exception as e:
|
|
189
|
+
print(f"❌ Error: {e}")
|
|
190
|
+
sys.exit(1)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
if __name__ == "__main__":
|
|
194
|
+
main()
|