gyomu-python-analysis 0.4.0__tar.gz → 0.6.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.
Files changed (184) hide show
  1. gyomu_python_analysis-0.6.0/.gyomu/concept/$Package.json +37 -0
  2. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/$Directory.json +24 -0
  3. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/$Directory.json +20 -0
  4. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/$Directory.json +24 -0
  5. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/ast/$Directory.json +18 -0
  6. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/expression/$Directory.json +19 -0
  7. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/analyzers/internal/$Directory.json +19 -0
  8. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/extract/$Directory.json +18 -0
  9. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/file/$Directory.json +12 -0
  10. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/analysis/parser/$Directory.json +17 -0
  11. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/error/$Directory.json +17 -0
  12. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/path/$Directory.json +17 -0
  13. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/project/$Directory.json +21 -0
  14. gyomu_python_analysis-0.6.0/.gyomu/concept/src/gyomu_python_analysis/snapshot/$Directory.json +25 -0
  15. gyomu_python_analysis-0.6.0/PKG-INFO +25 -0
  16. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/pyproject.toml +13 -0
  17. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/helpers.py +36 -6
  18. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/cls.py +0 -1
  19. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/functions.py +0 -1
  20. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/initialize.py +32 -2
  21. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/workspace.py +3 -56
  22. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/project/context.py +2 -0
  23. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/project/workspace.py +5 -1
  24. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/analyze.py +1 -1
  25. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/commit.py +1 -1
  26. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/create.py +1 -1
  27. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/diff.py +1 -2
  28. gyomu_python_analysis-0.6.0/src/gyomu_python_analysis/snapshot/models.py +27 -0
  29. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_initialize.py +85 -4
  30. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_workspace.py +2 -102
  31. gyomu_python_analysis-0.6.0/tests/unit/snapshot/__init__.py +0 -0
  32. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/snapshot/test_commit.py +3 -3
  33. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/snapshot/test_create.py +4 -1
  34. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/snapshot/test_diff.py +2 -2
  35. gyomu_python_analysis-0.4.0/PKG-INFO +0 -16
  36. gyomu_python_analysis-0.4.0/src/gyomu_python_analysis/snapshot/models.py +0 -103
  37. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/.gitignore +0 -0
  38. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/README.md +0 -0
  39. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/experiments/griffe_analysis.py +0 -0
  40. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/experiments/griffe_dump.py +0 -0
  41. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/experiments/sample/__init__.py +0 -0
  42. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/experiments/sample/user.py +0 -0
  43. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/experiments/sample.py +0 -0
  44. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/__init__.py +0 -0
  45. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/pyproject.toml +0 -0
  46. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/__init__.py +0 -0
  47. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/__init__.py +0 -0
  48. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/call.py +0 -0
  49. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/comprehension.py +0 -0
  50. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/for.py +0 -0
  51. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/function.py +0 -0
  52. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/if.py +0 -0
  53. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/match.py +0 -0
  54. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/try.py +0 -0
  55. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/ast/with.py +0 -0
  56. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/01-simple.py +0 -0
  57. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/02-args.py +0 -0
  58. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/03-typed-return.py +0 -0
  59. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/04-raises.py +0 -0
  60. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/05-examples.py +0 -0
  61. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/06-notes.py +0 -0
  62. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/07-complex.py +0 -0
  63. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/08-gyomu-context.py +0 -0
  64. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/09-custom-section.py +0 -0
  65. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/10-edge-cases.py +0 -0
  66. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/11-custom-and-gyomu-context.py +0 -0
  67. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/12-module.py +0 -0
  68. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/13-class.py +0 -0
  69. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/14-variable.py +0 -0
  70. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/15-custom-list-section.py +0 -0
  71. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/docstring/__init__.py +0 -0
  72. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/import/__init__.py +0 -0
  73. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/import/all.py +0 -0
  74. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/import/all2.py +0 -0
  75. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/import/imports.py +0 -0
  76. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/import/relative.py +0 -0
  77. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/shared.py +0 -0
  78. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/__init__.py +0 -0
  79. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/call.py +0 -0
  80. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/callable.py +0 -0
  81. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/classes.py +0 -0
  82. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/decorator.py +0 -0
  83. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/functions.py +0 -0
  84. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/generics.py +0 -0
  85. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/location.py +0 -0
  86. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/pydantic.py +0 -0
  87. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/type_alias.py +0 -0
  88. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/types.py +0 -0
  89. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/symbol/variable.py +0 -0
  90. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/types/__init__.py +0 -0
  91. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/fixtures/src/analysis/types/name.py +0 -0
  92. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/pyproject.toml +0 -0
  93. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/src/project_a/__init__.py +0 -0
  94. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_a/src/project_a/module.py +0 -0
  95. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/pyproject.toml +0 -0
  96. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/src/project_b/__init__.py +0 -0
  97. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/packages/project_b/src/project_b/module.py +0 -0
  98. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/python_analysis_test_support/monorepo_fixtures/pyproject.toml +0 -0
  99. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/roadmap.md +0 -0
  100. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/__init__.py +0 -0
  101. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/__init__.py +0 -0
  102. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/__init__.py +0 -0
  103. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/ast/__init__.py +0 -0
  104. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/ast/statement.py +0 -0
  105. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/ast/symbol.py +0 -0
  106. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/context.py +0 -0
  107. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/decorator.py +0 -0
  108. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/dependency.py +0 -0
  109. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/docstring.py +0 -0
  110. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/expression/__init__.py +0 -0
  111. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/expression/expr.py +0 -0
  112. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/imports.py +0 -0
  113. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/internal/__init__.py +0 -0
  114. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/internal/common.py +0 -0
  115. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/internal/location.py +0 -0
  116. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/internal/visibility.py +0 -0
  117. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/pydantic.py +0 -0
  118. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/type_alias.py +0 -0
  119. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/types.py +0 -0
  120. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/analyzers/variables.py +0 -0
  121. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/delete_cache.py +0 -0
  122. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/extract/__init__.py +0 -0
  123. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/extract/symbols.py +0 -0
  124. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/file/__init__.py +0 -0
  125. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/file/source_file_context.py +0 -0
  126. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/get_module.py +0 -0
  127. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/load.py +0 -0
  128. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/load_file_context.py +0 -0
  129. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/load_module.py +0 -0
  130. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/metadata.py +0 -0
  131. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/parser/__init__.py +0 -0
  132. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/analysis/parser/docstring.py +0 -0
  133. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/error/__init__.py +0 -0
  134. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/error/analysis.py +0 -0
  135. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/path/__init__.py +0 -0
  136. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/path/conversion.py +0 -0
  137. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/project/__init__.py +0 -0
  138. /gyomu_python_analysis-0.4.0/src/gyomu_python_analysis/snapshot/__init__.py → /gyomu_python_analysis-0.6.0/src/gyomu_python_analysis/py.typed +0 -0
  139. {gyomu_python_analysis-0.4.0/tests/unit → gyomu_python_analysis-0.6.0/src/gyomu_python_analysis/snapshot}/__init__.py +0 -0
  140. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/project.py +0 -0
  141. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/src/gyomu_python_analysis/snapshot/types.py +0 -0
  142. {gyomu_python_analysis-0.4.0/tests/unit/analysis → gyomu_python_analysis-0.6.0/tests/unit}/__init__.py +0 -0
  143. {gyomu_python_analysis-0.4.0/tests/unit/analysis/analyzers → gyomu_python_analysis-0.6.0/tests/unit/analysis}/__init__.py +0 -0
  144. {gyomu_python_analysis-0.4.0/tests/unit/analysis/analyzers/ast → gyomu_python_analysis-0.6.0/tests/unit/analysis/analyzers}/__init__.py +0 -0
  145. {gyomu_python_analysis-0.4.0/tests/unit/analysis/analyzers/expression → gyomu_python_analysis-0.6.0/tests/unit/analysis/analyzers/ast}/__init__.py +0 -0
  146. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/conftest.py +0 -0
  147. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/helper.py +0 -0
  148. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_call.py +0 -0
  149. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_comprehension.py +0 -0
  150. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_conversion.py +0 -0
  151. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_dependency.py +0 -0
  152. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_for.py +0 -0
  153. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_function.py +0 -0
  154. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_if.py +0 -0
  155. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_match.py +0 -0
  156. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_statement.py +0 -0
  157. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_try.py +0 -0
  158. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/ast/test_with.py +0 -0
  159. {gyomu_python_analysis-0.4.0/tests/unit/analysis/analyzers/internal → gyomu_python_analysis-0.6.0/tests/unit/analysis/analyzers/expression}/__init__.py +0 -0
  160. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/expression/test_analyze_expression_name.py +0 -0
  161. {gyomu_python_analysis-0.4.0/tests/unit/path → gyomu_python_analysis-0.6.0/tests/unit/analysis/analyzers/internal}/__init__.py +0 -0
  162. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/internal/test_location.py +0 -0
  163. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/internal/test_visibility.py +0 -0
  164. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_classes.py +0 -0
  165. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_decorator.py +0 -0
  166. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_dependency.py +0 -0
  167. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_docstring.py +0 -0
  168. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_functions.py +0 -0
  169. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_imports.py +0 -0
  170. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_pydantic.py +0 -0
  171. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_type_alias.py +0 -0
  172. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_types.py +0 -0
  173. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_analyze_variable.py +0 -0
  174. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/analyzers/test_context.py +0 -0
  175. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_get_module.py +0 -0
  176. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_load.py +0 -0
  177. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_load_file.py +0 -0
  178. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_load_module.py +0 -0
  179. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/analysis/test_metadata.py +0 -0
  180. {gyomu_python_analysis-0.4.0/tests/unit/snapshot → gyomu_python_analysis-0.6.0/tests/unit/path}/__init__.py +0 -0
  181. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/path/test_conversion.py +0 -0
  182. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/project/test_config.py +0 -0
  183. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/snapshot/test_analyze.py +0 -0
  184. {gyomu_python_analysis-0.4.0 → gyomu_python_analysis-0.6.0}/tests/unit/snapshot/test_project.py +0 -0
