Merge pull request #55 from ashleygwilliams/warn-no-readme

feat(readme): warn on no readme
master
ashley williams 7 years ago committed by GitHub
commit 030472bfa2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 171
      examples/no-readme/Cargo.lock
  2. 13
      examples/no-readme/Cargo.toml
  3. 15
      examples/no-readme/src/lib.rs
  4. 28
      src/bindgen.rs
  5. 35
      src/build.rs
  6. 13
      src/emoji.rs
  7. 11
      src/lib.rs
  8. 73
      src/main.rs
  9. 10
      src/manifest.rs
  10. 24
      src/readme.rs

@ -0,0 +1,171 @@
[[package]]
name = "dtoa"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "fnv"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "itoa"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "no-readme"
version = "0.1.0"
dependencies = [
"wasm-bindgen 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-traits"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "proc-macro2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "quote"
version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "quote"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "serde_derive"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_derive_internals"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
"synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_json"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "syn"
version = "0.11.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
"synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "syn"
version = "0.12.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "synom"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "unicode-xid"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "unicode-xid"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "wasm-bindgen"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"wasm-bindgen-macro 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.12.13 (registry+https://github.com/rust-lang/crates.io-index)",
"wasm-bindgen-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
]
[metadata]
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c"
"checksum num-traits 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3c2bd9b9d21e48e956b763c9f37134dc62d9e95da6edb3f672cacb6caf3cd3"
"checksum proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cd07deb3c6d1d9ff827999c7f9b04cdfd66b1b17ae508e14fe47b620f2282ae0"
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
"checksum quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eca14c727ad12702eb4b6bfb5a232287dcf8385cb8ca83a3eeaf6519c44c408"
"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526"
"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0"
"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5"
"checksum serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "57781ed845b8e742fc2bf306aba8e3b408fe8c366b900e3769fbc39f49eb8b39"
"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
"checksum syn 0.12.13 (registry+https://github.com/rust-lang/crates.io-index)" = "517f6da31bc53bf080b9a77b29fbd0ff8da2f5a2ebd24c73c2238274a94ac7cb"
"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
"checksum wasm-bindgen 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "717507a3c7ef09d740c6d781bda57ba054d7b776f3e27d4478e25a773afd2e4b"
"checksum wasm-bindgen-macro 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbc1a194a8fe6319f9f326f0c03d2083d61727ace574f9b1df083bad79a314ad"
"checksum wasm-bindgen-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b7cf730a826f1ec1ea2143d8582d5d2d27c0775035652daf0e0337225e8566b"

@ -0,0 +1,13 @@
[package]
name = "no-readme"
description = "an example rust->wasm crate with no readme"
version = "0.1.0"
authors = ["Ashley Williams <ashley666ashley@gmail.com>"]
license = "WTFPL"
repository = "https://github.com/ashleygwilliams/wasm-pack"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.1.0"

@ -0,0 +1,15 @@
#![feature(proc_macro)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet(name: &str) {
alert(&format!("Hello, {}!", name));
}

