xai-review 0.25.0__py3-none-any.whl → 0.27.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 (44) hide show
  1. ai_review/clients/bitbucket/__init__.py +0 -0
  2. ai_review/clients/bitbucket/client.py +31 -0
  3. ai_review/clients/bitbucket/pr/__init__.py +0 -0
  4. ai_review/clients/bitbucket/pr/client.py +141 -0
  5. ai_review/clients/bitbucket/pr/schema/__init__.py +0 -0
  6. ai_review/clients/bitbucket/pr/schema/comments.py +49 -0
  7. ai_review/clients/bitbucket/pr/schema/files.py +30 -0
  8. ai_review/clients/bitbucket/pr/schema/pull_request.py +38 -0
  9. ai_review/clients/bitbucket/pr/types.py +44 -0
  10. ai_review/clients/bitbucket/tools.py +6 -0
  11. ai_review/clients/github/pr/client.py +66 -12
  12. ai_review/clients/github/pr/schema/comments.py +2 -1
  13. ai_review/clients/github/pr/schema/files.py +2 -1
  14. ai_review/clients/github/pr/schema/reviews.py +2 -1
  15. ai_review/clients/github/tools.py +6 -0
  16. ai_review/clients/gitlab/mr/client.py +35 -6
  17. ai_review/clients/gitlab/mr/schema/discussions.py +2 -1
  18. ai_review/clients/gitlab/mr/schema/notes.py +2 -1
  19. ai_review/clients/gitlab/tools.py +5 -0
  20. ai_review/libs/config/vcs/base.py +13 -1
  21. ai_review/libs/config/vcs/bitbucket.py +13 -0
  22. ai_review/libs/config/vcs/pagination.py +6 -0
  23. ai_review/libs/constants/vcs_provider.py +1 -0
  24. ai_review/libs/http/paginate.py +43 -0
  25. ai_review/services/vcs/bitbucket/__init__.py +0 -0
  26. ai_review/services/vcs/bitbucket/client.py +185 -0
  27. ai_review/services/vcs/factory.py +3 -0
  28. ai_review/tests/fixtures/clients/bitbucket.py +204 -0
  29. ai_review/tests/suites/clients/bitbucket/__init__.py +0 -0
  30. ai_review/tests/suites/clients/bitbucket/test_client.py +14 -0
  31. ai_review/tests/suites/clients/bitbucket/test_tools.py +31 -0
  32. ai_review/tests/suites/clients/github/test_tools.py +31 -0
  33. ai_review/tests/suites/clients/gitlab/test_tools.py +26 -0
  34. ai_review/tests/suites/libs/http/__init__.py +0 -0
  35. ai_review/tests/suites/libs/http/test_paginate.py +95 -0
  36. ai_review/tests/suites/services/vcs/bitbucket/__init__.py +0 -0
  37. ai_review/tests/suites/services/vcs/bitbucket/test_service.py +117 -0
  38. ai_review/tests/suites/services/vcs/test_factory.py +8 -1
  39. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/METADATA +4 -4
  40. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/RECORD +44 -17
  41. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/WHEEL +0 -0
  42. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/entry_points.txt +0 -0
  43. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/licenses/LICENSE +0 -0
  44. {xai_review-0.25.0.dist-info → xai_review-0.27.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,117 @@
1
+ import pytest
2
+
3
+ from ai_review.services.vcs.bitbucket.client import BitbucketVCSClient
4
+ from ai_review.services.vcs.types import ReviewInfoSchema, ReviewCommentSchema
5
+ from ai_review.tests.fixtures.clients.bitbucket import FakeBitbucketPullRequestsHTTPClient
6
+
7
+
8
+ @pytest.mark.asyncio
9
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
10
+ async def test_get_review_info_returns_valid_schema(
11
+ bitbucket_vcs_client: BitbucketVCSClient,
12
+ fake_bitbucket_pull_requests_http_client: FakeBitbucketPullRequestsHTTPClient,
13
+ ):
14
+ """Should return detailed PR info with branches, author, reviewers, and files."""
15
+ info = await bitbucket_vcs_client.get_review_info()
16
+
17
+ assert isinstance(info, ReviewInfoSchema)
18
+ assert info.id == 1
19
+ assert info.title == "Fake Bitbucket PR"
20
+ assert info.description == "This is a fake PR for testing"
21
+
22
+ assert info.author.username == "tester"
23
+ assert {r.username for r in info.reviewers} == {"reviewer"}
24
+
25
+ assert info.source_branch.ref == "feature/test"
26
+ assert info.target_branch.ref == "main"
27
+ assert info.base_sha == "abc123"
28
+ assert info.head_sha == "def456"
29
+
30
+ assert "app/main.py" in info.changed_files
31
+ assert len(info.changed_files) == 2
32
+
33
+ called_methods = [name for name, _ in fake_bitbucket_pull_requests_http_client.calls]
34
+ assert called_methods == ["get_pull_request", "get_files"]
35
+
36
+
37
+ @pytest.mark.asyncio
38
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
39
+ async def test_get_general_comments_filters_inline(
40
+ bitbucket_vcs_client: BitbucketVCSClient,
41
+ fake_bitbucket_pull_requests_http_client: FakeBitbucketPullRequestsHTTPClient,
42
+ ):
43
+ """Should return only general comments (without inline info)."""
44
+ comments = await bitbucket_vcs_client.get_general_comments()
45
+
46
+ assert all(isinstance(c, ReviewCommentSchema) for c in comments)
47
+ assert len(comments) == 1
48
+
49
+ first = comments[0]
50
+ assert first.body == "General comment"
51
+ assert first.file is None
52
+ assert first.line is None
53
+
54
+ called_methods = [name for name, _ in fake_bitbucket_pull_requests_http_client.calls]
55
+ assert called_methods == ["get_comments"]
56
+
57
+
58
+ @pytest.mark.asyncio
59
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
60
+ async def test_get_inline_comments_filters_general(
61
+ bitbucket_vcs_client: BitbucketVCSClient,
62
+ fake_bitbucket_pull_requests_http_client: FakeBitbucketPullRequestsHTTPClient,
63
+ ):
64
+ """Should return only inline comments with file and line references."""
65
+ comments = await bitbucket_vcs_client.get_inline_comments()
66
+
67
+ assert all(isinstance(c, ReviewCommentSchema) for c in comments)
68
+ assert len(comments) == 1
69
+
70
+ first = comments[0]
71
+ assert first.body == "Inline comment"
72
+ assert first.file == "file.py"
73
+ assert first.line == 5
74
+
75
+ called_methods = [name for name, _ in fake_bitbucket_pull_requests_http_client.calls]
76
+ assert called_methods == ["get_comments"]
77
+
78
+
79
+ @pytest.mark.asyncio
80
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
81
+ async def test_create_general_comment_posts_comment(
82
+ bitbucket_vcs_client: BitbucketVCSClient,
83
+ fake_bitbucket_pull_requests_http_client: FakeBitbucketPullRequestsHTTPClient,
84
+ ):
85
+ """Should post a general (non-inline) comment."""
86
+ message = "Hello from Bitbucket test!"
87
+
88
+ await bitbucket_vcs_client.create_general_comment(message)
89
+
90
+ calls = [args for name, args in fake_bitbucket_pull_requests_http_client.calls if name == "create_comment"]
91
+ assert len(calls) == 1
92
+ call_args = calls[0]
93
+ assert call_args["content"]["raw"] == message
94
+ assert call_args["workspace"] == "workspace"
95
+ assert call_args["repo_slug"] == "repo"
96
+
97
+
98
+ @pytest.mark.asyncio
99
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
100
+ async def test_create_inline_comment_posts_comment(
101
+ bitbucket_vcs_client: BitbucketVCSClient,
102
+ fake_bitbucket_pull_requests_http_client: FakeBitbucketPullRequestsHTTPClient,
103
+ ):
104
+ """Should post an inline comment with correct file and line."""
105
+ file = "file.py"
106
+ line = 10
107
+ message = "Looks good"
108
+
109
+ await bitbucket_vcs_client.create_inline_comment(file, line, message)
110
+
111
+ calls = [args for name, args in fake_bitbucket_pull_requests_http_client.calls if name == "create_comment"]
112
+ assert len(calls) == 1
113
+
114
+ call_args = calls[0]
115
+ assert call_args["content"]["raw"] == message
116
+ assert call_args["inline"]["path"] == file
117
+ assert call_args["inline"]["to"] == line
@@ -1,5 +1,6 @@
1
1
  import pytest
2
2
 
3
+ from ai_review.services.vcs.bitbucket.client import BitbucketVCSClient
3
4
  from ai_review.services.vcs.factory import get_vcs_client
4
5
  from ai_review.services.vcs.github.client import GitHubVCSClient
5
6
  from ai_review.services.vcs.gitlab.client import GitLabVCSClient
@@ -17,7 +18,13 @@ def test_get_vcs_client_returns_gitlab(monkeypatch: pytest.MonkeyPatch):
17
18
  assert isinstance(client, GitLabVCSClient)
18
19
 
19
20
 
21
+ @pytest.mark.usefixtures("bitbucket_http_client_config")
22
+ def test_get_vcs_client_returns_bitbucket(monkeypatch: pytest.MonkeyPatch):
23
+ client = get_vcs_client()
24
+ assert isinstance(client, BitbucketVCSClient)
25
+
26
+
20
27
  def test_get_vcs_client_unsupported_provider(monkeypatch: pytest.MonkeyPatch):
21
- monkeypatch.setattr("ai_review.services.vcs.factory.settings.vcs.provider", "BITBUCKET")
28
+ monkeypatch.setattr("ai_review.services.vcs.factory.settings.vcs.provider", "UNSUPPORTED")
22
29
  with pytest.raises(ValueError):
23
30
  get_vcs_client()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xai-review
3
- Version: 0.25.0
3
+ Version: 0.27.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,7 +67,7 @@ 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 (more providers coming).
70
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, and **Bitbucket**.
71
71
  - **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
72
72
  - **Flexible configuration** — supports `YAML`, `JSON`, and `ENV`, with seamless overrides in CI/CD pipelines.
73
73
  - **AI Review runs fully client-side** — it never proxies or inspects your requests.
@@ -170,7 +170,7 @@ Key things you can customize:
170
170
 
171
171
  - **LLM provider** — OpenAI, Gemini, Claude, or Ollama
172
172
  - **Model settings** — model name, temperature, max tokens
173
- - **VCS integration** — works out of the box with **GitLab** and **GitHub**.
173
+ - **VCS integration** — works out of the box with **GitLab**, **GitHub**, and **Bitbucket**
174
174
  - **Review policy** — which files to include/exclude, review modes
175
175
  - **Prompts** — inline/context/summary prompt templates
176
176
 
@@ -209,7 +209,7 @@ jobs:
209
209
  runs-on: ubuntu-latest
210
210
  steps:
211
211
  - uses: actions/checkout@v4
212
- - uses: Nikita-Filonov/ai-review@v0.25.0
212
+ - uses: Nikita-Filonov/ai-review@v0.27.0
213
213
  with:
214
214
  review-command: ${{ inputs.review-command }}
215
215
  env:
@@ -8,6 +8,16 @@ ai_review/cli/commands/run_inline_review.py,sha256=u55K-Su0PR2-NcK7XI2rTCIi7HTEi
8
8
  ai_review/cli/commands/run_review.py,sha256=i39IYNDE_lAiQQnKLmxG71Ao8WAIOSn82L9EpdbPcsI,261
9
9
  ai_review/cli/commands/run_summary_review.py,sha256=NqjepGH5cbqczPzcuMEAxO4dI58FEUZl0b6uRVQ9SiA,224
10
10
  ai_review/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ ai_review/clients/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ ai_review/clients/bitbucket/client.py,sha256=VaqaQ5USMPTOEeS5XPdr-RkMKsxUpJ2SBE6lcemkz-g,1174
13
+ ai_review/clients/bitbucket/tools.py,sha256=UGBCurb8MQECivWDJDNXr7ej7rwA5-_kXTT4zF8RXIQ,147
14
+ ai_review/clients/bitbucket/pr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ ai_review/clients/bitbucket/pr/client.py,sha256=YnA5GCw_qqrjraNH_LjtE7t7cCmrMTY9IrcxDT2uyZ0,5836
16
+ ai_review/clients/bitbucket/pr/types.py,sha256=ZICV4ghYChj1Jl9Nlwyw1_kwmGybX51GhGdGzkRaLCk,1296
17
+ ai_review/clients/bitbucket/pr/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ ai_review/clients/bitbucket/pr/schema/comments.py,sha256=p3HQyi-M7DLXcD0RErVlqsnKhmo2JVqdA8ejVYF_Kzg,1337
19
+ ai_review/clients/bitbucket/pr/schema/files.py,sha256=qBDfIv370TDMKM8yoLlm1c-BTHNvEZRuhnBo18nkx9g,750
20
+ ai_review/clients/bitbucket/pr/schema/pull_request.py,sha256=buGULgaCkxCUFSdiw0XTwaSIYP_p1rAEuKXUyJ_Mzi8,863
11
21
  ai_review/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
22
  ai_review/clients/claude/client.py,sha256=uEadbBNBJnzjHDczbxXiiw1V1H1PdUWKu-Gn-eIDEmw,1890
13
23
  ai_review/clients/claude/schema.py,sha256=LE6KCjJKDXqBGU2Cno5XL5R8vUfScgskE9MqvE0Pt2A,887
@@ -18,23 +28,25 @@ ai_review/clients/gemini/schema.py,sha256=5oVvbI-h_sw8bFreS4JUmMj-aXa_frvxK3H8sg
18
28
  ai_review/clients/gemini/types.py,sha256=D-P0THorrQ8yq5P-NKAC65zzhEYRa9HkiXTORG9QoIk,267
19
29
  ai_review/clients/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
30
  ai_review/clients/github/client.py,sha256=pprQcCYdrhRYtuqRsTFiCbj54Qb1Ll6_jmlm7AJg8pk,1149
31
+ ai_review/clients/github/tools.py,sha256=sD2eS_iNhzT4ZLgTRmO2uBLuId-fa2aSvbu6VFeKSlc,201
21
32
  ai_review/clients/github/pr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- ai_review/clients/github/pr/client.py,sha256=YvGc4ClK615PgWslD8bL54pk1YakXHivabjnPZ8p6iI,6642
33
+ ai_review/clients/github/pr/client.py,sha256=HysL1u-WxLdhGKi-6HAx6fN-50XSk3yK55gZ9Nii72U,8851
23
34
  ai_review/clients/github/pr/types.py,sha256=mI5Vtlxc25iymOTPkNl55IQygXd4ti3B1Ydpx3q1fps,1726
24
35
  ai_review/clients/github/pr/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ai_review/clients/github/pr/schema/comments.py,sha256=IjBtpcJABlql97_N7_CMAKuAozbVnSkaD16l3KueGqk,719
26
- ai_review/clients/github/pr/schema/files.py,sha256=mXfmjaJuVbbo2PPTppCyYlc4LSd04fb-_x_9aJkNW04,335
36
+ ai_review/clients/github/pr/schema/comments.py,sha256=dIlX6tYPseAtLquk-UIie7jxBxrCbmPbDyB8bC9OFPo,743
37
+ ai_review/clients/github/pr/schema/files.py,sha256=ARirokToZ1zqMWh2jpDtVIs4qw5rlL7xfoRDJBJF71o,359
27
38
  ai_review/clients/github/pr/schema/pull_request.py,sha256=EwOworYQY4kCmL6QFKEXK7r2fpINK8o-4-FEy9-nTpg,688
28
- ai_review/clients/github/pr/schema/reviews.py,sha256=tRHqGPzZ-LTbAZhtoVeBdl-LH34tgI0zPCtJTfFe2Mc,356
39
+ ai_review/clients/github/pr/schema/reviews.py,sha256=qRJpBu03CBwC_tPng9q9tkqT_u2WcdDELblAi-OzxWI,380
29
40
  ai_review/clients/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
41
  ai_review/clients/gitlab/client.py,sha256=MIZed-V4JUzntkU9vJq7Fkp5VAjnzjvep_5QM5ni_Co,1151
42
+ ai_review/clients/gitlab/tools.py,sha256=ed8t2-dy2XtSRpYWhLxUobYvbBX_1zMZTPuzjbgPzTg,136
31
43
  ai_review/clients/gitlab/mr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- ai_review/clients/gitlab/mr/client.py,sha256=WdaJCJdSHeZZUQ9Hz8172RCgACwm-_NmcC91LHT7YwU,5158
44
+ ai_review/clients/gitlab/mr/client.py,sha256=39EjS0bvvi8-kiBOkBa7N1q0wHb0qTgo_KvQise61js,6350
33
45
  ai_review/clients/gitlab/mr/types.py,sha256=tZ3rDDkzJM8v4zPt4gTyKCL30htiPQE9F_kVR6K5JHA,1280
34
46
  ai_review/clients/gitlab/mr/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
47
  ai_review/clients/gitlab/mr/schema/changes.py,sha256=ZqSPb8zO0z_V8cEjxoTqnwbjRLxo6OTV4LeQEAg91cU,835
36
- ai_review/clients/gitlab/mr/schema/discussions.py,sha256=JgvxKfHoYxmp86aP4MpIczK-arU0hc-BZLASWDWBIRs,790
37
- ai_review/clients/gitlab/mr/schema/notes.py,sha256=yfnnRt69fALKfapzZpVtvCvNwPkq5jBFI7fbPMq1w1c,424
48
+ ai_review/clients/gitlab/mr/schema/discussions.py,sha256=owaWWD5lMG9GXkT8kgHiU_-khYTWGHanbWgSKDiJknA,814
49
+ ai_review/clients/gitlab/mr/schema/notes.py,sha256=DX9juurMYKcaYobh4n4M49dvHtUiLw5IzZKsGdBMxZg,448
38
50
  ai_review/clients/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
51
  ai_review/clients/ollama/client.py,sha256=KoJ9J5_Vfpv5XNJREshE_gA46uo9J0Z3qVC7wJPEcX8,1720
40
52
  ai_review/clients/ollama/schema.py,sha256=A6oKwkkEVrduyzMR_lhLnaLyvKXqlfsXjkMIF2eXaYw,1310
@@ -65,12 +77,14 @@ ai_review/libs/config/llm/meta.py,sha256=cEcAHOwy-mQBKo9_KJrQe0I7qppq6h99lSmoWX4
65
77
  ai_review/libs/config/llm/ollama.py,sha256=M6aiPb5GvYvkiGcgHTsh9bOw5JsBLqmfSKoIbHCejrU,372
66
78
  ai_review/libs/config/llm/openai.py,sha256=jGVL4gJ2wIacoKeK9Zc9LCgY95TxdeYOThdglVPErFU,262
67
79
  ai_review/libs/config/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- ai_review/libs/config/vcs/base.py,sha256=zkfqBnI9kF_wbU9Nan19CKciKwOpWvdcZEt57jHujbE,786
80
+ ai_review/libs/config/vcs/base.py,sha256=B0kKc6-A3mmV7dvHpo47u-1yTvdUCvLj_g4oCBo_NyY,1214
81
+ ai_review/libs/config/vcs/bitbucket.py,sha256=on5sQaE57kM_zSmqdDUNrttVtTPGOzqLHM5s7eFN7DA,275
69
82
  ai_review/libs/config/vcs/github.py,sha256=hk-kuDLd8wecqtEb8PSqF7Yy_pkihplJhi6nB6FZID4,256
70
83
  ai_review/libs/config/vcs/gitlab.py,sha256=ecYfU158VgVlM6P5mgZn8FOqk3Xt60xx7gUqT5e22a4,252
84
+ ai_review/libs/config/vcs/pagination.py,sha256=S-XxWQYkIjhu3ffpHQ44d7UtRHH81fh9GaJ-xQXUUy4,175
71
85
  ai_review/libs/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
86
  ai_review/libs/constants/llm_provider.py,sha256=k7GzctIZ-TDsRlhTPbpGYgym_CO2YKVFp_oXG9dTBW0,143
73
- ai_review/libs/constants/vcs_provider.py,sha256=mZMC8DWIDWQ1YeUZh1a1jduX5enOAe1rWeza0RBmpTY,99
87
+ ai_review/libs/constants/vcs_provider.py,sha256=xJpRdJIdAf05iH2x2f362d1MuviOlPVP7In-JvDVotE,127
74
88
  ai_review/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
89
  ai_review/libs/diff/models.py,sha256=RT4YJboOPA-AjNJGRj_HIZaJLEmROOhOgMh1wIGpIwY,2344
76
90
  ai_review/libs/diff/parser.py,sha256=2BGxZnRN3SRjNnZK4qIOW28aM93Ij__1SltwclJrlno,3817
@@ -78,6 +92,7 @@ ai_review/libs/diff/tools.py,sha256=CZWRDlOW2YS-b8h9gv_uP1MG194_FLkKzcKTwwZHocI,
78
92
  ai_review/libs/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
93
  ai_review/libs/http/client.py,sha256=JONzbhJWJKFz8Jy6p9pzq2hAMKlyJ2_WkBksuAlqW7k,453
80
94
  ai_review/libs/http/handlers.py,sha256=k1VvCIFjLzfH3qQ--aj4CZVgbU0oj78sYStMBrxo_Ek,1040
95
+ ai_review/libs/http/paginate.py,sha256=yAryDaUkQd-wojXOaak9HyicT-QZwx3L49AJlUEins4,1305
81
96
  ai_review/libs/http/event_hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
97
  ai_review/libs/http/event_hooks/base.py,sha256=cnSOOButTJYKeyb_OnGms1vXRfwfExP81L3ZfYWLufk,279
83
98
  ai_review/libs/http/event_hooks/logger.py,sha256=8_omfl6q3JijaBBIgzvzb4SayjNEDW-oxyck_Ky8wnI,603
@@ -150,8 +165,10 @@ ai_review/services/review/summary/schema.py,sha256=GipVNWrEKtgZPkytNSrXwzvX9Zq8P
150
165
  ai_review/services/review/summary/service.py,sha256=F4diIESc0y7YSiUKbInHWiSOW5tW_eQ0rpf78wKxLAo,562
151
166
  ai_review/services/review/summary/types.py,sha256=iDsucvx9xJZ5Xb5FN70da3bub3YDtt4vpQeVEK532E8,235
152
167
  ai_review/services/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- ai_review/services/vcs/factory.py,sha256=yoZ5qCI_vq2bG-9lbunf70ojcxdoj8ms-4vY4c5BcJE,606
168
+ ai_review/services/vcs/factory.py,sha256=AfhpZjQ257BkLjb_7zUyw_EUnfEiCUHgTph7GGm-MY4,753
154
169
  ai_review/services/vcs/types.py,sha256=S49LhAGHVAd_0QwZUr4JMhfc6DR-HikHR6-T_ETlTus,1998
170
+ ai_review/services/vcs/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
+ ai_review/services/vcs/bitbucket/client.py,sha256=OceM48MBoiUVKGTh8ZrrpVt8a1fDczCvOMD9VlwoapY,7253
155
172
  ai_review/services/vcs/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
173
  ai_review/services/vcs/github/client.py,sha256=v6NV97xi_rtRQQi8atRdSrXKhSOQ7CeRHK7YjoyjU6Q,6353
157
174
  ai_review/services/vcs/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -159,6 +176,7 @@ ai_review/services/vcs/gitlab/client.py,sha256=LK95m-uFSxhDEVU-cBGct61NTKjul-ieL
159
176
  ai_review/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
177
  ai_review/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
178
  ai_review/tests/fixtures/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
+ ai_review/tests/fixtures/clients/bitbucket.py,sha256=XJK1nU7Wir5PnmwCUJ_2uTlByA5a_CTEuXc2a-WmWio,7122
162
180
  ai_review/tests/fixtures/clients/claude.py,sha256=6ldJlSSea0zsZV0hRDMi9mqWm0hWT3mp_ROwG_sVU1c,2203
163
181
  ai_review/tests/fixtures/clients/gemini.py,sha256=zhLJhm49keKEBCPOf_pLu8_zCatsKKAWM4-gXOhaXeM,2429
164
182
  ai_review/tests/fixtures/clients/github.py,sha256=Mzr8LcvVlYLhimzDMG4tEOQwj_6E6kTvYvSrq04R3YI,6865
@@ -178,6 +196,9 @@ ai_review/tests/fixtures/services/review/inline.py,sha256=k4IW6oy5JHMo9Kv0H97DLl
178
196
  ai_review/tests/fixtures/services/review/summary.py,sha256=Hkt8mq1ZmqMH5_mELrS1x0wtCoNPbBjOEQ9yIsMbRts,691
179
197
  ai_review/tests/suites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
198
  ai_review/tests/suites/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
+ ai_review/tests/suites/clients/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
+ ai_review/tests/suites/clients/bitbucket/test_client.py,sha256=1qEkznC01hkh6TPpzChY9glhK6OTX-pfnSF43KNBtrY,600
201
+ ai_review/tests/suites/clients/bitbucket/test_tools.py,sha256=naHq0Xy7uP8pYdWR8JVrET5JJpNb0Z2-TEPkGHh2fFI,887
181
202
  ai_review/tests/suites/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
203
  ai_review/tests/suites/clients/claude/test_client.py,sha256=jLGqK7lzYc8LjJO-3HjBtLqCdg-ubw-xZ4EvFeFGRhY,404
183
204
  ai_review/tests/suites/clients/claude/test_schema.py,sha256=MUZXvEROgLNpUVHfCsH5D3ruJPQwTx0OgeT3_BRVjgI,1671
@@ -186,8 +207,10 @@ ai_review/tests/suites/clients/gemini/test_client.py,sha256=f2R7KisiENrzf8gaK26N
186
207
  ai_review/tests/suites/clients/gemini/test_schema.py,sha256=88dU28m7sEWvGx6tqYl7if7weWYuVc8erlkFkKKI3bk,3109
187
208
  ai_review/tests/suites/clients/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
209
  ai_review/tests/suites/clients/github/test_client.py,sha256=BiuLKCHIk83U1szYEZkB-n3vvyPgj6tAI5EqxKiT-CY,558
210
+ ai_review/tests/suites/clients/github/test_tools.py,sha256=_RKMWNgfeynnpbiDebRLg-1Qz91Kyevf5drl4hCngzU,881
189
211
  ai_review/tests/suites/clients/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
212
  ai_review/tests/suites/clients/gitlab/test_client.py,sha256=5QOkNvgm0XRKHh79FNIY9CTonAqYPXqCCxcxeiAHYCA,560
213
+ ai_review/tests/suites/clients/gitlab/test_tools.py,sha256=-gS_kvZwNBkvYeYyYPld78F4ZuZPrpNORWVbg2eq5wM,678
191
214
  ai_review/tests/suites/clients/ollama/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
215
  ai_review/tests/suites/clients/ollama/test_client.py,sha256=XZ8NAd1bS_ltTuYZPgqlutPRA6kbvH3_3SKTCbNBTgA,404
193
216
  ai_review/tests/suites/clients/ollama/test_schema.py,sha256=A93wCmxwGdvudfbA97VCPYP3gT6u6EYMetAg5fgURRA,1836
@@ -204,6 +227,8 @@ ai_review/tests/suites/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
204
227
  ai_review/tests/suites/libs/diff/test_models.py,sha256=RBFQ97LWhU8TlupxXkJ97ryAvJrSuOHLtT9biUBUMXg,3321
205
228
  ai_review/tests/suites/libs/diff/test_parser.py,sha256=rvWEVGIdaLBlDAnSevjRY7I1Zikj12d5GOgMk9QyHQQ,3013
206
229
  ai_review/tests/suites/libs/diff/test_tools.py,sha256=XkHJZ-b5veFz5oLKO09P7npaLN8lOzCnGR7e83Zv_mg,1953
230
+ ai_review/tests/suites/libs/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
+ ai_review/tests/suites/libs/http/test_paginate.py,sha256=9PCn1mUQypPId9l8RToBQnLBJBV_WEYxBh785bqqmMA,2694
207
232
  ai_review/tests/suites/libs/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
233
  ai_review/tests/suites/libs/template/test_render.py,sha256=n-ss5bd_hwc-RzYmqWmFM6KSlP1zLSnlsW1Yki12Bpw,1890
209
234
  ai_review/tests/suites/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -242,14 +267,16 @@ ai_review/tests/suites/services/review/summary/__init__.py,sha256=47DEQpj8HBSa-_
242
267
  ai_review/tests/suites/services/review/summary/test_schema.py,sha256=HUbSDbQzBp-iTsGLs7hJfu-sz6sq9xLO0woGmZPWyx0,735
243
268
  ai_review/tests/suites/services/review/summary/test_service.py,sha256=ibiYOWQMZuQKRutIT_EKGq7DEPQvp62YhscNHeSWFVQ,588
244
269
  ai_review/tests/suites/services/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
245
- ai_review/tests/suites/services/vcs/test_factory.py,sha256=RLxKRSISJQGH9_h2QY7zLvMyAVF4shYoEmKrrmUySME,850
270
+ ai_review/tests/suites/services/vcs/test_factory.py,sha256=EergKSHW4b7RZg9vJJ5Cj0XfPsDTLEclV1kq2_9greA,1138
271
+ ai_review/tests/suites/services/vcs/bitbucket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
+ ai_review/tests/suites/services/vcs/bitbucket/test_service.py,sha256=JnG5BYTgGMb-doNjis2BOeI8JrMmvqwv82UFD5f92kg,4448
246
273
  ai_review/tests/suites/services/vcs/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
274
  ai_review/tests/suites/services/vcs/github/test_service.py,sha256=c2sjecm4qzqYXuO9j6j35NQyJzqDpnXIJImRTcpkyHo,4378
248
275
  ai_review/tests/suites/services/vcs/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
276
  ai_review/tests/suites/services/vcs/gitlab/test_service.py,sha256=0dqgL5whzjcP-AQ4adP_12QfkYm_ZtdtMotmYm8Se7Y,4449
250
- xai_review-0.25.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
251
- xai_review-0.25.0.dist-info/METADATA,sha256=-Ogp0iZijYiluzi9D_yO21Ur9N9Z4qJclmSeHrddU3A,11132
252
- xai_review-0.25.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
253
- xai_review-0.25.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
254
- xai_review-0.25.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
255
- xai_review-0.25.0.dist-info/RECORD,,
277
+ xai_review-0.27.0.dist-info/licenses/LICENSE,sha256=p-v8m7Kmz4KKc7PcvsGiGEmCw9AiSXY4_ylOPy_u--Y,11343
278
+ xai_review-0.27.0.dist-info/METADATA,sha256=5SnK3Ip4vzfwvS110fYNDSDYD4OzrmA5G1eUV2oGMbE,11150
279
+ xai_review-0.27.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
280
+ xai_review-0.27.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
281
+ xai_review-0.27.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
282
+ xai_review-0.27.0.dist-info/RECORD,,