xai-review 0.10.0__tar.gz → 0.11.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.10.0 → xai_review-0.11.0}/PKG-INFO +1 -1
- xai_review-0.11.0/ai_review/libs/json.py +16 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/inline/service.py +2 -2
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/test_json.py +2 -16
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/inline/test_service.py +6 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/pyproject.toml +1 -1
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/PKG-INFO +1 -1
- xai_review-0.10.0/ai_review/libs/json.py +0 -19
- {xai_review-0.10.0 → xai_review-0.11.0}/LICENSE +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/README.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/commands/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/commands/run_context_review.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/commands/run_inline_review.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/commands/run_review.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/commands/run_summary_review.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/cli/main.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/claude/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/claude/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/claude/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gemini/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gemini/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gemini/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/schema/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/schema/changes.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/schema/comments.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/gitlab/mr/schema/discussions.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/openai/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/openai/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/clients/openai/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/config.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/asynchronous/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/asynchronous/gather.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/artifacts.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/base.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/claude.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/gemini.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/gitlab.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/http.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/llm.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/logger.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/openai.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/prompt.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/review.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/config/vcs.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/constants/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/constants/llm_provider.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/constants/vcs_provider.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/diff/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/diff/models.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/diff/parser.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/diff/tools.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/event_hooks/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/event_hooks/base.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/event_hooks/logger.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/handlers.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/transports/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/http/transports/retry.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/logger.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/resources.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/template/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/libs/template/render.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_context.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_inline.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_summary.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_system_context.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_system_inline.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/prompts/default_system_summary.md +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/resources/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/resources/pricing.yaml +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/artifacts/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/artifacts/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/artifacts/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/artifacts/tools.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/cost/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/cost/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/cost/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/diff/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/diff/renderers.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/diff/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/diff/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/diff/tools.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/git/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/git/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/git/types.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/claude/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/claude/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/factory.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/gemini/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/gemini/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/openai/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/openai/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/llm/types.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/prompt/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/prompt/adapter.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/prompt/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/prompt/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/inline/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/inline/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/policy/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/policy/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/summary/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/summary/schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/review/summary/service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/vcs/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/vcs/factory.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/vcs/gitlab/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/vcs/gitlab/client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/services/vcs/types.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/fixtures/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/fixtures/git.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/claude/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/claude/test_client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/claude/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gemini/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gemini/test_client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gemini/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gitlab/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gitlab/test_client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/openai/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/openai/test_client.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/openai/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/config/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/config/test_prompt.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/diff/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/diff/test_models.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/diff/test_parser.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/diff/test_tools.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/template/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/libs/template/test_render.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/test_renderers.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/test_service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/test_tools.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/prompt/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/prompt/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/prompt/test_service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/inline/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/inline/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/policy/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/policy/test_service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/summary/__init__.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/summary/test_schema.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/summary/test_service.py +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/setup.cfg +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/SOURCES.txt +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/dependency_links.txt +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/entry_points.txt +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/requires.txt +0 -0
- {xai_review-0.10.0 → xai_review-0.11.0}/xai_review.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
CONTROL_CHARS_RE = re.compile(r"[\x00-\x1F]")
|
|
4
|
+
REPLACEMENTS = {
|
|
5
|
+
"\n": "\\n",
|
|
6
|
+
"\r": "\\r",
|
|
7
|
+
"\t": "\\t",
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def sanitize_json_string(raw: str) -> str:
|
|
12
|
+
def replace(match: re.Match) -> str:
|
|
13
|
+
char = match.group()
|
|
14
|
+
return REPLACEMENTS.get(char, f"\\u{ord(char):04x}")
|
|
15
|
+
|
|
16
|
+
return CONTROL_CHARS_RE.sub(replace, raw)
|
|
@@ -18,12 +18,12 @@ class InlineCommentService:
|
|
|
18
18
|
try:
|
|
19
19
|
return InlineCommentListSchema.model_validate_json(raw)
|
|
20
20
|
except ValidationError as error:
|
|
21
|
-
logger.
|
|
21
|
+
logger.warning(f"Parse failed, trying sanitized JSON: {raw[:200]=}, {error=}")
|
|
22
22
|
try:
|
|
23
23
|
cleaned = sanitize_json_string(raw)
|
|
24
24
|
return InlineCommentListSchema.model_validate_json(cleaned)
|
|
25
25
|
except ValidationError as error:
|
|
26
|
-
logger.
|
|
26
|
+
logger.warning(f"Sanitized JSON still invalid: {raw[:200]=}, {error=}")
|
|
27
27
|
return None
|
|
28
28
|
|
|
29
29
|
@classmethod
|
|
@@ -12,30 +12,16 @@ from ai_review.libs.json import sanitize_json_string
|
|
|
12
12
|
("a\tb", "a\\tb"),
|
|
13
13
|
("abc\0def", "abc\\u0000def"),
|
|
14
14
|
("x\n\ry\t\0z", "x\\n\\ry\\t\\u0000z"),
|
|
15
|
+
("\n\r\t\0", "\\n\\r\\t\\u0000"),
|
|
16
|
+
("", "")
|
|
15
17
|
],
|
|
16
18
|
)
|
|
17
19
|
def test_sanitize_basic_cases(actual: str, expected: str) -> None:
|
|
18
20
|
assert sanitize_json_string(actual) == expected
|
|
19
21
|
|
|
20
22
|
|
|
21
|
-
def test_sanitize_multiple_control_chars() -> None:
|
|
22
|
-
raw = "A\nB\rC\tD\0E"
|
|
23
|
-
result = sanitize_json_string(raw)
|
|
24
|
-
assert result == "A\\nB\\rC\\tD\\u0000E"
|
|
25
|
-
|
|
26
|
-
|
|
27
23
|
def test_sanitize_idempotent() -> None:
|
|
28
24
|
raw = "foo\nbar"
|
|
29
25
|
once = sanitize_json_string(raw)
|
|
30
26
|
twice = sanitize_json_string(once)
|
|
31
27
|
assert once == twice
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def test_sanitize_empty_string() -> None:
|
|
35
|
-
assert sanitize_json_string("") == ""
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_sanitize_only_control_chars() -> None:
|
|
39
|
-
raw = "\n\r\t\0"
|
|
40
|
-
result = sanitize_json_string(raw)
|
|
41
|
-
assert result == "\\n\\r\\t\\u0000"
|
|
@@ -53,6 +53,8 @@ def test_json_with_raw_newline_sanitized():
|
|
|
53
53
|
output = '[{"file": "e.py", "line": 3, "message": "line1\nline2"}]'
|
|
54
54
|
result = InlineCommentService.parse_model_output(output)
|
|
55
55
|
assert len(result.root) == 1
|
|
56
|
+
assert result.root[0].file == "e.py"
|
|
57
|
+
assert result.root[0].line == 3
|
|
56
58
|
assert result.root[0].message == "line1\nline2"
|
|
57
59
|
|
|
58
60
|
|
|
@@ -85,6 +87,8 @@ def test_try_parse_valid_json():
|
|
|
85
87
|
assert isinstance(result, InlineCommentListSchema)
|
|
86
88
|
assert len(result.root) == 1
|
|
87
89
|
assert result.root[0].file == "ok.py"
|
|
90
|
+
assert result.root[0].line == 1
|
|
91
|
+
assert result.root[0].message == "all good"
|
|
88
92
|
|
|
89
93
|
|
|
90
94
|
def test_try_parse_needs_sanitization():
|
|
@@ -92,6 +96,8 @@ def test_try_parse_needs_sanitization():
|
|
|
92
96
|
result = InlineCommentService.try_parse_model_output(raw)
|
|
93
97
|
assert result is not None
|
|
94
98
|
assert result.root[0].file == "bad.py"
|
|
99
|
+
assert result.root[0].line == 2
|
|
100
|
+
assert result.root[0].message == "line1\nline2"
|
|
95
101
|
assert "line1" in result.root[0].message
|
|
96
102
|
|
|
97
103
|
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
|
|
3
|
-
CONTROL_CHARS_RE = re.compile(r"[\x00-\x1F]")
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def sanitize_json_string(raw: str) -> str:
|
|
7
|
-
def replace(match: re.Match) -> str:
|
|
8
|
-
char = match.group()
|
|
9
|
-
match char:
|
|
10
|
-
case "\n":
|
|
11
|
-
return "\\n"
|
|
12
|
-
case "\r":
|
|
13
|
-
return "\\r"
|
|
14
|
-
case "\t":
|
|
15
|
-
return "\\t"
|
|
16
|
-
case _:
|
|
17
|
-
return f"\\u{ord(char):04x}"
|
|
18
|
-
|
|
19
|
-
return CONTROL_CHARS_RE.sub(replace, raw)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/claude/test_client.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/claude/test_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gemini/test_client.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gemini/test_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/gitlab/test_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/openai/test_client.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/clients/openai/test_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/test_renderers.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/diff/test_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/prompt/test_schema.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/prompt/test_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/inline/__init__.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/inline/test_schema.py
RENAMED
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/policy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{xai_review-0.10.0 → xai_review-0.11.0}/ai_review/tests/suites/services/review/summary/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|