@@ -0,0 +1,37 @@
1
+ {
2
+ "summary": "Gyomu Python Analysis is a comprehensive toolkit for statically analyzing Python projects, workspaces, and language constructs. It provides modular AST-based analyzers for examining classes, functions, types, Pydantic models, and expressions, alongside robust workspace initialization, configuration parsing, and project snapshot tracking capabilities.",
3
+ "responsibilities": [
4
+ "Analyze Python source code structures, language constructs, and metadata.",
5
+ "Manage project and workspace initialization, configuration parsing, and module loading contexts.",
6
+ "Create, diff, and manage project snapshots to track code modifications and changes over time.",
7
+ "Build symbol indexes, locations, and identity contexts from source code elements."
8
+ ],
9
+ "capabilities": [
10
+ {
11
+ "name": "Python Language Analysis",
12
+ "description": "Examines Python language constructs including classes, functions, variables, imports, dependencies, docstrings, type aliases, and Pydantic models."
13
+ },
14
+ {
15
+ "name": "AST Parsing and Indexing",
16
+ "description": "Parses Python Abstract Syntax Trees to analyze statements, expressions, and build symbol indexes and identities."
17
+ },
18
+ {
19
+ "name": "Workspace and Project Management",
20
+ "description": "Initializes project and workspace contexts, reads configurations, manages module loading, and handles caching."
21
+ },
22
+ {
23
+ "name": "Snapshot and Version Tracking",
24
+ "description": "Tracks file modifications, diffs changes between versions, and handles project snapshot creation, validation, and persistence."
25
+ }
26
+ ],
27
+ "design_decisions": [
28
+ "Employs modular AST-based analyzers to decompose Python language constructs into structured representations.",
29
+ "Maintains explicit project and workspace contexts to support multi-project configurations and source root resolution.",
30
+ "Utilizes snapshot tracking with file hashing and modification timestamps to detect and analyze project changes efficiently."
31
+ ],
32
+ "usage_guidance": [
33
+ "Use the workspace and project initialization modules to set up analysis contexts from project configurations.",
34
+ "Leverage the core analyzers and AST utilities to inspect Python source code constructs and extract symbol metadata.",
35
+ "Employ snapshot and diffing workflows to track modifications and analyze changes across project files."
36
+ ]
37
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "summary": "Provides core Python analysis capabilities, including project and workspace initialization, configuration management, path conversion, custom error handling, and snapshot tracking workflows.",
3
+ "responsibilities": [
4
+ "Initialize project and workspace contexts, parse configurations, and manage file and module analysis.",
5
+ "Define custom error types and analysis phases for Python analysis operations.",
6
+ "Translate between various path formats including project-relative, source-relative, python, and full paths.",
7
+ "Manage project configurations and workspace structures.",
8
+ "Track file modifications, compute diffs, and handle snapshot creation, validation, and commit workflows."
9
+ ],
10
+ "concepts": [
11
+ "project analysis",
12
+ "configuration management",
13
+ "path conversion",
14
+ "error handling",
15
+ "project snapshot"
16
+ ],
17
+ "relationships": [
18
+ "Project and workspace contexts configure project analysis and snapshot management workflows."
19
+ ],
20
+ "design_decisions": [
21
+ "Modular structure organizing core analysis functions into domain-specific subpackages such as analysis, error, path, project, and snapshot."
22
+ ],
23
+ "importance": "Core"
24
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "summary": "Performs project and workspace initialization, reads project configurations, manages module loading, caching, and file analysis contexts.",
3
+ "responsibilities": [
4
+ "Initialize project contexts and parse project configurations from workspace structures, load and manage module and file analysis contexts, and delete module caches."
5
+ ],
6
+ "concepts": [
7
+ "project initialization",
8
+ "module loading and analysis",
9
+ "workspace configuration",
10
+ "file analysis context",
11
+ "cache management"
12
+ ],
13
+ "relationships": [
14
+ "Project initialization handles workspace configurations and source roots."
15
+ ],
16
+ "design_decisions": [
17
+ "Modular functions for project initialization, module loading, caching, workspace handling, and file context loading."
18
+ ],
19
+ "importance": "Core"
20
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "summary": "Provides core analyzer modules for examining Python language constructs such as classes, functions, dependencies, docstrings, imports, Pydantic models, type aliases, types, and variables, along with symbol context management.",
3
+ "responsibilities": [
4
+ "Analyze Python classes, functions, dependencies, docstrings, imports, Pydantic models, type aliases, types, and variables, and manage symbol context and identity during code analysis."
5
+ ],
6
+ "concepts": [
7
+ "class analysis",
8
+ "function analysis",
9
+ "dependency analysis",
10
+ "docstring analysis",
11
+ "import analysis",
12
+ "pydantic analysis",
13
+ "type analysis",
14
+ "variable analysis",
15
+ "symbol context"
16
+ ],
17
+ "relationships": [
18
+ "Code analysis uses specialized analyzers for classes, functions, dependencies, docstrings, imports, pydantic models, type aliases, types, and variables alongside symbol context management."
19
+ ],
20
+ "design_decisions": [
21
+ "Modular analysis routines for specific Python code constructs and features"
22
+ ],
23
+ "importance": "Core"
24
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "summary": "Provides AST-based code analysis capabilities, including functions to analyze Python statements and expressions as well as utilities for building symbol indexes.",
3
+ "responsibilities": [
4
+ "Provides functions to analyze statements, expressions, tuples, slices, sets, arrays, and dictionaries using Abstract Syntax Trees.",
5
+ "Builds class and function indexes and AST indexes from source code symbols."
6
+ ],
7
+ "concepts": [
8
+ "AST statement analysis",
9
+ "AST symbol indexing"
10
+ ],
11
+ "relationships": [
12
+ "Statement analysis and symbol indexing are components of AST-based code analysis."
13
+ ],
14
+ "design_decisions": [
15
+ "Organizes analysis routines into specialized modules for statements, expressions, and symbols."
16
+ ],
17
+ "importance": "Core"
18
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "summary": "Provides functions for analyzing various types of Python expressions, including constants, subscripts, dictionaries, arrays, literals, type expressions, tuples, sets, and expression names, alongside literal value parsing.",
3
+ "responsibilities": [
4
+ "analyze Python expressions including constants, subscripts, dictionaries, arrays, literals, type expressions, tuples, sets, and expression names",
5
+ "parse literal values"
6
+ ],
7
+ "concepts": [
8
+ "expression analysis",
9
+ "literal parsing",
10
+ "type expression analysis"
11
+ ],
12
+ "relationships": [
13
+ "analyze expression delegates to specific analyzers for constants, subscripts, dictionaries, arrays, literals, type expressions, tuples, sets, and expression names"
14
+ ],
15
+ "design_decisions": [
16
+ "modular expression analysis functions"
17
+ ],
18
+ "importance": "Core"
19
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "summary": "Houses internal helper utilities supporting analysis functionality, specifically providing common building blocks, location calculation, and visibility determination for code analysis.",
3
+ "responsibilities": [
4
+ "Provide internal helper utilities for code analysis including calculating symbol locations, determining visibility, and building common components."
5
+ ],
6
+ "concepts": [
7
+ "internal analysis helpers",
8
+ "symbol location calculation",
9
+ "visibility calculation",
10
+ "common analyzer components"
11
+ ],
12
+ "relationships": [
13
+ "Internal analysis modules provide shared calculation utilities for location, visibility, and common metadata attributes."
14
+ ],
15
+ "design_decisions": [
16
+ "Internal module helper functions are grouped together to support analysis logic."
17
+ ],
18
+ "importance": "Core"
19
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "summary": "Provides core symbol extraction capabilities and context management for analyzing Python source code.",
3
+ "responsibilities": [
4
+ "Extract symbols from Python code analysis.",
5
+ "Manage context used during symbol extraction."
6
+ ],
7
+ "concepts": [
8
+ "Symbol Extraction",
9
+ "Symbol Extract Context"
10
+ ],
11
+ "relationships": [
12
+ "SymbolExtractContext provides configuration and context for extract_symbols."
13
+ ],
14
+ "design_decisions": [
15
+ "Provides functional extraction logic operating within a specific context."
16
+ ],
17
+ "importance": "Core"
18
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "summary": "Provides file-level analysis context and source file representation for Python code analysis.",
3
+ "responsibilities": [
4
+ "Manage source file context for analysis"
5
+ ],
6
+ "concepts": [
7
+ "source file context"
8
+ ],
9
+ "relationships": [],
10
+ "design_decisions": [],
11
+ "importance": "Core"
12
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "summary": "The parser directory is responsible for analyzing and parsing code documentation, specifically providing docstring parsing capabilities for python analysis.",
3
+ "responsibilities": [
4
+ "Parse docstrings to extract analysis information"
5
+ ],
6
+ "concepts": [
7
+ "parser",
8
+ "docstring parser"
9
+ ],
10
+ "relationships": [
11
+ "DocstringParser provides docstring analysis functionality within the parser module."
12
+ ],
13
+ "design_decisions": [
14
+ "modular parsing organization"
15
+ ],
16
+ "importance": "Core"
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "summary": "Provides error handling and analysis phase definitions for Python analysis operations, including custom exception types.",
3
+ "responsibilities": [
4
+ "Define error types and analysis phases for Python analysis operations."
5
+ ],
6
+ "concepts": [
7
+ "Python Analysis error",
8
+ "AnalysisPhase"
9
+ ],
10
+ "relationships": [
11
+ "AnalysisError incorporates or references AnalysisPhase to represent Python analysis errors."
12
+ ],
13
+ "design_decisions": [
14
+ "Defines custom error types and analysis phases for Python analysis operations."
15
+ ],
16
+ "importance": "Core"
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "summary": "Provides path conversion and manipulation utilities to translate between different path formats including project-relative paths, source-relative paths, python paths, and full paths.",
3
+ "responsibilities": [
4
+ "converts various path representations such as project-relative paths, source-relative paths, python paths, and full paths"
5
+ ],
6
+ "concepts": [
7
+ "path conversion",
8
+ "path manipulation"
9
+ ],
10
+ "relationships": [
11
+ "converts project-relative paths, source-relative paths, python paths, and full paths to each other using path conversion functions"
12
+ ],
13
+ "design_decisions": [
14
+ "provides functions to convert between project-relative paths, source-relative paths, python paths, and full paths"
15
+ ],
16
+ "importance": "Core"
17
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "summary": "Manages project configuration, context, and workspace definitions, encapsulating settings parsed from configuration files and workspace structures.",
3
+ "responsibilities": [
4
+ "Manage project configuration settings parsed from pyproject.toml files.",
5
+ "Encapsulate project context including roots, configurations, and loaders.",
6
+ "Define workspace configurations, roots, and constituent projects."
7
+ ],
8
+ "concepts": [
9
+ "Project Context",
10
+ "Workspace Configuration",
11
+ "PyProject Config"
12
+ ],
13
+ "relationships": [
14
+ "ProjectContext encapsulates PyProjectConfig and project metadata.",
15
+ "WorkspaceContext contains WorkspaceConfig and WorkspaceProject instances."
16
+ ],
17
+ "design_decisions": [
18
+ "Encapsulates project context and workspace structures into object representations."
19
+ ],
20
+ "importance": "Core"
21
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "summary": "Manages project snapshots, tracking file modifications, diffing changes between snapshots, and handling snapshot creation, validation, and commit workflows.",
3
+ "responsibilities": [
4
+ "Create and manage project snapshots including target files, hashes, and modification timestamps.",
5
+ "Analyze, diff, and commit project changes by comparing snapshots.",
6
+ "Manage project snapshot workspaces and persistence."
7
+ ],
8
+ "concepts": [
9
+ "project snapshot",
10
+ "project changes",
11
+ "file snapshots",
12
+ "snapshot diff",
13
+ "snapshot workspace"
14
+ ],
15
+ "relationships": [
16
+ "Project changes analysis compares previous and current snapshots.",
17
+ "Diffing computes differences between previous and current project snapshots.",
18
+ "Committing validates the project snapshot and commits changes.",
19
+ "Creating a project snapshot enumerates target files and generates file snapshots."
20
+ ],
21
+ "design_decisions": [
22
+ "Exports functions for creating, validating, committing, analyzing, and diffing project snapshots."
23
+ ],
24
+ "importance": "Core"
25
+ }
@@ -0,0 +1,25 @@
1
+ Metadata-Version: 2.5
2
+ Name: gyomu-python-analysis
3
+ Version: 0.6.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
+ python analysis components for Gyomu Python.
@@ -12,6 +12,19 @@ dependencies = [
12
12
  "griffelib>=2.2.0",
13
13
  "docstring-parser>=0.18.0",
14
14
  ]
