Merge pull request #50 from epage/codegen

refactor(dict): Speed up build times by caching codegen
This commit is contained in:
Ed Page 2019-10-05 21:04:35 -06:00 committed by GitHub
commit 948eb0e281
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 36078 additions and 429 deletions

View file

@ -7,18 +7,24 @@ rust:
matrix: matrix:
include: include:
- env: RUSTFMT - env: RUSTFMT
rust: 1.35.0 # `stable`: Locking down for consistent behavior rust: 1.38.0 # `stable`: Locking down for consistent behavior
install: install:
- rustup component add rustfmt - rustup component add rustfmt
script: script:
- cargo fmt --all -- --check - cargo fmt --all -- --check
- env: CodeGen
rust: 1.38.0 # `stable`: Locking down for consistent behavior
install:
- rustup component add rustfmt
script:
- cargo run --package typos-codegen -- --input typos-dict/assets/words.csv --output typos-dict/src/dict_codegen.rs --check
- env: RUSTFLAGS="-D warnings" - env: RUSTFLAGS="-D warnings"
rust: 1.35.0 # `stable`: Locking down for consistent behavior rust: 1.38.0 # `stable`: Locking down for consistent behavior
install: install:
script: script:
- cargo check --tests --all - cargo check --tests --all
- env: CLIPPY - env: CLIPPY
rust: 1.35.0 # `stable`: Locking down for consistent behavior rust: 1.38.0 # `stable`: Locking down for consistent behavior
install: install:
- rustup component add clippy - rustup component add clippy
script: script:

755
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
[workspace] [workspace]
members = ["typos", "typos-dict"] members = ["codegen", "typos", "typos-dict"]
[package] [package]
name = "typos-cli" name = "typos-cli"

24
codegen/Cargo.toml Normal file
View file

@ -0,0 +1,24 @@
[package]
name = "typos-codegen"
version = "1.0.0"
authors = ["Ed Page <eopage@gmail.com>"]
description = "Source Code Spelling Correction"
repository = "https://github.com/crate-ci/imperative"
documentation = "https://docs.rs/imperative"
readme = "README.md"
categories = ["text-processing"]
license = "MIT"
edition = "2018"
publish = false
[badges]
travis-ci = { repository = "epage/typos" }
appveyor = { repository = "epage/typos" }
[dependencies]
phf = { version = "0.7", features = ["unicase"] }
phf_codegen = "0.7"
csv = "1.0"
unicase = "1.1"
codegenrs = "0.1"
structopt = "0.3"

62
codegen/src/main.rs Normal file
View file

@ -0,0 +1,62 @@
use structopt::StructOpt;
fn generate<W: std::io::Write>(input: &[u8], file: &mut W) {
writeln!(
file,
"// This file is code-genned by {}",
env!("CARGO_PKG_NAME")
)
.unwrap();
writeln!(file).unwrap();
writeln!(file, "use unicase::UniCase;").unwrap();
writeln!(
file,
"pub(crate) static WORD_DICTIONARY: phf::Map<unicase::UniCase<&'static str>, &'static str> = "
)
.unwrap();
let mut builder = phf_codegen::Map::new();
let records: Vec<_> = csv::Reader::from_reader(input)
.records()
.map(|r| r.unwrap())
.collect();
for record in &records {
let value = format!(r#""{}""#, &record[1]);
builder.entry(unicase::UniCase(&record[0]), &value);
}
builder.build(file).unwrap();
writeln!(file, ";").unwrap();
}
#[derive(Debug, StructOpt)]
#[structopt(rename_all = "kebab-case")]
struct Options {
#[structopt(long, parse(from_os_str))]
input: std::path::PathBuf,
#[structopt(flatten)]
codegen: codegenrs::CodeGenArgs,
#[structopt(flatten)]
rustmft: codegenrs::RustfmtArgs,
}
fn run() -> Result<i32, Box<dyn std::error::Error>> {
let options = Options::from_args();
let content = {
let mut content = vec![];
let input = std::fs::read(&options.input)?;
generate(&input, &mut content);
content
};
let content = String::from_utf8(content)?;
let content = options.rustmft.reformat(&content)?;
options.codegen.write_str(&content)?;
Ok(0)
}
fn main() {
let code = run().unwrap();
std::process::exit(code);
}

View file

@ -24,8 +24,3 @@ typos = { version = "0.1", path = "../typos" }
phf = { version = "0.7", features = ["unicase"] } phf = { version = "0.7", features = ["unicase"] }
unicase = "1.1" unicase = "1.1"
log = "0.4" log = "0.4"
[build-dependencies]
phf_codegen = "0.7"
csv = "1.0"
unicase = "1.1"

View file

@ -1,33 +0,0 @@
use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;
pub const CORPUS: &[u8] = include_bytes!("./assets/words.csv");
fn main() {
let path = Path::new(&env::var("OUT_DIR").unwrap()).join("codegen.rs");
let mut file = BufWriter::new(File::create(&path).unwrap());
println!("rerun-if-changed=./assets/words.csv");
write!(&mut file, "use unicase::UniCase;").unwrap();
write!(
&mut file,
"pub(crate) static WORD_DICTIONARY: phf::Map<unicase::UniCase<&'static str>, &'static str> = "
)
.unwrap();
let mut builder = phf_codegen::Map::new();
let records: Vec<_> = csv::Reader::from_reader(CORPUS)
.records()
.map(|r| r.unwrap())
.collect();
for record in &records {
let value = format!(r#""{}""#, &record[1]);
builder.entry(unicase::UniCase(&record[0]), &value);
#[cfg(features = "iterate_unstable")]
break;
}
builder.build(&mut file).unwrap();
write!(&mut file, ";\n").unwrap();
}

File diff suppressed because it is too large Load diff

View file

@ -36,7 +36,7 @@ impl CheckSettings {
pub fn build<'d, 'p>( pub fn build<'d, 'p>(
&self, &self,
dictionary: &'d Dictionary, dictionary: &'d dyn Dictionary,
parser: &'p tokens::Parser, parser: &'p tokens::Parser,
) -> Checks<'d, 'p> { ) -> Checks<'d, 'p> {
Checks { Checks {
@ -61,7 +61,7 @@ impl Default for CheckSettings {
#[derive(Clone)] #[derive(Clone)]
pub struct Checks<'d, 'p> { pub struct Checks<'d, 'p> {
dictionary: &'d Dictionary, dictionary: &'d dyn Dictionary,
parser: &'p tokens::Parser, parser: &'p tokens::Parser,
check_filenames: bool, check_filenames: bool,
check_files: bool, check_files: bool,