@ -1,24 +1,40 @@
use std::process::Command; use std::process::Command;
use console::style;
use emoji;
use progressbar;
pub fn cargo_install_wasm_bindgen() { pub fn cargo_install_wasm_bindgen() {
let step = format!(
"{} {}Installing WASM-bindgen...",
style("[6/7]").bold().dim(),
emoji::DOWN_ARROW
);
let pb = progressbar::new(step);
let _output = Command::new("cargo") let _output = Command::new("cargo")
.arg("install") .arg("install")
.arg("--git") .arg("--git")
.arg("https://github.com/alexcrichton/wasm-bindgen") .arg("https://github.com/alexcrichton/wasm-bindgen")
.output() .output()
.unwrap_or_else(|e| panic!("failed to execute process: {}", e)); .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e));
pb.finish();
//if !output.status.success() { //if !output.status.success() {
// let s = String::from_utf8_lossy(&output.stderr); // let s = String::from_utf8_lossy(&output.stderr);
// print!( // print!(
// "⛔ cargo_install_wasm_bindgen failed and stderr was:\n{}", // "{} cargo_install_wasm_bindgen failed and stderr was:\n{}",
// emoji::ERROR,
// s // s
// ); // );
// } // }
} }
pub fn wasm_bindgen_build(path: &str, name: &str) { pub fn wasm_bindgen_build(path: &str, name: &str) {
let step = format!(
"{} {}Running WASM-bindgen...",
style("[7/7]").bold().dim(),
emoji::RUNNER
);
let pb = progressbar::new(step);
let binary_name = name.replace("-", "_"); let binary_name = name.replace("-", "_");
let wasm_path = format!("target/wasm32-unknown-unknown/release/{}.wasm", binary_name); let wasm_path = format!("target/wasm32-unknown-unknown/release/{}.wasm", binary_name);
let _output = Command::new("wasm-bindgen") let _output = Command::new("wasm-bindgen")
@ -27,11 +43,11 @@ pub fn wasm_bindgen_build(path: &str, name: &str) {
.arg("--out-dir") .arg("--out-dir")
.arg("./pkg") .arg("./pkg")
.output() .output()
.unwrap_or_else(|e| panic!("failed to execute process: {}", e)); .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e));
pb.finish();
//if !output.status.success() { //if !output.status.success() {
// let s = String::from_utf8_lossy(&output.stderr); // let s = String::from_utf8_lossy(&output.stderr);
// print!(" wasm_bindgen_build failed and stderr was:\n{}", s); // print!(" wasm_bindgen_build failed and stderr was:\n{}", emoji::ERROR, s);
//} //}
} }

@ -1,21 +1,40 @@
use std::process::Command; use std::process::Command;
use console::style;
use emoji;
use progressbar;
pub fn rustup_add_wasm_target() { pub fn rustup_add_wasm_target() {
let step = format!(
"{} {}Adding WASM target...",
style("[1/7]").bold().dim(),
emoji::TARGET
);
let pb = progressbar::new(step);
let output = Command::new("rustup") let output = Command::new("rustup")
.arg("target") .arg("target")
.arg("add") .arg("add")
.arg("wasm32-unknown-unknown") .arg("wasm32-unknown-unknown")
.output() .output()
.unwrap_or_else(|e| panic!("failed to execute process: {}", e)); .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e));
pb.finish();
if !output.status.success() { if !output.status.success() {
let s = String::from_utf8_lossy(&output.stderr); let s = String::from_utf8_lossy(&output.stderr);
print!("⛔ rustup_add_wasm_target failed and stderr was:\n{}", s); print!(
"{} rustup_add_wasm_target failed and stderr was:\n{}",
emoji::ERROR,
s
);
} }
} }
pub fn cargo_build_wasm(path: &str) { pub fn cargo_build_wasm(path: &str) {
let step = format!(
"{} {}Compiling to WASM...",
style("[2/7]").bold().dim(),
emoji::CYCLONE
);
let pb = progressbar::new(step);
let output = Command::new("cargo") let output = Command::new("cargo")
.current_dir(path) .current_dir(path)
.arg("build") .arg("build")
@ -23,11 +42,15 @@ pub fn cargo_build_wasm(path: &str) {
.arg("--target") .arg("--target")
.arg("wasm32-unknown-unknown") .arg("wasm32-unknown-unknown")
.output() .output()
.unwrap_or_else(|e| panic!("failed to execute process: {}", e)); .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e));
pb.finish();
if !output.status.success() { if !output.status.success() {
let s = String::from_utf8_lossy(&output.stderr); let s = String::from_utf8_lossy(&output.stderr);
print!("⛔ cargo_build_wasm failed and stderr was:\n{}", s); print!(
"{} cargo_build_wasm failed and stderr was:\n{}",
emoji::ERROR,
s
);
} }
} }

@ -0,0 +1,13 @@
use console::Emoji;
pub static TARGET: Emoji = Emoji("🎯 ", "");
pub static CYCLONE: Emoji = Emoji("🌀 ", "");
pub static FOLDER: Emoji = Emoji("📂 ", "");
pub static MEMO: Emoji = Emoji("📝 ", "");
pub static DOWN_ARROW: Emoji = Emoji("⬇ ", "");
pub static RUNNER: Emoji = Emoji("🏃 ", "");
pub static SPARKLE: Emoji = Emoji("✨ ", ":-)");
pub static PACKAGE: Emoji = Emoji("📦 ", ":-)");
pub static WARN: Emoji = Emoji("⚠ ", ":-)");
pub static DANCERS: Emoji = Emoji("👯 ", "");
pub static ERROR: Emoji = Emoji("⛔ ", "");

