Skip to content

Commit

Permalink
Improve the UX for supporting the run/test commands.
Browse files Browse the repository at this point in the history
This commit pipes the stdout and inherits stderr when spawning `cargo`,
allowing for immediate output from cargo without buffering.

It also improves the processing of wasm artifacts to componentize; the
"creating component" message no longer prints on every build for macOS users.

Removed forcing colors in cargo output as we now inherit stderr, allowing cargo
to detect if it is a terminal or not.
  • Loading branch information
peterhuene committed Dec 4, 2023
1 parent 2af81a3 commit 7aa84a5
Show file tree
Hide file tree
Showing 11 changed files with 231 additions and 353 deletions.
1 change: 1 addition & 0 deletions src/commands/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ impl PublishCommand {
quiet: self.common.quiet,
targets: self.target.clone().into_iter().collect(),
manifest_path: self.manifest_path.clone(),
message_format: None,
frozen: self.frozen,
locked: self.locked,
release: true,
Expand Down
8 changes: 8 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,8 @@ pub struct CargoArguments {
pub targets: Vec<String>,
/// The --manifest-path argument.
pub manifest_path: Option<PathBuf>,
/// The `--message-format`` argument.
pub message_format: Option<String>,
/// The --frozen argument.
pub frozen: bool,
/// The --locked argument.
Expand Down Expand Up @@ -392,6 +394,7 @@ impl CargoArguments {
let mut args = Args::default()
.single("--color", "WHEN", Some('c'))
.single("--manifest-path", "PATH", None)
.single("--message-format", "FMT", None)
.multiple("--package", "SPEC", Some('p'))
.multiple("--target", "TRIPLE", None)
.flag("--release", Some('r'))
Expand Down Expand Up @@ -438,6 +441,7 @@ impl CargoArguments {
.unwrap()
.take_single()
.map(PathBuf::from),
message_format: args.get_mut("--message-format").unwrap().take_single(),
targets: args.get_mut("--target").unwrap().take_multiple(),
frozen: args.get("--frozen").unwrap().count() > 0,
locked: args.get("--locked").unwrap().count() > 0,
Expand Down Expand Up @@ -756,6 +760,7 @@ mod test {
quiet: false,
targets: Vec::new(),
manifest_path: None,
message_format: None,
release: false,
frozen: false,
locked: false,
Expand All @@ -773,6 +778,8 @@ mod test {
"--color=auto",
"--manifest-path",
"Cargo.toml",
"--message-format",
"json-render-diagnostics",
"--release",
"--package",
"package1",
Expand All @@ -798,6 +805,7 @@ mod test {
quiet: true,
targets: vec!["foo".to_string(), "bar".to_string()],
manifest_path: Some("Cargo.toml".into()),
message_format: Some("json-render-diagnostics".into()),
release: true,
frozen: true,
locked: true,
Expand Down
405 changes: 177 additions & 228 deletions src/lib.rs

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions tests/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ fn it_runs_bench_with_basic_component() -> Result<()> {
fs::write(
project.root().join("wit/world.wit"),
"
package my:fibonacci
package my:fibonacci;
interface types {
type size = u32
type size = u32;
}
world generator {
use types.{size}
export fibonacci: func(input: size) -> u32
use types.{size};
export fibonacci: func(input: size) -> u32;
}",
)?;

Expand Down
34 changes: 11 additions & 23 deletions tests/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ fn it_builds_a_bin_project() -> Result<()> {
project
.cargo_component("build --release")
.assert()
.stderr(contains("Finished\u{1b}[0m release [optimized] target(s)"))
.stderr(contains("Finished release [optimized] target(s)"))
.success();

validate_component(&project.release_wasm("foo"))?;
Expand Down Expand Up @@ -99,9 +99,7 @@ edition = "2021"
project
.cargo_component("build")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(&project.debug_wasm("foo"))?;
Expand All @@ -121,7 +119,7 @@ fn it_supports_wit_keywords() -> Result<()> {
project
.cargo_component("build --release")
.assert()
.stderr(contains("Finished\u{1b}[0m release [optimized] target(s)"))
.stderr(contains("Finished release [optimized] target(s)"))
.success();

validate_component(&project.release_wasm("interface"))?;
Expand All @@ -140,7 +138,7 @@ fn it_adds_a_producers_field() -> Result<()> {
project
.cargo_component("build --release")
.assert()
.stderr(contains("Finished\u{1b}[0m release [optimized] target(s)"))
.stderr(contains("Finished release [optimized] target(s)"))
.success();

let path = project.release_wasm("foo");
Expand Down Expand Up @@ -174,9 +172,7 @@ fn it_builds_wasm32_unknown_unknown() -> Result<()> {
project
.cargo_component("build --target wasm32-unknown-unknown")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(
Expand All @@ -202,9 +198,7 @@ fn it_regenerates_target_if_wit_changed() -> Result<()> {
project
.cargo_component("build")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(&project.debug_wasm("foo"))?;
Expand Down Expand Up @@ -308,9 +302,7 @@ impl Qux for Component {
project
.cargo_component("build")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(&project.debug_wasm("foo"))?;
Expand Down Expand Up @@ -347,9 +339,7 @@ impl Guest for CustomImplementor {
project
.cargo_component("build")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(&project.debug_wasm("foo"))?;
Expand Down Expand Up @@ -676,7 +666,7 @@ impl Guest for Component {
comp1
.cargo_component("build --release")
.assert()
.stderr(contains("Finished\u{1b}[0m release [optimized] target(s)"))
.stderr(contains("Finished release [optimized] target(s)"))
.success();

let dep = comp1.release_wasm("comp1");
Expand Down Expand Up @@ -721,7 +711,7 @@ impl Guest for Component {
comp2
.cargo_component("build --release")
.assert()
.stderr(contains("Finished\u{1b}[0m release [optimized] target(s)"))
.stderr(contains("Finished release [optimized] target(s)"))
.success();

let path: std::path::PathBuf = comp2.release_wasm("comp2");
Expand Down Expand Up @@ -758,9 +748,7 @@ fn it_builds_with_adapter() -> Result<()> {
project
.cargo_component("build")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

validate_component(&project.debug_wasm("foo"))?;
Expand Down
11 changes: 3 additions & 8 deletions tests/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fn it_checks_a_new_project() -> Result<()> {
})?;

project
.cargo_component("check --color never")
.cargo_component("check")
.assert()
.stderr(contains("Checking foo v0.1.0"))
.success();
Expand All @@ -39,10 +39,7 @@ fn it_finds_errors() -> Result<()> {
project
.cargo_component("check")
.assert()
.stderr(
contains("Checking\u{1b}[0m foo v0.1.0")
.and(contains("expected `String`, found `&str`")),
)
.stderr(contains("Checking foo v0.1.0").and(contains("expected `String`, found `&str`")))
.failure();

Ok(())
Expand Down Expand Up @@ -97,9 +94,7 @@ edition = "2021"
project
.cargo_component("check")
.assert()
.stderr(contains(
"Finished\u{1b}[0m dev [unoptimized + debuginfo] target(s)",
))
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();

Ok(())
Expand Down
13 changes: 4 additions & 9 deletions tests/clippy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fn it_checks_a_new_project() -> Result<()> {
})?;

project
.cargo_component("clippy --color never")
.cargo_component("clippy")
.assert()
.stderr(contains("Checking foo v0.1.0"))
.success();
Expand All @@ -39,10 +39,7 @@ fn it_finds_errors() -> Result<()> {
project
.cargo_component("clippy")
.assert()
.stderr(
contains("Checking\u{1b}[0m foo v0.1.0")
.and(contains("expected `String`, found `&str`")),
)
.stderr(contains("Checking foo v0.1.0").and(contains("expected `String`, found `&str`")))
.failure();

Ok(())
Expand All @@ -67,7 +64,7 @@ fn it_finds_clippy_warnings() -> Result<()> {
project
.cargo_component("clippy")
.assert()
.stderr(contains("Checking\u{1b}[0m foo v0.1.0").and(contains("clippy::needless_return")))
.stderr(contains("Checking foo v0.1.0").and(contains("clippy::needless_return")))
.success();

Ok(())
Expand Down Expand Up @@ -122,9 +119,7 @@ edition = "2021"
project
.cargo_component("clippy")
.assert()
.stderr(
contains("Checking\u{1b}[0m foo v0.1.0").and(contains("Checking\u{1b}[0m bar v0.1.0")),
)
.stderr(contains("Checking foo v0.1.0").and(contains("Checking bar v0.1.0")))
.success();

Ok(())
Expand Down
2 changes: 1 addition & 1 deletion tests/new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ world foo {
})?;

project
.cargo_component("build --color never")
.cargo_component("build")
.assert()
.stderr(contains("Finished dev [unoptimized + debuginfo] target(s)"))
.success();
Expand Down
41 changes: 5 additions & 36 deletions tests/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,47 +12,16 @@ fn it_runs_with_command_component() -> Result<()> {
let project = Project::new_bin("bar")?;
project.update_manifest(|mut doc| {
redirect_bindings_crate(&mut doc);
let mut dependencies = Table::new();
dependencies["wasi:cli"]["path"] = value("wit/deps/cli");

let target =
doc["package"]["metadata"]["component"]["target"].or_insert(Item::Table(Table::new()));
target["dependencies"] = Item::Table(dependencies);
Ok(doc)
})?;

fs::create_dir_all(project.root().join("wit/deps/cli"))?;
fs::write(
project.root().join("wit/deps/cli/run.wit"),
"
package wasi:cli
interface environment {
get-environment: func() -> list<tuple<string, string>>
get-arguments: func() -> list<string>
initial-cwd: func() -> option<string>
}",
)?;

fs::write(
project.root().join("wit/world.wit"),
"
package my:command
world generator {
import wasi:cli/environment
}",
)?;

fs::write(
project.root().join("src/main.rs"),
r#"
cargo_component_bindings::generate!();
use bindings::wasi::cli::environment::get_arguments;
fn main() {
if get_arguments().iter().any(|v| v == "--verbose") {
if std::env::args().any(|v| v == "--verbose") {
println!("[guest] running component 'my:command'");
}
}"#,
Expand Down Expand Up @@ -89,20 +58,20 @@ fn it_runs_with_reactor_component() -> Result<()> {
fs::write(
project.root().join("wit/deps/cli/run.wit"),
"
package wasi:cli
package wasi:cli@0.2.0-rc-2023-11-10;
interface run {
run: func() -> result
run: func() -> result;
}",
)?;

fs::write(
project.root().join("wit/world.wit"),
"
package my:reactor
package my:reactor;
world generator {
export wasi:cli/run
export wasi:cli/run@0.2.0-rc-2023-11-10;
}",
)?;

Expand Down
Loading

0 comments on commit 7aa84a5

Please sign in to comment.