fix(retrieval): accept generated Python bytecode cache
CI / Capabilities and shell quality (push) Successful in 12s
CI / Python tests and compilation (push) Successful in 25s
CI / CI configuration security checks (push) Successful in 5s
CI / Build and inspect generated packages (push) Successful in 14s
CI / PowerShell tests on Ubuntu (push) Successful in 1m14s
CI / Bash integration and installation guards (push) Successful in 1m38s
CI / Installed client configuration smoke tests (push) Successful in 14s
CI / Qwen retrieval integration (push) Successful in 14m18s
CI / Capabilities and shell quality (push) Successful in 12s
CI / Python tests and compilation (push) Successful in 25s
CI / CI configuration security checks (push) Successful in 5s
CI / Build and inspect generated packages (push) Successful in 14s
CI / PowerShell tests on Ubuntu (push) Successful in 1m14s
CI / Bash integration and installation guards (push) Successful in 1m38s
CI / Installed client configuration smoke tests (push) Successful in 14s
CI / Qwen retrieval integration (push) Successful in 14m18s
This commit is contained in:
1 parent
280292d72e
commit
756b8fe59e
2 files changed
+27
-1
No files matched your search
@@ -3,6 +3,7 @@ import hashlib
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -89,10 +90,15 @@ def check_runtime(target, state):
|
|||||||
path = target / name
|
path = target / name
|
||||||
if path.is_symlink() or not path.is_file() or digest(path) != expected:
|
if path.is_symlink() or not path.is_file() or digest(path) != expected:
|
||||||
raise ValueError(f'Owned semantic retrieval file changed: {name}')
|
raise ValueError(f'Owned semantic retrieval file changed: {name}')
|
||||||
allowed = set(state['files']) | {'.venv', 'model-cache'}
|
allowed = set(state['files']) | {'.venv', 'model-cache', '__pycache__'}
|
||||||
for path in target.iterdir():
|
for path in target.iterdir():
|
||||||
if path.is_symlink() or path.name not in allowed:
|
if path.is_symlink() or path.name not in allowed:
|
||||||
raise ValueError(f'Foreign or linked semantic retrieval path: {path.name}')
|
raise ValueError(f'Foreign or linked semantic retrieval path: {path.name}')
|
||||||
|
if path.name == '__pycache__' and (not path.is_dir() or any(
|
||||||
|
child.is_symlink() or not child.is_file() or not re.fullmatch(
|
||||||
|
r'(?:server|benchmark)\.[A-Za-z0-9_-]+(?:\.opt-\d+)?\.pyc', child.name)
|
||||||
|
for child in path.iterdir())):
|
||||||
|
raise ValueError('Foreign or linked semantic retrieval path: __pycache__')
|
||||||
|
|
||||||
|
|
||||||
def sync(root, home, clients, enabled, dry_run, update, summary=False):
|
def sync(root, home, clients, enabled, dry_run, update, summary=False):
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import io
|
|||||||
import json
|
import json
|
||||||
from contextlib import redirect_stdout
|
from contextlib import redirect_stdout
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import py_compile
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
@@ -85,6 +86,25 @@ class SemanticRetrievalTests(unittest.TestCase):
|
|||||||
self.assertFalse(target.exists())
|
self.assertFalse(target.exists())
|
||||||
self.assertFalse(state_path.exists())
|
self.assertFalse(state_path.exists())
|
||||||
|
|
||||||
|
def test_update_accepts_python_cache_but_rejects_foreign_cache_content(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
home = Path(directory) / 'home'
|
||||||
|
target = home / '.my-ai-configuration/semantic-retrieval'
|
||||||
|
target.mkdir(parents=True)
|
||||||
|
files = {}
|
||||||
|
for name in MODULE.FILES:
|
||||||
|
content = (ROOT / 'shared/retrieval' / name).read_bytes()
|
||||||
|
(target / name).write_bytes(content)
|
||||||
|
files[name] = hashlib.sha256(content).hexdigest()
|
||||||
|
MODULE.save_state(target.parent / 'semantic-retrieval.json', {'version': 1, 'clients': ['codex'], 'files': files}, False)
|
||||||
|
py_compile.compile(str(target / 'server.py'), doraise=True)
|
||||||
|
cache = target / '__pycache__'
|
||||||
|
with patch.object(MODULE, 'ensure_runtime', return_value=Path('python')), patch.object(MODULE, 'ensure_models'):
|
||||||
|
MODULE.sync(ROOT, home, ['codex'], True, False, True)
|
||||||
|
(cache / 'foreign.txt').write_text('keep')
|
||||||
|
with self.assertRaisesRegex(ValueError, '__pycache__'):
|
||||||
|
MODULE.sync(ROOT, home, ['codex'], True, False, True)
|
||||||
|
|
||||||
def test_negative_benchmark_keeps_active_runtime(self):
|
def test_negative_benchmark_keeps_active_runtime(self):
|
||||||
with tempfile.TemporaryDirectory() as directory:
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
home = Path(directory) / 'home'
|
home = Path(directory) / 'home'
|
||||||
|
|||||||
Reference in new issue
Block a user