xai-review 0.29.0__py3-none-any.whl → 0.31.0__py3-none-any.whl

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 (50) hide show
  1. ai_review/clients/gitea/__init__.py +0 -0
  2. ai_review/clients/gitea/client.py +31 -0
  3. ai_review/clients/gitea/pr/__init__.py +0 -0
  4. ai_review/clients/gitea/pr/client.py +118 -0
  5. ai_review/clients/gitea/pr/schema/__init__.py +0 -0
  6. ai_review/clients/gitea/pr/schema/comments.py +37 -0
  7. ai_review/clients/gitea/pr/schema/files.py +16 -0
  8. ai_review/clients/gitea/pr/schema/pull_request.py +18 -0
  9. ai_review/clients/gitea/pr/schema/user.py +6 -0
  10. ai_review/clients/gitea/pr/types.py +25 -0
  11. ai_review/clients/gitea/tools.py +6 -0
  12. ai_review/libs/config/review.py +1 -0
  13. ai_review/libs/config/vcs/base.py +8 -1
  14. ai_review/libs/config/vcs/gitea.py +13 -0
  15. ai_review/libs/constants/vcs_provider.py +1 -0
  16. ai_review/services/review/gateway/review_dry_run_comment_gateway.py +42 -0
  17. ai_review/services/review/service.py +9 -3
  18. ai_review/services/vcs/factory.py +3 -0
  19. ai_review/services/vcs/gitea/__init__.py +0 -0
  20. ai_review/services/vcs/gitea/adapter.py +22 -0
  21. ai_review/services/vcs/gitea/client.py +151 -0
  22. ai_review/tests/fixtures/clients/gitea.py +141 -0
  23. ai_review/tests/fixtures/services/review/gateway/{comment.py → review_comment_gateway.py} +1 -1
  24. ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py +103 -0
  25. ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py +34 -0
  26. ai_review/tests/suites/clients/gitea/__init__.py +0 -0
  27. ai_review/tests/suites/clients/gitea/test_client.py +14 -0
  28. ai_review/tests/suites/clients/gitea/test_tools.py +26 -0
  29. ai_review/tests/suites/services/review/gateway/{test_comment.py → test_review_comment_gateway.py} +1 -1
  30. ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +93 -0
  31. ai_review/tests/suites/services/review/gateway/{test_llm.py → test_review_llm_gateway.py} +1 -15
  32. ai_review/tests/suites/services/review/runner/test_context.py +2 -2
  33. ai_review/tests/suites/services/review/runner/test_inline.py +2 -2
  34. ai_review/tests/suites/services/review/runner/test_inline_reply.py +2 -2
  35. ai_review/tests/suites/services/review/runner/test_summary.py +2 -2
  36. ai_review/tests/suites/services/review/runner/test_summary_reply.py +2 -2
  37. ai_review/tests/suites/services/review/test_service.py +18 -0
  38. ai_review/tests/suites/services/vcs/gitea/__init__.py +0 -0
  39. ai_review/tests/suites/services/vcs/gitea/test_adapter.py +52 -0
  40. ai_review/tests/suites/services/vcs/gitea/test_client.py +86 -0
  41. ai_review/tests/suites/services/vcs/test_factory.py +7 -0
  42. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/METADATA +21 -12
  43. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/RECORD +49 -24
  44. ai_review/tests/fixtures/services/review/gateway/llm.py +0 -17
  45. /ai_review/services/review/gateway/{comment.py → review_comment_gateway.py} +0 -0
  46. /ai_review/services/review/gateway/{llm.py → review_llm_gateway.py} +0 -0
  47. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/WHEEL +0 -0
  48. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/entry_points.txt +0 -0
  49. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/licenses/LICENSE +0 -0
  50. {xai_review-0.29.0.dist-info → xai_review-0.31.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,86 @@
1
+ import pytest
2
+
3
+ from ai_review.services.vcs.gitea.client import GiteaVCSClient
4
+ from ai_review.services.vcs.types import ReviewInfoSchema, ReviewCommentSchema, ReviewThreadSchema, ThreadKind
5
+ from ai_review.tests.fixtures.clients.gitea import FakeGiteaPullRequestsHTTPClient
6
+
7
+
8
+ @pytest.mark.asyncio
9
+ @pytest.mark.usefixtures("gitea_http_client_config")
10
+ async def test_get_review_info_returns_valid_schema(
11
+ gitea_vcs_client: GiteaVCSClient,
12
+ fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
13
+ ):
14
+ info = await gitea_vcs_client.get_review_info()
15
+
16
+ assert isinstance(info, ReviewInfoSchema)
17
+ assert info.id == 1
18
+ assert info.title == "Fake Gitea PR"
19
+ assert info.author.username == "tester"
20
+ assert "src/main.py" in info.changed_files
21
+ assert info.source_branch.ref == "feature"
22
+ assert info.target_branch.ref == "main"
23
+
24
+
25
+ @pytest.mark.asyncio
26
+ @pytest.mark.usefixtures("gitea_http_client_config")
27
+ async def test_get_general_comments_returns_list(
28
+ gitea_vcs_client: GiteaVCSClient,
29
+ fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
30
+ ):
31
+ comments = await gitea_vcs_client.get_general_comments()
32
+ assert all(isinstance(c, ReviewCommentSchema) for c in comments)
33
+ assert len(comments) > 0
34
+
35
+
36
+ @pytest.mark.asyncio
37
+ @pytest.mark.usefixtures("gitea_http_client_config")
38
+ async def test_get_inline_comments_filters_by_file(
39
+ gitea_vcs_client: GiteaVCSClient,
40
+ fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
41
+ ):
42
+ comments = await gitea_vcs_client.get_inline_comments()
43
+ assert all(c.file for c in comments)
44
+ assert all(isinstance(c, ReviewCommentSchema) for c in comments)
45
+
46
+
47
+ @pytest.mark.asyncio
48
+ @pytest.mark.usefixtures("gitea_http_client_config")
49
+ async def test_create_general_comment_posts_comment(
50
+ gitea_vcs_client: GiteaVCSClient,
51
+ fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
52
+ ):
53
+ await gitea_vcs_client.create_general_comment("Test comment")
54
+ calls = [name for name, _ in fake_gitea_pull_requests_http_client.calls]
55
+ assert "create_comment" in calls
56
+
57
+
58
+ @pytest.mark.asyncio
59
+ @pytest.mark.usefixtures("gitea_http_client_config")
60
+ async def test_create_inline_comment_posts_comment(
61
+ gitea_vcs_client: GiteaVCSClient,
62
+ fake_gitea_pull_requests_http_client: FakeGiteaPullRequestsHTTPClient,
63
+ ):
64
+ await gitea_vcs_client.create_inline_comment("src/main.py", 10, "Inline comment")
65
+ calls = [name for name, _ in fake_gitea_pull_requests_http_client.calls]
66
+ assert "create_comment" in calls
67
+
68
+
69
+ @pytest.mark.asyncio
70
+ @pytest.mark.usefixtures("gitea_http_client_config")
71
+ async def test_get_inline_threads_groups_by_comment(
72
+ gitea_vcs_client: GiteaVCSClient,
73
+ ):
74
+ threads = await gitea_vcs_client.get_inline_threads()
75
+ assert all(isinstance(t, ReviewThreadSchema) for t in threads)
76
+ assert all(t.kind == ThreadKind.INLINE for t in threads)
77
+
78
+
79
+ @pytest.mark.asyncio
80
+ @pytest.mark.usefixtures("gitea_http_client_config")
81
+ async def test_get_general_threads_wraps_comments(
82
+ gitea_vcs_client: GiteaVCSClient,
83
+ ):
84
+ threads = await gitea_vcs_client.get_general_threads()
85
+ assert all(isinstance(t, ReviewThreadSchema) for t in threads)
86
+ assert all(t.kind == ThreadKind.SUMMARY for t in threads)
@@ -2,10 +2,17 @@ import pytest
2
2
 
3
3
  from ai_review.services.vcs.bitbucket.client import BitbucketVCSClient
4
4
  from ai_review.services.vcs.factory import get_vcs_client
5
+ from ai_review.services.vcs.gitea.client import GiteaVCSClient
5
6
  from ai_review.services.vcs.github.client import GitHubVCSClient
6
7
  from ai_review.services.vcs.gitlab.client import GitLabVCSClient
7
8
 
8
9
 
10
+ @pytest.mark.usefixtures("gitea_http_client_config")
11
+ def test_get_vcs_client_returns_gitea(monkeypatch: pytest.MonkeyPatch):
12
+ client = get_vcs_client()
13
+ assert isinstance(client, GiteaVCSClient)
14
+
15
+
9
16
  @pytest.mark.usefixtures("github_http_client_config")
10
17
  def test_get_vcs_client_returns_github(monkeypatch: pytest.MonkeyPatch):
11
18
  client = get_vcs_client()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.29.0
3
+ Version: 0.31.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>
@@ -67,15 +67,15 @@ improve code quality, enforce consistency, and speed up the review process.
67
67
  ✨ Key features:
68
68
 
69
69
  - **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, or **Ollama**, and switch anytime.
70
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, and **Bitbucket**.
70
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**.
71
71
  - **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
72
72
  - **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
73
73
  summary discussions.
74
74
  - **Flexible configuration** — supports `YAML`, `JSON`, and `ENV`, with seamless overrides in CI/CD pipelines.
75
75
  - **AI Review runs fully client-side** — it never proxies or inspects your requests.
76
76
 
77
- AI Review runs automatically in your CI/CD pipeline and posts both **inline comments**, **summary reviews**, and now *
78
- *AI-generated replies** directly inside your merge requests. This makes reviews faster, more conversational, and still
77
+ AI Review runs automatically in your CI/CD pipeline and posts both **inline comments**, **summary reviews**, and now
78
+ **AI-generated replies** directly inside your merge requests. This makes reviews faster, more conversational, and still
79
79
  fully under human control.
80
80
 
81
81
  ---
@@ -85,11 +85,13 @@ fully under human control.
85
85
  Curious how **AI Review** works in practice? Here are three real Pull Requests reviewed entirely by the tool — one per
86
86
  mode:
87
87
 
88
- | Mode | Description | 🐙 GitHub | 🦊 GitLab |
89
- |------------|----------------------------------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------|
90
- | 🧩 Inline | Adds line-by-line comments directly in the diff | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/4) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/2) |
91
- | 🧠 Context | Performs broader analysis across multiple files | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/5) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/3) |
92
- | 📄 Summary | Posts a concise summary review with key highlights | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/6) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/4) |
88
+ | Mode | Description | 🐙 GitHub | 🦊 GitLab |
89
+ |------------------|----------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|----------------------------------------------------------------------------|
90
+ | 🧩 Inline | Adds **line-by-line comments** directly in the diff. Focuses on specific code changes. | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/4) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/2) |
91
+ | 🧠 Context | Performs a **broader analysis across multiple files**, detecting cross-file issues and inconsistencies. | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/5) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/3) |
92
+ | 📄 Summary | Posts a **concise high-level summary** with key highlights, strengths, and major issues. | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/6) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/4) |
93
+ | 💬 Inline Reply | Generates a **context-aware reply** to an existing inline comment thread. Can clarify decisions, propose fixes, or provide code suggestions. | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/16) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/5) |
94
+ | 💬 Summary Reply | Continues the **summary-level review discussion**, responding to reviewer comments with clarifications, rationale, or actionable next steps. | [View on GitHub](https://github.com/Nikita-Filonov/ai-review/pull/17) | [View on GitLab](https://gitlab.com/core8332439/review/-/merge_requests/6) |
93
95
 
94
96
  👉 Each review was generated automatically via GitHub Actions using the corresponding mode:
95
97
 
@@ -97,6 +99,8 @@ mode:
97
99
  ai-review run-inline
98
100
  ai-review run-summary
99
101
  ai-review run-context
102
+ ai-review run-inline-reply
103
+ ai-review run-summary-reply
100
104
  ```
101
105
 
102
106
  ---
@@ -162,6 +166,8 @@ vcs:
162
166
  > - ai-review run-inline
163
167
  > - ai-review run-context
164
168
  > - ai-review run-summary
169
+ > - ai-review run-inline-reply
170
+ > - ai-review run-summary-reply
165
171
 
166
172
  ---
167
173
 
@@ -172,7 +178,7 @@ Key things you can customize:
172
178
 
173
179
  - **LLM provider** — OpenAI, Gemini, Claude, or Ollama
174
180
  - **Model settings** — model name, temperature, max tokens
175
- - **VCS integration** — works out of the box with **GitLab**, **GitHub**, and **Bitbucket**
181
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and **Gitea**
176
182
  - **Review policy** — which files to include/exclude, review modes
177
183
  - **Prompts** — inline/context/summary prompt templates
178
184
 
@@ -202,7 +208,7 @@ on:
202
208
  review-command:
203
209
  type: choice
204
210
  default: run
205
- options: [ run, run-inline, run-context, run-summary ]
211
+ options: [ run, run-inline, run-context, run-summary, run-inline-reply, run-summary-reply ]
206
212
  pull-request-number:
207
213
  type: string
208
214
  required: true
@@ -211,7 +217,10 @@ jobs:
211
217
  runs-on: ubuntu-latest
212
218
  steps:
213
219
  - uses: actions/checkout@v4
214
- - uses: Nikita-Filonov/ai-review@v0.29.0
220
+ with:
221
+ fetch-depth: 0
222
+
223
+ - uses: Nikita-Filonov/ai-review@v0.31.0
215
224
  with:
216
225
  review-command: ${{ inputs.review-command }}
217
226
  env:
@@ -29,6 +29,17 @@ ai_review/clients/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
29
29
  ai_review/clients/gemini/client.py,sha256=4G1LBcpiFcrITOysQbMwhY1db4hHcSGgyI-0XazZMV0,1889
30
30
  ai_review/clients/gemini/schema.py,sha256=5oVvbI-h_sw8bFreS4JUmMj-aXa_frvxK3H8sg4iJIA,2264
31
31
  ai_review/clients/gemini/types.py,sha256=D-P0THorrQ8yq5P-NKAC65zzhEYRa9HkiXTORG9QoIk,267
32
+ ai_review/clients/gitea/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ ai_review/clients/gitea/client.py,sha256=cMxp1Ic44JFvSkuqLdWkAhsgMC6CwM3qmf-1CptqnV8,1152
34
+ ai_review/clients/gitea/tools.py,sha256=vg805Gk4hsEn8_zePtCZkvkxYPxT-A1o0mkU_RqAlC0,196
35
+ ai_review/clients/gitea/pr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ ai_review/clients/gitea/pr/client.py,sha256=eFAZai2zinr7ZGscVHa0cZIaYJJucNcLb08f73cKo-o,4945
37
+ ai_review/clients/gitea/pr/types.py,sha256=hy4win_nDvnEi_aHAbysmHtymHDq-zIATYKSEbpDcYY,984
38
+ ai_review/clients/gitea/pr/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ ai_review/clients/gitea/pr/schema/comments.py,sha256=vQ-ATCmbEa2oeFndpkf-V-4jxGBH7gTMakCLVpkYunE,922
40
+ ai_review/clients/gitea/pr/schema/files.py,sha256=O4c4Z3R775OuGOJgf5baMH5ivzHCVsSBFaPXEgVmKs0,341
41
+ ai_review/clients/gitea/pr/schema/pull_request.py,sha256=lT4r-Am5MmFQqB5WnQ0OWw6cB3e-NlBAi08Jw1fmAE8,361
42
+ ai_review/clients/gitea/pr/schema/user.py,sha256=5YIys_MFFm612hKMMQdjwlsH-FG_bS-vSQsPbBueEPU,94
32
43
  ai_review/clients/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
44
  ai_review/clients/github/client.py,sha256=pprQcCYdrhRYtuqRsTFiCbj54Qb1Ll6_jmlm7AJg8pk,1149
34
45
  ai_review/clients/github/tools.py,sha256=sD2eS_iNhzT4ZLgTRmO2uBLuId-fa2aSvbu6VFeKSlc,201
@@ -74,7 +85,7 @@ ai_review/libs/config/core.py,sha256=ZQ2QtYr7vAF0tXbVLvVwk9QFE5h6JjAKAUQWcb9gHws
74
85
  ai_review/libs/config/http.py,sha256=dx5PwgnGbPocUwf9QRhFmXmjfFDoeerOM04yB3B6S8w,398
75
86
  ai_review/libs/config/logger.py,sha256=oPmjpjf6EZwW7CgOjT8mOQdGnT98CLwXepiGB_ajZvU,384
76
87
  ai_review/libs/config/prompt.py,sha256=jPBYvi75u6BUIHOZnXCg5CiL0XRONDfW5T4WaYlxPEE,6066
77
- ai_review/libs/config/review.py,sha256=q2EwLvUzsOp_WW1gtd_8fvUhAoStWiNGicxOYP4gm9E,1198
88
+ ai_review/libs/config/review.py,sha256=jCfHfGfHs7Sc6H92hVUBd8bMRbLiIiThVmk6lFNlv40,1224
78
89
  ai_review/libs/config/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
90
  ai_review/libs/config/llm/base.py,sha256=ovvULFhfwH66_705D1O87ZGMeaQOZO7ZQhRUzzfzguU,2089
80
91
  ai_review/libs/config/llm/claude.py,sha256=MoalXkBA6pEp01znS8ohTRopfea9RUcqhZX5lOIuek8,293
@@ -83,14 +94,15 @@ ai_review/libs/config/llm/meta.py,sha256=cEcAHOwy-mQBKo9_KJrQe0I7qppq6h99lSmoWX4
83
94
  ai_review/libs/config/llm/ollama.py,sha256=M6aiPb5GvYvkiGcgHTsh9bOw5JsBLqmfSKoIbHCejrU,372
84
95
  ai_review/libs/config/llm/openai.py,sha256=jGVL4gJ2wIacoKeK9Zc9LCgY95TxdeYOThdglVPErFU,262
85
96
  ai_review/libs/config/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
- ai_review/libs/config/vcs/base.py,sha256=B0kKc6-A3mmV7dvHpo47u-1yTvdUCvLj_g4oCBo_NyY,1214
97
+ ai_review/libs/config/vcs/base.py,sha256=RJZhKysD-d8oYZQ2v1H74jyqdqtOCc8zZ0n9S4ovfHk,1471
87
98
  ai_review/libs/config/vcs/bitbucket.py,sha256=on5sQaE57kM_zSmqdDUNrttVtTPGOzqLHM5s7eFN7DA,275
99
+ ai_review/libs/config/vcs/gitea.py,sha256=elJjWnHxdC9kDWu0oHsxYsqv7FC-1zvmLfaWAlWYan4,254
88
100
  ai_review/libs/config/vcs/github.py,sha256=hk-kuDLd8wecqtEb8PSqF7Yy_pkihplJhi6nB6FZID4,256
89
101
  ai_review/libs/config/vcs/gitlab.py,sha256=ecYfU158VgVlM6P5mgZn8FOqk3Xt60xx7gUqT5e22a4,252
90
102
  ai_review/libs/config/vcs/pagination.py,sha256=S-XxWQYkIjhu3ffpHQ44d7UtRHH81fh9GaJ-xQXUUy4,175
91
103
  ai_review/libs/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
104
  ai_review/libs/constants/llm_provider.py,sha256=k7GzctIZ-TDsRlhTPbpGYgym_CO2YKVFp_oXG9dTBW0,143
93
- ai_review/libs/constants/vcs_provider.py,sha256=xJpRdJIdAf05iH2x2f362d1MuviOlPVP7In-JvDVotE,127
105
+ ai_review/libs/constants/vcs_provider.py,sha256=7A30fTSs9GM_A4J9B84MNY78c7do0RaoKytuiRwdhDY,147
94
106
  ai_review/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
107
  ai_review/libs/diff/models.py,sha256=RT4YJboOPA-AjNJGRj_HIZaJLEmROOhOgMh1wIGpIwY,2344
96
108
  ai_review/libs/diff/parser.py,sha256=2BGxZnRN3SRjNnZK4qIOW28aM93Ij__1SltwclJrlno,3817
@@ -162,10 +174,11 @@ ai_review/services/prompt/service.py,sha256=AvhLMfwmIxbnPWdViSSclwUUqnHGx2V-hSMs
162
174
  ai_review/services/prompt/tools.py,sha256=7yKQmHajlwFE37tvmMbbBYDmFObFVOb1ubHhNXBdAnE,1229
163
175
  ai_review/services/prompt/types.py,sha256=9p1RHuR5-5DNV0AtR_VtiT5OHo6eNqKzGggQoPWiSh8,1572
164
176
  ai_review/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
- ai_review/services/review/service.py,sha256=oqRJfWcww-ZuW5BToXqEymLCLlQbRSZ1ng5LxpUG_Y8,5286
177
+ ai_review/services/review/service.py,sha256=aqt0dlA77_MPT4lcq1qbTjOZOKE-7y83I-7J5jwvro4,5579
166
178
  ai_review/services/review/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- ai_review/services/review/gateway/comment.py,sha256=gOFoEFXIJ9SX7B05dTO605dUOnrchCtB-a2ExXCfUxE,5019
168
- ai_review/services/review/gateway/llm.py,sha256=5BQU8Vmo55pzWkVk6s_w5B3qX4tSkjjtj7wWWhLyc9s,1534
179
+ ai_review/services/review/gateway/review_comment_gateway.py,sha256=gOFoEFXIJ9SX7B05dTO605dUOnrchCtB-a2ExXCfUxE,5019
180
+ ai_review/services/review/gateway/review_dry_run_comment_gateway.py,sha256=3CLUBGt8ExX-r_d3PDUxhgaw-yUMqYYOvJbRzs-W63I,2420
181
+ ai_review/services/review/gateway/review_llm_gateway.py,sha256=5BQU8Vmo55pzWkVk6s_w5B3qX4tSkjjtj7wWWhLyc9s,1534
169
182
  ai_review/services/review/gateway/types.py,sha256=C9zOUF0ZDnSa568T3AIWIxpNdnpcB8QUxU1rVqx7lZc,1795
170
183
  ai_review/services/review/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
184
  ai_review/services/review/internal/inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -195,11 +208,14 @@ ai_review/services/review/runner/summary.py,sha256=KfQkfw_sqyvKnsi2-eD2YLfjfpOMa
195
208
  ai_review/services/review/runner/summary_reply.py,sha256=8YWMhw4dNjFgxTTgxyb6yLh-CkK_4AtfP36eD0DV4nY,3683
196
209
  ai_review/services/review/runner/types.py,sha256=lZJCiCAHnedXqYBIvnb8A0HzOQd3GEPWC_wu_mk46KY,113
197
210
  ai_review/services/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
- ai_review/services/vcs/factory.py,sha256=AfhpZjQ257BkLjb_7zUyw_EUnfEiCUHgTph7GGm-MY4,753
211
+ ai_review/services/vcs/factory.py,sha256=1lVkM0kwSMSzMMDZxURRDUlPC-3xw-IiBDYl6b42cTw,884
199
212
  ai_review/services/vcs/types.py,sha256=LemhQ4LAGlOdwMSF-HlYIo7taSRu4494YQ0Rp2PBgcg,3169
200
213
  ai_review/services/vcs/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
214
  ai_review/services/vcs/bitbucket/adapter.py,sha256=b-8KT46C8WT-Sos-gUGFJsxIWY7mXfzTuJjIqYuzrBA,928
202
215
  ai_review/services/vcs/bitbucket/client.py,sha256=MhqkFDewutX7DFBCFBDhDopFznwf92dAdZsxy_oS_mc,10726
216
+ ai_review/services/vcs/gitea/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
+ ai_review/services/vcs/gitea/adapter.py,sha256=DxzcXReKTGHkw4DCJa8X3Mnczcg9hqx6sIAQYY-8HAI,784
218
+ ai_review/services/vcs/gitea/client.py,sha256=HqejmtARi7-DqNcTb4P6E9tyYsC-7HtbYubmtK2OQnk,6242
203
219
  ai_review/services/vcs/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
220
  ai_review/services/vcs/github/adapter.py,sha256=pxcbSLEXkOg1c1NtzB0hkZJVvyC4An9pCzNK5sPJKbA,1212
205
221
  ai_review/services/vcs/github/client.py,sha256=rSVvpyovT1wDLq0fIQPe5UJqmgIgIFh2P-CPqIQ_sf0,9371
@@ -212,6 +228,7 @@ ai_review/tests/fixtures/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
212
228
  ai_review/tests/fixtures/clients/bitbucket.py,sha256=K4Ez_hTOVKz5-KlXbgTOVDec6iewxkm8hqDJvebhnpE,7124
213
229
  ai_review/tests/fixtures/clients/claude.py,sha256=6ldJlSSea0zsZV0hRDMi9mqWm0hWT3mp_ROwG_sVU1c,2203
214
230
  ai_review/tests/fixtures/clients/gemini.py,sha256=zhLJhm49keKEBCPOf_pLu8_zCatsKKAWM4-gXOhaXeM,2429
231
+ ai_review/tests/fixtures/clients/gitea.py,sha256=JTJLYRSr1hTOWXFknAq5eBSCSNxMKsdgMdjNpvVBA04,5027
215
232
  ai_review/tests/fixtures/clients/github.py,sha256=kC1L-nWZMn9O_uRfuT_B8R4sn8FRvISlBJMkRKaioS0,7814
216
233
  ai_review/tests/fixtures/clients/gitlab.py,sha256=AD6NJOJSw76hjAEiWewQ6Vu5g-cfQn0GTtdchuDBH9o,8042
217
234
  ai_review/tests/fixtures/clients/ollama.py,sha256=UUHDDPUraQAG8gBC-0UvftaK0BDYir5cJDlRKJymSQg,2109
@@ -231,8 +248,9 @@ ai_review/tests/fixtures/services/vcs.py,sha256=RXfbuW0Ffx7km7q2Zck__1qTZdZ-_vNr
231
248
  ai_review/tests/fixtures/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
249
  ai_review/tests/fixtures/services/review/base.py,sha256=10LaT6xi5IP0CrR6LfatirVKnZ7D0n8Q1dV99nOBEuE,1501
233
250
  ai_review/tests/fixtures/services/review/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
- ai_review/tests/fixtures/services/review/gateway/comment.py,sha256=nm_dA3teFK5cZJltKS9UcDlUvxmbClii56CCv4vkRF8,4063
235
- ai_review/tests/fixtures/services/review/gateway/llm.py,sha256=OXYZtJbQ8VqvNlPxG6CLPT0mz-HrhfZA8hoEAgf8loM,515
251
+ ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py,sha256=aclYEHKS7Kd0TK6_AGvkYsdMFhESHAGhk4Xpblxy1bQ,4078
252
+ ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py,sha256=3E-fDONV4j8GJlSaumqN90Rayoe8yKjnn6APwOrpDDs,4125
253
+ ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py,sha256=tm3ktE5wFVIFFvHPSUO1wQG7LC3Ekta2PwWky9ugL98,1146
236
254
  ai_review/tests/fixtures/services/review/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
255
  ai_review/tests/fixtures/services/review/internal/inline.py,sha256=D-npuBMSsP_ng5RgplaUZnANl3q5f7GD4OkE8IvQv2M,1038
238
256
  ai_review/tests/fixtures/services/review/internal/inline_reply.py,sha256=NRfcVBHavyHvoxOiqMhYhcf6YWDLfT367ZoXeUZIieU,1047
@@ -258,6 +276,9 @@ ai_review/tests/suites/clients/claude/test_schema.py,sha256=MUZXvEROgLNpUVHfCsH5
258
276
  ai_review/tests/suites/clients/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
259
277
  ai_review/tests/suites/clients/gemini/test_client.py,sha256=f2R7KisiENrzf8gaK26NYQZpQ1dvGHykZZ-eN_xC1UQ,404
260
278
  ai_review/tests/suites/clients/gemini/test_schema.py,sha256=88dU28m7sEWvGx6tqYl7if7weWYuVc8erlkFkKKI3bk,3109
279
+ ai_review/tests/suites/clients/gitea/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
280
+ ai_review/tests/suites/clients/gitea/test_client.py,sha256=OvNLGywTsbyHKlaOOoiJu65UduJRbhEezkTIMK19gb8,544
281
+ ai_review/tests/suites/clients/gitea/test_tools.py,sha256=S9CkTccPFY1MgQ0Uilb6Kihs7iPJqNaE4Wvoa3jx8Xk,693
261
282
  ai_review/tests/suites/clients/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
262
283
  ai_review/tests/suites/clients/github/test_client.py,sha256=BiuLKCHIk83U1szYEZkB-n3vvyPgj6tAI5EqxKiT-CY,558
263
284
  ai_review/tests/suites/clients/github/test_tools.py,sha256=_RKMWNgfeynnpbiDebRLg-1Qz91Kyevf5drl4hCngzU,881
@@ -312,10 +333,11 @@ ai_review/tests/suites/services/prompt/test_schema.py,sha256=rm2__LA2_4qQwSmNAZ_
312
333
  ai_review/tests/suites/services/prompt/test_service.py,sha256=jfpmM--eZH43NylwltX-ijmF58ZJ4WA83kmGshUbJfs,8312
313
334
  ai_review/tests/suites/services/prompt/test_tools.py,sha256=SmweFvrpxd-3RO5v18vCl7zonEqFE1n4eqHH7-6auYM,4511
314
335
  ai_review/tests/suites/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
- ai_review/tests/suites/services/review/test_service.py,sha256=1KSgYQ1SfO4dserZTMrkLfAzv0466k7LQG8m4TA_rGk,3324
336
+ ai_review/tests/suites/services/review/test_service.py,sha256=9XBywDoVTzLXlfqMmrxwJbPoj8QoGFW5wDwirqu2UHI,4206
316
337
  ai_review/tests/suites/services/review/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
- ai_review/tests/suites/services/review/gateway/test_comment.py,sha256=mFraqWLAF2yTcy8qAwAE5YjuWsab7GixFT5II3Ca7zg,8816
318
- ai_review/tests/suites/services/review/gateway/test_llm.py,sha256=WO326PiZkF4fHPYl1CRDfpUkLsC2BrLPmJpu0rnWrwY,2903
338
+ ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py,sha256=eueGnKY3YcLvLQ8hSdhKQuVfOlFwxP82cwgEHKyRPiQ,8831
339
+ ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py,sha256=YGSCZRyyV9BJaKpI66viHYZdM-GtuODJt4ZzEW1-29g,3862
340
+ ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py,sha256=m4HKvqDQYNesY5F2wuOMeHqXwQe99K4K_depdyTs37Q,2508
319
341
  ai_review/tests/suites/services/review/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
342
  ai_review/tests/suites/services/review/internal/inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
321
343
  ai_review/tests/suites/services/review/internal/inline/test_schema.py,sha256=2SGF8yNHsNv8lwG-MUlgO3RT4juTt0PQSl10qNhSt7o,2377
@@ -332,25 +354,28 @@ ai_review/tests/suites/services/review/internal/summary_reply/__init__.py,sha256
332
354
  ai_review/tests/suites/services/review/internal/summary_reply/test_schema.py,sha256=_2kfcHjB-thIFTIhdDBR7PsEl8beIAu4FtEkQjb0Ljk,859
333
355
  ai_review/tests/suites/services/review/internal/summary_reply/test_service.py,sha256=VlVr9wXXwmpp9qxy_4dMZnFHSZ12j2QSP_m58Vs_wXE,709
334
356
  ai_review/tests/suites/services/review/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
- ai_review/tests/suites/services/review/runner/test_context.py,sha256=57RO3lBR35RfLizJ71wdvJ6MAVz9h8M8i7i6ZKF8MNY,3948
336
- ai_review/tests/suites/services/review/runner/test_inline.py,sha256=ZehmjvoNe-0Zff55xBceBBg7tNn5AWRW_MdPNt-Uvrg,4651
337
- ai_review/tests/suites/services/review/runner/test_inline_reply.py,sha256=X_vu1lB83z5k8VG7mfBZaCtfFkq2D4VnGpQEsNJOrmo,4888
338
- ai_review/tests/suites/services/review/runner/test_summary.py,sha256=ePiORxLDtmsIqRA-eAZ8eDjVhVBjALrJ8jjIb6DlshE,3944
339
- ai_review/tests/suites/services/review/runner/test_summary_reply.py,sha256=L-G_Jpf3etnNqgPp9fhCy3JH_gmniyl9IUPGyEvkRLM,4546
357
+ ai_review/tests/suites/services/review/runner/test_context.py,sha256=tuOntcwvgnH89mlFXAnwmERPbw3AMk4NgZ6rnRmWA98,3978
358
+ ai_review/tests/suites/services/review/runner/test_inline.py,sha256=rnnfXqxeEYuzi7n3G9iscAfYst607LzovbtEwV6z0cQ,4681
359
+ ai_review/tests/suites/services/review/runner/test_inline_reply.py,sha256=Q3gsOdWvA1fYKRn-8BII19XAylAKK3B1i20xeP_Z1u4,4918
360
+ ai_review/tests/suites/services/review/runner/test_summary.py,sha256=VLIcKffScWSaxUztYHNLAsNUMGiJQWn7j_Le8Zcrizo,3974
361
+ ai_review/tests/suites/services/review/runner/test_summary_reply.py,sha256=UExBEkWh-EG0akVchgLdnnpcd7HFqEnDyMAVbFY_rtU,4576
340
362
  ai_review/tests/suites/services/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
341
- ai_review/tests/suites/services/vcs/test_factory.py,sha256=EergKSHW4b7RZg9vJJ5Cj0XfPsDTLEclV1kq2_9greA,1138
363
+ ai_review/tests/suites/services/vcs/test_factory.py,sha256=C_Ht4-zdZrAxFkw0PJYCU6IncvkQnF_0tNhvh_52P4Q,1404
342
364
  ai_review/tests/suites/services/vcs/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
343
365
  ai_review/tests/suites/services/vcs/bitbucket/test_adapter.py,sha256=zOjAOxtSSN0le5_-3-vkucCnHZH0zIUer7ZAMUMo62A,3760
344
366
  ai_review/tests/suites/services/vcs/bitbucket/test_client.py,sha256=oIlUdUBPgO2bfNyAsodUsAU7kRnETQVqmRJimRtEfBU,7846
367
+ ai_review/tests/suites/services/vcs/gitea/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
368
+ ai_review/tests/suites/services/vcs/gitea/test_adapter.py,sha256=7UPsbDQhn99obPZZ2fKnLE3_h9uoY_ujMD0WbHGAegY,1782
369
+ ai_review/tests/suites/services/vcs/gitea/test_client.py,sha256=ntk-ijRqEAUZ4IGXXerhQ9nCfj6Je6hMNB666uaklws,3307
345
370
  ai_review/tests/suites/services/vcs/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
346
371
  ai_review/tests/suites/services/vcs/github/test_adapter.py,sha256=bK4k532v_8kDiud5RI9OlGetWMiLP8NaW1vEfHvcHfQ,4893
347
372
  ai_review/tests/suites/services/vcs/github/test_client.py,sha256=mNt1bA6aVU3REsJiU_tK1PokQxQTaCKun0tNBHuvIp8,8039
348
373
  ai_review/tests/suites/services/vcs/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
349
374
  ai_review/tests/suites/services/vcs/gitlab/test_adapter.py,sha256=BYBP2g1AKF_jCSJYJj16pW7M_6PprwD9reYEpdw3StU,4340
350
375
  ai_review/tests/suites/services/vcs/gitlab/test_client.py,sha256=dnI-YxYADmVF2GS9rp6-JPkcqsn4sN8Fjbe4MkeYMaE,8476
351
- xai_review-0.29.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
352
- xai_review-0.29.0.dist-info/METADATA,sha256=gcWmlsiSWriTYeM_noFaGBajgOpdJtl4xCWRbJyzMSU,11358
353
- xai_review-0.29.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
354
- xai_review-0.29.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
355
- xai_review-0.29.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
356
- xai_review-0.29.0.dist-info/RECORD,,
376
+ xai_review-0.31.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
377
+ xai_review-0.31.0.dist-info/METADATA,sha256=yHKLyE_H6IOrbL2Sgje0LM-hcw0G4GLKm4pwwW2wtt4,12689
378
+ xai_review-0.31.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
379
+ xai_review-0.31.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
380
+ xai_review-0.31.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
381
+ xai_review-0.31.0.dist-info/RECORD,,
@@ -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()