15
+ license = "MIT"
16
+ authors = [
17
+ { name = "Yoshihisa Matsumoto" },
18
+ ]
19
+ classifiers = [
20
+ "Development Status :: 4 - Beta",
21
+ "Intended Audience :: Developers",
22
+ "License :: OSI Approved :: MIT License",
23
+ "Programming Language :: Python :: 3",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Topic :: Software Development :: Libraries",
26
+ "Topic :: Software Development :: Libraries :: Python Modules",
27
+ ]
15
28
 
16
29
  [build-system]
17
30
  requires = ["hatchling"]
@@ -16,14 +16,13 @@ from gyomu_python_analysis.analysis.initialize import initialize_project_context
16
16
  from gyomu_python_analysis.analysis.load import load_module
17
17
  from gyomu_python_analysis.analysis.load_module import load_module_analysis
18
18
  from gyomu_python_analysis.project.context import ProjectContext, PyProjectConfig
19
+ from gyomu_python_analysis.project.workspace import (
20
+ WorkspaceProject,
21
+ WorkspaceRoot,
22
+ WorkspaceRootKind,
23
+ )
19
24
  from gyomu_python_analysis.snapshot.models import (
20
25
  AnalyzeProjectChangesResult,
21
- FileAdded,
22
- FileChange,
23
- FileDeleted,
24
- FileSnapshot,
25
- FileUpdated,
26
- ProjectSnapshot,
27
26
  )