@ -1,3 +1,4 @@
extern crate console;
extern crate failure; extern crate failure;
extern crate indicatif; extern crate indicatif;
#[macro_use] #[macro_use]
@ -9,13 +10,23 @@ pub mod build;
pub mod bindgen; pub mod bindgen;
pub mod readme; pub mod readme;
pub mod manifest; pub mod manifest;
pub mod progressbar;
pub mod emoji;
use std::fs; use std::fs;
use failure::Error; use failure::Error;
use console::style;
pub fn create_pkg_dir(path: &str) -> Result<(), Error> { pub fn create_pkg_dir(path: &str) -> Result<(), Error> {
let step = format!(
"{} {}Creating a pkg directory...",
style("[3/7]").bold().dim(),
emoji::FOLDER
);
let pb = progressbar::new(step);
let pkg_dir_path = format!("{}/pkg", path); let pkg_dir_path = format!("{}/pkg", path);
fs::create_dir_all(pkg_dir_path)?; fs::create_dir_all(pkg_dir_path)?;
pb.finish();
Ok(()) Ok(())
} }

@ -5,24 +5,11 @@ extern crate indicatif;
extern crate quicli; extern crate quicli;
extern crate wasm_pack; extern crate wasm_pack;
mod progressbar;
use std::time::Instant; use std::time::Instant;
use console::{style, Emoji};
use indicatif::HumanDuration; use indicatif::HumanDuration;
use quicli::prelude::*; use quicli::prelude::*;
use wasm_pack::{bindgen, build, manifest, readme}; use wasm_pack::{bindgen, build, emoji, manifest, readme};
static TARGET: Emoji = Emoji("🎯 ", "");
static CYCLONE: Emoji = Emoji("🌀 ", "");
static FOLDER: Emoji = Emoji("📂 ", "");
static MEMO: Emoji = Emoji("📝 ", "");
static DANCERS: Emoji = Emoji("👯 ", "");
static DOWN_ARROW: Emoji = Emoji("⬇ ", "");
static RUNNER: Emoji = Emoji("🏃 ", "");
static SPARKLE: Emoji = Emoji("✨ ", ":-)");
static PACKAGE: Emoji = Emoji("📦 ", ":-)");
/// 📦 ✨ pack and publish your wasm! /// 📦 ✨ pack and publish your wasm!
#[derive(Debug, StructOpt)] #[derive(Debug, StructOpt)]
@ -56,67 +43,23 @@ main!(|args: Cli, log_level: verbosity| match args.cmd {
None => ".".to_string(), None => ".".to_string(),
}; };
let step1 = format!(
"{} {}Adding WASM target...",
style("[1/7]").bold().dim(),
TARGET
);
let pb1 = progressbar::new(step1);
build::rustup_add_wasm_target(); build::rustup_add_wasm_target();
pb1.finish();
let step2 = format!(
"{} {}Compiling to WASM...",
style("[2/7]").bold().dim(),
CYCLONE
);
let pb2 = progressbar::new(step2);
build::cargo_build_wasm(&crate_path); build::cargo_build_wasm(&crate_path);
pb2.finish();
let step3 = format!(
"{} {}Creating a pkg directory...",
style("[3/7]").bold().dim(),
FOLDER
);
let pb3 = progressbar::new(step3);
wasm_pack::create_pkg_dir(&crate_path)?; wasm_pack::create_pkg_dir(&crate_path)?;
pb3.finish();
let step4 = format!(
"{} {}Writing a package.json...",
style("[4/7]").bold().dim(),
MEMO
);
let pb4 = progressbar::new(step4);
manifest::write_package_json(&crate_path)?; manifest::write_package_json(&crate_path)?;
pb4.finish();
let step5 = format!(
"{} {}Copying over your README...",
style("[5/7]").bold().dim(),
DANCERS
);
let pb5 = progressbar::new(step5);
readme::copy_from_crate(&crate_path)?; readme::copy_from_crate(&crate_path)?;
pb5.finish();
let step6 = format!(
"{} {}Installing WASM-bindgen...",
style("[6/7]").bold().dim(),
DOWN_ARROW
);
let pb6 = progressbar::new(step6);
bindgen::cargo_install_wasm_bindgen(); bindgen::cargo_install_wasm_bindgen();
pb6.finish();
let name = manifest::get_crate_name(&crate_path)?; let name = manifest::get_crate_name(&crate_path)?;
let step7 = format!(
"{} {}Running WASM-bindgen...",
style("[7/7]").bold().dim(),
RUNNER
);
let pb7 = progressbar::new(step7);
bindgen::wasm_bindgen_build(&crate_path, &name); bindgen::wasm_bindgen_build(&crate_path, &name);
pb7.finish(); println!(
println!("{} Done in {}", SPARKLE, HumanDuration(started.elapsed())); "{} Done in {}",
emoji::SPARKLE,
HumanDuration(started.elapsed())
);
println!( println!(
"{} Your WASM pkg is ready to publish at {}/pkg", "{} Your WASM pkg is ready to publish at {}/pkg",
PACKAGE, &crate_path emoji::PACKAGE,
&crate_path
) )
} }
Command::Pack { .. } => { Command::Pack { .. } => {

@ -1,9 +1,12 @@
use std::fs::File; use std::fs::File;
use std::io::prelude::*; use std::io::prelude::*;
use console::style;
use failure::Error; use failure::Error;
use serde_json; use serde_json;
use toml; use toml;
use emoji;
use progressbar;
#[derive(Deserialize)] #[derive(Deserialize)]
struct CargoManifest { struct CargoManifest {
@ -66,12 +69,19 @@ impl CargoManifest {
/// Generate a package.json file inside in `./pkg`. /// Generate a package.json file inside in `./pkg`.
pub fn write_package_json(path: &str) -> Result<(), Error> { pub fn write_package_json(path: &str) -> Result<(), Error> {
let step = format!(
"{} {}Writing a package.json...",
style("[4/7]").bold().dim(),
emoji::MEMO
);
let pb = progressbar::new(step);
let pkg_file_path = format!("{}/pkg/package.json", path); let pkg_file_path = format!("{}/pkg/package.json", path);
let mut pkg_file = File::create(pkg_file_path)?; let mut pkg_file = File::create(pkg_file_path)?;
let crate_data = read_cargo_toml(path)?; let crate_data = read_cargo_toml(path)?;
let npm_data = crate_data.into_npm(); let npm_data = crate_data.into_npm();
let npm_json = serde_json::to_string(&npm_data)?; let npm_json = serde_json::to_string(&npm_data)?;
pkg_file.write_all(npm_json.as_bytes())?; pkg_file.write_all(npm_json.as_bytes())?;
pb.finish();
Ok(()) Ok(())
} }

@ -1,9 +1,31 @@
use std::fs; use std::fs;
use failure::Error; use failure::Error;
use console::style;
use indicatif::MultiProgress;
use progressbar;
use emoji;
pub fn copy_from_crate(path: &str) -> Result<(), Error> { pub fn copy_from_crate(path: &str) -> Result<(), Error> {
let m = MultiProgress::new();
let step = format!(
"{} {}Copying over your README...",
style("[5/7]").bold().dim(),
emoji::DANCERS
);
let pb = m.add(progressbar::new(step));
let crate_readme_path = format!("{}/README.md", path); let crate_readme_path = format!("{}/README.md", path);
let new_readme_path = format!("{}/pkg/README.md", path); let new_readme_path = format!("{}/pkg/README.md", path);
fs::copy(&crate_readme_path, &new_readme_path)?; if let Err(_) = fs::copy(&crate_readme_path, &new_readme_path) {
let warn = format!(
"{} {}: origin crate has no README",
emoji::WARN,
style("[WARN]").bold().dim()
);
let warn_pb = m.add(progressbar::new(warn));
warn_pb.finish();
};
pb.finish();
m.join_and_clear()?;
Ok(()) Ok(())
} }

Loading…
Cancel
Save