xai-review 0.29.0__tar.gz → 0.30.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.

Potentially problematic release.


This version of xai-review might be problematic. Click here for more details.

Files changed (365) hide show
  1. {xai_review-0.29.0/xai_review.egg-info → xai_review-0.30.0}/PKG-INFO +2 -2
  2. {xai_review-0.29.0 → xai_review-0.30.0}/README.md +1 -1
  3. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/review.py +1 -0
  4. xai_review-0.30.0/ai_review/services/review/gateway/review_dry_run_comment_gateway.py +42 -0
  5. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/service.py +9 -3
  6. xai_review-0.29.0/ai_review/tests/fixtures/services/review/gateway/comment.py → xai_review-0.30.0/ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py +1 -1
  7. xai_review-0.30.0/ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py +103 -0
  8. xai_review-0.30.0/ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py +34 -0
  9. xai_review-0.29.0/ai_review/tests/suites/services/review/gateway/test_comment.py → xai_review-0.30.0/ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py +1 -1
  10. xai_review-0.30.0/ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +93 -0
  11. xai_review-0.29.0/ai_review/tests/suites/services/review/gateway/test_llm.py → xai_review-0.30.0/ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py +1 -15
  12. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/test_context.py +2 -2
  13. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/test_inline.py +2 -2
  14. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/test_inline_reply.py +2 -2
  15. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/test_summary.py +2 -2
  16. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/test_summary_reply.py +2 -2
  17. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/test_service.py +18 -0
  18. {xai_review-0.29.0 → xai_review-0.30.0}/pyproject.toml +1 -1
  19. {xai_review-0.29.0 → xai_review-0.30.0/xai_review.egg-info}/PKG-INFO +2 -2
  20. {xai_review-0.29.0 → xai_review-0.30.0}/xai_review.egg-info/SOURCES.txt +9 -6
  21. xai_review-0.29.0/ai_review/tests/fixtures/services/review/gateway/llm.py +0 -17
  22. {xai_review-0.29.0 → xai_review-0.30.0}/LICENSE +0 -0
  23. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/__init__.py +0 -0
  24. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/__init__.py +0 -0
  25. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/__init__.py +0 -0
  26. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_context_review.py +0 -0
  27. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_inline_reply_review.py +0 -0
  28. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_inline_review.py +0 -0
  29. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_review.py +0 -0
  30. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_summary_reply_review.py +0 -0
  31. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/commands/run_summary_review.py +0 -0
  32. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/cli/main.py +0 -0
  33. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/__init__.py +0 -0
  34. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/__init__.py +0 -0
  35. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/client.py +0 -0
  36. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/__init__.py +0 -0
  37. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/client.py +0 -0
  38. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/schema/__init__.py +0 -0
  39. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/schema/comments.py +0 -0
  40. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/schema/files.py +0 -0
  41. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/schema/pull_request.py +0 -0
  42. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/schema/user.py +0 -0
  43. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/pr/types.py +0 -0
  44. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/bitbucket/tools.py +0 -0
  45. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/claude/__init__.py +0 -0
  46. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/claude/client.py +0 -0
  47. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/claude/schema.py +0 -0
  48. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/claude/types.py +0 -0
  49. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gemini/__init__.py +0 -0
  50. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gemini/client.py +0 -0
  51. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gemini/schema.py +0 -0
  52. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gemini/types.py +0 -0
  53. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/__init__.py +0 -0
  54. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/client.py +0 -0
  55. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/__init__.py +0 -0
  56. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/client.py +0 -0
  57. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/__init__.py +0 -0
  58. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/comments.py +0 -0
  59. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/files.py +0 -0
  60. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/pull_request.py +0 -0
  61. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/reviews.py +0 -0
  62. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/schema/user.py +0 -0
  63. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/pr/types.py +0 -0
  64. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/github/tools.py +0 -0
  65. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/__init__.py +0 -0
  66. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/client.py +0 -0
  67. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/__init__.py +0 -0
  68. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/client.py +0 -0
  69. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/__init__.py +0 -0
  70. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/changes.py +0 -0
  71. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/discussions.py +0 -0
  72. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/notes.py +0 -0
  73. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/position.py +0 -0
  74. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/schema/user.py +0 -0
  75. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/mr/types.py +0 -0
  76. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/gitlab/tools.py +0 -0
  77. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/ollama/__init__.py +0 -0
  78. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/ollama/client.py +0 -0
  79. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/ollama/schema.py +0 -0
  80. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/ollama/types.py +0 -0
  81. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/openai/__init__.py +0 -0
  82. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/openai/client.py +0 -0
  83. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/openai/schema.py +0 -0
  84. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/clients/openai/types.py +0 -0
  85. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/config.py +0 -0
  86. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/__init__.py +0 -0
  87. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/asynchronous/__init__.py +0 -0
  88. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/asynchronous/gather.py +0 -0
  89. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/__init__.py +0 -0
  90. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/artifacts.py +0 -0
  91. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/base.py +0 -0
  92. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/core.py +0 -0
  93. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/http.py +0 -0
  94. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/__init__.py +0 -0
  95. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/base.py +0 -0
  96. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/claude.py +0 -0
  97. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/gemini.py +0 -0
  98. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/meta.py +0 -0
  99. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/ollama.py +0 -0
  100. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/llm/openai.py +0 -0
  101. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/logger.py +0 -0
  102. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/prompt.py +0 -0
  103. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/__init__.py +0 -0
  104. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/base.py +0 -0
  105. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/bitbucket.py +0 -0
  106. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/github.py +0 -0
  107. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/gitlab.py +0 -0
  108. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/config/vcs/pagination.py +0 -0
  109. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/constants/__init__.py +0 -0
  110. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/constants/llm_provider.py +0 -0
  111. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/constants/vcs_provider.py +0 -0
  112. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/diff/__init__.py +0 -0
  113. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/diff/models.py +0 -0
  114. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/diff/parser.py +0 -0
  115. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/diff/tools.py +0 -0
  116. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/__init__.py +0 -0
  117. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/client.py +0 -0
  118. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/event_hooks/__init__.py +0 -0
  119. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/event_hooks/base.py +0 -0
  120. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/event_hooks/logger.py +0 -0
  121. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/handlers.py +0 -0
  122. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/paginate.py +0 -0
  123. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/transports/__init__.py +0 -0
  124. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/http/transports/retry.py +0 -0
  125. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/json.py +0 -0
  126. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/llm/__init__.py +0 -0
  127. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/llm/output_json_parser.py +0 -0
  128. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/logger.py +0 -0
  129. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/resources.py +0 -0
  130. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/template/__init__.py +0 -0
  131. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/libs/template/render.py +0 -0
  132. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/__init__.py +0 -0
  133. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_context.md +0 -0
  134. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_inline.md +0 -0
  135. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_inline_reply.md +0 -0
  136. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_summary.md +0 -0
  137. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_summary_reply.md +0 -0
  138. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_system_context.md +0 -0
  139. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_system_inline.md +0 -0
  140. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_system_inline_reply.md +0 -0
  141. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_system_summary.md +0 -0
  142. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/prompts/default_system_summary_reply.md +0 -0
  143. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/resources/__init__.py +0 -0
  144. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/resources/pricing.yaml +0 -0
  145. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/__init__.py +0 -0
  146. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/artifacts/__init__.py +0 -0
  147. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/artifacts/schema.py +0 -0
  148. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/artifacts/service.py +0 -0
  149. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/artifacts/tools.py +0 -0
  150. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/artifacts/types.py +0 -0
  151. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/cost/__init__.py +0 -0
  152. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/cost/schema.py +0 -0
  153. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/cost/service.py +0 -0
  154. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/cost/types.py +0 -0
  155. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/__init__.py +0 -0
  156. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/renderers.py +0 -0
  157. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/schema.py +0 -0
  158. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/service.py +0 -0
  159. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/tools.py +0 -0
  160. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/diff/types.py +0 -0
  161. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/git/__init__.py +0 -0
  162. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/git/service.py +0 -0
  163. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/git/types.py +0 -0
  164. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/hook/__init__.py +0 -0
  165. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/hook/constants.py +0 -0
  166. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/hook/service.py +0 -0
  167. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/hook/types.py +0 -0
  168. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/__init__.py +0 -0
  169. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/claude/__init__.py +0 -0
  170. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/claude/client.py +0 -0
  171. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/factory.py +0 -0
  172. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/gemini/__init__.py +0 -0
  173. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/gemini/client.py +0 -0
  174. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/ollama/__init__.py +0 -0
  175. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/ollama/client.py +0 -0
  176. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/openai/__init__.py +0 -0
  177. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/openai/client.py +0 -0
  178. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/llm/types.py +0 -0
  179. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/__init__.py +0 -0
  180. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/adapter.py +0 -0
  181. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/schema.py +0 -0
  182. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/service.py +0 -0
  183. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/tools.py +0 -0
  184. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/prompt/types.py +0 -0
  185. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/__init__.py +0 -0
  186. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/gateway/__init__.py +0 -0
  187. /xai_review-0.29.0/ai_review/services/review/gateway/comment.py → /xai_review-0.30.0/ai_review/services/review/gateway/review_comment_gateway.py +0 -0
  188. /xai_review-0.29.0/ai_review/services/review/gateway/llm.py → /xai_review-0.30.0/ai_review/services/review/gateway/review_llm_gateway.py +0 -0
  189. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/gateway/types.py +0 -0
  190. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/__init__.py +0 -0
  191. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline/__init__.py +0 -0
  192. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline/schema.py +0 -0
  193. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline/service.py +0 -0
  194. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline/types.py +0 -0
  195. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline_reply/__init__.py +0 -0
  196. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline_reply/schema.py +0 -0
  197. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline_reply/service.py +0 -0
  198. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/inline_reply/types.py +0 -0
  199. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/policy/__init__.py +0 -0
  200. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/policy/service.py +0 -0
  201. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/policy/types.py +0 -0
  202. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary/__init__.py +0 -0
  203. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary/schema.py +0 -0
  204. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary/service.py +0 -0
  205. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary/types.py +0 -0
  206. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary_reply/__init__.py +0 -0
  207. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary_reply/schema.py +0 -0
  208. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary_reply/service.py +0 -0
  209. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/internal/summary_reply/types.py +0 -0
  210. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/__init__.py +0 -0
  211. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/context.py +0 -0
  212. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/inline.py +0 -0
  213. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/inline_reply.py +0 -0
  214. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/summary.py +0 -0
  215. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/summary_reply.py +0 -0
  216. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/review/runner/types.py +0 -0
  217. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/__init__.py +0 -0
  218. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/bitbucket/__init__.py +0 -0
  219. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/bitbucket/adapter.py +0 -0
  220. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/bitbucket/client.py +0 -0
  221. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/factory.py +0 -0
  222. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/github/__init__.py +0 -0
  223. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/github/adapter.py +0 -0
  224. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/github/client.py +0 -0
  225. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/gitlab/__init__.py +0 -0
  226. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/gitlab/adapter.py +0 -0
  227. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/gitlab/client.py +0 -0
  228. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/services/vcs/types.py +0 -0
  229. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/__init__.py +0 -0
  230. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/__init__.py +0 -0
  231. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/__init__.py +0 -0
  232. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/bitbucket.py +0 -0
  233. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/claude.py +0 -0
  234. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/gemini.py +0 -0
  235. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/github.py +0 -0
  236. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/gitlab.py +0 -0
  237. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/ollama.py +0 -0
  238. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/clients/openai.py +0 -0
  239. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/libs/__init__.py +0 -0
  240. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/libs/llm/__init__.py +0 -0
  241. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/libs/llm/output_json_parser.py +0 -0
  242. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/__init__.py +0 -0
  243. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/artifacts.py +0 -0
  244. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/cost.py +0 -0
  245. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/diff.py +0 -0
  246. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/git.py +0 -0
  247. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/hook.py +0 -0
  248. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/llm.py +0 -0
  249. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/prompt.py +0 -0
  250. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/__init__.py +0 -0
  251. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/base.py +0 -0
  252. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/gateway/__init__.py +0 -0
  253. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/__init__.py +0 -0
  254. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/inline.py +0 -0
  255. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/inline_reply.py +0 -0
  256. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/policy.py +0 -0
  257. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/summary.py +0 -0
  258. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/internal/summary_reply.py +0 -0
  259. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/__init__.py +0 -0
  260. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/context.py +0 -0
  261. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/inline.py +0 -0
  262. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/inline_reply.py +0 -0
  263. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/summary.py +0 -0
  264. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/review/runner/summary_reply.py +0 -0
  265. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/fixtures/services/vcs.py +0 -0
  266. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/__init__.py +0 -0
  267. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/cli/__init__.py +0 -0
  268. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/cli/test_main.py +0 -0
  269. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/__init__.py +0 -0
  270. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/bitbucket/__init__.py +0 -0
  271. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/bitbucket/test_client.py +0 -0
  272. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/bitbucket/test_tools.py +0 -0
  273. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/claude/__init__.py +0 -0
  274. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/claude/test_client.py +0 -0
  275. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/claude/test_schema.py +0 -0
  276. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gemini/__init__.py +0 -0
  277. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gemini/test_client.py +0 -0
  278. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gemini/test_schema.py +0 -0
  279. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/github/__init__.py +0 -0
  280. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/github/test_client.py +0 -0
  281. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/github/test_tools.py +0 -0
  282. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gitlab/__init__.py +0 -0
  283. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gitlab/test_client.py +0 -0
  284. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/gitlab/test_tools.py +0 -0
  285. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/ollama/__init__.py +0 -0
  286. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/ollama/test_client.py +0 -0
  287. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/ollama/test_schema.py +0 -0
  288. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/openai/__init__.py +0 -0
  289. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/openai/test_client.py +0 -0
  290. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/clients/openai/test_schema.py +0 -0
  291. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/__init__.py +0 -0
  292. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/asynchronous/__init__.py +0 -0
  293. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/asynchronous/test_gather.py +0 -0
  294. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/config/__init__.py +0 -0
  295. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/config/test_prompt.py +0 -0
  296. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/diff/__init__.py +0 -0
  297. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/diff/test_models.py +0 -0
  298. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/diff/test_parser.py +0 -0
  299. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/diff/test_tools.py +0 -0
  300. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/http/__init__.py +0 -0
  301. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/http/test_paginate.py +0 -0
  302. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/llm/__init__.py +0 -0
  303. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/llm/test_output_json_parser.py +0 -0
  304. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/template/__init__.py +0 -0
  305. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/template/test_render.py +0 -0
  306. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/libs/test_json.py +0 -0
  307. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/__init__.py +0 -0
  308. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/cost/__init__.py +0 -0
  309. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/cost/test_schema.py +0 -0
  310. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/cost/test_service.py +0 -0
  311. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/diff/__init__.py +0 -0
  312. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/diff/test_renderers.py +0 -0
  313. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/diff/test_service.py +0 -0
  314. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/diff/test_tools.py +0 -0
  315. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/hook/__init__.py +0 -0
  316. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/hook/test_service.py +0 -0
  317. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/__init__.py +0 -0
  318. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/claude/__init__.py +0 -0
  319. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/claude/test_client.py +0 -0
  320. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/gemini/__init__.py +0 -0
  321. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/gemini/test_client.py +0 -0
  322. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/ollama/__init__.py +0 -0
  323. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/ollama/test_client.py +0 -0
  324. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/openai/__init__.py +0 -0
  325. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/openai/test_client.py +0 -0
  326. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/llm/test_factory.py +0 -0
  327. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/prompt/__init__.py +0 -0
  328. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/prompt/test_adapter.py +0 -0
  329. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/prompt/test_schema.py +0 -0
  330. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/prompt/test_service.py +0 -0
  331. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/prompt/test_tools.py +0 -0
  332. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/__init__.py +0 -0
  333. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/gateway/__init__.py +0 -0
  334. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/__init__.py +0 -0
  335. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline/__init__.py +0 -0
  336. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline/test_schema.py +0 -0
  337. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline/test_service.py +0 -0
  338. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline_reply/__init__.py +0 -0
  339. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_schema.py +0 -0
  340. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_service.py +0 -0
  341. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/policy/__init__.py +0 -0
  342. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/policy/test_service.py +0 -0
  343. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary/__init__.py +0 -0
  344. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary/test_schema.py +0 -0
  345. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary/test_service.py +0 -0
  346. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary_reply/__init__.py +0 -0
  347. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_schema.py +0 -0
  348. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_service.py +0 -0
  349. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/review/runner/__init__.py +0 -0
  350. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/__init__.py +0 -0
  351. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/bitbucket/__init__.py +0 -0
  352. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/bitbucket/test_adapter.py +0 -0
  353. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/bitbucket/test_client.py +0 -0
  354. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/github/__init__.py +0 -0
  355. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/github/test_adapter.py +0 -0
  356. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/github/test_client.py +0 -0
  357. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/gitlab/__init__.py +0 -0
  358. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/gitlab/test_adapter.py +0 -0
  359. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/gitlab/test_client.py +0 -0
  360. {xai_review-0.29.0 → xai_review-0.30.0}/ai_review/tests/suites/services/vcs/test_factory.py +0 -0
  361. {xai_review-0.29.0 → xai_review-0.30.0}/setup.cfg +0 -0
  362. {xai_review-0.29.0 → xai_review-0.30.0}/xai_review.egg-info/dependency_links.txt +0 -0
  363. {xai_review-0.29.0 → xai_review-0.30.0}/xai_review.egg-info/entry_points.txt +0 -0
  364. {xai_review-0.29.0 → xai_review-0.30.0}/xai_review.egg-info/requires.txt +0 -0
  365. {xai_review-0.29.0 → xai_review-0.30.0}/xai_review.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.29.0