28
27
  from gyomu_schema.schemas.python.class_analysis import ClassAnalysis
29
28
  from gyomu_schema.schemas.python.function_analysis import FunctionAnalysis
@@ -36,6 +35,14 @@ from gyomu_schema.schemas.python.types import (
36
35
  WorkspaceRelativePath,
37
36
  )
38
37
  from gyomu_schema.schemas.python.variable import VariableAnalysis
38
+ from gyomu_schema.schemas.snapshot.types import (
39
+ FileAdded,
40
+ FileChange,
41
+ FileDeleted,
42
+ FileSnapshot,
43
+ FileUpdated,
44
+ ProjectSnapshot,
45
+ )
39
46
  from gyomu_schema.schemas.types import FullPath
40
47
  from returns.result import Failure
41
48
 
@@ -53,6 +60,23 @@ _default_project_config = PyProjectConfig(
53
60
  _toml_data={},
54
61
  )
55
62
 
63
+ _default_workspace_path = WorkspaceRelativePath(Path("."))
64
+ _default_pyproject = PyProjectConfig(
65
+ path=_default_workspace_path,
66
+ name="test",
67
+ description="",
68
+ formatter_line_length=88,
69
+ version="1.0",
70
+ _toml_data={},
71
+ )
72
+
73
+
74
+ def create_workspace_project(
75
+ path: WorkspaceRelativePath = _default_workspace_path,
76
+ config: PyProjectConfig = _default_pyproject,
77
+ ) -> WorkspaceProject:
78
+ return WorkspaceProject(path=path, config=config)
79
+
56
80
 
