codexa 0.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codexa-0.4.0.dist-info/METADATA +650 -0
- codexa-0.4.0.dist-info/RECORD +189 -0
- codexa-0.4.0.dist-info/WHEEL +5 -0
- codexa-0.4.0.dist-info/entry_points.txt +2 -0
- codexa-0.4.0.dist-info/licenses/LICENSE +21 -0
- codexa-0.4.0.dist-info/top_level.txt +1 -0
- semantic_code_intelligence/__init__.py +5 -0
- semantic_code_intelligence/analysis/__init__.py +21 -0
- semantic_code_intelligence/analysis/ai_features.py +351 -0
- semantic_code_intelligence/bridge/__init__.py +28 -0
- semantic_code_intelligence/bridge/context_provider.py +245 -0
- semantic_code_intelligence/bridge/protocol.py +167 -0
- semantic_code_intelligence/bridge/server.py +348 -0
- semantic_code_intelligence/bridge/vscode.py +271 -0
- semantic_code_intelligence/ci/__init__.py +13 -0
- semantic_code_intelligence/ci/hooks.py +98 -0
- semantic_code_intelligence/ci/hotspots.py +272 -0
- semantic_code_intelligence/ci/impact.py +246 -0
- semantic_code_intelligence/ci/metrics.py +591 -0
- semantic_code_intelligence/ci/pr.py +412 -0
- semantic_code_intelligence/ci/quality.py +557 -0
- semantic_code_intelligence/ci/templates.py +164 -0
- semantic_code_intelligence/ci/trace.py +224 -0
- semantic_code_intelligence/cli/__init__.py +0 -0
- semantic_code_intelligence/cli/commands/__init__.py +0 -0
- semantic_code_intelligence/cli/commands/ask_cmd.py +153 -0
- semantic_code_intelligence/cli/commands/benchmark_cmd.py +303 -0
- semantic_code_intelligence/cli/commands/chat_cmd.py +252 -0
- semantic_code_intelligence/cli/commands/ci_gen_cmd.py +74 -0
- semantic_code_intelligence/cli/commands/context_cmd.py +120 -0
- semantic_code_intelligence/cli/commands/cross_refactor_cmd.py +113 -0
- semantic_code_intelligence/cli/commands/deps_cmd.py +91 -0
- semantic_code_intelligence/cli/commands/docs_cmd.py +101 -0
- semantic_code_intelligence/cli/commands/doctor_cmd.py +147 -0
- semantic_code_intelligence/cli/commands/evolve_cmd.py +171 -0
- semantic_code_intelligence/cli/commands/explain_cmd.py +112 -0
- semantic_code_intelligence/cli/commands/gate_cmd.py +135 -0
- semantic_code_intelligence/cli/commands/grep_cmd.py +234 -0
- semantic_code_intelligence/cli/commands/hotspots_cmd.py +119 -0
- semantic_code_intelligence/cli/commands/impact_cmd.py +131 -0
- semantic_code_intelligence/cli/commands/index_cmd.py +138 -0
- semantic_code_intelligence/cli/commands/init_cmd.py +152 -0
- semantic_code_intelligence/cli/commands/investigate_cmd.py +163 -0
- semantic_code_intelligence/cli/commands/languages_cmd.py +101 -0
- semantic_code_intelligence/cli/commands/lsp_cmd.py +49 -0
- semantic_code_intelligence/cli/commands/mcp_cmd.py +50 -0
- semantic_code_intelligence/cli/commands/metrics_cmd.py +264 -0
- semantic_code_intelligence/cli/commands/models_cmd.py +157 -0
- semantic_code_intelligence/cli/commands/plugin_cmd.py +275 -0
- semantic_code_intelligence/cli/commands/pr_summary_cmd.py +178 -0
- semantic_code_intelligence/cli/commands/quality_cmd.py +208 -0
- semantic_code_intelligence/cli/commands/refactor_cmd.py +103 -0
- semantic_code_intelligence/cli/commands/review_cmd.py +88 -0
- semantic_code_intelligence/cli/commands/search_cmd.py +236 -0
- semantic_code_intelligence/cli/commands/serve_cmd.py +117 -0
- semantic_code_intelligence/cli/commands/suggest_cmd.py +100 -0
- semantic_code_intelligence/cli/commands/summary_cmd.py +78 -0
- semantic_code_intelligence/cli/commands/tool_cmd.py +282 -0
- semantic_code_intelligence/cli/commands/trace_cmd.py +123 -0
- semantic_code_intelligence/cli/commands/tui_cmd.py +58 -0
- semantic_code_intelligence/cli/commands/viz_cmd.py +127 -0
- semantic_code_intelligence/cli/commands/watch_cmd.py +72 -0
- semantic_code_intelligence/cli/commands/web_cmd.py +61 -0
- semantic_code_intelligence/cli/commands/workspace_cmd.py +250 -0
- semantic_code_intelligence/cli/main.py +65 -0
- semantic_code_intelligence/cli/router.py +92 -0
- semantic_code_intelligence/config/__init__.py +0 -0
- semantic_code_intelligence/config/settings.py +260 -0
- semantic_code_intelligence/context/__init__.py +19 -0
- semantic_code_intelligence/context/engine.py +429 -0
- semantic_code_intelligence/context/memory.py +253 -0
- semantic_code_intelligence/daemon/__init__.py +1 -0
- semantic_code_intelligence/daemon/watcher.py +515 -0
- semantic_code_intelligence/docs/__init__.py +1080 -0
- semantic_code_intelligence/embeddings/__init__.py +0 -0
- semantic_code_intelligence/embeddings/enhanced.py +131 -0
- semantic_code_intelligence/embeddings/generator.py +149 -0
- semantic_code_intelligence/embeddings/model_registry.py +100 -0
- semantic_code_intelligence/evolution/__init__.py +1 -0
- semantic_code_intelligence/evolution/budget_guard.py +111 -0
- semantic_code_intelligence/evolution/commit_manager.py +88 -0
- semantic_code_intelligence/evolution/context_builder.py +131 -0
- semantic_code_intelligence/evolution/engine.py +249 -0
- semantic_code_intelligence/evolution/patch_generator.py +229 -0
- semantic_code_intelligence/evolution/task_selector.py +214 -0
- semantic_code_intelligence/evolution/test_runner.py +111 -0
- semantic_code_intelligence/indexing/__init__.py +0 -0
- semantic_code_intelligence/indexing/chunker.py +174 -0
- semantic_code_intelligence/indexing/parallel.py +86 -0
- semantic_code_intelligence/indexing/scanner.py +146 -0
- semantic_code_intelligence/indexing/semantic_chunker.py +337 -0
- semantic_code_intelligence/llm/__init__.py +62 -0
- semantic_code_intelligence/llm/cache.py +219 -0
- semantic_code_intelligence/llm/cached_provider.py +145 -0
- semantic_code_intelligence/llm/conversation.py +190 -0
- semantic_code_intelligence/llm/cross_refactor.py +272 -0
- semantic_code_intelligence/llm/investigation.py +274 -0
- semantic_code_intelligence/llm/mock_provider.py +77 -0
- semantic_code_intelligence/llm/ollama_provider.py +122 -0
- semantic_code_intelligence/llm/openai_provider.py +100 -0
- semantic_code_intelligence/llm/provider.py +92 -0
- semantic_code_intelligence/llm/rate_limiter.py +164 -0
- semantic_code_intelligence/llm/reasoning.py +438 -0
- semantic_code_intelligence/llm/safety.py +110 -0
- semantic_code_intelligence/llm/streaming.py +251 -0
- semantic_code_intelligence/lsp/__init__.py +609 -0
- semantic_code_intelligence/mcp/__init__.py +393 -0
- semantic_code_intelligence/parsing/__init__.py +19 -0
- semantic_code_intelligence/parsing/parser.py +375 -0
- semantic_code_intelligence/plugins/__init__.py +255 -0
- semantic_code_intelligence/plugins/examples/__init__.py +1 -0
- semantic_code_intelligence/plugins/examples/code_quality.py +73 -0
- semantic_code_intelligence/plugins/examples/search_annotator.py +56 -0
- semantic_code_intelligence/scalability/__init__.py +205 -0
- semantic_code_intelligence/search/__init__.py +0 -0
- semantic_code_intelligence/search/formatter.py +123 -0
- semantic_code_intelligence/search/grep.py +361 -0
- semantic_code_intelligence/search/hybrid_search.py +170 -0
- semantic_code_intelligence/search/keyword_search.py +311 -0
- semantic_code_intelligence/search/section_expander.py +103 -0
- semantic_code_intelligence/services/__init__.py +0 -0
- semantic_code_intelligence/services/indexing_service.py +630 -0
- semantic_code_intelligence/services/search_service.py +269 -0
- semantic_code_intelligence/storage/__init__.py +0 -0
- semantic_code_intelligence/storage/chunk_hash_store.py +86 -0
- semantic_code_intelligence/storage/hash_store.py +66 -0
- semantic_code_intelligence/storage/index_manifest.py +85 -0
- semantic_code_intelligence/storage/index_stats.py +138 -0
- semantic_code_intelligence/storage/query_history.py +160 -0
- semantic_code_intelligence/storage/symbol_registry.py +209 -0
- semantic_code_intelligence/storage/vector_store.py +297 -0
- semantic_code_intelligence/tests/__init__.py +0 -0
- semantic_code_intelligence/tests/test_ai_features.py +351 -0
- semantic_code_intelligence/tests/test_chunker.py +119 -0
- semantic_code_intelligence/tests/test_cli.py +188 -0
- semantic_code_intelligence/tests/test_config.py +154 -0
- semantic_code_intelligence/tests/test_context.py +381 -0
- semantic_code_intelligence/tests/test_embeddings.py +73 -0
- semantic_code_intelligence/tests/test_endtoend.py +1142 -0
- semantic_code_intelligence/tests/test_enhanced_embeddings.py +92 -0
- semantic_code_intelligence/tests/test_hash_store.py +79 -0
- semantic_code_intelligence/tests/test_logging.py +55 -0
- semantic_code_intelligence/tests/test_new_cli.py +138 -0
- semantic_code_intelligence/tests/test_parser.py +495 -0
- semantic_code_intelligence/tests/test_phase10.py +355 -0
- semantic_code_intelligence/tests/test_phase11.py +593 -0
- semantic_code_intelligence/tests/test_phase12.py +375 -0
- semantic_code_intelligence/tests/test_phase13.py +663 -0
- semantic_code_intelligence/tests/test_phase14.py +568 -0
- semantic_code_intelligence/tests/test_phase15.py +814 -0
- semantic_code_intelligence/tests/test_phase16.py +792 -0
- semantic_code_intelligence/tests/test_phase17.py +815 -0
- semantic_code_intelligence/tests/test_phase18.py +934 -0
- semantic_code_intelligence/tests/test_phase19.py +986 -0
- semantic_code_intelligence/tests/test_phase20.py +2753 -0
- semantic_code_intelligence/tests/test_phase20b.py +2058 -0
- semantic_code_intelligence/tests/test_phase20c.py +962 -0
- semantic_code_intelligence/tests/test_phase21.py +428 -0
- semantic_code_intelligence/tests/test_phase22.py +799 -0
- semantic_code_intelligence/tests/test_phase23.py +783 -0
- semantic_code_intelligence/tests/test_phase24.py +715 -0
- semantic_code_intelligence/tests/test_phase25.py +496 -0
- semantic_code_intelligence/tests/test_phase26.py +251 -0
- semantic_code_intelligence/tests/test_phase27.py +531 -0
- semantic_code_intelligence/tests/test_phase8.py +592 -0
- semantic_code_intelligence/tests/test_phase9.py +643 -0
- semantic_code_intelligence/tests/test_plugins.py +293 -0
- semantic_code_intelligence/tests/test_priority_features.py +727 -0
- semantic_code_intelligence/tests/test_router.py +41 -0
- semantic_code_intelligence/tests/test_scalability.py +138 -0
- semantic_code_intelligence/tests/test_scanner.py +125 -0
- semantic_code_intelligence/tests/test_search.py +160 -0
- semantic_code_intelligence/tests/test_semantic_chunker.py +255 -0
- semantic_code_intelligence/tests/test_tools.py +182 -0
- semantic_code_intelligence/tests/test_vector_store.py +151 -0
- semantic_code_intelligence/tests/test_watcher.py +211 -0
- semantic_code_intelligence/tools/__init__.py +442 -0
- semantic_code_intelligence/tools/executor.py +232 -0
- semantic_code_intelligence/tools/protocol.py +200 -0
- semantic_code_intelligence/tui/__init__.py +454 -0
- semantic_code_intelligence/utils/__init__.py +0 -0
- semantic_code_intelligence/utils/logging.py +112 -0
- semantic_code_intelligence/version.py +3 -0
- semantic_code_intelligence/web/__init__.py +11 -0
- semantic_code_intelligence/web/api.py +289 -0
- semantic_code_intelligence/web/server.py +397 -0
- semantic_code_intelligence/web/ui.py +659 -0
- semantic_code_intelligence/web/visualize.py +226 -0
- semantic_code_intelligence/workspace/__init__.py +427 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"""Tests for v0.27.0 features: grep flags, JSONL, models CLI, IVF, build, VS Code extension."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pytest
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from click.testing import CliRunner
|
|
10
|
+
|
|
11
|
+
from semantic_code_intelligence import __version__
|
|
12
|
+
from semantic_code_intelligence.cli.main import cli
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# =========================================================================
|
|
16
|
+
# Version
|
|
17
|
+
# =========================================================================
|
|
18
|
+
|
|
19
|
+
class TestVersion027:
|
|
20
|
+
def test_version_is_027(self):
|
|
21
|
+
assert __version__ == "0.4.0"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# =========================================================================
|
|
25
|
+
# P2 — Grep flag parity + JSONL
|
|
26
|
+
# =========================================================================
|
|
27
|
+
|
|
28
|
+
class TestSearchGrepFlags:
|
|
29
|
+
"""Verify the new grep-style flags are accepted by the search CLI."""
|
|
30
|
+
|
|
31
|
+
def test_search_help_has_context_lines(self):
|
|
32
|
+
runner = CliRunner()
|
|
33
|
+
result = runner.invoke(cli, ["search", "--help"])
|
|
34
|
+
assert "--context-lines" in result.output
|
|
35
|
+
assert "-C" in result.output
|
|
36
|
+
|
|
37
|
+
def test_search_help_has_files_only(self):
|
|
38
|
+
runner = CliRunner()
|
|
39
|
+
result = runner.invoke(cli, ["search", "--help"])
|
|
40
|
+
assert "--files-only" in result.output
|
|
41
|
+
|
|
42
|
+
def test_search_help_has_files_without_match(self):
|
|
43
|
+
runner = CliRunner()
|
|
44
|
+
result = runner.invoke(cli, ["search", "--help"])
|
|
45
|
+
assert "--files-without-match" in result.output
|
|
46
|
+
|
|
47
|
+
def test_search_help_has_line_numbers(self):
|
|
48
|
+
runner = CliRunner()
|
|
49
|
+
result = runner.invoke(cli, ["search", "--help"])
|
|
50
|
+
assert "--line-numbers" in result.output
|
|
51
|
+
|
|
52
|
+
def test_search_help_has_jsonl(self):
|
|
53
|
+
runner = CliRunner()
|
|
54
|
+
result = runner.invoke(cli, ["search", "--help"])
|
|
55
|
+
assert "--jsonl" in result.output
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class TestFormatterJsonl:
|
|
59
|
+
"""Test format_results_jsonl output."""
|
|
60
|
+
|
|
61
|
+
def test_jsonl_empty(self):
|
|
62
|
+
from semantic_code_intelligence.search.formatter import format_results_jsonl
|
|
63
|
+
assert format_results_jsonl([]) == ""
|
|
64
|
+
|
|
65
|
+
def test_jsonl_format(self):
|
|
66
|
+
from semantic_code_intelligence.search.formatter import format_results_jsonl
|
|
67
|
+
from semantic_code_intelligence.services.search_service import SearchResult
|
|
68
|
+
results = [
|
|
69
|
+
SearchResult(
|
|
70
|
+
file_path="a.py", start_line=1, end_line=5,
|
|
71
|
+
language="python", content="pass", score=0.9,
|
|
72
|
+
chunk_index=0,
|
|
73
|
+
),
|
|
74
|
+
SearchResult(
|
|
75
|
+
file_path="b.py", start_line=10, end_line=20,
|
|
76
|
+
language="python", content="x = 1", score=0.8,
|
|
77
|
+
chunk_index=1,
|
|
78
|
+
),
|
|
79
|
+
]
|
|
80
|
+
output = format_results_jsonl(results)
|
|
81
|
+
lines = output.strip().split("\n")
|
|
82
|
+
assert len(lines) == 2
|
|
83
|
+
for line in lines:
|
|
84
|
+
obj = json.loads(line)
|
|
85
|
+
assert "file_path" in obj
|
|
86
|
+
assert "score" in obj
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# =========================================================================
|
|
90
|
+
# P5 — IVF index support
|
|
91
|
+
# =========================================================================
|
|
92
|
+
|
|
93
|
+
class TestVectorStoreIVF:
|
|
94
|
+
"""Test IVF-related vector store functionality."""
|
|
95
|
+
|
|
96
|
+
def test_default_flat_index(self):
|
|
97
|
+
from semantic_code_intelligence.storage.vector_store import VectorStore
|
|
98
|
+
store = VectorStore(128)
|
|
99
|
+
assert store.size == 0
|
|
100
|
+
assert not store._use_ivf
|
|
101
|
+
|
|
102
|
+
def test_ivf_mode_fallback_few_vectors(self):
|
|
103
|
+
"""IVF mode should fall back to flat when not enough vectors to train."""
|
|
104
|
+
from semantic_code_intelligence.storage.vector_store import VectorStore, ChunkMetadata
|
|
105
|
+
store = VectorStore(8, use_ivf=True)
|
|
106
|
+
vecs = np.random.randn(5, 8).astype(np.float32)
|
|
107
|
+
vecs = vecs / np.linalg.norm(vecs, axis=1, keepdims=True)
|
|
108
|
+
meta = [
|
|
109
|
+
ChunkMetadata(f"f{i}.py", 1, 2, i, "python", "x", "")
|
|
110
|
+
for i in range(5)
|
|
111
|
+
]
|
|
112
|
+
store.add(vecs, meta)
|
|
113
|
+
assert store.size == 5
|
|
114
|
+
# Should have fallen back to flat since 5 < IVF_NLIST
|
|
115
|
+
assert not store._use_ivf
|
|
116
|
+
|
|
117
|
+
def test_ivf_threshold_constant(self):
|
|
118
|
+
from semantic_code_intelligence.storage.vector_store import IVF_THRESHOLD
|
|
119
|
+
assert IVF_THRESHOLD == 50_000
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# =========================================================================
|
|
123
|
+
# P6 — Models CLI
|
|
124
|
+
# =========================================================================
|
|
125
|
+
|
|
126
|
+
class TestModelsCLI:
|
|
127
|
+
"""Test the models command group."""
|
|
128
|
+
|
|
129
|
+
def test_models_list_help(self):
|
|
130
|
+
runner = CliRunner()
|
|
131
|
+
result = runner.invoke(cli, ["models", "list", "--help"])
|
|
132
|
+
assert result.exit_code == 0
|
|
133
|
+
assert "--json" in result.output
|
|
134
|
+
|
|
135
|
+
def test_models_info_help(self):
|
|
136
|
+
runner = CliRunner()
|
|
137
|
+
result = runner.invoke(cli, ["models", "info", "--help"])
|
|
138
|
+
assert result.exit_code == 0
|
|
139
|
+
|
|
140
|
+
def test_models_download_help(self):
|
|
141
|
+
runner = CliRunner()
|
|
142
|
+
result = runner.invoke(cli, ["models", "download", "--help"])
|
|
143
|
+
assert result.exit_code == 0
|
|
144
|
+
assert "--backend" in result.output
|
|
145
|
+
|
|
146
|
+
def test_models_switch_help(self):
|
|
147
|
+
runner = CliRunner()
|
|
148
|
+
result = runner.invoke(cli, ["models", "switch", "--help"])
|
|
149
|
+
assert result.exit_code == 0
|
|
150
|
+
|
|
151
|
+
def test_models_list_json(self):
|
|
152
|
+
runner = CliRunner()
|
|
153
|
+
result = runner.invoke(cli, ["models", "list", "--json"])
|
|
154
|
+
assert result.exit_code == 0
|
|
155
|
+
data = json.loads(result.output)
|
|
156
|
+
assert isinstance(data, list)
|
|
157
|
+
assert len(data) >= 5
|
|
158
|
+
names = [m["name"] for m in data]
|
|
159
|
+
assert "all-MiniLM-L6-v2" in names
|
|
160
|
+
|
|
161
|
+
def test_models_info_valid(self):
|
|
162
|
+
runner = CliRunner()
|
|
163
|
+
result = runner.invoke(cli, ["models", "info", "minilm"])
|
|
164
|
+
assert result.exit_code == 0
|
|
165
|
+
assert "MiniLM" in result.output
|
|
166
|
+
|
|
167
|
+
def test_models_info_unknown(self):
|
|
168
|
+
runner = CliRunner()
|
|
169
|
+
result = runner.invoke(cli, ["models", "info", "nonexistent-model-xyz"])
|
|
170
|
+
assert result.exit_code != 0
|
|
171
|
+
|
|
172
|
+
def test_model_count_is_35(self):
|
|
173
|
+
"""Verify we now have 36 top-level commands."""
|
|
174
|
+
assert len(cli.commands) == 39
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class TestModelRegistry:
|
|
178
|
+
"""Test model registry helper functions."""
|
|
179
|
+
|
|
180
|
+
def test_resolve_alias(self):
|
|
181
|
+
from semantic_code_intelligence.embeddings.model_registry import resolve_model_name
|
|
182
|
+
assert resolve_model_name("minilm") == "all-MiniLM-L6-v2"
|
|
183
|
+
assert resolve_model_name("jina-code") == "jinaai/jina-embeddings-v2-base-code"
|
|
184
|
+
|
|
185
|
+
def test_list_models(self):
|
|
186
|
+
from semantic_code_intelligence.embeddings.model_registry import list_models
|
|
187
|
+
models = list_models()
|
|
188
|
+
assert len(models) >= 5
|
|
189
|
+
|
|
190
|
+
def test_get_model_info(self):
|
|
191
|
+
from semantic_code_intelligence.embeddings.model_registry import get_model_info
|
|
192
|
+
info = get_model_info("minilm")
|
|
193
|
+
assert info is not None
|
|
194
|
+
assert info.dimension == 384
|
|
195
|
+
|
|
196
|
+
def test_get_model_info_unknown(self):
|
|
197
|
+
from semantic_code_intelligence.embeddings.model_registry import get_model_info
|
|
198
|
+
assert get_model_info("fake-model-xxx") is None
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# =========================================================================
|
|
202
|
+
# P4 — Build script
|
|
203
|
+
# =========================================================================
|
|
204
|
+
|
|
205
|
+
class TestBuildScript:
|
|
206
|
+
def test_build_script_exists(self):
|
|
207
|
+
assert Path("scripts/build_binary.py").exists() or Path("d:/mounir/CodexA/scripts/build_binary.py").exists()
|
|
208
|
+
|
|
209
|
+
def test_build_script_importable(self):
|
|
210
|
+
import importlib.util
|
|
211
|
+
spec = importlib.util.spec_from_file_location("build_binary", "scripts/build_binary.py")
|
|
212
|
+
assert spec is not None
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
# =========================================================================
|
|
216
|
+
# P3 — VS Code extension
|
|
217
|
+
# =========================================================================
|
|
218
|
+
|
|
219
|
+
class TestVSCodeExtension:
|
|
220
|
+
def test_package_json_exists(self):
|
|
221
|
+
p = Path("vscode-extension/package.json")
|
|
222
|
+
assert p.exists() or Path("d:/mounir/CodexA/vscode-extension/package.json").exists()
|
|
223
|
+
|
|
224
|
+
def test_extension_ts_exists(self):
|
|
225
|
+
p = Path("vscode-extension/src/extension.ts")
|
|
226
|
+
assert p.exists() or Path("d:/mounir/CodexA/vscode-extension/src/extension.ts").exists()
|
|
227
|
+
|
|
228
|
+
def test_package_json_valid(self):
|
|
229
|
+
p = Path("vscode-extension/package.json")
|
|
230
|
+
if not p.exists():
|
|
231
|
+
p = Path("d:/mounir/CodexA/vscode-extension/package.json")
|
|
232
|
+
data = json.loads(p.read_text(encoding="utf-8"))
|
|
233
|
+
assert data["name"] == "codexa"
|
|
234
|
+
assert "commands" in str(data["contributes"])
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# =========================================================================
|
|
238
|
+
# Formatter context expansion
|
|
239
|
+
# =========================================================================
|
|
240
|
+
|
|
241
|
+
class TestFormatterExpand:
|
|
242
|
+
def test_expand_context_no_file(self):
|
|
243
|
+
from semantic_code_intelligence.search.formatter import _expand_context
|
|
244
|
+
from semantic_code_intelligence.services.search_service import SearchResult
|
|
245
|
+
result = SearchResult(
|
|
246
|
+
file_path="/nonexistent/path.py", start_line=5, end_line=10,
|
|
247
|
+
language="python", content="hello", score=0.5, chunk_index=0,
|
|
248
|
+
)
|
|
249
|
+
content, start = _expand_context(result, 3)
|
|
250
|
+
assert content == "hello"
|
|
251
|
+
assert start == 5
|