3
+ Version: 0.30.0
4
4
  Summary: AI-powered code review tool
5
5
  Author-email: Nikita Filonov <nikita.filonov@example.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
@@ -211,7 +211,7 @@ jobs:
211
211
  runs-on: ubuntu-latest
212
212
  steps:
213
213
  - uses: actions/checkout@v4
214
- - uses: Nikita-Filonov/ai-review@v0.29.0
214
+ - uses: Nikita-Filonov/ai-review@v0.30.0
215
215
  with:
216
216
  review-command: ${{ inputs.review-command }}
217
217
  env:
@@ -177,7 +177,7 @@ jobs:
177
177
  runs-on: ubuntu-latest
178
178
  steps:
179
179
  - uses: actions/checkout@v4
180
- - uses: Nikita-Filonov/ai-review@v0.29.0
180
+ - uses: Nikita-Filonov/ai-review@v0.30.0
181
181
  with:
182
182
  review-command: ${{ inputs.review-command }}
183
183
  env:
@@ -19,6 +19,7 @@ class ReviewMode(StrEnum):
19
19
 
20
20
  class ReviewConfig(BaseModel):
21
21
  mode: ReviewMode = ReviewMode.FULL_FILE_DIFF
22
+ dry_run: bool = False
22
23
  inline_tag: str = Field(default="#ai-review-inline")
