Skip to content

Commit

Permalink
fix: make shebang scripts work with comments
Browse files Browse the repository at this point in the history
  • Loading branch information
jdx committed Aug 28, 2024
1 parent 49dece6 commit 9eb2a64
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 17 deletions.
4 changes: 3 additions & 1 deletion cli/src/cli/complete_word.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ impl CompleteWord {
let mut ctx = tera::Context::new();
ctx.insert("words", &self.words);
ctx.insert("CURRENT", &cword);
ctx.insert("PREV", &(cword - 1));
if cword > 0 {
ctx.insert("PREV", &(cword - 1));
}

let parsed = usage::cli::parse(spec, &words)?;
debug!("parsed cmd: {}", parsed.cmd.full_cmd.join(" "));
Expand Down
46 changes: 31 additions & 15 deletions cli/tests/complete_word.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,61 @@ use predicates::str::contains;

#[test]
fn complete_word_completer() {
assert_cmd(&["plugins", "install", "pl"]).stdout("plugin-1\nplugin-2\nplugin-3\n");
assert_cmd("basic.usage.kdl", &["plugins", "install", "pl"])
.stdout("plugin-1\nplugin-2\nplugin-3\n");
}

#[test]
fn complete_word_subcommands() {
assert_cmd(&["plugins", "install"]).stdout(contains("install"));
assert_cmd("basic.usage.kdl", &["plugins", "install"]).stdout(contains("install"));
}

#[test]
fn complete_word_cword() {
assert_cmd(&["--cword=3", "plugins", "install"]).stdout(contains("plugin-2"));
assert_cmd("basic.usage.kdl", &["--cword=3", "plugins", "install"])
.stdout(contains("plugin-2"));
}

#[test]
fn complete_word_long_flag() {
assert_cmd(&["--", "plugins", "install", "--"]).stdout("--dir\n--global\n");
assert_cmd(&["--", "plugins", "install", "--g"]).stdout("--global\n");
assert_cmd(&["--", "plugins", "install", "--global", "pl"]).stdout(contains("plugin-2"));
assert_cmd("basic.usage.kdl", &["--", "plugins", "install", "--"]).stdout("--dir\n--global\n");
assert_cmd("basic.usage.kdl", &["--", "plugins", "install", "--g"]).stdout("--global\n");
assert_cmd(
"basic.usage.kdl",
&["--", "plugins", "install", "--global", "pl"],
)
.stdout(contains("plugin-2"));
}

#[test]
fn complete_word_long_flag_val() {
assert_cmd(&["--", "plugins", "install", "--dir", ""])
.stdout(contains("src").and(contains("tests")));
assert_cmd(
"basic.usage.kdl",
&["--", "plugins", "install", "--dir", ""],
)
.stdout(contains("src").and(contains("tests")));
}

#[test]
fn complete_word_short_flag() {
assert_cmd(&["--", "plugins", "install", "-"]).stdout("-d\n-g\n--dir\n--global\n");
assert_cmd(&["--", "plugins", "install", "-g"]).stdout("-g\n");
assert_cmd(&["--", "plugins", "install", "-g", "pl"]).stdout(contains("plugin-2"));
assert_cmd("basic.usage.kdl", &["--", "plugins", "install", "-"])
.stdout("-d\n-g\n--dir\n--global\n");
assert_cmd("basic.usage.kdl", &["--", "plugins", "install", "-g"]).stdout("-g\n");
assert_cmd("basic.usage.kdl", &["--", "plugins", "install", "-g", "pl"])
.stdout(contains("plugin-2"));
}

fn cmd() -> Command {
#[test]
fn complete_word_shebang() {
assert_cmd("example.sh", &["--", "-"]).stdout("--bar\n--foo\n");
}

fn cmd(example: &str) -> Command {
let mut cmd = Command::cargo_bin("usage").unwrap();
cmd.args(["cw", "-f", "../examples/basic.usage.kdl", "mycli"]);
cmd.args(["cw", "-f", &format!("../examples/{example}"), "mycli"]);
cmd
}

fn assert_cmd(args: &[&str]) -> Assert {
cmd().args(args).assert().success()
fn assert_cmd(example: &str, args: &[&str]) -> Assert {
cmd(example).args(args).assert().success()
}
7 changes: 6 additions & 1 deletion lib/src/parse/spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,12 @@ fn split_script(file: &Path) -> Result<(String, String), UsageErr> {
let full = file::read_to_string(file)?;
let schema = full.strip_prefix("#!/usr/bin/env usage\n").unwrap_or(&full);
let (schema, body) = schema.split_once("\n#!").unwrap_or((schema, ""));
let schema = schema.trim().to_string();
let schema = schema
.trim()
.lines()
.filter(|l| !l.starts_with('#'))
.collect::<Vec<_>>()
.join("\n");
let body = format!("#!{}", body);
Ok((schema, body))
}
Expand Down

0 comments on commit 9eb2a64

Please sign in to comment.