gyomu-python-analysis 0.6.0__tar.gz → 0.7.0__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.
- gyomu_python_analysis-0.7.0/.gyomu/knowledge/Development.yaml +11 -0
- gyomu_python_analysis-0.7.0/.gyomu/knowledge/Package.yaml +152 -0
- gyomu_python_analysis-0.7.0/.gyomu/knowledge/Roadmap.yaml +9 -0
- gyomu_python_analysis-0.7.0/.gyomu/knowledge/Technical.yaml +34 -0
- gyomu_python_analysis-0.7.0/PKG-INFO +68 -0
- gyomu_python_analysis-0.7.0/README.ja.md +46 -0
- gyomu_python_analysis-0.7.0/README.md +46 -0
- gyomu_python_analysis-0.7.0/experiments/fail_analysis.py +19 -0
- gyomu_python_analysis-0.7.0/experiments/sample/user2.py +85 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/variable.py +19 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/helpers.py +19 -11
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/ast/statement.py +10 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/ast/symbol.py +42 -13
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/cls.py +44 -16
- gyomu_python_analysis-0.7.0/src/gyomu_python_analysis/analysis/analyzers/pydantic.py +182 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/variables.py +38 -22
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/extract/symbols.py +17 -2
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_types.py +9 -9
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_variable.py +30 -2
- gyomu_python_analysis-0.6.0/PKG-INFO +0 -25
- gyomu_python_analysis-0.6.0/README.md +0 -3
- gyomu_python_analysis-0.6.0/src/gyomu_python_analysis/analysis/analyzers/pydantic.py +0 -128
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gitignore +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/$Package.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/ast/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/expression/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/internal/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/extract/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/file/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/analysis/parser/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/error/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/path/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/project/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/.gyomu/concept/src/gyomu_python_analysis/snapshot/$Directory.json +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/experiments/griffe_analysis.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/experiments/griffe_dump.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/experiments/sample/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/experiments/sample/user.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/experiments/sample.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/pyproject.toml +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/pyproject.toml +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/call.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/comprehension.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/for.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/function.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/if.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/match.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/try.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/ast/with.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/01-simple.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/02-args.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/03-typed-return.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/04-raises.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/05-examples.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/06-notes.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/07-complex.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/08-gyomu-context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/09-custom-section.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/10-edge-cases.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/11-custom-and-gyomu-context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/12-module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/13-class.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/14-variable.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/15-custom-list-section.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/docstring/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/import/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/import/all.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/import/all2.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/import/imports.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/import/relative.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/shared.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/call.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/callable.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/classes.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/decorator.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/functions.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/generics.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/location.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/pydantic.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/type_alias.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/symbol/types.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/types/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/fixtures/src/analysis/types/name.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/pyproject.toml +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/src/project_a/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/src/project_a/module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/pyproject.toml +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/src/project_b/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/src/project_b/module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/monorepo_fixtures/pyproject.toml +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/roadmap.md +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/ast/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/decorator.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/dependency.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/docstring.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/expression/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/expression/expr.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/functions.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/imports.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/internal/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/internal/common.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/internal/location.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/internal/visibility.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/type_alias.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/analyzers/types.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/delete_cache.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/extract/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/file/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/file/source_file_context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/get_module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/initialize.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/load.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/load_file_context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/load_module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/metadata.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/parser/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/parser/docstring.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/analysis/workspace.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/error/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/error/analysis.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/path/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/path/conversion.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/project/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/project/context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/project/workspace.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/py.typed +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/analyze.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/commit.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/create.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/diff.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/models.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/project.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/src/gyomu_python_analysis/snapshot/types.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/conftest.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/helper.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_call.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_comprehension.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_conversion.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_dependency.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_for.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_function.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_if.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_match.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_statement.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_try.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/ast/test_with.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/expression/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/expression/test_analyze_expression_name.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/internal/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/internal/test_location.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/internal/test_visibility.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_classes.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_decorator.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_dependency.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_docstring.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_functions.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_imports.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_pydantic.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_analyze_type_alias.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/analyzers/test_context.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_get_module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_initialize.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_load.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_load_file.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_load_module.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_metadata.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/analysis/test_workspace.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/path/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/path/test_conversion.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/project/test_config.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/__init__.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/test_analyze.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/test_commit.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/test_create.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/test_diff.py +0 -0
- {gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/tests/unit/snapshot/test_project.py +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# yaml-language-server: $schema=../../../../schemas/Package.json
|
|
2
|
+
|
|
3
|
+
display_name: Gyomu Python Analysis
|
|
4
|
+
|
|
5
|
+
mission: |
|
|
6
|
+
GyomuにおけるPythonソースコード解析基盤を提供します。
|
|
7
|
+
PythonプロジェクトおよびWorkspaceを解析し、ソースコードの構造、
|
|
8
|
+
宣言、依存関係などを構造化された解析モデルとして抽出します。
|
|
9
|
+
Project ContextやWorkspace Contextを通じて解析対象と設定を一貫して管理し、
|
|
10
|
+
解析結果とプロジェクト状態を再利用可能な形式で扱えるようにすることで、
|
|
11
|
+
Concept、Facts、Docstringなどの上位レイヤーが利用する共通の解析基盤を提供します。
|
|
12
|
+
|
|
13
|
+
policies:
|
|
14
|
+
- 解析結果はソースコードおよびプロジェクト設定から決定的に導出されるものとする。
|
|
15
|
+
- Project ContextとWorkspace Contextを通じて解析対象と解析設定を一貫して管理する。
|
|
16
|
+
- プロジェクト解析とソースファイル解析は独立した責務として設計する。
|
|
17
|
+
- 解析結果は読み取り専用の構造化されたモデルとして提供し、解析処理によってソースコードを変更しない。
|
|
18
|
+
- パス解決はプロジェクトおよびWorkspace全体で一貫したルールに従う。
|
|
19
|
+
- Python固有の解析処理を共通基盤に集約し、上位レイヤーが解析ライブラリの実装詳細へ直接依存しない構造を維持する。
|
|
20
|
+
- 解析対象のプロジェクト境界とソースルートを明確に管理する。
|
|
21
|
+
- プロジェクトの状態はSnapshotとして永続化し、後続の処理から再利用できるようにする。
|
|
22
|
+
- Snapshotは解析対象の現在状態を表現する情報として扱い、ドキュメント更新などの上位処理とは分離する。
|
|
23
|
+
|
|
24
|
+
constraints:
|
|
25
|
+
- ソースコードを書き換えてはならない。
|
|
26
|
+
- READMEや設計ドキュメントなどのドキュメント生成を担当してはならない。
|
|
27
|
+
- docstringの生成、更新、適用を担当してはならない。
|
|
28
|
+
- AIによる推論や意味解析を実装してはならない。
|
|
29
|
+
- 特定プロジェクト固有の解析ロジックを共通解析基盤へ持ち込んではならない。
|
|
30
|
+
- Python解析ライブラリの実装詳細を上位レイヤーの公開APIとして露出させてはならない。
|
|
31
|
+
- 解析結果を利用したアプリケーション固有の判断ロジックを実装してはならない。
|
|
32
|
+
- 解析処理とドキュメント更新処理を結合してはならない。
|
|
33
|
+
|
|
34
|
+
non_goals:
|
|
35
|
+
- READMEや設計ドキュメントを生成すること。
|
|
36
|
+
- docstringを生成・更新・適用すること。
|
|
37
|
+
- ConceptやKnowledgeなどのプロジェクト知識を生成・管理すること。
|
|
38
|
+
- AIによるコード推論や意味解析を提供すること。
|
|
39
|
+
- コード変換やリファクタリングを実行すること。
|
|
40
|
+
- Pythonソースコードの品質改善やLint修正を実行すること。
|
|
41
|
+
- 解析結果を利用した重要度評価やアーキテクチャ判断を実行すること。
|
|
42
|
+
- 解析対象の変更を検出してUpdate Planを生成すること。
|
|
43
|
+
|
|
44
|
+
terminology:
|
|
45
|
+
- term: Project Context
|
|
46
|
+
definition: |
|
|
47
|
+
Pythonプロジェクトのルート、ソースルート、パッケージ、
|
|
48
|
+
解析対象ファイルなど、プロジェクト解析に必要な情報を保持するコンテキスト。
|
|
49
|
+
|
|
50
|
+
- term: Workspace Context
|
|
51
|
+
definition: |
|
|
52
|
+
複数のPythonプロジェクトやパッケージを含むWorkspace全体の解析対象と
|
|
53
|
+
プロジェクト間の関係を管理するコンテキスト。
|
|
54
|
+
|
|
55
|
+
- term: File Analysis
|
|
56
|
+
definition: |
|
|
57
|
+
単一のPythonソースファイルから抽出された宣言、シンボル、
|
|
58
|
+
依存関係などの構造解析結果。
|
|
59
|
+
|
|
60
|
+
- term: Project Analysis
|
|
61
|
+
definition: |
|
|
62
|
+
Pythonプロジェクトの構造や設定、ソースファイルを解析し、
|
|
63
|
+
プロジェクト全体の解析情報を構築する処理。
|
|
64
|
+
|
|
65
|
+
- term: Snapshot
|
|
66
|
+
definition: |
|
|
67
|
+
特定時点におけるPythonプロジェクトの状態を表現する永続化された情報。
|
|
68
|
+
ファイルハッシュなどを用いて解析対象の状態を記録し、
|
|
69
|
+
後続の処理から現在のプロジェクト状態を参照できるようにする。
|
|
70
|
+
|
|
71
|
+
- term: Source Root
|
|
72
|
+
definition: |
|
|
73
|
+
Pythonプロジェクトにおいて解析対象となるソースコードのルートディレクトリ。
|
|
74
|
+
|
|
75
|
+
- term: Project Root
|
|
76
|
+
definition: |
|
|
77
|
+
Pythonプロジェクトを識別し、pyproject.tomlなどのプロジェクト設定や
|
|
78
|
+
ソースコードを解決するための基準となるディレクトリ。
|
|
79
|
+
|
|
80
|
+
rationale:
|
|
81
|
+
- Pythonソースコードの解析を共通基盤化することで、上位レイヤーは解析ライブラリや解析方法を意識せず利用できる。
|
|
82
|
+
- Project ContextとWorkspace Contextを導入することで、プロジェクト境界や解析対象を一貫したルールで管理できる。
|
|
83
|
+
- 解析結果を構造化されたモデルとして提供することで、Concept、Facts、Docstringなど複数の上位処理から再利用できる。
|
|
84
|
+
- パス解決を共通化することで、プロジェクトルート、ソースルート、ファイルなどの対応を安定して管理できる。
|
|
85
|
+
- Snapshotによってプロジェクトの特定時点の状態を永続化することで、上位の状態管理処理が現在の解析対象を一貫して参照できる。
|
|
86
|
+
- Python固有の解析処理を集約することで、上位パッケージがGriffeなどの解析実装へ直接依存することを防げる。
|
|
87
|
+
- 解析処理とドキュメント生成・更新処理を分離することで、解析結果を複数の用途へ安全に再利用できる。
|
|
88
|
+
|
|
89
|
+
usage:
|
|
90
|
+
- situation: Pythonプロジェクトを解析したい
|
|
91
|
+
guidance: Project Contextを初期化し、プロジェクトのソースルートと解析対象を解決して解析を実行する。
|
|
92
|
+
|
|
93
|
+
- situation: Workspace内のPythonプロジェクトを解析したい
|
|
94
|
+
guidance: Workspace Contextから対象プロジェクトを解決し、そのProject Contextを利用して解析する。
|
|
95
|
+
|
|
96
|
+
- situation: 単一のPythonソースファイルを解析したい
|
|
97
|
+
guidance: File Analysisを利用して、ファイルに含まれる宣言や依存関係などの構造情報を取得する。
|
|
98
|
+
|
|
99
|
+
- situation: Pythonプロジェクト全体の構造を取得したい
|
|
100
|
+
guidance: Project Analysisを利用して、プロジェクトのソースコードと設定から構造化された解析情報を構築する。
|
|
101
|
+
|
|
102
|
+
- situation: プロジェクトの現在状態を記録したい
|
|
103
|
+
guidance: Snapshotを生成して、解析対象の状態を永続化する。
|
|
104
|
+
|
|
105
|
+
- situation: ConceptやFactsなどの上位処理で解析結果を利用したい
|
|
106
|
+
guidance: Python Analysisが提供する構造化された解析モデルを利用し、解析ライブラリの実装へ直接依存しない。
|
|
107
|
+
|
|
108
|
+
- situation: テストでPython解析を利用したい
|
|
109
|
+
guidance: テスト用のプロジェクト構造を用意し、Project Contextを初期化して実際のファイルシステム上で解析する。
|
|
110
|
+
|
|
111
|
+
examples:
|
|
112
|
+
- title: プロジェクト解析
|
|
113
|
+
input: |
|
|
114
|
+
Pythonプロジェクト全体の構造を解析したい。
|
|
115
|
+
output: |
|
|
116
|
+
Project Contextを初期化してPythonプロジェクトを解析する。
|
|
117
|
+
explanation: |
|
|
118
|
+
プロジェクトルートとソースルートを基準として解析対象を一貫して解決できる。
|
|
119
|
+
|
|
120
|
+
- title: ファイル解析
|
|
121
|
+
input: |
|
|
122
|
+
Pythonソースファイルに含まれる公開宣言や依存関係を取得したい。
|
|
123
|
+
output: |
|
|
124
|
+
File Analysisを実行して構造化された解析結果を取得する。
|
|
125
|
+
explanation: |
|
|
126
|
+
ソースコードを変更せず、ファイルの構造情報のみを取得できる。
|
|
127
|
+
|
|
128
|
+
- title: Workspace解析
|
|
129
|
+
input: |
|
|
130
|
+
複数のPythonプロジェクトを含むWorkspaceを解析したい。
|
|
131
|
+
output: |
|
|
132
|
+
Workspace Contextから対象プロジェクトを解決し、それぞれのProject Contextを利用して解析する。
|
|
133
|
+
explanation: |
|
|
134
|
+
Workspace内の複数プロジェクトを、それぞれのプロジェクト境界を維持したまま一貫して解析できる。
|
|
135
|
+
|
|
136
|
+
- title: Snapshotの作成
|
|
137
|
+
input: |
|
|
138
|
+
Pythonプロジェクトの特定時点の状態を記録したい。
|
|
139
|
+
output: |
|
|
140
|
+
Snapshotを生成して解析対象ファイルの状態を永続化する。
|
|
141
|
+
explanation: |
|
|
142
|
+
プロジェクトの状態を再利用可能な形式で記録できるため、
|
|
143
|
+
後続の状態管理処理から一貫して参照できる。
|
|
144
|
+
|
|
145
|
+
- title: 上位処理からの解析結果利用
|
|
146
|
+
input: |
|
|
147
|
+
ConceptやFactsの処理でPythonソースコードの構造を利用したい。
|
|
148
|
+
output: |
|
|
149
|
+
Python Analysisが提供する解析モデルを利用する。
|
|
150
|
+
explanation: |
|
|
151
|
+
上位レイヤーはPython解析ライブラリの実装詳細に依存せず、
|
|
152
|
+
共通化された解析結果を利用できる。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# yaml-language-server: $schema=../../../../schemas/Technical.json
|
|
2
|
+
|
|
3
|
+
installation:
|
|
4
|
+
- command: uv add gyomu-python-analysis
|
|
5
|
+
description: |
|
|
6
|
+
通常のPythonパッケージと同様にインストールする。
|
|
7
|
+
特別なセットアップは不要。
|
|
8
|
+
|
|
9
|
+
configuration: []
|
|
10
|
+
|
|
11
|
+
dependencies:
|
|
12
|
+
- package: returns
|
|
13
|
+
description: |
|
|
14
|
+
Success / Failure / Result による明示的な成功・失敗表現に利用する。
|
|
15
|
+
|
|
16
|
+
- package: gyomu-schema
|
|
17
|
+
description: |
|
|
18
|
+
スキーマ、共通型の置き場として利用
|
|
19
|
+
|
|
20
|
+
- package: gyomu-infra
|
|
21
|
+
description: |
|
|
22
|
+
I/Oなどの基盤処理全般に利用
|
|
23
|
+
|
|
24
|
+
- package: griffelib
|
|
25
|
+
description: |
|
|
26
|
+
Pythonの構文解析に利用
|
|
27
|
+
|
|
28
|
+
- package: docstring-parser
|
|
29
|
+
description: |
|
|
30
|
+
docstring解析に利用
|
|
31
|
+
|
|
32
|
+
compatibility: []
|
|
33
|
+
|
|
34
|
+
migration: []
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: gyomu-python-analysis
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: Gyomu Python Analysis
|
|
5
|
+
Author: Yoshihisa Matsumoto
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Requires-Python: >=3.13
|
|
15
|
+
Requires-Dist: docstring-parser>=0.18.0
|
|
16
|
+
Requires-Dist: griffelib>=2.2.0
|
|
17
|
+
Requires-Dist: gyomu-infra
|
|
18
|
+
Requires-Dist: gyomu-schema
|
|
19
|
+
Requires-Dist: pydantic
|
|
20
|
+
Requires-Dist: returns
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# Gyomu Python Analysis
|
|
24
|
+
|
|
25
|
+
US English | [JP 日本語](README.ja.md)
|
|
26
|
+
|
|
27
|
+
## Overview
|
|
28
|
+
|
|
29
|
+
This package serves as a comprehensive static analysis foundation for Python projects and workspaces within Gyomu. Its primary purpose is to examine language constructs and extract source code structures, declarations, and dependencies into a unified, structured analysis model.
|
|
30
|
+
|
|
31
|
+
By managing targets and configurations consistently through project and workspace contexts, the toolkit enables analysis results and project states to be handled in a reusable format. This establishes a common infrastructure that empowers upper layers, such as concepts, facts, and docstrings, with reliable structural insights.
|
|
32
|
+
|
|
33
|
+
## Architecture
|
|
34
|
+
|
|
35
|
+
Gyomu Python Analysis is organized into modular components that divide responsibilities across language analysis, workspace management, and version tracking. The architecture centers on analyzing Python source structures through AST parsing and dedicated analyzers for language constructs, classes, functions, types, and Pydantic models.
|
|
36
|
+
|
|
37
|
+
The analysis subsystem handles project and workspace initialization, reads configurations, manages module loading, and maintains file analysis contexts. Within this subsystem, specialized components focus on deep AST inspection of statements and expressions, alongside symbol indexing and identity resolution.
|
|
38
|
+
|
|
39
|
+
Separately, the snapshot component manages project version tracking by creating, validating, and persisting project snapshots. It collaborates with the broader architecture by tracking file modifications and computing diffs to analyze code changes over time.
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
Install using uv.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv add gyomu-python-analysis
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Dependencies
|
|
50
|
+
|
|
51
|
+
This package relies on several runtime dependencies for its core functionality. It uses `returns` for explicit success and failure representation via Success, Failure, and Result, while `gyomu-schema` and `gyomu-infra` serve as repositories for common types and general infrastructure processing such as I/O. Additionally, `griffelib` and `docstring-parser` are utilized for AST and docstring analysis, respectively.
|
|
52
|
+
|
|
53
|
+
## Development
|
|
54
|
+
|
|
55
|
+
Contributors must ensure that all analysis results are deterministically derived exclusively from source code and project configurations, treating the underlying code as strictly read-only to prevent any unintended modifications during execution. Project Context and Workspace Context must be maintained as the central authorities for managing parsing targets, configuration rules, and path resolution uniformly across the entire scope. To preserve clean architectural boundaries, project-level analysis and individual source file parsing must be strictly separated as independent responsibilities, ensuring that Python-specific implementation details remain encapsulated within this shared foundation and are never leaked to upper layers.
|
|
56
|
+
|
|
57
|
+
State management relies on the creation, comparison, and persistence of project snapshots, which represent the exact current state of the code over time and must be handled independently of higher-level operations such as documentation updates. Contributors are required to structure all output data as immutable, read-structured models that can be efficiently reused by Concept, Facts, and Docstring layers. Furthermore, any evolution of the codebase must respect clearly defined project boundaries and source roots, maintaining a decoupled architecture where dependent layers interact solely through the provided analysis models and context interfaces rather than direct parsing libraries.
|
|
58
|
+
|
|
59
|
+
## Public API
|
|
60
|
+
|
|
61
|
+
- Python Language Analysis - Examines Python language constructs including classes, functions, variables, imports, dependencies, docstrings, type aliases, and Pydantic models.
|
|
62
|
+
- AST Parsing and Indexing - Parses Python Abstract Syntax Trees to analyze statements, expressions, and build symbol indexes and identities.
|
|
63
|
+
- Workspace and Project Management - Initializes project and workspace contexts, reads configurations, manages module loading, and handles caching.
|
|
64
|
+
- Snapshot and Version Tracking - Tracks file modifications, diffs changes between versions, and handles project snapshot creation, validation, and persistence.
|
|
65
|
+
|
|
66
|
+
## License
|
|
67
|
+
|
|
68
|
+
MIT
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Gyomu Python Analysis
|
|
2
|
+
|
|
3
|
+
[US English](README.md) | JP 日本語
|
|
4
|
+
|
|
5
|
+
## 概要
|
|
6
|
+
|
|
7
|
+
本パッケージは、Gyomu内のPythonプロジェクトやワークスペースを対象とした、包括的な静態解析の基盤として機能します。その主な目的は、言語構造を検証し、ソースコードの構造、宣言、および依存関係を抽出し、統一された構造化解析モデルへと統合することです。
|
|
8
|
+
|
|
9
|
+
プロジェクトやワークスペースのコンテキストを通じてターゲットと設定を統一的に管理することで、解析結果やプロジェクトの状態を再利用可能な形式で扱うことができます。これにより共通基盤が構築され、Concept、Fact、docstringsなどの上位レイヤーに対して信頼性の高い構造的洞察を提供します。
|
|
10
|
+
|
|
11
|
+
## アーキテクチャ
|
|
12
|
+
|
|
13
|
+
Gyomu Python Analysis は、言語分析、ワークスペース管理、バージョン追跡に責任を分割するモジュール式コンポーネントで構成されています。このアーキテクチャは、AST パースと、言語構造、クラス、関数、型、Pydantic モデル向けの専用アナライザーを通じた Python ソース構造の分析を中心としています。
|
|
14
|
+
|
|
15
|
+
分析サブシステムは、プロジェクトおよびワークスペースの初期化処理、設定の読み込み、モジュール読み込みの管理、ファイル分析コンテキストの維持を行います。このサブシステム内では、専用コンポーネントが文や式の詳細な AST 検査に加えて、シンボルインデックス作成と識別子の解決に注力します。
|
|
16
|
+
|
|
17
|
+
これとは別に、スナップショットコンポーネントは、プロジェクトスナップショットの作成、検証、永続化によってプロジェクトのバージョン追跡を管理します。ファイル変更の追跡と差分の計算を行い、経時的なコード変更を分析することで、より広範なアーキテクチャと連携します。
|
|
18
|
+
|
|
19
|
+
## インストール
|
|
20
|
+
|
|
21
|
+
uv を使用してインストールします。
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
uv add gyomu-python-analysis
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 依存関係
|
|
28
|
+
|
|
29
|
+
このパッケージは、コア機能の実現にいくつかのランタイム依存関係を利用しています。成功、失敗、結果を明示的に表現するために `returns` を使用し、共通型の保持や入出力などの一般的なインフラストラクチャ処理には `gyomu-schema` および `gyomu-infra` をリポジトリとして利用します。さらに、AST(抽象構文木)およびドキュメント文字列の解析には、それぞれ `griffelib` と `docstring-parser` が使用されます。
|
|
30
|
+
|
|
31
|
+
## 開発
|
|
32
|
+
|
|
33
|
+
コントリビューターは、すべての解析結果がソースコードとプロジェクトの設定のみから決定論的に導出されることを確認する必要があります。実行中の意図しない変更を防ぐため、基盤となるコードは厳密に読み取り専用として扱います。Project ContextとWorkspace Contextは、解析ターゲット、設定ルール、およびパス解決をスコープ全体で一元管理するための信頼の唯一の情報源として維持されなければなりません。クリーンなアーキテクチャの境界を維持するため、プロジェクトレベルの解析と個別のソースファイル解析は独立した責務として厳密に分離し、Python固有の実装詳細がこの共有基盤内にカプセル化され、上位レイヤーに漏洩しないようにする必要があります。
|
|
34
|
+
|
|
35
|
+
状態管理はプロジェクトスナップショットの作成、比較、永続化に依存します。これらは時間の経過におけるコードの正確な現在状態を表すものであり、ドキュメントの更新などの上位レイヤーの操作とは独立して処理されなければなりません。コントリビューターは、すべての出力データを、Concept、Facts、Docstringの各レイヤーによって効率的に再利用できる、不変かつ読み取り構造化されたモデルとして構築することが求められます。さらに、コードベースの変更にあたっては、明確に定義されたプロジェクト境界とソースルートを尊重し、依存レイヤーが直接的な解析ライブラリではなく、提供される解析モデルとcontextインターフェースを介してのみ相互作用する、疎結合なアーキテクチャを維持する必要があります。
|
|
36
|
+
|
|
37
|
+
## Public API
|
|
38
|
+
|
|
39
|
+
- Python言語解析 - クラス、関数、変数、インポート、依存関係、ドキュメント文字列、型エイリアス、PydanticモデルなどのPython言語の構文要素を検証します。
|
|
40
|
+
- AST解析とインデックス作成 - Pythonの抽象構文木(AST)を解析して文や式を検証し、シンボルのインデックスと識別子を構築します。
|
|
41
|
+
- ワークスペースおよびプロジェクト管理 - プロジェクトとワークスペースのコンテキストを初期化し、設定を読み込み、モジュールのロードを管理し、キャッシュを処理します。
|
|
42
|
+
- スナップショットとバージョン追跡 - ファイルの変更を追跡し、バージョン間の差分を検出し、プロジェクトのスナップショットの作成、検証、永続化を処理します。
|
|
43
|
+
|
|
44
|
+
## ライセンス
|
|
45
|
+
|
|
46
|
+
MIT
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Gyomu Python Analysis
|
|
2
|
+
|
|
3
|
+
US English | [JP 日本語](README.ja.md)
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This package serves as a comprehensive static analysis foundation for Python projects and workspaces within Gyomu. Its primary purpose is to examine language constructs and extract source code structures, declarations, and dependencies into a unified, structured analysis model.
|
|
8
|
+
|
|
9
|
+
By managing targets and configurations consistently through project and workspace contexts, the toolkit enables analysis results and project states to be handled in a reusable format. This establishes a common infrastructure that empowers upper layers, such as concepts, facts, and docstrings, with reliable structural insights.
|
|
10
|
+
|
|
11
|
+
## Architecture
|
|
12
|
+
|
|
13
|
+
Gyomu Python Analysis is organized into modular components that divide responsibilities across language analysis, workspace management, and version tracking. The architecture centers on analyzing Python source structures through AST parsing and dedicated analyzers for language constructs, classes, functions, types, and Pydantic models.
|
|
14
|
+
|
|
15
|
+
The analysis subsystem handles project and workspace initialization, reads configurations, manages module loading, and maintains file analysis contexts. Within this subsystem, specialized components focus on deep AST inspection of statements and expressions, alongside symbol indexing and identity resolution.
|
|
16
|
+
|
|
17
|
+
Separately, the snapshot component manages project version tracking by creating, validating, and persisting project snapshots. It collaborates with the broader architecture by tracking file modifications and computing diffs to analyze code changes over time.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
Install using uv.
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
uv add gyomu-python-analysis
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Dependencies
|
|
28
|
+
|
|
29
|
+
This package relies on several runtime dependencies for its core functionality. It uses `returns` for explicit success and failure representation via Success, Failure, and Result, while `gyomu-schema` and `gyomu-infra` serve as repositories for common types and general infrastructure processing such as I/O. Additionally, `griffelib` and `docstring-parser` are utilized for AST and docstring analysis, respectively.
|
|
30
|
+
|
|
31
|
+
## Development
|
|
32
|
+
|
|
33
|
+
Contributors must ensure that all analysis results are deterministically derived exclusively from source code and project configurations, treating the underlying code as strictly read-only to prevent any unintended modifications during execution. Project Context and Workspace Context must be maintained as the central authorities for managing parsing targets, configuration rules, and path resolution uniformly across the entire scope. To preserve clean architectural boundaries, project-level analysis and individual source file parsing must be strictly separated as independent responsibilities, ensuring that Python-specific implementation details remain encapsulated within this shared foundation and are never leaked to upper layers.
|
|
34
|
+
|
|
35
|
+
State management relies on the creation, comparison, and persistence of project snapshots, which represent the exact current state of the code over time and must be handled independently of higher-level operations such as documentation updates. Contributors are required to structure all output data as immutable, read-structured models that can be efficiently reused by Concept, Facts, and Docstring layers. Furthermore, any evolution of the codebase must respect clearly defined project boundaries and source roots, maintaining a decoupled architecture where dependent layers interact solely through the provided analysis models and context interfaces rather than direct parsing libraries.
|
|
36
|
+
|
|
37
|
+
## Public API
|
|
38
|
+
|
|
39
|
+
- Python Language Analysis - Examines Python language constructs including classes, functions, variables, imports, dependencies, docstrings, type aliases, and Pydantic models.
|
|
40
|
+
- AST Parsing and Indexing - Parses Python Abstract Syntax Trees to analyze statements, expressions, and build symbol indexes and identities.
|
|
41
|
+
- Workspace and Project Management - Initializes project and workspace contexts, reads configurations, manages module loading, and handles caching.
|
|
42
|
+
- Snapshot and Version Tracking - Tracks file modifications, diffs changes between versions, and handles project snapshot creation, validation, and persistence.
|
|
43
|
+
|
|
44
|
+
## License
|
|
45
|
+
|
|
46
|
+
MIT
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from gyomu_python_analysis.analysis.initialize import initialize_project_context
|
|
5
|
+
from gyomu_python_analysis.analysis.load_module import load_module_analysis
|
|
6
|
+
from gyomu_schema.schemas.python.types import ProjectRelativePath, PythonPath
|
|
7
|
+
from gyomu_schema.schemas.types import FullPath
|
|
8
|
+
from returns.result import Failure
|
|
9
|
+
|
|
10
|
+
from gyomu_schema.utility.fromatting import format_object
|
|
11
|
+
|
|
12
|
+
# context = initialize_project_context(project_root=FullPath(Path("../../schema").resolve()),source_root=ProjectRelativePath(Path("src"))).unwrap()
|
|
13
|
+
context = initialize_project_context(project_root=FullPath(Path("..").resolve()),source_root=ProjectRelativePath(Path("experiments"))).unwrap()
|
|
14
|
+
result = load_module_analysis(context, module_path=PythonPath("sample.user2"))
|
|
15
|
+
# result = load_module_analysis(context,module_path=PythonPath("gyomu_schema.schemas.knowledge.roadmap"))
|
|
16
|
+
if isinstance(result,Failure):
|
|
17
|
+
print(format_object(result.failure(),depth=6))
|
|
18
|
+
else:
|
|
19
|
+
print(format_object(result.unwrap(),depth=6))
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import Annotated, Literal
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Confidence = Annotated[
|
|
9
|
+
float,
|
|
10
|
+
Field(
|
|
11
|
+
ge=0.0,
|
|
12
|
+
le=1.0,
|
|
13
|
+
description="AI decision confidence used for merge strategy routing",
|
|
14
|
+
),
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
Version = 1.2
|
|
18
|
+
|
|
19
|
+
class RoadmapItem(BaseModel):
|
|
20
|
+
model_config = ConfigDict(
|
|
21
|
+
json_schema_extra={
|
|
22
|
+
"title": "RoadmapItem",
|
|
23
|
+
"description": (
|
|
24
|
+
"One roadmap item describing a planned improvement or feature."
|
|
25
|
+
),
|
|
26
|
+
},
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
title: str = Field(
|
|
30
|
+
description="A short title summarizing the planned work.",
|
|
31
|
+
default="ABC"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
description: str = Field(
|
|
35
|
+
description=(
|
|
36
|
+
"Explain the purpose, expected outcome, or motivation for this work."
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
priority: Literal["high", "medium", "low"] = Field(
|
|
41
|
+
description=(
|
|
42
|
+
"Relative implementation priority. High-priority items are expected "
|
|
43
|
+
"to be addressed before lower-priority items."
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
ReadmeSectionId = Literal[
|
|
48
|
+
"overview",
|
|
49
|
+
"features",
|
|
50
|
+
"installation",
|
|
51
|
+
"requirements",
|
|
52
|
+
"quick-start",
|
|
53
|
+
"architecture",
|
|
54
|
+
"public-api",
|
|
55
|
+
"development",
|
|
56
|
+
"dependencies",
|
|
57
|
+
"license",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
README_SECTION_TITLES: dict[str, dict[ReadmeSectionId, str]] = {
|
|
61
|
+
"en": {
|
|
62
|
+
"overview": "Overview",
|
|
63
|
+
"features": "Features",
|
|
64
|
+
"installation": "Installation",
|
|
65
|
+
"public-api": "Public API",
|
|
66
|
+
"quick-start": "Quick Start",
|
|
67
|
+
"architecture": "Architecture",
|
|
68
|
+
"dependencies": "Dependencies",
|
|
69
|
+
"development": "Development",
|
|
70
|
+
"license": "License",
|
|
71
|
+
"requirements": "Requirements",
|
|
72
|
+
},
|
|
73
|
+
"ja": {
|
|
74
|
+
"overview": "概要",
|
|
75
|
+
"features": "機能",
|
|
76
|
+
"installation": "インストール",
|
|
77
|
+
"public-api": "Public API",
|
|
78
|
+
"quick-start": "クイックスタート",
|
|
79
|
+
"architecture": "アーキテクチャ",
|
|
80
|
+
"dependencies": "依存関係",
|
|
81
|
+
"development": "開発",
|
|
82
|
+
"license": "ライセンス",
|
|
83
|
+
"requirements": "要件",
|
|
84
|
+
},
|
|
85
|
+
}
|
|
@@ -31,3 +31,22 @@ Confidence2 = Annotated[
|
|
|
31
31
|
description="AI decision confidence used for merge strategy routing",
|
|
32
32
|
),
|
|
33
33
|
]
|
|
34
|
+
|
|
35
|
+
Confidence3 = Annotated[
|
|
36
|
+
float | None,
|
|
37
|
+
Field(
|
|
38
|
+
ge=0.0,
|
|
39
|
+
le=1.0,
|
|
40
|
+
description="AI decision confidence used for merge strategy routing",
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
Confidence4 = Annotated[
|
|
46
|
+
float | int | None,
|
|
47
|
+
Field(
|
|
48
|
+
ge=0.0,
|
|
49
|
+
le=1.0,
|
|
50
|
+
description="AI decision confidence used for merge strategy routing",
|
|
51
|
+
),
|
|
52
|
+
]
|
{gyomu_python_analysis-0.6.0 → gyomu_python_analysis-0.7.0}/python_analysis_test_support/helpers.py
RENAMED
|
@@ -6,6 +6,7 @@ from pathlib import Path
|
|
|
6
6
|
from griffe import Attribute, Class, Function, TypeAlias
|
|
7
7
|
from gyomu_infra.filesystem.file_io import read_source_text
|
|
8
8
|
from gyomu_infra.logger import logger
|
|
9
|
+
from gyomu_python_analysis.analysis.analyzers.ast.symbol import AstTargetSymbolType
|
|
9
10
|
from gyomu_python_analysis.analysis.analyzers.cls import analyze_class
|
|
10
11
|
from gyomu_python_analysis.analysis.analyzers.context import initialize_symbol_context
|
|
11
12
|
from gyomu_python_analysis.analysis.analyzers.functions import analyze_function
|
|
@@ -206,12 +207,14 @@ class AnalysisTestBase:
|
|
|
206
207
|
file_name, symbol_name, dump_required
|
|
207
208
|
)
|
|
208
209
|
assert isinstance(symbol, Attribute)
|
|
210
|
+
ast_symbol = index.get(symbol.name)
|
|
209
211
|
return analyze_variable(
|
|
210
212
|
variable=symbol,
|
|
211
213
|
name=symbol_name,
|
|
212
214
|
context=initialize_symbol_context(
|
|
213
215
|
module_name=file_name, name=symbol_name, source_lines=source_lines
|
|
214
216
|
),
|
|
217
|
+
asy_symbol=ast_symbol,
|
|
215
218
|
)
|
|
216
219
|
|
|
217
220
|
def _analyze_class_base(
|
|
@@ -238,7 +241,7 @@ class AnalysisTestBase:
|
|
|
238
241
|
) -> tuple[
|
|
239
242
|
SymbolAnalysis,
|
|
240
243
|
list[str],
|
|
241
|
-
dict[str,
|
|
244
|
+
dict[str, AstTargetSymbolType],
|
|
242
245
|
]:
|
|
243
246
|
module_name = file_name
|
|
244
247
|
context = self._read_module_fixture(module_name)
|
|
@@ -260,28 +263,33 @@ class AnalysisTestBase:
|
|
|
260
263
|
source_lines = source.splitlines(keepends=True)
|
|
261
264
|
tree = ast.parse(source=source, filename=module_name)
|
|
262
265
|
# index = _analyze_ast_module(source=source, source_path=module_name)
|
|
263
|
-
index: dict[str,
|
|
264
|
-
self._build_class_function_index(tree)
|
|
265
|
-
)
|
|
266
|
+
index: dict[str, AstTargetSymbolType] = self._build_class_function_index(tree)
|
|
266
267
|
|
|
267
268
|
return symbol, source_lines, index
|
|
268
269
|
|
|
269
|
-
_default_index: dict[
|
|
270
|
-
str, ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef
|
|
271
|
-
] = {}
|
|
270
|
+
_default_index: dict[str, AstTargetSymbolType] = {}
|
|
272
271
|
|
|
273
272
|
def _build_class_function_index(
|
|
274
273
|
self,
|
|
275
274
|
tree: ast.Module | ast.ClassDef,
|
|
276
|
-
index: dict[
|
|
277
|
-
|
|
278
|
-
] = _default_index,
|
|
279
|
-
) -> dict[str, ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef]:
|
|
275
|
+
index: dict[str, AstTargetSymbolType] = _default_index,
|
|
276
|
+
) -> dict[str, AstTargetSymbolType]:
|
|
280
277
|
|
|
281
278
|
for child in ast.iter_child_nodes(tree):
|
|
282
279
|
if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
|
|
283
280
|
key = child.name
|
|
284
281
|
index[key] = child
|
|
282
|
+
if isinstance(child, ast.Assign): # noqa: SIM102
|
|
283
|
+
if child.end_lineno is not None:
|
|
284
|
+
for target in child.targets:
|
|
285
|
+
if isinstance(target, ast.Name):
|
|
286
|
+
key = target.id
|
|
287
|
+
index[key] = child
|
|
288
|
+
if isinstance(child, ast.AnnAssign): # noqa: SIM102
|
|
289
|
+
if child.end_lineno is not None: # noqa: SIM102
|
|
290
|
+
if isinstance(child.target, ast.Name):
|
|
291
|
+
key = child.target.id
|
|
292
|
+
index[key] = child
|
|
285
293
|
if isinstance(child, ast.ClassDef):
|
|
286
294
|
self._build_class_function_index(child, index)
|
|
287
295
|
return index
|
|
@@ -55,6 +55,7 @@ from gyomu_schema.schemas.python.type.expression import (
|
|
|
55
55
|
NamedExpressionAnalysis,
|
|
56
56
|
NameExpressionAnalysis,
|
|
57
57
|
NoneExpressionAnalysis,
|
|
58
|
+
NonLocalStatementAnalysis,
|
|
58
59
|
ParamSpecAnalysis,
|
|
59
60
|
PassStatementAnalysis,
|
|
60
61
|
PatternAnalysis,
|
|
@@ -140,6 +141,9 @@ def analyze_statement(
|
|
|
140
141
|
if isinstance(statement, ast.Global):
|
|
141
142
|
return _analyze_global(statement)
|
|
142
143
|
|
|
144
|
+
if isinstance(statement, ast.Nonlocal):
|
|
145
|
+
return _analyze_nonlocal(statement)
|
|
146
|
+
|
|
143
147
|
logger.debug(f"unsupported statement: {repr(statement)}")
|
|
144
148
|
return UnknownStatementAnalysis()
|
|
145
149
|
|
|
@@ -1113,6 +1117,12 @@ def _analyze_global(
|
|
|
1113
1117
|
return GlobalStatementAnalysis(names=tuple(statement.names))
|
|
1114
1118
|
|
|
1115
1119
|
|
|
1120
|
+
def _analyze_nonlocal(
|
|
1121
|
+
statement: ast.Nonlocal,
|
|
1122
|
+
) -> NonLocalStatementAnalysis:
|
|
1123
|
+
return NonLocalStatementAnalysis(names=tuple(statement.names))
|
|
1124
|
+
|
|
1125
|
+
|
|
1116
1126
|
def _analyze_assert(
|
|
1117
1127
|
statement: ast.Assert,
|
|
1118
1128
|
context: SymbolContext,
|