23
24
  inline_reply_tag: str = Field(default="#ai-review-inline-reply")
24
25
  summary_tag: str = Field(default="#ai-review-summary")
@@ -0,0 +1,42 @@
1
+ from ai_review.libs.asynchronous.gather import bounded_gather
2
+ from ai_review.libs.logger import get_logger
3
+ from ai_review.services.hook import hook
4
+ from ai_review.services.review.gateway.review_comment_gateway import ReviewCommentGateway
5
+ from ai_review.services.review.internal.inline.schema import InlineCommentListSchema, InlineCommentSchema
6
+ from ai_review.services.review.internal.inline_reply.schema import InlineCommentReplySchema
7
+ from ai_review.services.review.internal.summary.schema import SummaryCommentSchema
8
+ from ai_review.services.review.internal.summary_reply.schema import SummaryCommentReplySchema
9
+ from ai_review.services.vcs.types import VCSClientProtocol
10
+
11
+ logger = get_logger("REVIEW_DRY_RUN_COMMENT_GATEWAY")
12
+
13
+
14
+ class ReviewDryRunCommentGateway(ReviewCommentGateway):
15
+ def __init__(self, vcs: VCSClientProtocol):
16
+ super().__init__(vcs)
17
+ logger.warning("Running in DRY RUN mode — no comments will be posted to VCS")
18
+
19
+ async def process_inline_reply(self, thread_id: str, reply: InlineCommentReplySchema) -> None:
20
+ await hook.emit_inline_comment_reply_start(reply)
21
+ logger.info(f"[dry-run] Would create inline reply for thread {thread_id}:\n{reply.body_with_tag}")
22
+ await hook.emit_inline_comment_reply_complete(reply)
23
+
24
+ async def process_summary_reply(self, thread_id: str, reply: SummaryCommentReplySchema) -> None:
25
+ await hook.emit_summary_comment_reply_start(reply)
26
+ logger.info(f"[dry-run] Would create summary reply for thread {thread_id}:\n{reply.body_with_tag}")
27
+ await hook.emit_summary_comment_reply_complete(reply)
28
+
29
+ async def process_inline_comment(self, comment: InlineCommentSchema) -> None:
30
+ await hook.emit_inline_comment_start(comment)
31
+ logger.info(
32
+ f"[dry-run] Would create inline comment for {comment.file}:{comment.line}:\n{comment.body_with_tag}"
33
+ )
34
+ await hook.emit_inline_comment_complete(comment)
35
+
36
+ async def process_summary_comment(self, comment: SummaryCommentSchema) -> None:
37
+ await hook.emit_summary_comment_start(comment)
38
+ logger.info(f"[dry-run] Would create summary comment:\n{comment.body_with_tag}")
39
+ await hook.emit_summary_comment_complete(comment)
40
+
41
+ async def process_inline_comments(self, comments: InlineCommentListSchema) -> None:
42
+ await bounded_gather([self.process_inline_comment(comment) for comment in comments.root])
@@ -1,3 +1,4 @@
1
+ from ai_review.config import settings
1
2
  from ai_review.libs.logger import get_logger
