feat(artifact-presenter): open text files in Orca
This commit is contained in:
@@ -120,6 +120,22 @@ class FakeRunner:
|
||||
return subprocess.CompletedProcess(argv, 0, json.dumps(output), "")
|
||||
|
||||
|
||||
class OrcaAwareRunner(FakeRunner):
|
||||
def __init__(self, *args, fail_orca_open: bool = False, **kwargs) -> None:
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fail_orca_open = fail_orca_open
|
||||
|
||||
def __call__(self, command, **kwargs):
|
||||
argv = [str(value) for value in command]
|
||||
if argv[1:3] == ["file", "open"]:
|
||||
self.calls.append(argv)
|
||||
if self.fail_orca_open:
|
||||
raise subprocess.CalledProcessError(1, argv)
|
||||
output = {"ok": True, "result": {"opened": True}}
|
||||
return subprocess.CompletedProcess(argv, 0, json.dumps(output), "")
|
||||
return super().__call__(command, **kwargs)
|
||||
|
||||
|
||||
class ArtifactPresenterTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.tempdir = tempfile.TemporaryDirectory()
|
||||
@@ -132,6 +148,7 @@ class ArtifactPresenterTests(unittest.TestCase):
|
||||
self.executables = {
|
||||
"herdr": "/usr/bin/herdr",
|
||||
"mcat": "/usr/bin/mcat",
|
||||
"orca": "/usr/bin/orca",
|
||||
}
|
||||
|
||||
def tearDown(self) -> None:
|
||||
@@ -381,21 +398,71 @@ class ArtifactPresenterTests(unittest.TestCase):
|
||||
)
|
||||
self.assertFalse(any(call[1:3] == ["pane", "split"] for call in runner.calls))
|
||||
|
||||
def test_presents_non_markdown_file_directly_with_mcat(self) -> None:
|
||||
video = self.artifact.with_name("review.mp4")
|
||||
video.write_bytes(b"video fixture")
|
||||
runner = FakeRunner(
|
||||
def test_opens_editor_friendly_file_in_orca_managed_session(self) -> None:
|
||||
source = self.artifact.with_name("module.ts")
|
||||
source.write_text("export const answer = 42;\n", encoding="utf-8")
|
||||
runner = OrcaAwareRunner()
|
||||
|
||||
result = MODULE.present_document(
|
||||
source,
|
||||
env={**self.env, "ORCA_WORKSPACE_ID": "workspace"},
|
||||
which=self.which,
|
||||
run=runner,
|
||||
)
|
||||
|
||||
self.assertEqual(result.status, "orca-opened")
|
||||
self.assertEqual(
|
||||
runner.calls,
|
||||
[["/usr/bin/orca", "file", "open", str(source.resolve()), "--json"]],
|
||||
)
|
||||
|
||||
def test_uses_configured_orca_cli_command(self) -> None:
|
||||
self.executables["orca-wsl"] = "/opt/orca/orca-wsl"
|
||||
runner = OrcaAwareRunner()
|
||||
|
||||
result = MODULE.present_document(
|
||||
self.artifact,
|
||||
env={"TERM_PROGRAM": "Orca", "ORCA_CLI_COMMAND": "orca-wsl"},
|
||||
which=self.which,
|
||||
run=runner,
|
||||
)
|
||||
|
||||
self.assertEqual(result.status, "orca-opened")
|
||||
self.assertEqual(runner.calls[0][0], "/opt/orca/orca-wsl")
|
||||
|
||||
def test_falls_back_to_mcat_when_orca_cannot_open_text_file(self) -> None:
|
||||
runner = OrcaAwareRunner(
|
||||
[{"pane_id": "workspace:p-viewer", "label": MODULE.PANE_LABEL}],
|
||||
fail_orca_open=True,
|
||||
)
|
||||
|
||||
result = MODULE.present_document(
|
||||
video,
|
||||
env=self.env,
|
||||
self.artifact,
|
||||
env={**self.env, "ORCA_TERMINAL_HANDLE": "term-1"},
|
||||
which=self.which,
|
||||
run=runner,
|
||||
)
|
||||
|
||||
self.assertEqual(result.status, "reused")
|
||||
self.assertEqual(runner.calls[0][1:3], ["file", "open"])
|
||||
self.mcat_run_call(runner, "workspace:p-viewer")
|
||||
|
||||
def test_presents_binary_file_directly_with_mcat_in_orca_session(self) -> None:
|
||||
video = self.artifact.with_name("review.mp4")
|
||||
video.write_bytes(b"video\0fixture")
|
||||
runner = OrcaAwareRunner(
|
||||
[{"pane_id": "workspace:p-viewer", "label": MODULE.PANE_LABEL}],
|
||||
)
|
||||
|
||||
result = MODULE.present_document(
|
||||
video,
|
||||
env={**self.env, "TERM_PROGRAM": "Orca"},
|
||||
which=self.which,
|
||||
run=runner,
|
||||
)
|
||||
|
||||
self.assertEqual(result.status, "reused")
|
||||
self.assertFalse(any(call[1:3] == ["file", "open"] for call in runner.calls))
|
||||
self.mcat_run_call(runner, "workspace:p-viewer", video)
|
||||
|
||||
def test_encodes_artifact_paths_before_terminal_delivery(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user