Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(cli): Introduce file_type_specifics module #793

Merged
merged 2 commits into from
Aug 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/typos-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ encoding_rs = "0.8.32"
assert_fs = "1.0"
trycmd = "0.14.16"
criterion = "0.5"
snapbox = "0.4.11"

[[bench]]
name = "checks"
Expand Down
97 changes: 26 additions & 71 deletions crates/typos-cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use std::collections::HashMap;

use kstring::KString;

use crate::file_type_specifics;

pub const SUPPORTED_FILE_NAMES: &[&str] = &["typos.toml", "_typos.toml", ".typos.toml"];

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
Expand Down Expand Up @@ -155,93 +157,46 @@ pub struct TypeEngineConfig {

impl TypeEngineConfig {
pub fn from_defaults() -> Self {
let patterns = [
(
KString::from("lock"),
let mut patterns = HashMap::new();

for no_check_type in file_type_specifics::NO_CHECK_TYPES {
patterns.insert(
KString::from(*no_check_type),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
check_file: Some(false),
..Default::default()
},
},
),
(
KString::from("vim"),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
dict: Some(DictConfig {
extend_identifiers: maplit::hashmap! {
"windo".into() => "windo".into(),
},
..Default::default()
}),
..Default::default()
},
},
),
(
KString::from("vimscript"),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
dict: Some(DictConfig {
extend_identifiers: maplit::hashmap! {
"windo".into() => "windo".into(),
},
..Default::default()
}),
..Default::default()
},
},
),
(
KString::from("rust"),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
dict: Some(DictConfig {
extend_identifiers: maplit::hashmap! {
"flate2".into() => "flate2".into(),
},
extend_words: maplit::hashmap! {
"ser".into() => "ser".into(),
},
..Default::default()
}),
..Default::default()
},
},
),
(
KString::from("py"),
);
}

for (typ, dict_config) in file_type_specifics::TYPE_SPECIFIC_DICTS {
patterns.insert(
KString::from(*typ),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
dict: Some(DictConfig {
extend_identifiers: maplit::hashmap! {
"NDArray".into() => "NDArray".into(),
},
extend_identifiers: dict_config
.ignore_idents
.iter()
.map(|key| ((*key).into(), (*key).into()))
.collect(),
extend_words: dict_config
.ignore_words
.iter()
.map(|key| ((*key).into(), (*key).into()))
.collect(),
..Default::default()
}),
..Default::default()
},
},
),
(
KString::from("cert"),
GlobEngineConfig {
extend_glob: Vec::new(),
engine: EngineConfig {
check_file: Some(false),
..Default::default()
},
},
),
]
.into_iter()
.collect();
);
}

Self { patterns }
}

Expand Down
80 changes: 80 additions & 0 deletions crates/typos-cli/src/file_type_specifics.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
//! This module specifies [`EngineConfig`] defaults for the file types defined in [`default_types`].
epage marked this conversation as resolved.
Show resolved Hide resolved
//!
//! [`EngineConfig`]: crate::config::EngineConfig
//! [`default_types`]: crate::default_types

/// Set `check_file` to `false` for these types.
pub const NO_CHECK_TYPES: &[&str] = &["cert", "lock"];

pub const TYPE_SPECIFIC_DICTS: &[(&str, StaticDictConfig)] = &[
(
"py",
StaticDictConfig {
ignore_idents: &[
"NDArray", // numpy.typing.NDArray
],
ignore_words: &[],
},
),
(
"rust",
StaticDictConfig {
ignore_idents: &[
"flate2", // https://crates.io/crates/flate2
],
ignore_words: &[
"ser", // serde::ser, serde_json::ser, etc.
],
},
),
(
"vim",
StaticDictConfig {
ignore_idents: &[
"windo", // https://vimdoc.sourceforge.net/htmldoc/windows.html#:windo
],
ignore_words: &[],
},
),
(
"vimscript",
StaticDictConfig {
ignore_idents: &[
"windo", // https://vimdoc.sourceforge.net/htmldoc/windows.html#:windo
],
ignore_words: &[],
},
),
];

pub struct StaticDictConfig {
pub ignore_idents: &'static [&'static str],
pub ignore_words: &'static [&'static str],
}

#[cfg(test)]
mod tests {
use itertools::Itertools;

use super::TYPE_SPECIFIC_DICTS;

#[test]
fn test_type_specific_dicts_contains_no_duplicates() {
let types: Vec<_> = TYPE_SPECIFIC_DICTS.iter().map(|(typ, _)| *typ).collect();
let types_unique: Vec<_> = types.clone().into_iter().unique().collect();

snapbox::assert_eq(types.join("\n"), types_unique.join("\n"));
}

#[test]
fn test_type_specific_dicts_is_sorted() {
// The order of the entries in TYPE_SPECIFIC_DICTS actually doesn't
// affect the runtime behavior, we just want them ordered
// so that it's easier to find entries for contributors.

let types: Vec<_> = TYPE_SPECIFIC_DICTS.iter().map(|(typ, _)| *typ).collect();
let types_sorted: Vec<_> = types.iter().cloned().sorted().collect();

snapbox::assert_eq(types.join("\n"), types_sorted.join("\n"));
}
}
1 change: 1 addition & 0 deletions crates/typos-cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ pub mod report;

mod default_types;
mod file_type;
mod file_type_specifics;
Loading