2
3
  from ai_review.services.artifacts.service import ArtifactsService
3
4
  from ai_review.services.cost.service import CostService
@@ -5,8 +6,9 @@ from ai_review.services.diff.service import DiffService
5
6
  from ai_review.services.git.service import GitService
6
7
  from ai_review.services.llm.factory import get_llm_client
7
8
  from ai_review.services.prompt.service import PromptService
8
- from ai_review.services.review.gateway.comment import ReviewCommentGateway
9
- from ai_review.services.review.gateway.llm import ReviewLLMGateway
9
+ from ai_review.services.review.gateway.review_comment_gateway import ReviewCommentGateway
10
+ from ai_review.services.review.gateway.review_dry_run_comment_gateway import ReviewDryRunCommentGateway
11
+ from ai_review.services.review.gateway.review_llm_gateway import ReviewLLMGateway
10
12
  from ai_review.services.review.internal.inline.service import InlineCommentService
11
13
  from ai_review.services.review.internal.inline_reply.service import InlineCommentReplyService
12
14
  from ai_review.services.review.internal.policy.service import ReviewPolicyService
@@ -42,7 +44,11 @@ class ReviewService:
42
44
  cost=self.cost,
43
45
  artifacts=self.artifacts
44
46
  )
45
- self.review_comment_gateway = ReviewCommentGateway(vcs=self.vcs)
47
+ self.review_comment_gateway = (
48
+ ReviewDryRunCommentGateway(vcs=self.vcs)
49
+ if settings.review.dry_run
50
+ else ReviewCommentGateway(vcs=self.vcs)
51
+ )
46
52
 
