Skip to content

Commit 8efbf88

Browse files
committed
Extract use files
1 parent b4c30a7 commit 8efbf88

File tree

7 files changed

+159
-62
lines changed

7 files changed

+159
-62
lines changed

src/yatm_v2/src/app/cli.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1+
use crate::app::constants::YAML_EXTENSIONS;
12
use crate::app::load_config::load_config;
2-
use crate::app::requirements::get_requirements_from_files;
33
use crate::app::{
44
init_workspace::init_workspace,
55
requirements::{
66
get_requirements_from_file, validate_requirements_file, validate_requirements_files,
77
},
88
};
99
use crate::types::{RequirementsFile, TestCasesBuilderFile};
10+
use crate::utils::get_files;
1011

1112
use std::path::PathBuf;
1213

1314
use anyhow::{Context, Ok, Result};
1415
use clap::{Parser, Subcommand};
1516

16-
use super::requirements::get_requirements_files;
17-
1817
// Define the main application
1918
#[derive(Parser)]
2019
#[command(author, version, about, long_about = None)]
@@ -170,7 +169,7 @@ pub fn cli() -> Result<()> {
170169
}
171170
RequirementsSubcommands::List { config_path } => {
172171
let config = load_config(&config_path)?;
173-
let requirements_files = get_requirements_files(&config.requirements_dirs)?;
172+
let requirements_files = get_files(&config.requirements_dirs, &YAML_EXTENSIONS)?;
174173
for requirement_file in requirements_files {
175174
println!(
176175
"{}",
@@ -285,7 +284,7 @@ mod test_cli {
285284
}
286285

287286
#[test]
288-
fn full_requirements_test() {
287+
fn test_init() {
289288
let dir = tempdir().unwrap().path().to_path_buf();
290289

291290
// run the init command
@@ -305,6 +304,21 @@ mod test_cli {
305304
assert!(config.generated_files_dir.is_dir());
306305
assert!(dir.join(".gitignore").is_file());
307306
assert_eq!(get_number_of_files_in_dir(&config.new_requirements_dir), 1);
307+
}
308+
309+
#[test]
310+
fn test_requirements() {
311+
let dir = tempdir().unwrap().path().to_path_buf();
312+
313+
// run the init command
314+
let mut cmd = get_command();
315+
cmd.args(&["init", "--path", dir.to_str().unwrap()])
316+
.assert()
317+
.success();
318+
319+
// load the config
320+
assert!(dir.join("config.yaml").is_file());
321+
let config = load_config(&dir).unwrap();
308322

309323
// run the requirements new command
310324
let new_requirements_file_name = "my-test-requirements.yaml";

src/yatm_v2/src/app/constants.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub const YAML_EXTENSIONS: [&str; 2] = ["yaml", "yml"];

src/yatm_v2/src/app/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod cli;
2+
mod constants;
23
mod init_workspace;
34
mod load_config;
45
mod requirements;

src/yatm_v2/src/app/requirements.rs

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use crate::app::constants::YAML_EXTENSIONS;
12
use crate::types::RequirementsFile;
3+
use crate::utils::get_files;
24
use anyhow::{Context, Result};
35
use common::types::Requirement;
46
use serde_yaml;
@@ -16,63 +18,6 @@ pub fn validate_requirements_file(requirement_path: &PathBuf) -> Result<()> {
1618
Ok(())
1719
}
1820

19-
/// Get the requirements from the files.
20-
pub fn get_requirements_from_files(requirement_dirs: &Vec<PathBuf>) -> Result<Vec<Requirement>> {
21-
let requirement_files = get_requirements_files(&requirement_dirs).context(format!(
22-
"Failed to get the requirement files: {:?}",
23-
requirement_dirs
24-
))?;
25-
let mut all_requirements: Vec<Requirement> = vec![];
26-
for requirement_file in requirement_files {
27-
let requirements = get_requirements_from_file(&requirement_file).context(format!(
28-
"Failed to validate the requirement: {:?}",
29-
requirement_file
30-
))?;
31-
all_requirements.extend(requirements);
32-
}
33-
Ok(all_requirements)
34-
}
35-
36-
/// Get the requirements from a file.
37-
pub fn get_requirements_from_file(requirement_path: &PathBuf) -> Result<Vec<Requirement>> {
38-
let requirement = std::fs::read_to_string(&requirement_path).context(format!(
39-
"Failed to read the requirement file: {:?}",
40-
requirement_path
41-
))?;
42-
let requirements_file =
43-
serde_yaml::from_str::<RequirementsFile>(&requirement).context(format!(
44-
"Failed to deserialize the requirement: {:?}",
45-
requirement_path
46-
))?;
47-
Ok(requirements_file.requirements)
48-
}
49-
50-
/// Get the requirements file paths.
51-
pub fn get_requirements_files(requirement_dirs: &Vec<PathBuf>) -> Result<Vec<PathBuf>> {
52-
let mut requirements_files: Vec<PathBuf> = vec![];
53-
for requirement_dir in requirement_dirs {
54-
let requirement_files = std::fs::read_dir(&requirement_dir).context(format!(
55-
"Failed to read the requirement directory: {:?}",
56-
requirement_dir
57-
))?;
58-
for requirement_file in requirement_files {
59-
let requirement_file = requirement_file.context(format!(
60-
"Failed to read the entry in the requirement directory: {:?}",
61-
requirement_dir
62-
))?;
63-
let requirement_path = requirement_file.path();
64-
requirements_files.push(requirement_path);
65-
}
66-
}
67-
if requirements_files.is_empty() {
68-
return Err(anyhow::anyhow!(format!(
69-
"No requirement files found: {:#?}",
70-
requirement_dirs
71-
)));
72-
}
73-
Ok(requirements_files)
74-
}
75-
7621
#[cfg(test)]
7722
mod test_validate_requirement {
7823
use super::*;
@@ -111,3 +56,34 @@ mod test_validate_requirement {
11156
assert!(validate_requirements_file(&requirement_path).is_err());
11257
}
11358
}
59+
60+
/// Get the requirements from the files.
61+
pub fn get_requirements_from_files(requirement_dirs: &Vec<PathBuf>) -> Result<Vec<Requirement>> {
62+
let requirement_files = get_files(&requirement_dirs, &YAML_EXTENSIONS).context(format!(
63+
"Failed to get the requirement files: {:?}",
64+
requirement_dirs
65+
))?;
66+
let mut all_requirements: Vec<Requirement> = vec![];
67+
for requirement_file in requirement_files {
68+
let requirements = get_requirements_from_file(&requirement_file).context(format!(
69+
"Failed to validate the requirement: {:?}",
70+
requirement_file
71+
))?;
72+
all_requirements.extend(requirements);
73+
}
74+
Ok(all_requirements)
75+
}
76+
77+
/// Get the requirements from a file.
78+
pub fn get_requirements_from_file(requirement_path: &PathBuf) -> Result<Vec<Requirement>> {
79+
let requirement = std::fs::read_to_string(&requirement_path).context(format!(
80+
"Failed to read the requirement file: {:?}",
81+
requirement_path
82+
))?;
83+
let requirements_file =
84+
serde_yaml::from_str::<RequirementsFile>(&requirement).context(format!(
85+
"Failed to deserialize the requirement: {:?}",
86+
requirement_path
87+
))?;
88+
Ok(requirements_file.requirements)
89+
}

src/yatm_v2/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod app;
22
mod github;
33
mod test_cases;
44
mod types;
5+
mod utils;
56

67
use anyhow::{Context, Ok, Result};
78
use types::LocalIssue;

src/yatm_v2/src/utils/get_files.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
use anyhow::{Context, Result};
2+
use std::path::PathBuf;
3+
4+
/// Get the files with the given extensions recursively from the directories.
5+
pub fn get_files(dir: &Vec<PathBuf>, extensions: &[&str]) -> Result<Vec<PathBuf>> {
6+
// Recursively called helper function to process directories
7+
fn get_files_recursive(
8+
dir: &PathBuf,
9+
extensions: &[&str],
10+
out_files: &mut Vec<PathBuf>,
11+
) -> Result<()> {
12+
let paths = std::fs::read_dir(dir)
13+
.with_context(|| format!("Failed to read the directory: {:?}", dir))?;
14+
for path in paths {
15+
let entry = path
16+
.with_context(|| format!("Failed to read the entry in the directory: {:?}", dir))?;
17+
let file_path = entry.path();
18+
if file_path.is_dir() {
19+
// If the path is a directory, recursively search it
20+
get_files_recursive(&file_path, extensions, out_files)?;
21+
} else {
22+
// Otherwise, process the file
23+
let extension = file_path
24+
.extension()
25+
.and_then(|e| e.to_str())
26+
.map(|e| e.to_lowercase());
27+
if let Some(extension) = extension {
28+
if extensions.contains(&extension.as_str()) {
29+
out_files.push(file_path);
30+
}
31+
}
32+
}
33+
}
34+
Ok(())
35+
}
36+
37+
let mut out_files: Vec<PathBuf> = vec![];
38+
for dir in dir {
39+
get_files_recursive(dir, extensions, &mut out_files)?;
40+
}
41+
if out_files.is_empty() {
42+
return Err(anyhow::anyhow!("No files found in directory: {:?}", dir));
43+
}
44+
Ok(out_files)
45+
}
46+
47+
#[cfg(test)]
48+
mod test_get_files {
49+
use super::*;
50+
use std::fs::File;
51+
use std::io::Write;
52+
use tempfile::tempdir;
53+
54+
const YAML_EXTENSIONS: [&str; 1] = ["yaml"];
55+
56+
#[test]
57+
fn test_get_files() {
58+
let dir = tempdir().unwrap();
59+
let file_path = dir.path().join("file.yaml");
60+
let mut file = File::create(&file_path).unwrap();
61+
let file_str = "file";
62+
file.write_all(file_str.as_bytes()).unwrap();
63+
let files = get_files(&vec![dir.path().to_path_buf()], &YAML_EXTENSIONS).unwrap();
64+
assert_eq!(files.len(), 1);
65+
assert_eq!(files[0], file_path);
66+
}
67+
68+
#[test]
69+
fn test_get_files_invalid() {
70+
let dir = tempdir().unwrap();
71+
let files = get_files(&vec![dir.path().to_path_buf()], &YAML_EXTENSIONS);
72+
assert!(files.is_err());
73+
}
74+
75+
#[test]
76+
fn test_get_files_recursive() {
77+
let dir = tempdir().unwrap();
78+
let sub_dir = dir.path().join("sub_dir");
79+
std::fs::create_dir(&sub_dir).unwrap();
80+
let file_path = sub_dir.join("file.yaml");
81+
let mut file = File::create(&file_path).unwrap();
82+
let file_str = "file";
83+
file.write_all(file_str.as_bytes()).unwrap();
84+
let files = get_files(&vec![dir.path().to_path_buf()], &YAML_EXTENSIONS).unwrap();
85+
assert_eq!(files.len(), 1);
86+
assert_eq!(files[0], file_path);
87+
}
88+
89+
#[test]
90+
fn test_get_files_recursive_invalid() {
91+
let dir = tempdir().unwrap();
92+
let sub_dir = dir.path().join("sub_dir");
93+
std::fs::create_dir(&sub_dir).unwrap();
94+
let file_path = sub_dir.join("file.txt");
95+
let mut file = File::create(&file_path).unwrap();
96+
let file_str = "file";
97+
file.write_all(file_str.as_bytes()).unwrap();
98+
let files = get_files(&vec![dir.path().to_path_buf()], &YAML_EXTENSIONS);
99+
assert!(files.is_err());
100+
}
101+
}

src/yatm_v2/src/utils/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod get_files;
2+
3+
pub use get_files::get_files;

0 commit comments

Comments
 (0)