bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
import asyncio
|
|
from types import SimpleNamespace
|
|
|
|
from mirage.resource.ram import RAMResource
|
|
from mirage.types import MountMode
|
|
from mirage.workspace import Workspace
|
|
from mirage.workspace.executor.fanout import (_adjust_depth_texts,
|
|
_synthesize_find_mount_entries)
|
|
|
|
|
|
def _mounts(*prefixes):
|
|
return [SimpleNamespace(prefix=p) for p in prefixes]
|
|
|
|
|
|
def test_synthesize_no_expression_emits_all():
|
|
desc = _mounts("/ram/", "/disk/")
|
|
assert _synthesize_find_mount_entries("/", desc, []) == "/ram\n/disk"
|
|
|
|
|
|
def test_synthesize_positive_name():
|
|
desc = _mounts("/ram/", "/disk/")
|
|
assert _synthesize_find_mount_entries("/", desc,
|
|
["-name", "ram"]) == "/ram"
|
|
|
|
|
|
def test_synthesize_honors_not():
|
|
desc = _mounts("/ram/", "/disk/", "/notes/")
|
|
out = _synthesize_find_mount_entries("/", desc, ["-not", "-name", "ram"])
|
|
assert out == "/disk\n/notes"
|
|
|
|
|
|
def test_synthesize_honors_or():
|
|
desc = _mounts("/ram/", "/disk/", "/notes/")
|
|
out = _synthesize_find_mount_entries(
|
|
"/", desc, ["-name", "ram", "-o", "-name", "disk"])
|
|
assert out == "/ram\n/disk"
|
|
|
|
|
|
def test_synthesize_type_file_excludes_mount_dirs():
|
|
desc = _mounts("/ram/", "/disk/")
|
|
assert _synthesize_find_mount_entries("/", desc, ["-type", "f"]) == ""
|
|
|
|
|
|
def test_synthesize_type_dir_includes_mount_dirs():
|
|
desc = _mounts("/ram/", "/disk/")
|
|
assert _synthesize_find_mount_entries("/", desc,
|
|
["-type", "d"]) == "/ram\n/disk"
|
|
|
|
|
|
def test_synthesize_maxdepth_window():
|
|
desc = _mounts("/ram/", "/a/b/")
|
|
assert _synthesize_find_mount_entries("/", desc,
|
|
["-maxdepth", "1"]) == "/ram"
|
|
|
|
|
|
def test_adjust_depth_texts_reduces_maxdepth_by_delta():
|
|
out = _adjust_depth_texts(["-maxdepth", "3", "-name", "x"], "/",
|
|
"/data/sub")
|
|
assert out == ["-maxdepth", "1", "-name", "x"]
|
|
|
|
|
|
def test_adjust_depth_texts_clamps_mindepth_at_zero():
|
|
out = _adjust_depth_texts(["-mindepth", "1"], "/", "/data")
|
|
assert out == ["-mindepth", "0"]
|
|
|
|
|
|
def test_adjust_depth_texts_no_depth_tokens_unchanged():
|
|
out = _adjust_depth_texts(["-name", "x", "-o", "-name", "y"], "/", "/data")
|
|
assert out == ["-name", "x", "-o", "-name", "y"]
|
|
|
|
|
|
def test_adjust_depth_texts_same_mount_unchanged():
|
|
assert _adjust_depth_texts(["-maxdepth", "3"], "/data",
|
|
"/data") == ["-maxdepth", "3"]
|
|
|
|
|
|
def test_maxdepth_applies_to_child_mount_depth_end_to_end():
|
|
parent = RAMResource()
|
|
child = RAMResource()
|
|
child._store.dirs.add("/a")
|
|
child._store.files["/a/b.txt"] = b"deep\n"
|
|
ws = Workspace(resources={
|
|
"/": (parent, MountMode.EXEC),
|
|
"/data/": (child, MountMode.EXEC),
|
|
}, )
|
|
io = asyncio.run(ws.execute("find / -maxdepth 2"))
|
|
out = (io.stdout if isinstance(io.stdout, bytes) else b"").decode()
|
|
assert "/data/a" in out
|
|
assert "/data/a/b.txt" not in out
|