Skip to content

Commit 6c3323a

Browse files
feat(wipe): add support for wiping terraform folders
1 parent 0eb1933 commit 6c3323a

7 files changed

Lines changed: 42 additions & 12 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version = "0.3.3"
44
edition = "2024"
55
license = "MIT"
66
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
7-
description = "recursively wipe target and node_modules folders"
7+
description = "Cargo subcommand that recursively finds and optionally wipes all \"target\" (Rust), \"node_modules\" (Node), or \".terraform\" (Terraform) folders that are found in the current path."
88
keywords = ["cli", "cargo", "wipe", "target", "node_modules"]
99
categories = ["command-line-interface", "command-line-utilities"]
1010
readme = "README.md"

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
[![codecov][codecov_badge]][codecov]
66
[![license][license_badge]][license]
77
[![Crates.io][crates_installs_badge]][crates]\
8-
Cargo subcommand that recursively finds and optionally wipes all "target" or "node_modules" folders that are found in the current path.
8+
Cargo subcommand that recursively finds and optionally wipes all "target" (Rust),
9+
"node_modules" (Node), or ".terraform" (Terraform) folders that are found in the current path.
910

1011
## Usage
1112

src/command.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use clap::{Parser, ValueEnum, arg, command};
66
#[derive(Debug, Parser)]
77
#[command(name = "cargo", bin_name = "cargo")]
88
pub enum Command {
9-
/// Recursively finds and optionally wipes all "target" (Rust) or
10-
/// "node_modules" (Node) folders that are found in the current path.
9+
/// Recursively finds and optionally wipes all "target" (Rust),
10+
/// "node_modules" (Node), or ".terraform" (Terraform) folders that
11+
/// are found in the current path.
1112
/// Add the `-w` flag to wipe all folders found. USE WITH CAUTION!
1213
Wipe(Args),
1314
}
@@ -33,12 +34,14 @@ pub struct Args {
3334
pub enum LanguageEnum {
3435
Node,
3536
Rust,
37+
Terraform,
3638
}
3739

3840
#[derive(Debug, PartialEq, Eq)]
3941
pub enum DirectoryEnum {
4042
NodeModules,
4143
Target,
44+
Terraform,
4245
}
4346

4447
impl str::FromStr for LanguageEnum {
@@ -48,9 +51,10 @@ impl str::FromStr for LanguageEnum {
4851
match value.to_lowercase().trim() {
4952
"node" => Ok(LanguageEnum::Node),
5053
"rust" => Ok(LanguageEnum::Rust),
54+
"terraform" => Ok(LanguageEnum::Terraform),
5155
_ => Err(io::Error::new(
5256
io::ErrorKind::InvalidInput,
53-
"Valid options are: node | rust",
57+
"Valid options are: node | rust | terraform",
5458
)),
5559
}
5660
}
@@ -61,6 +65,7 @@ impl fmt::Display for LanguageEnum {
6165
match self {
6266
LanguageEnum::Node => write!(f, "node"),
6367
LanguageEnum::Rust => write!(f, "rust"),
68+
LanguageEnum::Terraform => write!(f, "terraform"),
6469
}
6570
}
6671
}
@@ -70,6 +75,7 @@ impl From<LanguageEnum> for DirectoryEnum {
7075
match language {
7176
LanguageEnum::Node => DirectoryEnum::NodeModules,
7277
LanguageEnum::Rust => DirectoryEnum::Target,
78+
LanguageEnum::Terraform => DirectoryEnum::Terraform,
7379
}
7480
}
7581
}
@@ -79,6 +85,7 @@ impl From<&LanguageEnum> for DirectoryEnum {
7985
match language {
8086
LanguageEnum::Node => DirectoryEnum::NodeModules,
8187
LanguageEnum::Rust => DirectoryEnum::Target,
88+
LanguageEnum::Terraform => DirectoryEnum::Terraform,
8289
}
8390
}
8491
}
@@ -88,6 +95,7 @@ impl fmt::Display for DirectoryEnum {
8895
match self {
8996
DirectoryEnum::NodeModules => write!(f, "node_modules"),
9097
DirectoryEnum::Target => write!(f, "target"),
98+
DirectoryEnum::Terraform => write!(f, ".terraform"),
9199
}
92100
}
93101
}
@@ -103,6 +111,7 @@ mod tests {
103111
#[rstest]
104112
#[case("node", LanguageEnum::Node)]
105113
#[case("rust", LanguageEnum::Rust)]
114+
#[case("terraform", LanguageEnum::Terraform)]
106115
#[case("RUST", LanguageEnum::Rust)]
107116
#[case("ruSt ", LanguageEnum::Rust)]
108117
fn language_string_to_enum(#[case] language_string: &str, #[case] language_enum: LanguageEnum) {
@@ -120,19 +129,24 @@ mod tests {
120129
let err = result.err().unwrap();
121130

122131
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
123-
assert_eq!(err.to_string(), "Valid options are: node | rust");
132+
assert_eq!(
133+
err.to_string(),
134+
"Valid options are: node | rust | terraform"
135+
);
124136
}
125137

126138
#[rstest]
127139
#[case(LanguageEnum::Node, "node")]
128140
#[case(LanguageEnum::Rust, "rust")]
141+
#[case(LanguageEnum::Terraform, "terraform")]
129142
fn language_enum_to_string(#[case] language_enum: LanguageEnum, #[case] language_string: &str) {
130143
assert_eq!(language_enum.to_string(), language_string);
131144
}
132145

133146
#[rstest]
134147
#[case(LanguageEnum::Node, DirectoryEnum::NodeModules)]
135148
#[case(LanguageEnum::Rust, DirectoryEnum::Target)]
149+
#[case(LanguageEnum::Terraform, DirectoryEnum::Terraform)]
136150
fn language_enum_to_directory_enum(
137151
#[case] language_enum: LanguageEnum,
138152
#[case] expected_directory_enum: DirectoryEnum,
@@ -144,6 +158,7 @@ mod tests {
144158
#[rstest]
145159
#[case(DirectoryEnum::NodeModules, "node_modules")]
146160
#[case(DirectoryEnum::Target, "target")]
161+
#[case(DirectoryEnum::Terraform, ".terraform")]
147162
fn directory_enum_to_string(
148163
#[case] directory_enum: DirectoryEnum,
149164
#[case] directory_string: &str,

src/tests/helpers/test_run.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl TestRun {
4747
run.generate_hits(language, hits_count);
4848
run.generate_ignores(language, ignores_count);
4949
run.generate_no_hits();
50-
run.generate_opposite(language);
50+
run.generate_different_language_hits(language);
5151
run.generate_invalid(language);
5252
run.generate_partial(language);
5353

@@ -107,15 +107,18 @@ impl TestRun {
107107
}
108108
}
109109

110-
fn generate_opposite(&mut self, language: &LanguageEnum) {
111-
let opposite = if matches!(language, LanguageEnum::Node) {
112-
"target"
110+
fn generate_different_language_hits(&mut self, language: &LanguageEnum) {
111+
let different_language = if language == &LanguageEnum::Node {
112+
DirectoryEnum::Target.to_string()
113113
} else {
114-
"node_modules"
114+
DirectoryEnum::NodeModules.to_string()
115115
};
116116

117117
let name = TestRun::generate_folder_name(&mut self.rng);
118-
let path = self.path.join(Path::new(&name)).join(Path::new(opposite));
118+
let path = self
119+
.path
120+
.join(Path::new(&name))
121+
.join(Path::new(&different_language));
119122

120123
std::fs::create_dir_all(&path).unwrap();
121124

src/tests/wipe.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use crate::writer::{SPACING_FILES, SPACING_SIZE};
1515
#[case(LanguageEnum::Node, true)]
1616
#[case(LanguageEnum::Rust, false)]
1717
#[case(LanguageEnum::Rust, true)]
18+
#[case(LanguageEnum::Terraform, false)]
19+
#[case(LanguageEnum::Terraform, true)]
1820
fn run_with_hits(#[case] language: LanguageEnum, #[case] wipe: bool) {
1921
let test_run = TestRun::new(&language, 3, 0);
2022
let directory: DirectoryEnum = (&language).into();
@@ -94,6 +96,8 @@ fn run_with_hits(#[case] language: LanguageEnum, #[case] wipe: bool) {
9496
#[case(LanguageEnum::Node, true)]
9597
#[case(LanguageEnum::Rust, false)]
9698
#[case(LanguageEnum::Rust, true)]
99+
#[case(LanguageEnum::Terraform, false)]
100+
#[case(LanguageEnum::Terraform, true)]
97101
fn run_no_hits(#[case] language: LanguageEnum, #[case] wipe: bool) {
98102
let test_run = TestRun::new(&language, 0, 0);
99103

@@ -146,6 +150,8 @@ fn run_no_hits(#[case] language: LanguageEnum, #[case] wipe: bool) {
146150
#[case(LanguageEnum::Node, true)]
147151
#[case(LanguageEnum::Rust, false)]
148152
#[case(LanguageEnum::Rust, true)]
153+
#[case(LanguageEnum::Terraform, false)]
154+
#[case(LanguageEnum::Terraform, true)]
149155
fn run_with_ignores(#[case] language: LanguageEnum, #[case] wipe: bool) {
150156
let test_run = TestRun::new(&language, 3, 3);
151157

src/tests/wipe_permissions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ mod wipe_permissions_tests {
1515
#[case(LanguageEnum::Node, true)]
1616
#[case(LanguageEnum::Rust, false)]
1717
#[case(LanguageEnum::Rust, true)]
18+
#[case(LanguageEnum::Terraform, false)]
19+
#[case(LanguageEnum::Terraform, true)]
1820
fn test_with_readonly_folders(#[case] language: LanguageEnum, #[case] wipe: bool) {
1921
use std::fs;
2022
use std::os::unix::fs::PermissionsExt;

src/wipe_params.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ mod tests {
4040
#[case(Args { language: LanguageEnum::Rust, wipe: false, ignores: Vec::new() })]
4141
#[case(Args { language: LanguageEnum::Rust, wipe: true, ignores: Vec::new() })]
4242
#[case(Args { language: LanguageEnum::Rust, wipe: true, ignores: vec![PathBuf::from("example/path")] })]
43+
#[case(Args { language: LanguageEnum::Terraform, wipe: false, ignores: Vec::new() })]
44+
#[case(Args { language: LanguageEnum::Terraform, wipe: true, ignores: Vec::new() })]
45+
#[case(Args { language: LanguageEnum::Terraform, wipe: true, ignores: vec![PathBuf::from("example/path")] })]
4346
fn test_wipe_params(#[case] args: Args) {
4447
let params = WipeParams::new(&args).unwrap();
4548

0 commit comments

Comments
 (0)