Skip to content

Commit 6b44a97

Browse files
authored
fix(completion): restore typed VFS completion for tree/ls/cat (#147)
* fix(completion): use typed VFS path completions for tree/ls/cat * test(e2e): accept typed click completion output * fix(completion): align alias behavior and typed VFS assertions
1 parent cdc3a73 commit 6b44a97

3 files changed

Lines changed: 27 additions & 16 deletions

File tree

scripts/e2e-test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ else
153153
check_output "complete /d (no replay)" "no replay loaded" $RDC _complete /d
154154
fi
155155
COMP_OUTPUT=$(env _RDC_COMPLETE=bash_complete COMP_WORDS="rdc ls /d" COMP_CWORD=2 $RDC 2>&1 || true)
156-
if [ "$REPLAY_READY" -eq 1 ] && echo "$COMP_OUTPUT" | grep -q "/draws/"; then
156+
if [ "$REPLAY_READY" -eq 1 ] && echo "$COMP_OUTPUT" | grep -Eq "(/draws/|dir,/draws)"; then
157157
echo -e " ${GREEN}${NC} click shell_complete /d → /draws/"
158158
PASS=$((PASS + 1))
159159
elif [ "$REPLAY_READY" -eq 0 ] && echo "$COMP_OUTPUT" | grep -q "no replay loaded"; then

src/rdc/commands/vfs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ def _complete_vfs_path(
107107
for child in result.get("children", []):
108108
name = child["name"]
109109
if name.startswith(prefix):
110-
suffix = "/" if child.get("kind") == "dir" else ""
111-
items.append(CompletionItem(base + name + suffix))
110+
item_type = "dir" if child.get("kind") in {"dir", "alias"} else "plain"
111+
items.append(CompletionItem(base + name, type=item_type))
112112
return items
113113

114114

@@ -289,5 +289,5 @@ def complete_cmd(partial: str) -> None:
289289
for child in children:
290290
name = child["name"]
291291
if name.startswith(prefix):
292-
suffix = "/" if child.get("kind") == "dir" else ""
292+
suffix = "/" if child.get("kind") in {"dir", "alias"} else ""
293293
click.echo(base + name + suffix)

tests/unit/test_vfs_completion.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ def _values(items: list[CompletionItem]) -> list[str]:
4343
def test_complete_root_partial(monkeypatch) -> None:
4444
_patch(monkeypatch, _ROOT_CHILDREN)
4545
result = _complete_vfs_path(ctx=None, param=None, incomplete="/d")
46+
assert any(item.value == "/draws" and item.type == "dir" for item in result)
4647
values = _values(result)
47-
assert "/draws/" in values
4848
assert "/info" not in values
4949

5050

5151
def test_complete_root_empty(monkeypatch) -> None:
5252
_patch(monkeypatch, _ROOT_CHILDREN)
5353
result = _complete_vfs_path(ctx=None, param=None, incomplete="")
54+
assert any(item.value == "/draws" and item.type == "dir" for item in result)
55+
assert any(item.value == "/events" and item.type == "dir" for item in result)
5456
values = _values(result)
55-
assert "/draws/" in values
56-
assert "/events/" in values
5757
assert "/info" in values
5858
assert "/stats" in values
5959

@@ -70,18 +70,22 @@ def fake_call(method: str, params: dict | None = None) -> dict:
7070
result = _complete_vfs_path(ctx=None, param=None, incomplete="/draws/")
7171
assert called_with[0]["path"] == "/draws"
7272
values = _values(result)
73-
assert "/draws/142/" in values
74-
assert "/draws/140/" in values
73+
assert "/draws/142" in values
74+
assert "/draws/140" in values
7575

7676

7777
def test_complete_nested_partial(monkeypatch) -> None:
7878
_patch(monkeypatch, _DRAWS_CHILDREN)
7979
result = _complete_vfs_path(ctx=None, param=None, incomplete="/draws/14")
80+
typed = {item.value: item.type for item in result}
8081
values = _values(result)
81-
assert "/draws/140/" in values
82-
assert "/draws/141/" in values
83-
assert "/draws/142/" in values
84-
assert "/draws/200/" not in values
82+
assert "/draws/140" in values
83+
assert "/draws/141" in values
84+
assert "/draws/142" in values
85+
assert "/draws/200" not in values
86+
assert typed["/draws/140"] == "dir"
87+
assert typed["/draws/141"] == "dir"
88+
assert typed["/draws/142"] == "dir"
8589

8690

8791
def test_complete_leaf_no_slash(monkeypatch) -> None:
@@ -95,15 +99,22 @@ def test_complete_leaf_no_slash(monkeypatch) -> None:
9599
values = _values(result)
96100
assert "/draws/142/descriptors" in values
97101
assert "/draws/142/binary_buf" in values
98-
assert "/draws/142/shader/" in values
102+
assert "/draws/142/shader" in values
103+
assert any(item.value == "/draws/142/shader" and item.type == "dir" for item in result)
99104

100105

101106
def test_complete_deep_path(monkeypatch) -> None:
102107
_patch(monkeypatch, _DRAW_142_CHILDREN)
103108
result = _complete_vfs_path(ctx=None, param=None, incomplete="/draws/142/sh")
104109
values = _values(result)
105-
assert "/draws/142/shader/" in values
106-
assert "/draws/142/pipeline/" not in values
110+
assert "/draws/142/shader" in values
111+
assert "/draws/142/pipeline" not in values
112+
113+
114+
def test_complete_alias_treated_as_directory(monkeypatch) -> None:
115+
_patch(monkeypatch, [{"name": "current", "kind": "alias"}])
116+
result = _complete_vfs_path(ctx=None, param=None, incomplete="/c")
117+
assert any(item.value == "/current" and item.type == "dir" for item in result)
107118

108119

109120
def test_complete_no_session(monkeypatch) -> None:

0 commit comments

Comments
 (0)