57
81
  def _create_context() -> ProjectContext:
58
82
  return initialize_project_context(
@@ -101,6 +125,12 @@ def create_project_snapshot(
101
125
  return ProjectSnapshot(project_root=project_root, files=files)
102
126
 
103
127
 
128
+ def create_workspace_root(
129
+ path: FullPath, kind: WorkspaceRootKind = WorkspaceRootKind.UV_WORKSPACE
130
+ ) -> WorkspaceRoot:
131
+ return WorkspaceRoot(path=path, kind=kind)
132
+
133
+
104
134
  def create_analyze_project_change(
105
135
  current_snapshot: ProjectSnapshot,
106
136
  project_id: str = "ABC",
@@ -239,7 +239,6 @@ def _build_class_method_analysis(
239
239
  context=context, member_path=new_member_path
240
240
  ),
241
241
  is_ellipsis_only=is_ellipsis_only,
242
- statements=tuple(statements),
243
242
  )
244
243
 
245
244
 
@@ -96,5 +96,4 @@ def analyze_function(
96
96
  return_type=return_type,
97
97
  identity=context.declaration,
98
98
  is_ellipsis_only=is_ellipsis_only,
99
- statements=tuple(statements),
100
99
  )
@@ -36,11 +36,16 @@ def initialize_project_from_workspace(
36
36
  files = find_included_python_files(
37
37
  project_root=project_root, source_root=source_root
38
38
  )
39
+ package_roots = find_package_roots(
40
+ project_root=project_root,
41
+ source_root=source_root,
42
+ )
39
43
  return ProjectContext(
40
44
  project_root=project_root,
41
45
  source_root=source_root,
42
46
  config=project.config,
43
47
  included_files=files,
48
+ package_roots=package_roots,
44
49
  )
45
50
 
46
51
 
@@ -71,16 +76,41 @@ def initialize_project_context(
71
76
  files = find_included_python_files(
72
77
  project_root=project_root, source_root=source_root
73
78
  )
79
+
80
+ package_roots = find_package_roots(
81
+ project_root=project_root,
82
+ source_root=source_root,
83
+ )
84
+
74
85
  return Success(
75
86
  ProjectContext(
76
87
  project_root=project_root,
77
88
  source_root=source_root,
78
89
  config=config_result.unwrap(),
79
90
  included_files=files,
91
+ package_roots=package_roots,
80
92
  )
81
93
  )
82
94
 
83
95
 
96
+ def find_package_roots(
97
+ project_root: FullPath,
98
+ source_root: ProjectRelativePath,
99
+ ) -> tuple[ProjectRelativePath, ...]:
100
+ """Find package root directories within the source root.
101
+
102
+ Find all package root directories containing an `__init__.py` file within the source
103
+ root.
104
+ """
105
+ source_path = project_root / source_root
106
+
107
+ return tuple(
108
+ ProjectRelativePath(path.relative_to(project_root))
109
+ for path in sorted(source_path.iterdir(), key=lambda path: path.name)
110
+ if path.is_dir() and (path / "__init__.py").is_file()
111
+ )
112
+
113
+
84
114
  def find_included_python_files(
85
115
  project_root: FullPath, source_root: ProjectRelativePath
86
116
  ) -> frozenset[ProjectRelativePath]:
@@ -107,13 +137,13 @@ def analyze_project_config(
107
137
  project_root: FullPath,
108
138
  toml_data: dict[str, Any],
109
139
  project_relative_path: WorkspaceRelativePath | None = None,
110
- workspace_config: WorkspaceConfig | None = None,
140
+ workspace_config: PyProjectConfig | None = None,
111
141
  ) -> Result[PyProjectConfig, AnalysisError]:
112
142
  """Analyze the project configuration from parsed pyproject.toml data."""
113
143
 
114
144
  if project_relative_path is None:
115
145
  project_relative_path = WorkspaceRelativePath(Path("."))
116
- project = toml_data["project"]
146
+ project = toml_data.get("project", {})
117
147
  name = project.get("name", "")
118
148
  description = project.get("description", None)
119
149
  is_version_dynamic = "dynamic" in project and "version" in project["dynamic"]
@@ -10,7 +10,6 @@ from returns.result import Failure, Result, Success
10
10
  from gyomu_python_analysis.analysis.initialize import analyze_project_config
11
11
  from gyomu_python_analysis.error.analysis import AnalysisError
12
12
  from gyomu_python_analysis.project.workspace import (
13
- WorkspaceConfig,
14
13
  WorkspaceContext,
15
14
  WorkspaceProject,
16
15
  WorkspaceRoot,
@@ -126,60 +125,6 @@ def is_uv_workspace(toml_data: dict[str, Any]) -> bool:
126
125
  )
127
126
 
128
127
 
129
- def initialize_workspace_config(
130
- path: FullPath, toml_data: dict[str, Any]
131
- ) -> Result[WorkspaceConfig, AnalysisError]:
132
- """Initializes workspace configuration.
133
-
134
- Initializes workspace configuration from pyproject.toml data.
135
-
136
- Args:
137
- path (FullPath): The path to the workspace root or project.
138
- toml_data (dict[str, Any]): The parsed TOML data dictionary.
139
-
140
- Returns:
141
- Result[WorkspaceConfig, AnalysisError]: A Result containing the WorkspaceConfig
142
- on success, or an AnalysisError on failure.
143
- """
144
- try:
145
- name = None
146
- description = None
147
- if "project" in toml_data:
148
- project = toml_data["project"]
149
- name = project.get("name", None)
150
- description = project.get("description", None)
151
-
152
- formatter_line_length: int | None = None
153
- tool = toml_data.get("tool")
154
- if (
155
- isinstance(tool, dict)
156
- and isinstance(tool.get("ruff"), dict)
157
- and "line-length" in tool["ruff"]
158
- ):
159
- formatter_line_length = int(tool["ruff"]["line-length"])
160
-
161
- if formatter_line_length is None:
162
- formatter_line_length = 88
163
-
164
- return Success(
165
- WorkspaceConfig(
166
- path=path,
167
- name=name,
168
- description=description,
169
- formatter_line_length=formatter_line_length,
170
- )
171
- )
172
- except ValueError:
173
- return Failure(
174
- AnalysisError(
175
- "fail to parse root pyproject.toml",
176
- file_path=path,
177
- phase="workspace-discovery",
178
- context="gyomu_python_analysis.analysis.workspace.intialize_workspace_config",
179
- )
180
- )
181
-
182
-
183
128
  def get_uv_workspace_members(toml_data: dict[str, Any]) -> list[str]:
184
129
  """Retrieves member paths from a uv workspace configuration.
185
130
 
@@ -226,7 +171,7 @@ def initialize_workspace_context(
226
171
  return toml_result
227
172
 
228
173
  toml_data = toml_result.unwrap()
229
- config_result = initialize_workspace_config(root.path, toml_data)
174
+ config_result = analyze_project_config(root.path, toml_data)
230
175
  if isinstance(config_result, Failure):
231
176
  return config_result
232
177
 
@@ -238,6 +183,7 @@ def initialize_workspace_context(
238
183
  return project_config_result
239
184
  return Success(
240
185
  WorkspaceContext(
186
+ path=root.path,
241
187
  config=config_result.unwrap(),
242
188
  projects=tuple(
243
189
  [
@@ -281,6 +227,7 @@ def initialize_workspace_context(
281
227
  )
282
228
  return Success(
283
229
  WorkspaceContext(
230
+ path=root.path,
284
231
  config=config_result.unwrap(),
285
232
  projects=tuple(projects),
286
233
  )
@@ -109,6 +109,7 @@ class ProjectContext:
109
109
  source_root: ProjectRelativePath,
110
110
  config: PyProjectConfig,
111
111
  included_files: frozenset[ProjectRelativePath] = frozenset(),
112
+ package_roots: tuple[ProjectRelativePath, ...] = tuple(),
112
113
  ) -> None:
113
114
  self.project_root = project_root
114
115
  self.source_root = source_root
@@ -118,3 +119,4 @@ class ProjectContext:
118
119
  )
119
120
  self.config = config
120
121
  self.included_files = included_files
122
+ self.package_roots = package_roots
@@ -46,8 +46,12 @@ class WorkspaceContext:
46
46
  """
47
47
 
48
48
  def __init__(
49
- self, config: WorkspaceConfig, projects: tuple[WorkspaceProject, ...]
49
+ self,
50
+ path: FullPath,
51
+ config: PyProjectConfig,
52
+ projects: tuple[WorkspaceProject, ...],
50
53
  ) -> None:
54
+ self.path = path
51
55
  self.config = config
52
56
  self.projects = projects
53
57
 
@@ -1,5 +1,6 @@
1
1
  from gyomu_infra.filesystem.file_io import read_json
2
2
  from gyomu_schema.schemas.python.types import WorkspaceRelativePath
3
+ from gyomu_schema.schemas.snapshot.types import ProjectSnapshot
3
4
  from gyomu_schema.schemas.types import FullPath
4
5
  from returns.result import Failure, Result, Success
5
6
 
@@ -9,7 +10,6 @@ from gyomu_python_analysis.snapshot.create import create_snapshot
9
10
  from gyomu_python_analysis.snapshot.diff import diff_snapshot
10
11
  from gyomu_python_analysis.snapshot.models import (
11
12
  AnalyzeProjectChangesResult,
12
- ProjectSnapshot,
13
13
  )
14
14
  from gyomu_python_analysis.snapshot.project import ensure_project_workspace
15
15