47
53
  self.inline_review_runner = InlineReviewRunner(
48
54
  vcs=self.vcs,
@@ -2,7 +2,7 @@ from typing import Any
2
2
 
3
3
  import pytest
4
4
 
5
- from ai_review.services.review.gateway.comment import ReviewCommentGateway
5
+ from ai_review.services.review.gateway.review_comment_gateway import ReviewCommentGateway
6
6
  from ai_review.services.review.gateway.types import ReviewCommentGatewayProtocol
7
7
  from ai_review.services.review.internal.inline.schema import InlineCommentSchema, InlineCommentListSchema
8
8
  from ai_review.services.review.internal.inline_reply.schema import InlineCommentReplySchema
@@ -0,0 +1,103 @@
1
+ from typing import Any
2
+
3
+ import pytest
4
+
5
+ from ai_review.services.review.gateway.review_dry_run_comment_gateway import ReviewDryRunCommentGateway
6
+ from ai_review.services.review.gateway.types import ReviewCommentGatewayProtocol
7
+ from ai_review.services.review.internal.inline.schema import InlineCommentSchema, InlineCommentListSchema
8
+ from ai_review.services.review.internal.inline_reply.schema import InlineCommentReplySchema
9
+ from ai_review.services.review.internal.summary.schema import SummaryCommentSchema
10
+ from ai_review.services.review.internal.summary_reply.schema import SummaryCommentReplySchema
11
+ from ai_review.services.vcs.types import (
12
+ UserSchema,
13
+ ThreadKind,
14
+ ReviewThreadSchema,
15
+ ReviewCommentSchema,
16
+ VCSClientProtocol,
17
+ )
18
+
19
+
20
+ class FakeReviewDryRunCommentGateway(ReviewCommentGatewayProtocol):
21
+ def __init__(self, responses: dict[str, Any] | None = None):
22
+ self.calls: list[tuple[str, dict]] = []
23
+
24
+ fake_user = UserSchema(id="u1", username="tester", name="Tester")
25
+
26
+ fake_inline_thread = ReviewThreadSchema(
27
+ id="t1",
28
+ kind=ThreadKind.INLINE,
29
+ file="file.py",
30
+ line=10,
31
+ comments=[
32
+ ReviewCommentSchema(
33
+ id="c1",
34
+ body="#ai-review-inline some comment",
35
+ file="file.py",
36
+ line=10,
37
+ author=fake_user,
38
+ ),
39
+ ],
40
+ )
41
+
42
+ fake_summary_thread = ReviewThreadSchema(
43
+ id="t2",
44
+ kind=ThreadKind.SUMMARY,
45
+ comments=[
46
+ ReviewCommentSchema(
47
+ id="c2",
48
+ body="#ai-review-summary summary comment",
49
+ author=fake_user,
50
+ ),
51
+ ],
52
+ )
53
+
54
+ self.responses = responses or {
55
+ "get_inline_threads": [fake_inline_thread],
56
+ "get_summary_threads": [fake_summary_thread],
57
+ "has_existing_inline_comments": False,
58
+ "has_existing_summary_comments": False,
59
+ }
60
+
61
+ # --- Методы чтения ---
62
+ async def get_inline_threads(self) -> list[ReviewThreadSchema]:
63
+ self.calls.append(("get_inline_threads", {}))
64
+ return self.responses["get_inline_threads"]
65
+
66
+ async def get_summary_threads(self) -> list[ReviewThreadSchema]:
67
+ self.calls.append(("get_summary_threads", {}))
68
+ return self.responses["get_summary_threads"]
69
+
70
+ async def has_existing_inline_comments(self) -> bool:
71
+ self.calls.append(("has_existing_inline_comments", {}))
72
+ return self.responses["has_existing_inline_comments"]
73
+
74
+ async def has_existing_summary_comments(self) -> bool:
75
+ self.calls.append(("has_existing_summary_comments", {}))
76
+ return self.responses["has_existing_summary_comments"]
77
+
78
+ async def process_inline_reply(self, thread_id: str, reply: InlineCommentReplySchema) -> None:
79
+ self.calls.append(("process_inline_reply", {"thread_id": thread_id, "reply": reply}))
80
+
81
+ async def process_summary_reply(self, thread_id: str, reply: SummaryCommentReplySchema) -> None:
82
+ self.calls.append(("process_summary_reply", {"thread_id": thread_id, "reply": reply}))
83
+
84
+ async def process_inline_comment(self, comment: InlineCommentSchema) -> None:
85
+ self.calls.append(("process_inline_comment", {"comment": comment}))
86
+
87
+ async def process_summary_comment(self, comment: SummaryCommentSchema) -> None:
88
+ self.calls.append(("process_summary_comment", {"comment": comment}))
89
+
90
+ async def process_inline_comments(self, comments: InlineCommentListSchema) -> None:
91
+ self.calls.append(("process_inline_comments", {"comments": comments}))
92
+ for comment in comments.root:
93
+ await self.process_inline_comment(comment)
94
+
95
+
96
+ @pytest.fixture
97
+ def fake_review_dry_run_comment_gateway() -> FakeReviewDryRunCommentGateway:
98
+ return FakeReviewDryRunCommentGateway()
99
+
100
+
101
+ @pytest.fixture
102
+ def review_dry_run_comment_gateway(fake_vcs_client: VCSClientProtocol) -> ReviewDryRunCommentGateway:
103
+ return ReviewDryRunCommentGateway(vcs=fake_vcs_client)
@@ -0,0 +1,34 @@
1
+ import pytest
2
+
3
+ from ai_review.services.review.gateway.review_llm_gateway import ReviewLLMGateway
4
+ from ai_review.services.review.gateway.types import ReviewLLMGatewayProtocol
5
+ from ai_review.tests.fixtures.services.artifacts import FakeArtifactsService
6
+ from ai_review.tests.fixtures.services.cost import FakeCostService
7
+ from ai_review.tests.fixtures.services.llm import FakeLLMClient
8
+
9
+
10
+ class FakeReviewLLMGateway(ReviewLLMGatewayProtocol):
11
+ def __init__(self):
12
+ self.calls: list[tuple[str, dict]] = []
13
+
14
+ async def ask(self, prompt: str, prompt_system: str) -> str:
15
+ self.calls.append(("ask", {"prompt": prompt, "prompt_system": prompt_system}))
16
+ return "FAKE_LLM_RESPONSE"
17
+
18
+
19
+ @pytest.fixture
20
+ def fake_review_llm_gateway() -> FakeReviewLLMGateway:
21
+ return FakeReviewLLMGateway()
22
+
23
+
24
+ @pytest.fixture
25
+ def review_llm_gateway(
26
+ fake_llm_client: FakeLLMClient,
27
+ fake_cost_service: FakeCostService,
28
+ fake_artifacts_service: FakeArtifactsService,
29
+ ) -> ReviewLLMGateway:
30
+ return ReviewLLMGateway(
31
+ llm=fake_llm_client,
32
+ cost=fake_cost_service,
33
+ artifacts=fake_artifacts_service,
34
+ )
@@ -1,7 +1,7 @@
1
1
  import pytest
2
2
 
3
3
  from ai_review.config import settings
4
- from ai_review.services.review.gateway.comment import ReviewCommentGateway
4
+ from ai_review.services.review.gateway.review_comment_gateway import ReviewCommentGateway
5
5
  from ai_review.services.review.internal.inline.schema import InlineCommentSchema, InlineCommentListSchema
6
6
  from ai_review.services.review.internal.inline_reply.schema import InlineCommentReplySchema
7
7
  from ai_review.services.review.internal.summary.schema import SummaryCommentSchema
@@ -0,0 +1,93 @@
1
+ import pytest
2
+
3
+ from ai_review.services.review.gateway.review_dry_run_comment_gateway import ReviewDryRunCommentGateway
4
+ from ai_review.services.review.internal.inline.schema import InlineCommentSchema, InlineCommentListSchema
5
+ from ai_review.services.review.internal.inline_reply.schema import InlineCommentReplySchema
6
+ from ai_review.services.review.internal.summary.schema import SummaryCommentSchema
7
+ from ai_review.services.review.internal.summary_reply.schema import SummaryCommentReplySchema
8
+ from ai_review.tests.fixtures.services.vcs import FakeVCSClient
9
+
10
+
11
+ @pytest.mark.asyncio
12
+ async def test_process_inline_reply_dry_run_logs_and_no_vcs_calls(
13
+ capsys,
14
+ fake_vcs_client: FakeVCSClient,
15
+ review_dry_run_comment_gateway: ReviewDryRunCommentGateway
16
+ ):
17
+ """Dry-run: should log the inline reply but not call VCS."""
18
+ reply = InlineCommentReplySchema(message="AI reply dry-run")
19
+ await review_dry_run_comment_gateway.process_inline_reply("t1", reply)
20
+ output = capsys.readouterr().out
21
+
22
+ assert "[dry-run]" in output
23
+ assert "Would create inline reply" in output
24
+ assert not any(call[0].startswith("create_") for call in fake_vcs_client.calls)
25
+
26
+
27
+ @pytest.mark.asyncio
28
+ async def test_process_summary_reply_dry_run_logs_and_no_vcs_calls(
29
+ capsys,
30
+ fake_vcs_client: FakeVCSClient,
31
+ review_dry_run_comment_gateway: ReviewDryRunCommentGateway
32
+ ):
33
+ """Dry-run: should log the summary reply but not call VCS."""
34
+ reply = SummaryCommentReplySchema(text="Dry-run summary reply")
35
+ await review_dry_run_comment_gateway.process_summary_reply("t2", reply)
36
+ output = capsys.readouterr().out
37
+
38
+ assert "[dry-run]" in output
39
+ assert "Would create summary reply" in output
40
+ assert not any(call[0].startswith("create_") for call in fake_vcs_client.calls)
41
+
42
+
43
+ @pytest.mark.asyncio
44
+ async def test_process_inline_comment_dry_run_logs_and_no_vcs_calls(
45
+ capsys,
46
+ fake_vcs_client: FakeVCSClient,
47
+ review_dry_run_comment_gateway: ReviewDryRunCommentGateway
48
+ ):
49
+ """Dry-run: should log inline comment without creating one."""
50
+ comment = InlineCommentSchema(file="a.py", line=10, message="Test comment")
51
+ await review_dry_run_comment_gateway.process_inline_comment(comment)
52
+ output = capsys.readouterr().out
53
+
54
+ assert "[dry-run]" in output
55
+ assert "Would create inline comment" in output
56
+ assert "a.py" in output
57
+ assert not any(call[0].startswith("create_") for call in fake_vcs_client.calls)
58
+
59
+
60
+ @pytest.mark.asyncio
61
+ async def test_process_summary_comment_dry_run_logs_and_no_vcs_calls(
62
+ capsys,
63
+ fake_vcs_client: FakeVCSClient,
64
+ review_dry_run_comment_gateway: ReviewDryRunCommentGateway
65
+ ):
66
+ """Dry-run: should log summary comment but not send it."""
67
+ comment = SummaryCommentSchema(text="Dry-run summary comment")
68
+ await review_dry_run_comment_gateway.process_summary_comment(comment)
69
+ output = capsys.readouterr().out
70
+
71
+ assert "[dry-run]" in output
72
+ assert "Would create summary comment" in output
73
+ assert not any(call[0].startswith("create_") for call in fake_vcs_client.calls)
74
+
75
+
76
+ @pytest.mark.asyncio
77
+ async def test_process_inline_comments_iterates_all(
78
+ capsys,
79
+ fake_vcs_client: FakeVCSClient,
80
+ review_dry_run_comment_gateway: ReviewDryRunCommentGateway
81
+ ):
82
+ """Dry-run: should iterate through all inline comments and log each."""
83
+ comments = InlineCommentListSchema(root=[
84
+ InlineCommentSchema(file="a.py", line=1, message="C1"),
85
+ InlineCommentSchema(file="b.py", line=2, message="C2"),
86
+ ])
87
+ await review_dry_run_comment_gateway.process_inline_comments(comments)
88
+ output = capsys.readouterr().out
89
+
90
+ assert "[dry-run]" in output
91
+ assert "a.py" in output
92
+ assert "b.py" in output
93
+ assert not any(call[0].startswith("create_") for call in fake_vcs_client.calls)
@@ -1,26 +1,12 @@
1
1
  import pytest
2
2
 
3
3
  from ai_review.services.llm.types import ChatResultSchema
4
- from ai_review.services.review.gateway.llm import ReviewLLMGateway
4
+ from ai_review.services.review.gateway.review_llm_gateway import ReviewLLMGateway
5
5
  from ai_review.tests.fixtures.services.artifacts import FakeArtifactsService
6
6
  from ai_review.tests.fixtures.services.cost import FakeCostService
7
7
  from ai_review.tests.fixtures.services.llm import FakeLLMClient
8
8
 
9
9
 
10
- @pytest.fixture
11
- def review_llm_gateway(
12
- fake_llm_client: FakeLLMClient,
13
- fake_cost_service: FakeCostService,
14
- fake_artifacts_service: FakeArtifactsService,
15
- ) -> ReviewLLMGateway:
16
- """Fixture providing ReviewLLMGateway with fake dependencies."""
17
- return ReviewLLMGateway(
18
- llm=fake_llm_client,
19
- cost=fake_cost_service,
20
- artifacts=fake_artifacts_service,
21
- )
22
-
23
-
24
10
  @pytest.mark.asyncio
25
11
  async def test_ask_happy_path(
26
12
  review_llm_gateway: ReviewLLMGateway,
@@ -4,8 +4,8 @@ from ai_review.services.review.runner.context import ContextReviewRunner
4
4
  from ai_review.tests.fixtures.services.cost import FakeCostService
5
5
  from ai_review.tests.fixtures.services.diff import FakeDiffService
6
6
  from ai_review.tests.fixtures.services.prompt import FakePromptService
7
- from ai_review.tests.fixtures.services.review.gateway.comment import FakeReviewCommentGateway
8
- from ai_review.tests.fixtures.services.review.gateway.llm import FakeReviewLLMGateway
7
+ from ai_review.tests.fixtures.services.review.gateway.review_comment_gateway import FakeReviewCommentGateway
8
+ from ai_review.tests.fixtures.services.review.gateway.review_llm_gateway import FakeReviewLLMGateway
9
9
  from ai_review.tests.fixtures.services.review.internal.inline import FakeInlineCommentService
10
10
  from ai_review.tests.fixtures.services.review.internal.policy import FakeReviewPolicyService
11
11
  from ai_review.tests.fixtures.services.vcs import FakeVCSClient
@@ -6,8 +6,8 @@ from ai_review.tests.fixtures.services.cost import FakeCostService
6
6
  from ai_review.tests.fixtures.services.diff import FakeDiffService
7
7
  from ai_review.tests.fixtures.services.git import FakeGitService
8
8
  from ai_review.tests.fixtures.services.prompt import FakePromptService
9
- from ai_review.tests.fixtures.services.review.gateway.comment import FakeReviewCommentGateway
10
- from ai_review.tests.fixtures.services.review.gateway.llm import FakeReviewLLMGateway
9
+ from ai_review.tests.fixtures.services.review.gateway.review_comment_gateway import FakeReviewCommentGateway
10
+ from ai_review.tests.fixtures.services.review.gateway.review_llm_gateway import FakeReviewLLMGateway
11
11
  from ai_review.tests.fixtures.services.review.internal.inline import FakeInlineCommentService
12
12
  from ai_review.tests.fixtures.services.review.internal.policy import FakeReviewPolicyService
13
13
  from ai_review.tests.fixtures.services.vcs import FakeVCSClient
@@ -6,8 +6,8 @@ from ai_review.tests.fixtures.services.cost import FakeCostService
6
6
  from ai_review.tests.fixtures.services.diff import FakeDiffService
7
7
  from ai_review.tests.fixtures.services.git import FakeGitService
8
8
  from ai_review.tests.fixtures.services.prompt import FakePromptService
9
- from ai_review.tests.fixtures.services.review.gateway.comment import FakeReviewCommentGateway
10
- from ai_review.tests.fixtures.services.review.gateway.llm import FakeReviewLLMGateway
9
+ from ai_review.tests.fixtures.services.review.gateway.review_comment_gateway import FakeReviewCommentGateway
10
+ from ai_review.tests.fixtures.services.review.gateway.review_llm_gateway import FakeReviewLLMGateway
11
11
  from ai_review.tests.fixtures.services.review.internal.inline_reply import FakeInlineCommentReplyService
12
12
  from ai_review.tests.fixtures.services.vcs import FakeVCSClient
13
13
 
@@ -5,8 +5,8 @@ from ai_review.services.review.runner.summary import SummaryReviewRunner
5
5
  from ai_review.tests.fixtures.services.cost import FakeCostService
6
6
  from ai_review.tests.fixtures.services.diff import FakeDiffService
7
7
  from ai_review.tests.fixtures.services.prompt import FakePromptService
8
- from ai_review.tests.fixtures.services.review.gateway.comment import FakeReviewCommentGateway
9
- from ai_review.tests.fixtures.services.review.gateway.llm import FakeReviewLLMGateway
8
+ from ai_review.tests.fixtures.services.review.gateway.review_comment_gateway import FakeReviewCommentGateway
9
+ from ai_review.tests.fixtures.services.review.gateway.review_llm_gateway import FakeReviewLLMGateway
10
10
  from ai_review.tests.fixtures.services.review.internal.policy import FakeReviewPolicyService
11
11
  from ai_review.tests.fixtures.services.review.internal.summary import FakeSummaryCommentService
12
12
  from ai_review.tests.fixtures.services.vcs import FakeVCSClient
@@ -5,8 +5,8 @@ from ai_review.services.vcs.types import ReviewInfoSchema, ReviewThreadSchema, R
5
5
  from ai_review.tests.fixtures.services.cost import FakeCostService
6
6
  from ai_review.tests.fixtures.services.diff import FakeDiffService
7
7
  from ai_review.tests.fixtures.services.prompt import FakePromptService
8
- from ai_review.tests.fixtures.services.review.gateway.comment import FakeReviewCommentGateway
9
- from ai_review.tests.fixtures.services.review.gateway.llm import FakeReviewLLMGateway
8
+ from ai_review.tests.fixtures.services.review.gateway.review_comment_gateway import FakeReviewCommentGateway
9
+ from ai_review.tests.fixtures.services.review.gateway.review_llm_gateway import FakeReviewLLMGateway
10
10
  from ai_review.tests.fixtures.services.review.internal.policy import FakeReviewPolicyService
11
11
  from ai_review.tests.fixtures.services.review.internal.summary_reply import FakeSummaryCommentReplyService
12
12
  from ai_review.tests.fixtures.services.vcs import FakeVCSClient
@@ -1,6 +1,8 @@
1
1
  import pytest
2
2
 
3
3
  from ai_review.services.llm.types import ChatResultSchema
4
+ from ai_review.services.review.gateway.review_comment_gateway import ReviewCommentGateway
5
+ from ai_review.services.review.gateway.review_dry_run_comment_gateway import ReviewDryRunCommentGateway
4
6
  from ai_review.services.review.service import ReviewService
5
7
  from ai_review.tests.fixtures.services.cost import FakeCostService
6
8
  from ai_review.tests.fixtures.services.review.runner.context import FakeContextReviewRunner
@@ -91,3 +93,19 @@ def test_report_total_cost_no_data(capsys, review_service: ReviewService):
91
93
  output = capsys.readouterr().out
92
94
 
93
95
  assert "No cost data collected" in output
96
+
97
+
98
+ def test_review_service_uses_dry_run_comment_gateway(monkeypatch: pytest.MonkeyPatch):
99
+ """Should use ReviewDryRunCommentGateway when settings.review.dry_run=True."""
100
+ monkeypatch.setattr("ai_review.config.settings.review.dry_run", True)
101
+
102
+ service = ReviewService()
103
+ assert type(service.review_comment_gateway) is ReviewDryRunCommentGateway
104
+
105
+
106
+ def test_review_service_uses_real_comment_gateway(monkeypatch: pytest.MonkeyPatch):
107
+ """Should use normal ReviewCommentGateway when dry_run=False."""
108
+ monkeypatch.setattr("ai_review.config.settings.review.dry_run", False)
109
+
110
+ service = ReviewService()
111
+ assert type(service.review_comment_gateway) is ReviewCommentGateway
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "xai-review"
7
7
  readme = { file = "README.md", content-type = "text/markdown" }
8
- version = "0.29.0"
8
+ version = "0.30.0"
9
9
  license = { text = "Apache-2.0" }
10
10
  authors = [
11
11
  { name = "Nikita Filonov", email = "nikita.filonov@example.com" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.29.0
3
+ Version: 0.30.0
4
4
  Summary: AI-powered code review tool
5
5
  Author-email: Nikita Filonov <nikita.filonov@example.com>
6
6
  Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
@@ -211,7 +211,7 @@ jobs:
211
211
  runs-on: ubuntu-latest
212
212
  steps:
213
213
  - uses: actions/checkout@v4
214
- - uses: Nikita-Filonov/ai-review@v0.29.0
214
+ - uses: Nikita-Filonov/ai-review@v0.30.0
215
215
  with:
216
216
  review-command: ${{ inputs.review-command }}
217
217
  env:
@@ -167,8 +167,9 @@ ai_review/services/prompt/types.py
167
167
  ai_review/services/review/__init__.py
168
168
  ai_review/services/review/service.py
169
169
  ai_review/services/review/gateway/__init__.py
170
- ai_review/services/review/gateway/comment.py
171
- ai_review/services/review/gateway/llm.py
170
+ ai_review/services/review/gateway/review_comment_gateway.py
171
+ ai_review/services/review/gateway/review_dry_run_comment_gateway.py
172
+ ai_review/services/review/gateway/review_llm_gateway.py
172
173
  ai_review/services/review/gateway/types.py
173
174
  ai_review/services/review/internal/__init__.py
174
175
  ai_review/services/review/internal/inline/__init__.py
@@ -234,8 +235,9 @@ ai_review/tests/fixtures/services/vcs.py
234
235
  ai_review/tests/fixtures/services/review/__init__.py
235
236
  ai_review/tests/fixtures/services/review/base.py
236
237
  ai_review/tests/fixtures/services/review/gateway/__init__.py
237
- ai_review/tests/fixtures/services/review/gateway/comment.py
238
- ai_review/tests/fixtures/services/review/gateway/llm.py
238
+ ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py
239
+ ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py
240
+ ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py
239
241
  ai_review/tests/fixtures/services/review/internal/__init__.py
240
242
  ai_review/tests/fixtures/services/review/internal/inline.py
241
243
  ai_review/tests/fixtures/services/review/internal/inline_reply.py
@@ -317,8 +319,9 @@ ai_review/tests/suites/services/prompt/test_tools.py
317
319
  ai_review/tests/suites/services/review/__init__.py
318
320
  ai_review/tests/suites/services/review/test_service.py
319
321
  ai_review/tests/suites/services/review/gateway/__init__.py
320
- ai_review/tests/suites/services/review/gateway/test_comment.py
321
- ai_review/tests/suites/services/review/gateway/test_llm.py
322
+ ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py
323
+ ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py
324
+ ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py
322
325
  ai_review/tests/suites/services/review/internal/__init__.py
323
326
  ai_review/tests/suites/services/review/internal/inline/__init__.py
324
327
  ai_review/tests/suites/services/review/internal/inline/test_schema.py
@@ -1,17 +0,0 @@
1
- import pytest
2
-
3
- from ai_review.services.review.gateway.types import ReviewLLMGatewayProtocol
4
-
5
-
6
- class FakeReviewLLMGateway(ReviewLLMGatewayProtocol):
7
- def __init__(self):
8
- self.calls: list[tuple[str, dict]] = []
9
-
10
- async def ask(self, prompt: str, prompt_system: str) -> str:
11
- self.calls.append(("ask", {"prompt": prompt, "prompt_system": prompt_system}))
12
- return "FAKE_LLM_RESPONSE"
13
-
14
-
15
- @pytest.fixture
16
- def fake_review_llm_gateway() -> FakeReviewLLMGateway:
17
- return FakeReviewLLMGateway()
File without changes