xai-review 0.37.0__tar.gz → 0.39.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.
- {xai_review-0.37.0/xai_review.egg-info → xai_review-0.39.0}/PKG-INFO +9 -7
- {xai_review-0.37.0 → xai_review-0.39.0}/README.md +5 -3
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/client.py +6 -6
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/client.py +52 -40
- xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/comments.py +59 -0
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/schema/files.py +7 -7
- xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/pull_request.py +34 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/schema/user.py +7 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_cloud/pr/types.py +44 -0
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/tools.py +1 -1
- xai_review-0.39.0/ai_review/clients/bitbucket_server/client.py +32 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/client.py +163 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/changes.py +36 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/comments.py +55 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/pull_request.py +48 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema/user.py +13 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/types.py +44 -0
- xai_review-0.39.0/ai_review/clients/bitbucket_server/tools.py +6 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/base.py +23 -6
- xai_review-0.37.0/ai_review/libs/config/vcs/bitbucket.py → xai_review-0.39.0/ai_review/libs/config/vcs/bitbucket_cloud.py +2 -2
- xai_review-0.39.0/ai_review/libs/config/vcs/bitbucket_server.py +13 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/constants/vcs_provider.py +2 -1
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/client.py +1 -1
- {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/adapter.py +4 -4
- {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/client.py +26 -23
- xai_review-0.39.0/ai_review/services/vcs/bitbucket_server/adapter.py +27 -0
- xai_review-0.39.0/ai_review/services/vcs/bitbucket_server/client.py +263 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/factory.py +6 -3
- xai_review-0.39.0/ai_review/tests/fixtures/clients/bitbucket_cloud.py +207 -0
- xai_review-0.39.0/ai_review/tests/fixtures/clients/bitbucket_server.py +265 -0
- xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud/test_client.py +14 -0
- xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud/test_tools.py +31 -0
- xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server/test_client.py +14 -0
- xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server/test_tools.py +38 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/__init__.py +0 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud}/test_adapter.py +24 -24
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_cloud}/test_client.py +51 -51
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/__init__.py +0 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/test_adapter.py +115 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/bitbucket_server/test_client.py +201 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/gitea/__init__.py +0 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/github/__init__.py +0 -0
- xai_review-0.39.0/ai_review/tests/suites/services/vcs/gitlab/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/test_factory.py +11 -4
- {xai_review-0.37.0 → xai_review-0.39.0}/pyproject.toml +6 -4
- {xai_review-0.37.0 → xai_review-0.39.0/xai_review.egg-info}/PKG-INFO +9 -7
- {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/SOURCES.txt +44 -22
- xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/comments.py +0 -63
- xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/pull_request.py +0 -34
- xai_review-0.37.0/ai_review/clients/bitbucket/pr/schema/user.py +0 -7
- xai_review-0.37.0/ai_review/clients/bitbucket/pr/types.py +0 -44
- xai_review-0.37.0/ai_review/tests/fixtures/clients/bitbucket.py +0 -204
- xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket/test_client.py +0 -14
- xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket/test_tools.py +0 -31
- {xai_review-0.37.0 → xai_review-0.39.0}/LICENSE +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_context_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_inline_reply_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_inline_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_summary_reply_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/commands/run_summary_review.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/cli/main.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/bitbucket → xai_review-0.39.0/ai_review/clients/bitbucket_cloud}/pr/schema/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/claude → xai_review-0.39.0/ai_review/clients/bitbucket_server}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gemini → xai_review-0.39.0/ai_review/clients/bitbucket_server/pr}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitea → xai_review-0.39.0/ai_review/clients/bitbucket_server/pr/schema}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitea/pr → xai_review-0.39.0/ai_review/clients/claude}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/claude/types.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitea/pr/schema → xai_review-0.39.0/ai_review/clients/gemini}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gemini/types.py +0 -0
- {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/pr/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/github → xai_review-0.39.0/ai_review/clients/gitea}/pr/schema/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/comments.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/files.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/pull_request.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/schema/user.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/pr/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitea/tools.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitlab → xai_review-0.39.0/ai_review/clients/github}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitlab/mr → xai_review-0.39.0/ai_review/clients/github/pr}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/gitlab/mr → xai_review-0.39.0/ai_review/clients/github/pr}/schema/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/comments.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/files.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/pull_request.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/reviews.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/schema/user.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/pr/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/github/tools.py +0 -0
- {xai_review-0.37.0/ai_review/clients/ollama → xai_review-0.39.0/ai_review/clients/gitlab}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/openai → xai_review-0.39.0/ai_review/clients/gitlab/mr}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/client.py +0 -0
- {xai_review-0.37.0/ai_review/clients/openai/v1 → xai_review-0.39.0/ai_review/clients/gitlab/mr/schema}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/changes.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/discussions.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/notes.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/position.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/schema/user.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/mr/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/gitlab/tools.py +0 -0
- {xai_review-0.37.0/ai_review/clients/openai/v2 → xai_review-0.39.0/ai_review/clients/ollama}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/ollama/types.py +0 -0
- {xai_review-0.37.0/ai_review/clients/openrouter → xai_review-0.39.0/ai_review/clients/openai}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/libs → xai_review-0.39.0/ai_review/clients/openai/v1}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v1/types.py +0 -0
- {xai_review-0.37.0/ai_review/libs/asynchronous → xai_review-0.39.0/ai_review/clients/openai/v2}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openai/v2/types.py +0 -0
- {xai_review-0.37.0/ai_review/libs/config → xai_review-0.39.0/ai_review/clients/openrouter}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/clients/openrouter/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/config.py +0 -0
- {xai_review-0.37.0/ai_review/libs/config/llm → xai_review-0.39.0/ai_review/libs}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/libs/config/vcs → xai_review-0.39.0/ai_review/libs/asynchronous}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/asynchronous/gather.py +0 -0
- {xai_review-0.37.0/ai_review/libs/constants → xai_review-0.39.0/ai_review/libs/config}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/artifacts.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/base.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/core.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/http.py +0 -0
- {xai_review-0.37.0/ai_review/libs/diff → xai_review-0.39.0/ai_review/libs/config/llm}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/base.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/claude.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/gemini.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/meta.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/ollama.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/openai.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/llm/openrouter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/logger.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/prompt.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/review.py +0 -0
- {xai_review-0.37.0/ai_review/libs/http → xai_review-0.39.0/ai_review/libs/config/vcs}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/gitea.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/github.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/gitlab.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/config/vcs/pagination.py +0 -0
- {xai_review-0.37.0/ai_review/libs/http/event_hooks → xai_review-0.39.0/ai_review/libs/constants}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/constants/llm_provider.py +0 -0
- {xai_review-0.37.0/ai_review/libs/http/transports → xai_review-0.39.0/ai_review/libs/diff}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/models.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/parser.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/diff/tools.py +0 -0
- {xai_review-0.37.0/ai_review/libs/llm → xai_review-0.39.0/ai_review/libs/http}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/libs/template → xai_review-0.39.0/ai_review/libs/http/event_hooks}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/event_hooks/base.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/event_hooks/logger.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/handlers.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/paginate.py +0 -0
- {xai_review-0.37.0/ai_review/prompts → xai_review-0.39.0/ai_review/libs/http/transports}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/http/transports/retry.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/json.py +0 -0
- {xai_review-0.37.0/ai_review/resources → xai_review-0.39.0/ai_review/libs/llm}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/llm/output_json_parser.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/logger.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/resources.py +0 -0
- {xai_review-0.37.0/ai_review/services → xai_review-0.39.0/ai_review/libs/template}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/libs/template/render.py +0 -0
- {xai_review-0.37.0/ai_review/services/artifacts → xai_review-0.39.0/ai_review/prompts}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_context.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_inline.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_inline_reply.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_summary.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_summary_reply.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_context.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_inline.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_inline_reply.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_summary.md +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/prompts/default_system_summary_reply.md +0 -0
- {xai_review-0.37.0/ai_review/services/cost → xai_review-0.39.0/ai_review/resources}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/resources/pricing.yaml +0 -0
- {xai_review-0.37.0/ai_review/services/diff → xai_review-0.39.0/ai_review/services}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/services/git → xai_review-0.39.0/ai_review/services/artifacts}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/tools.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/artifacts/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm → xai_review-0.39.0/ai_review/services/cost}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/cost/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm/claude → xai_review-0.39.0/ai_review/services/diff}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/renderers.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/tools.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/diff/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm/gemini → xai_review-0.39.0/ai_review/services/git}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/git/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/git/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/constants.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/hook/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm/ollama → xai_review-0.39.0/ai_review/services/llm}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm/openai → xai_review-0.39.0/ai_review/services/llm/claude}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/claude/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/factory.py +0 -0
- {xai_review-0.37.0/ai_review/services/llm/openrouter → xai_review-0.39.0/ai_review/services/llm/gemini}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/gemini/client.py +0 -0
- {xai_review-0.37.0/ai_review/services/prompt → xai_review-0.39.0/ai_review/services/llm/ollama}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/ollama/client.py +0 -0
- {xai_review-0.37.0/ai_review/services/review → xai_review-0.39.0/ai_review/services/llm/openai}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/openai/client.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/gateway → xai_review-0.39.0/ai_review/services/llm/openrouter}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/openrouter/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/llm/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal → xai_review-0.39.0/ai_review/services/prompt}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/tools.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/prompt/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal/inline → xai_review-0.39.0/ai_review/services/review}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal/inline_reply → xai_review-0.39.0/ai_review/services/review/gateway}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/review_llm_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/gateway/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal/policy → xai_review-0.39.0/ai_review/services/review/internal}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal/summary → xai_review-0.39.0/ai_review/services/review/internal/inline}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/internal/summary_reply → xai_review-0.39.0/ai_review/services/review/internal/inline_reply}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/inline_reply/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/review/runner → xai_review-0.39.0/ai_review/services/review/internal/policy}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/policy/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/policy/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/vcs → xai_review-0.39.0/ai_review/services/review/internal/summary}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/vcs/bitbucket → xai_review-0.39.0/ai_review/services/review/internal/summary_reply}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/internal/summary_reply/types.py +0 -0
- {xai_review-0.37.0/ai_review/services/vcs/gitea → xai_review-0.39.0/ai_review/services/review/runner}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/context.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/inline.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/inline_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/summary.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/summary_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/runner/types.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/review/service.py +0 -0
- {xai_review-0.37.0/ai_review/services/vcs/github → xai_review-0.39.0/ai_review/services/vcs}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/services/vcs/gitlab → xai_review-0.39.0/ai_review/services/vcs/bitbucket_cloud}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests → xai_review-0.39.0/ai_review/services/vcs/bitbucket_server}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures → xai_review-0.39.0/ai_review/services/vcs/gitea}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitea/adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitea/client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/clients → xai_review-0.39.0/ai_review/services/vcs/github}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/github/adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/github/client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/libs → xai_review-0.39.0/ai_review/services/vcs/gitlab}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitlab/adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/gitlab/client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/services/vcs/types.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/libs/llm → xai_review-0.39.0/ai_review/tests}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/services → xai_review-0.39.0/ai_review/tests/fixtures}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/services/review → xai_review-0.39.0/ai_review/tests/fixtures/clients}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/claude.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gemini.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gitea.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/github.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/gitlab.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/ollama.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/openai.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/clients/openrouter.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/services/review/gateway → xai_review-0.39.0/ai_review/tests/fixtures/libs}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/services/review/internal → xai_review-0.39.0/ai_review/tests/fixtures/libs/llm}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/libs/llm/output_json_parser.py +0 -0
- {xai_review-0.37.0/ai_review/tests/fixtures/services/review/runner → xai_review-0.39.0/ai_review/tests/fixtures/services}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/artifacts.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/cost.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/diff.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/git.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/hook.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/llm.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/prompt.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites → xai_review-0.39.0/ai_review/tests/fixtures/services/review}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/base.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/cli → xai_review-0.39.0/ai_review/tests/fixtures/services/review/gateway}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_dry_run_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/gateway/review_llm_gateway.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients → xai_review-0.39.0/ai_review/tests/fixtures/services/review/internal}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/inline.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/inline_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/policy.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/summary.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/internal/summary_reply.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/bitbucket → xai_review-0.39.0/ai_review/tests/fixtures/services/review/runner}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/context.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/inline.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/inline_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/summary.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/review/runner/summary_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/fixtures/services/vcs.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/claude → xai_review-0.39.0/ai_review/tests/suites}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/gemini → xai_review-0.39.0/ai_review/tests/suites/cli}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/cli/test_main.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/gitea → xai_review-0.39.0/ai_review/tests/suites/clients}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/github → xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_cloud}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/gitlab → xai_review-0.39.0/ai_review/tests/suites/clients/bitbucket_server}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/ollama → xai_review-0.39.0/ai_review/tests/suites/clients/claude}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/claude/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/claude/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/openai → xai_review-0.39.0/ai_review/tests/suites/clients/gemini}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gemini/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gemini/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/openai/v1 → xai_review-0.39.0/ai_review/tests/suites/clients/gitea}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitea/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitea/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/openai/v2 → xai_review-0.39.0/ai_review/tests/suites/clients/github}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/github/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/github/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/clients/openrouter → xai_review-0.39.0/ai_review/tests/suites/clients/gitlab}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitlab/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/gitlab/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs → xai_review-0.39.0/ai_review/tests/suites/clients/ollama}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/ollama/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/ollama/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/asynchronous → xai_review-0.39.0/ai_review/tests/suites/clients/openai}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/config → xai_review-0.39.0/ai_review/tests/suites/clients/openai/v1}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v1/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v1/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/config/llm → xai_review-0.39.0/ai_review/tests/suites/clients/openai/v2}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v2/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openai/v2/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/diff → xai_review-0.39.0/ai_review/tests/suites/clients/openrouter}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openrouter/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/clients/openrouter/test_schema.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/http → xai_review-0.39.0/ai_review/tests/suites/libs}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/llm → xai_review-0.39.0/ai_review/tests/suites/libs/asynchronous}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/asynchronous/test_gather.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/libs/template → xai_review-0.39.0/ai_review/tests/suites/libs/config}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services → xai_review-0.39.0/ai_review/tests/suites/libs/config/llm}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/config/llm/test_openai.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/config/test_prompt.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/artifacts → xai_review-0.39.0/ai_review/tests/suites/libs/diff}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_models.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_parser.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/diff/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/cost → xai_review-0.39.0/ai_review/tests/suites/libs/http}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/http/test_paginate.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/diff → xai_review-0.39.0/ai_review/tests/suites/libs/llm}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/llm/test_output_json_parser.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/hook → xai_review-0.39.0/ai_review/tests/suites/libs/template}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/template/test_render.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/libs/test_json.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm → xai_review-0.39.0/ai_review/tests/suites/services}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm/claude → xai_review-0.39.0/ai_review/tests/suites/services/artifacts}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/artifacts/test_service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/artifacts/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm/gemini → xai_review-0.39.0/ai_review/tests/suites/services/cost}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/cost/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/cost/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm/ollama → xai_review-0.39.0/ai_review/tests/suites/services/diff}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_renderers.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/diff/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm/openai → xai_review-0.39.0/ai_review/tests/suites/services/hook}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/hook/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/llm/openrouter → xai_review-0.39.0/ai_review/tests/suites/services/llm}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/prompt → xai_review-0.39.0/ai_review/tests/suites/services/llm/claude}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/claude/test_client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review → xai_review-0.39.0/ai_review/tests/suites/services/llm/gemini}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/gemini/test_client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/gateway → xai_review-0.39.0/ai_review/tests/suites/services/llm/ollama}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/ollama/test_client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal → xai_review-0.39.0/ai_review/tests/suites/services/llm/openai}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/openai/test_client.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/inline → xai_review-0.39.0/ai_review/tests/suites/services/llm/openrouter}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/openrouter/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/llm/test_factory.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/inline_reply → xai_review-0.39.0/ai_review/tests/suites/services/prompt}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/prompt/test_tools.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/policy → xai_review-0.39.0/ai_review/tests/suites/services/review}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/summary → xai_review-0.39.0/ai_review/tests/suites/services/review/gateway}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_dry_run_comment_gateway.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/gateway/test_review_llm_gateway.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/internal/summary_reply → xai_review-0.39.0/ai_review/tests/suites/services/review/internal}/__init__.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/review/runner → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/inline}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/inline_reply}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/inline_reply/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/bitbucket → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/policy}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/policy/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/gitea → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/summary}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/github → xai_review-0.39.0/ai_review/tests/suites/services/review/internal/summary_reply}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_schema.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/internal/summary_reply/test_service.py +0 -0
- {xai_review-0.37.0/ai_review/tests/suites/services/vcs/gitlab → xai_review-0.39.0/ai_review/tests/suites/services/review/runner}/__init__.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_context.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_inline.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_inline_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_summary.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/runner/test_summary_reply.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/review/test_service.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitea/test_adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitea/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/github/test_adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/github/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitlab/test_adapter.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/ai_review/tests/suites/services/vcs/gitlab/test_client.py +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/setup.cfg +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/dependency_links.txt +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/entry_points.txt +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/requires.txt +0 -0
- {xai_review-0.37.0 → xai_review-0.39.0}/xai_review.egg-info/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: xai-review
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI-powered code review tool for GitHub, GitLab, Bitbucket and Gitea — built with LLMs like OpenAI, Claude, Gemini, Ollama, and OpenRouter
|
|
5
|
-
Author-email: Nikita Filonov <nikita.filonov@
|
|
3
|
+
Version: 0.39.0
|
|
4
|
+
Summary: AI-powered code review tool for GitHub, GitLab, Bitbucket Cloud, Bitbucket Server and Gitea — built with LLMs like OpenAI, Claude, Gemini, Ollama, and OpenRouter
|
|
5
|
+
Author-email: Nikita Filonov <nikita.filonov@gmail.com>
|
|
6
6
|
Maintainer-email: Nikita Filonov <nikita.filonov@example.com>
|
|
7
7
|
License: Apache License
|
|
8
8
|
Version 2.0, January 2004
|
|
@@ -208,7 +208,7 @@ License: Apache License
|
|
|
208
208
|
Project-URL: Issues, https://github.com/Nikita-Filonov/ai-review/issues
|
|
209
209
|
Project-URL: Homepage, https://github.com/Nikita-Filonov/ai-review
|
|
210
210
|
Project-URL: Repository, https://github.com/Nikita-Filonov/ai-review
|
|
211
|
-
Keywords: ai,code review,llm,openai,claude,gemini,ollama,openrouter,ci/cd,gitlab,github,gitea,bitbucket
|
|
211
|
+
Keywords: ai,code review,llm,openai,claude,gemini,ollama,openrouter,ci/cd,gitlab,github,gitea,bitbucket,bitbucket cloud,bitbucket server
|
|
212
212
|
Classifier: Programming Language :: Python :: 3
|
|
213
213
|
Classifier: Programming Language :: Python :: 3.11
|
|
214
214
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -268,7 +268,8 @@ improve code quality, enforce consistency, and speed up the review process.
|
|
|
268
268
|
|
|
269
269
|
- **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, **Ollama**, or **OpenRouter**, and
|
|
270
270
|
switch anytime.
|
|
271
|
-
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**,
|
|
271
|
+
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**,
|
|
272
|
+
and **Gitea**.
|
|
272
273
|
- **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
|
|
273
274
|
- **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
|
|
274
275
|
summary discussions.
|
|
@@ -379,7 +380,8 @@ Key things you can customize:
|
|
|
379
380
|
|
|
380
381
|
- **LLM provider** — OpenAI, Gemini, Claude, Ollama, or OpenRouter
|
|
381
382
|
- **Model settings** — model name, temperature, max tokens
|
|
382
|
-
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and
|
|
383
|
+
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**, and
|
|
384
|
+
**Gitea**
|
|
383
385
|
- **Review policy** — which files to include/exclude, review modes
|
|
384
386
|
- **Prompts** — inline/context/summary prompt templates
|
|
385
387
|
|
|
@@ -421,7 +423,7 @@ jobs:
|
|
|
421
423
|
with:
|
|
422
424
|
fetch-depth: 0
|
|
423
425
|
|
|
424
|
-
- uses: Nikita-Filonov/ai-review@v0.
|
|
426
|
+
- uses: Nikita-Filonov/ai-review@v0.39.0
|
|
425
427
|
with:
|
|
426
428
|
review-command: ${{ inputs.review-command }}
|
|
427
429
|
env:
|
|
@@ -34,7 +34,8 @@ improve code quality, enforce consistency, and speed up the review process.
|
|
|
34
34
|
|
|
35
35
|
- **Multiple LLM providers** — choose between **OpenAI**, **Claude**, **Gemini**, **Ollama**, or **OpenRouter**, and
|
|
36
36
|
switch anytime.
|
|
37
|
-
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**,
|
|
37
|
+
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**,
|
|
38
|
+
and **Gitea**.
|
|
38
39
|
- **Customizable prompts** — adapt inline, context, and summary reviews to match your team’s coding guidelines.
|
|
39
40
|
- **Reply modes** — AI can now **participate in existing review threads**, adding follow-up replies in both inline and
|
|
40
41
|
summary discussions.
|
|
@@ -145,7 +146,8 @@ Key things you can customize:
|
|
|
145
146
|
|
|
146
147
|
- **LLM provider** — OpenAI, Gemini, Claude, Ollama, or OpenRouter
|
|
147
148
|
- **Model settings** — model name, temperature, max tokens
|
|
148
|
-
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket**, and
|
|
149
|
+
- **VCS integration** — works out of the box with **GitLab**, **GitHub**, **Bitbucket Cloud**, **Bitbucket Server**, and
|
|
150
|
+
**Gitea**
|
|
149
151
|
- **Review policy** — which files to include/exclude, review modes
|
|
150
152
|
- **Prompts** — inline/context/summary prompt templates
|
|
151
153
|
|
|
@@ -187,7 +189,7 @@ jobs:
|
|
|
187
189
|
with:
|
|
188
190
|
fetch-depth: 0
|
|
189
191
|
|
|
190
|
-
- uses: Nikita-Filonov/ai-review@v0.
|
|
192
|
+
- uses: Nikita-Filonov/ai-review@v0.39.0
|
|
191
193
|
with:
|
|
192
194
|
review-command: ${{ inputs.review-command }}
|
|
193
195
|
env:
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
from ai_review.clients.bitbucket.pr.client import BitbucketPullRequestsHTTPClient
|
|
2
1
|
from httpx import AsyncClient, AsyncHTTPTransport
|
|
3
2
|
|
|
3
|
+
from ai_review.clients.bitbucket_cloud.pr.client import BitbucketCloudPullRequestsHTTPClient
|
|
4
4
|
from ai_review.config import settings
|
|
5
5
|
from ai_review.libs.http.event_hooks.logger import LoggerEventHook
|
|
6
6
|
from ai_review.libs.http.transports.retry import RetryTransport
|
|
7
7
|
from ai_review.libs.logger import get_logger
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class BitbucketCloudHTTPClient:
|
|
11
11
|
def __init__(self, client: AsyncClient):
|
|
12
|
-
self.pr =
|
|
12
|
+
self.pr = BitbucketCloudPullRequestsHTTPClient(client)
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def
|
|
16
|
-
logger = get_logger("
|
|
15
|
+
def get_bitbucket_cloud_http_client() -> BitbucketCloudHTTPClient:
|
|
16
|
+
logger = get_logger("BITBUCKET_CLOUD_HTTP_CLIENT")
|
|
17
17
|
logger_event_hook = LoggerEventHook(logger=logger)
|
|
18
18
|
retry_transport = RetryTransport(logger=logger, transport=AsyncHTTPTransport())
|
|
19
19
|
|
|
@@ -29,4 +29,4 @@ def get_bitbucket_http_client() -> BitbucketHTTPClient:
|
|
|
29
29
|
}
|
|
30
30
|
)
|
|
31
31
|
|
|
32
|
-
return
|
|
32
|
+
return BitbucketCloudHTTPClient(client=client)
|
|
@@ -1,72 +1,84 @@
|
|
|
1
1
|
from httpx import Response, QueryParams
|
|
2
2
|
|
|
3
|
-
from ai_review.clients.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.comments import (
|
|
4
|
+
BitbucketCloudPRCommentSchema,
|
|
5
|
+
BitbucketCloudGetPRCommentsQuerySchema,
|
|
6
|
+
BitbucketCloudGetPRCommentsResponseSchema,
|
|
7
|
+
BitbucketCloudCreatePRCommentRequestSchema,
|
|
8
|
+
BitbucketCloudCreatePRCommentResponseSchema,
|
|
9
9
|
)
|
|
10
|
-
from ai_review.clients.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.files import (
|
|
11
|
+
BitbucketCloudPRFileSchema,
|
|
12
|
+
BitbucketCloudGetPRFilesQuerySchema,
|
|
13
|
+
BitbucketCloudGetPRFilesResponseSchema,
|
|
14
14
|
)
|
|
15
|
-
from ai_review.clients.
|
|
16
|
-
from ai_review.clients.
|
|
17
|
-
from ai_review.clients.
|
|
15
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.pull_request import BitbucketCloudGetPRResponseSchema
|
|
16
|
+
from ai_review.clients.bitbucket_cloud.pr.types import BitbucketCloudPullRequestsHTTPClientProtocol
|
|
17
|
+
from ai_review.clients.bitbucket_cloud.tools import bitbucket_cloud_has_next_page
|
|
18
18
|
from ai_review.config import settings
|
|
19
19
|
from ai_review.libs.http.client import HTTPClient
|
|
20
20
|
from ai_review.libs.http.handlers import handle_http_error, HTTPClientError
|
|
21
21
|
from ai_review.libs.http.paginate import paginate
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
class
|
|
24
|
+
class BitbucketCloudPullRequestsHTTPClientError(HTTPClientError):
|
|
25
25
|
pass
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
class
|
|
29
|
-
@handle_http_error(
|
|
28
|
+
class BitbucketCloudPullRequestsHTTPClient(HTTPClient, BitbucketCloudPullRequestsHTTPClientProtocol):
|
|
29
|
+
@handle_http_error(
|
|
30
|
+
client="BitbucketCloudPullRequestsHTTPClient",
|
|
31
|
+
exception=BitbucketCloudPullRequestsHTTPClientError
|
|
32
|
+
)
|
|
30
33
|
async def get_pull_request_api(self, workspace: str, repo_slug: str, pull_request_id: str) -> Response:
|
|
31
34
|
return await self.get(f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}")
|
|
32
35
|
|
|
33
|
-
@handle_http_error(
|
|
36
|
+
@handle_http_error(
|
|
37
|
+
client="BitbucketCloudPullRequestsHTTPClient",
|
|
38
|
+
exception=BitbucketCloudPullRequestsHTTPClientError
|
|
39
|
+
)
|
|
34
40
|
async def get_diffstat_api(
|
|
35
41
|
self,
|
|
36
42
|
workspace: str,
|
|
37
43
|
repo_slug: str,
|
|
38
44
|
pull_request_id: str,
|
|
39
|
-
query:
|
|
45
|
+
query: BitbucketCloudGetPRFilesQuerySchema,
|
|
40
46
|
) -> Response:
|
|
41
47
|
return await self.get(
|
|
42
48
|
f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/diffstat",
|
|
43
49
|
query=QueryParams(**query.model_dump(by_alias=True)),
|
|
44
50
|
)
|
|
45
51
|
|
|
46
|
-
@handle_http_error(
|
|
52
|
+
@handle_http_error(
|
|
53
|
+
client="BitbucketCloudPullRequestsHTTPClient",
|
|
54
|
+
exception=BitbucketCloudPullRequestsHTTPClientError
|
|
55
|
+
)
|
|
47
56
|
async def get_comments_api(
|
|
48
57
|
self,
|
|
49
58
|
workspace: str,
|
|
50
59
|
repo_slug: str,
|
|
51
60
|
pull_request_id: str,
|
|
52
|
-
query:
|
|
61
|
+
query: BitbucketCloudGetPRCommentsQuerySchema,
|
|
53
62
|
) -> Response:
|
|
54
63
|
return await self.get(
|
|
55
64
|
f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments",
|
|
56
65
|
query=QueryParams(**query.model_dump(by_alias=True)),
|
|
57
66
|
)
|
|
58
67
|
|
|
59
|
-
@handle_http_error(
|
|
68
|
+
@handle_http_error(
|
|
69
|
+
client="BitbucketCloudPullRequestsHTTPClient",
|
|
70
|
+
exception=BitbucketCloudPullRequestsHTTPClientError
|
|
71
|
+
)
|
|
60
72
|
async def create_comment_api(
|
|
61
73
|
self,
|
|
62
74
|
workspace: str,
|
|
63
75
|
repo_slug: str,
|
|
64
76
|
pull_request_id: str,
|
|
65
|
-
request:
|
|
77
|
+
request: BitbucketCloudCreatePRCommentRequestSchema,
|
|
66
78
|
) -> Response:
|
|
67
79
|
return await self.post(
|
|
68
80
|
f"/repositories/{workspace}/{repo_slug}/pullrequests/{pull_request_id}/comments",
|
|
69
|
-
json=request.model_dump(by_alias=True),
|
|
81
|
+
json=request.model_dump(by_alias=True, exclude_none=True),
|
|
70
82
|
)
|
|
71
83
|
|
|
72
84
|
async def get_pull_request(
|
|
@@ -74,31 +86,31 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
|
|
|
74
86
|
workspace: str,
|
|
75
87
|
repo_slug: str,
|
|
76
88
|
pull_request_id: str
|
|
77
|
-
) ->
|
|
89
|
+
) -> BitbucketCloudGetPRResponseSchema:
|
|
78
90
|
resp = await self.get_pull_request_api(workspace, repo_slug, pull_request_id)
|
|
79
|
-
return
|
|
91
|
+
return BitbucketCloudGetPRResponseSchema.model_validate_json(resp.text)
|
|
80
92
|
|
|
81
93
|
async def get_files(
|
|
82
94
|
self,
|
|
83
95
|
workspace: str,
|
|
84
96
|
repo_slug: str,
|
|
85
97
|
pull_request_id: str
|
|
86
|
-
) ->
|
|
98
|
+
) -> BitbucketCloudGetPRFilesResponseSchema:
|
|
87
99
|
async def fetch_page(page: int) -> Response:
|
|
88
|
-
query =
|
|
100
|
+
query = BitbucketCloudGetPRFilesQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
|
|
89
101
|
return await self.get_diffstat_api(workspace, repo_slug, pull_request_id, query)
|
|
90
102
|
|
|
91
|
-
def extract_items(response: Response) -> list[
|
|
92
|
-
result =
|
|
103
|
+
def extract_items(response: Response) -> list[BitbucketCloudPRFileSchema]:
|
|
104
|
+
result = BitbucketCloudGetPRFilesResponseSchema.model_validate_json(response.text)
|
|
93
105
|
return result.values
|
|
94
106
|
|
|
95
107
|
items = await paginate(
|
|
96
108
|
max_pages=settings.vcs.pagination.max_pages,
|
|
97
109
|
fetch_page=fetch_page,
|
|
98
110
|
extract_items=extract_items,
|
|
99
|
-
has_next_page=
|
|
111
|
+
has_next_page=bitbucket_cloud_has_next_page
|
|
100
112
|
)
|
|
101
|
-
return
|
|
113
|
+
return BitbucketCloudGetPRFilesResponseSchema(
|
|
102
114
|
size=len(items),
|
|
103
115
|
values=items,
|
|
104
116
|
page_len=settings.vcs.pagination.per_page
|
|
@@ -109,22 +121,22 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
|
|
|
109
121
|
workspace: str,
|
|
110
122
|
repo_slug: str,
|
|
111
123
|
pull_request_id: str
|
|
112
|
-
) ->
|
|
124
|
+
) -> BitbucketCloudGetPRCommentsResponseSchema:
|
|
113
125
|
async def fetch_page(page: int) -> Response:
|
|
114
|
-
query =
|
|
126
|
+
query = BitbucketCloudGetPRCommentsQuerySchema(page=page, page_len=settings.vcs.pagination.per_page)
|
|
115
127
|
return await self.get_comments_api(workspace, repo_slug, pull_request_id, query)
|
|
116
128
|
|
|
117
|
-
def extract_items(response: Response) -> list[
|
|
118
|
-
result =
|
|
129
|
+
def extract_items(response: Response) -> list[BitbucketCloudPRCommentSchema]:
|
|
130
|
+
result = BitbucketCloudGetPRCommentsResponseSchema.model_validate_json(response.text)
|
|
119
131
|
return result.values
|
|
120
132
|
|
|
121
133
|
items = await paginate(
|
|
122
134
|
max_pages=settings.vcs.pagination.max_pages,
|
|
123
135
|
fetch_page=fetch_page,
|
|
124
136
|
extract_items=extract_items,
|
|
125
|
-
has_next_page=
|
|
137
|
+
has_next_page=bitbucket_cloud_has_next_page
|
|
126
138
|
)
|
|
127
|
-
return
|
|
139
|
+
return BitbucketCloudGetPRCommentsResponseSchema(
|
|
128
140
|
size=len(items),
|
|
129
141
|
values=items,
|
|
130
142
|
page_len=settings.vcs.pagination.per_page
|
|
@@ -135,7 +147,7 @@ class BitbucketPullRequestsHTTPClient(HTTPClient, BitbucketPullRequestsHTTPClien
|
|
|
135
147
|
workspace: str,
|
|
136
148
|
repo_slug: str,
|
|
137
149
|
pull_request_id: str,
|
|
138
|
-
request:
|
|
139
|
-
) ->
|
|
150
|
+
request: BitbucketCloudCreatePRCommentRequestSchema
|
|
151
|
+
) -> BitbucketCloudCreatePRCommentResponseSchema:
|
|
140
152
|
response = await self.create_comment_api(workspace, repo_slug, pull_request_id, request)
|
|
141
|
-
return
|
|
153
|
+
return BitbucketCloudCreatePRCommentResponseSchema.model_validate_json(response.text)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field, ConfigDict
|
|
2
|
+
|
|
3
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.user import BitbucketCloudUserSchema
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BitbucketCloudCommentContentSchema(BaseModel):
|
|
7
|
+
raw: str
|
|
8
|
+
html: str | None = None
|
|
9
|
+
markup: str | None = None
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BitbucketCloudCommentInlineSchema(BaseModel):
|
|
13
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
14
|
+
|
|
15
|
+
path: str
|
|
16
|
+
to_line: int | None = Field(alias="to", default=None)
|
|
17
|
+
from_line: int | None = Field(alias="from", default=None)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BitbucketCloudCommentParentSchema(BaseModel):
|
|
21
|
+
id: int
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class BitbucketCloudPRCommentSchema(BaseModel):
|
|
25
|
+
id: int
|
|
26
|
+
user: BitbucketCloudUserSchema | None = None
|
|
27
|
+
parent: BitbucketCloudCommentParentSchema | None = None
|
|
28
|
+
inline: BitbucketCloudCommentInlineSchema | None = None
|
|
29
|
+
content: BitbucketCloudCommentContentSchema
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class BitbucketCloudGetPRCommentsQuerySchema(BaseModel):
|
|
33
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
34
|
+
|
|
35
|
+
page: int = 1
|
|
36
|
+
page_len: int = Field(alias="pagelen", default=100)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BitbucketCloudGetPRCommentsResponseSchema(BaseModel):
|
|
40
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
41
|
+
|
|
42
|
+
size: int
|
|
43
|
+
page: int | None = None
|
|
44
|
+
next: str | None = None
|
|
45
|
+
values: list[BitbucketCloudPRCommentSchema]
|
|
46
|
+
page_len: int = Field(alias="pagelen")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class BitbucketCloudCreatePRCommentRequestSchema(BaseModel):
|
|
50
|
+
parent: BitbucketCloudCommentParentSchema | None = None
|
|
51
|
+
inline: BitbucketCloudCommentInlineSchema | None = None
|
|
52
|
+
content: BitbucketCloudCommentContentSchema
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class BitbucketCloudCreatePRCommentResponseSchema(BaseModel):
|
|
56
|
+
id: int
|
|
57
|
+
parent: BitbucketCloudCommentParentSchema | None = None
|
|
58
|
+
inline: BitbucketCloudCommentInlineSchema | None = None
|
|
59
|
+
content: BitbucketCloudCommentContentSchema
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
from pydantic import BaseModel, Field, ConfigDict
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class
|
|
4
|
+
class BitbucketCloudPRFilePathSchema(BaseModel):
|
|
5
5
|
path: str
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
9
|
-
new:
|
|
10
|
-
old:
|
|
8
|
+
class BitbucketCloudPRFileSchema(BaseModel):
|
|
9
|
+
new: BitbucketCloudPRFilePathSchema | None = None
|
|
10
|
+
old: BitbucketCloudPRFilePathSchema | None = None
|
|
11
11
|
status: str
|
|
12
12
|
lines_added: int
|
|
13
13
|
lines_removed: int
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class
|
|
16
|
+
class BitbucketCloudGetPRFilesQuerySchema(BaseModel):
|
|
17
17
|
model_config = ConfigDict(populate_by_name=True)
|
|
18
18
|
|
|
19
19
|
page: int = 1
|
|
20
20
|
page_len: int = Field(alias="pagelen", default=100)
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class
|
|
23
|
+
class BitbucketCloudGetPRFilesResponseSchema(BaseModel):
|
|
24
24
|
model_config = ConfigDict(populate_by_name=True)
|
|
25
25
|
|
|
26
26
|
size: int
|
|
27
27
|
page: int | None = None
|
|
28
28
|
next: str | None = None
|
|
29
|
-
values: list[
|
|
29
|
+
values: list[BitbucketCloudPRFileSchema]
|
|
30
30
|
page_len: int = Field(alias="pagelen")
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field
|
|
2
|
+
|
|
3
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.user import BitbucketCloudUserSchema
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BitbucketCloudBranchSchema(BaseModel):
|
|
7
|
+
name: str
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BitbucketCloudCommitSchema(BaseModel):
|
|
11
|
+
hash: str
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BitbucketCloudRepositorySchema(BaseModel):
|
|
15
|
+
uuid: str
|
|
16
|
+
full_name: str
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BitbucketCloudPRLocationSchema(BaseModel):
|
|
20
|
+
branch: BitbucketCloudBranchSchema
|
|
21
|
+
commit: BitbucketCloudCommitSchema
|
|
22
|
+
repository: BitbucketCloudRepositorySchema
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BitbucketCloudGetPRResponseSchema(BaseModel):
|
|
26
|
+
id: int
|
|
27
|
+
title: str
|
|
28
|
+
description: str | None = None
|
|
29
|
+
state: str
|
|
30
|
+
author: BitbucketCloudUserSchema
|
|
31
|
+
source: BitbucketCloudPRLocationSchema
|
|
32
|
+
destination: BitbucketCloudPRLocationSchema
|
|
33
|
+
reviewers: list[BitbucketCloudUserSchema] = Field(default_factory=list)
|
|
34
|
+
participants: list[BitbucketCloudUserSchema] = Field(default_factory=list)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from typing import Protocol
|
|
2
|
+
|
|
3
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.comments import (
|
|
4
|
+
BitbucketCloudGetPRCommentsResponseSchema,
|
|
5
|
+
BitbucketCloudCreatePRCommentRequestSchema,
|
|
6
|
+
BitbucketCloudCreatePRCommentResponseSchema,
|
|
7
|
+
)
|
|
8
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.files import BitbucketCloudGetPRFilesResponseSchema
|
|
9
|
+
from ai_review.clients.bitbucket_cloud.pr.schema.pull_request import BitbucketCloudGetPRResponseSchema
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BitbucketCloudPullRequestsHTTPClientProtocol(Protocol):
|
|
13
|
+
async def get_pull_request(
|
|
14
|
+
self,
|
|
15
|
+
workspace: str,
|
|
16
|
+
repo_slug: str,
|
|
17
|
+
pull_request_id: str
|
|
18
|
+
) -> BitbucketCloudGetPRResponseSchema:
|
|
19
|
+
...
|
|
20
|
+
|
|
21
|
+
async def get_files(
|
|
22
|
+
self,
|
|
23
|
+
workspace: str,
|
|
24
|
+
repo_slug: str,
|
|
25
|
+
pull_request_id: str
|
|
26
|
+
) -> BitbucketCloudGetPRFilesResponseSchema:
|
|
27
|
+
...
|
|
28
|
+
|
|
29
|
+
async def get_comments(
|
|
30
|
+
self,
|
|
31
|
+
workspace: str,
|
|
32
|
+
repo_slug: str,
|
|
33
|
+
pull_request_id: str
|
|
34
|
+
) -> BitbucketCloudGetPRCommentsResponseSchema:
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
async def create_comment(
|
|
38
|
+
self,
|
|
39
|
+
workspace: str,
|
|
40
|
+
repo_slug: str,
|
|
41
|
+
pull_request_id: str,
|
|
42
|
+
request: BitbucketCloudCreatePRCommentRequestSchema,
|
|
43
|
+
) -> BitbucketCloudCreatePRCommentResponseSchema:
|
|
44
|
+
...
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from ai_review.clients.bitbucket_server.pr.client import BitbucketServerPullRequestsHTTPClient
|
|
2
|
+
from httpx import AsyncClient, AsyncHTTPTransport
|
|
3
|
+
|
|
4
|
+
from ai_review.config import settings
|
|
5
|
+
from ai_review.libs.http.event_hooks.logger import LoggerEventHook
|
|
6
|
+
from ai_review.libs.http.transports.retry import RetryTransport
|
|
7
|
+
from ai_review.libs.logger import get_logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BitbucketServerHTTPClient:
|
|
11
|
+
def __init__(self, client: AsyncClient):
|
|
12
|
+
self.pr = BitbucketServerPullRequestsHTTPClient(client)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_bitbucket_server_http_client() -> BitbucketServerHTTPClient:
|
|
16
|
+
logger = get_logger("BITBUCKET_SERVER_HTTP_CLIENT")
|
|
17
|
+
logger_event_hook = LoggerEventHook(logger=logger)
|
|
18
|
+
retry_transport = RetryTransport(logger=logger, transport=AsyncHTTPTransport())
|
|
19
|
+
|
|
20
|
+
client = AsyncClient(
|
|
21
|
+
verify=settings.vcs.http_client.verify,
|
|
22
|
+
timeout=settings.vcs.http_client.timeout,
|
|
23
|
+
headers={"Authorization": f"Basic {settings.vcs.http_client.api_token_value}"},
|
|
24
|
+
base_url=settings.vcs.http_client.api_url_value,
|
|
25
|
+
transport=retry_transport,
|
|
26
|
+
event_hooks={
|
|
27
|
+
"request": [logger_event_hook.request],
|
|
28
|
+
"response": [logger_event_hook.response],
|
|
29
|
+
},
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return BitbucketServerHTTPClient(client=client)
|